// // file name: subloop.C // Written by Ee-Chien Chang // #include #include // for semaphore: sema_wait() sema_post() #include "sparse_mask.h" // for class item #include "sparse_2.h" #include "tcpstream.h" #include "block_item.h" #include "GLOBAL_VARIABLE.h" void update_map(block_item *); int read_ihaar_fillin_data ( tcp_Stream * netstream, block_item * user_request ) { int total; // total number of pixel read //for each request in org_req; for ( block_item* curr_request = user_request; curr_request != 0; curr_request = curr_request -> next ) { //-------------------------------------------------- // for each reqest, which is a block in a level. // count the number of zeros in the mask. // This are the places to be filled in. // the zero-intervals are stroed in new_req. //-------------------------------------------------- int mylevel = curr_request -> level; item **rows = new (item *) [ curr_request->en_row - curr_request->st_row + 1 ]; //------- b r e a k t o s m a l l i n t e r v a l s ---- int err = sem_wait ( & DATA_READY ); if (err) { cout << "SEMAPHORE -wait ERROR " << err << endl; while(1){} } total =0; for (int rrow =0, row = curr_request -> st_row; row <= curr_request -> en_row; rrow ++, row ++ ) { int subtotal=0; rows[rrow ] = T[mylevel][row].zeros( &subtotal, curr_request->st_col, curr_request->en_col); total += subtotal; } err = sem_post ( & DATA_READY ); if (err) { cout << "SEMAPHORE -post ERROR " << err << endl; while(1){} } //------- r e a d f r o m n e t -------------------- if (total >0) { int total_byte = 4 * HEADER.BYTE_PER_PIXEL *total; unsigned char * tmp = new unsigned char [total_byte]; netstream->read_byte(&tmp[0*total_byte/4], (unsigned long)total_byte/4 ); netstream->read_byte(&tmp[1*total_byte/4], (unsigned long)total_byte/4 ); netstream->read_byte(&tmp[2*total_byte/4], (unsigned long)total_byte/4 ); netstream->read_byte(&tmp[3*total_byte/4], (unsigned long)total_byte/4 ); //------- i h a a r ( u p d a t e C o e f f ) ---------- int tmp_count =0; for (int rrow =0, row = curr_request -> st_row; row <= curr_request -> en_row; rrow ++, row ++ ) { tmp_count += C.ihaar ( rows[rrow], total, mylevel, row, &tmp [tmp_count] ); } //-------- u p d a t e m a s k ------------------ { sem_wait ( & DATA_READY ); //............. S E T S E M A P H O R E for (int row = curr_request -> st_row; row <= curr_request -> en_row; row ++ ) { T[mylevel][row].set( curr_request->st_col, curr_request->en_col ); } //............. R E L E A S E S E M A P H O R E sem_post ( & DATA_READY ); } delete [] tmp; } //------- r e c l a i m m e m o r y --------------------- for (int rrow =0, row = curr_request -> st_row; row <= curr_request -> en_row; rrow ++, row ++ ) delete rows[rrow]; delete [] rows; if (total > 0) update_map(curr_request); } // for-loop return total; }