📄 vtcenc.cpp
字号:
} // printf("%d %d\n", mzte_codec.m_iHeight, mzte_codec.m_iWidth ); mzte_codec.m_iDCWidth = GetDCWidth(); //added by SL 030499 (This is the real DC-width and height) mzte_codec.m_iDCHeight = GetDCHeight(); // begin: deleted by Sharp (99/2/16)#if 0 mzte_codec.m_iAcmOrder = 0; mzte_codec.m_iAcmMaxFreqChg = 0; init_acm_maxf_enc();#endif // end: deleted by Sharp (99/2/16) // fprintf(stdout,"init ac model!\n"); int height; int width; int x,y; for (col=0; col<mzte_codec.m_iColors; col++) { height = mzte_codec.m_Image[col].height; width = mzte_codec.m_Image[col].width;// printf("SPlayer %d %d\n", width, height); mzte_codec.m_SPlayer[col].coeffinfo = new COEFFINFO * [height]; if (mzte_codec.m_SPlayer[col].coeffinfo == NULL) exit(fprintf(stderr,"Allocating memory for coefficient structure (I).")); mzte_codec.m_SPlayer[col].coeffinfo[0] = new COEFFINFO [height*width]; if (mzte_codec.m_SPlayer[col].coeffinfo[0] == NULL) exit(fprintf(stderr,"Allocating memory for coefficient structure (II).")); for (y = 1; y < height; ++y) mzte_codec.m_SPlayer[col].coeffinfo[y] = mzte_codec.m_SPlayer[col].coeffinfo[y-1]+width; // for (int y=0; y<height; y++) // modified by Sharp (99/2/16) // FPDAM for (y=0; y<height; y++) // FPDAM for (x=0; x<width; x++) { mzte_codec.m_SPlayer[col].coeffinfo[y][x].skip =0; } } // fprintf(stdout,"Coeffinfo memory allocation done!\n"); /*------- DC: Open and initialize bitstream file -------*/ if ((bitfile=fopen(mzte_codec.m_cBitFile,"wb"))==NULL) errorHandler("Can't open file '%s' for writing.", mzte_codec.m_cBitFile); init_bit_packing_fp(bitfile,1); tile_table_pos = header_Enc(synfilter);// @@@@@@@@@@// deleted for FDAM1 by Samsung AIT on 2000/02/03// if(!mzte_codec.m_usErrResiDisable)// emit_bits((UShort)mzte_codec.m_usSegmentThresh,16);// ~deleted for FDAM1 by Samsung AIT 2000/02/03 // begin: added by Sharp (99/2/16) for (Int iTile = 0; iTile<mzte_codec.m_iNumOfTile; iTile++ ){ if ( mzte_codec.m_tiling_disable == 0 ){// FPDAM begin: modified by Sharp cut_tile_image(mzte_codec.m_Image, mzte_codec.m_ImageOrg, iTile, mzte_codec.m_iColors, tile_width, tile_height, anafilter[0]);// FPDAM end: modified by Sharp// FPDAM begin: added by Sharp if ( mzte_codec.m_iAlphaChannel ) mzte_codec.m_iTextureTileType = CheckTextureTileType(mzte_codec.m_Image[0].mask, mzte_codec.m_iWidth, mzte_codec.m_iHeight, mzte_codec.m_iRealWidth, mzte_codec.m_iRealHeight);// FPDAM end: added by Sharp if ( iTile != 0 ){ if ((bitfile=fopen(mzte_codec.m_cBitFile,"ab"))==NULL) errorHandler("Can't open file '%s' for writing.",mzte_codec.m_cBitFile); fseek(bitfile,0,SEEK_END); init_bit_packing_fp(bitfile,1); }// FPDAM begin: modified by Sharp// tile_header_Enc(iTile); tile_header_Enc(synfilter,iTile);// FPDAM end: modified by Sharp } if( !mzte_codec.m_usErrResiDisable ) texture_packet_header_Enc(synfilter); if ( mzte_codec.m_tiling_disable == 0 ) printf("Encoding %d-th tile\n", iTile); mzte_codec.m_iAcmOrder = 0; mzte_codec.m_iAcmMaxFreqChg = 0; init_acm_maxf_enc(); // end: added by Sharp (99/2/16) /* DISCRETE WAVELET TRANSFORM */ noteProgress("Wavelet Transform...."); // begin: modified by Sharp (99/5/10) // begin: added by Sharp (99/2/16)// if(mzte_codec.m_tiling_disable==0){// perform_DWT_Tile(anafilter, mzte_codec.m_ImageOrg, iTile); //*********// } else {// FPDAM begin: added by Sharp if ( mzte_codec.m_tiling_disable!=0 || !mzte_codec.m_iAlphaChannel || mzte_codec.m_iTextureTileType!=TRANSP_TILE)// FPDAM end: added by Sharp perform_DWT(anafilter);// } // end: added by Sharp (99/2/16)// end: modified by Sharp (99/5/10) // choose_wavelet_filter(&anafilter, &synfilter, mzte_codec.m_iWvtType); // hjlee 0901 // perform_DWT(anafilter); deleted by Sharp (99/2/16) noteProgress("Completed wavelet transform.");// begin: added by Sharp (99/4/7) if ( mzte_codec.m_tiling_disable == 0 ){ stat(mzte_codec.m_cBitFile, &file_info); init_size = file_info.st_size; } TextureObjectLayer_enc(bitfile); if (mzte_codec.m_tiling_disable==0 && mzte_codec.m_tiling_jump_table_enable == 1) { if (iTile==0){/* printf("Header = %d\n", tile_table_pos);*/ stat(mzte_codec.m_cBitFile, &file_info);/* printf("%d\n", file_info.st_size);*/ table[0] = file_info.st_size - tile_table_pos - (34 * mzte_codec.m_iNumOfTile + used_bits + 8)/8; } else { stat(mzte_codec.m_cBitFile, &file_info);/* printf("%d\n", file_info.st_size);*/ table[iTile] = file_info.st_size - init_size; }/* printf("Encoded Table[%d] = %d\n", iTile, table[iTile]);*/ }// end: added by Sharp (99/4/7) // begin: deleted by Sharp (99/4/7)#if 0 // begin: added by Sharp (99/2/16) if (mzte_codec.m_tiling_disable==0){ struct stat file_info; if (iTile==0){ TextureObjectLayer_enc(synfilter, iTile, &tile_table_pos); /* printf("Header = %d\n", tile_table_pos);*/ stat(mzte_codec.m_cBitFile, &file_info); /* printf("%d\n", file_info.st_size);*/ table[0] = file_info.st_size - tile_table_pos - (34 * mzte_codec.m_iNumOfTile + used_bits + 8)/8; } else { int init_size; stat(mzte_codec.m_cBitFile, &file_info); init_size = file_info.st_size; TextureObjectLayer_enc(synfilter, iTile, &garbage); stat(mzte_codec.m_cBitFile, &file_info); /* printf("%d\n", file_info.st_size);*/ table[iTile] = file_info.st_size - init_size; } /* printf("Encoded Table[%d] = %d\n", iTile, table[iTile]);*/ } else { TextureObjectLayer_enc(synfilter, iTile, &garbage); } // end: added by Sharp (99/2/16)#endif// end: deleted by Sharp (99/4/7) // TextureObjectLayer_enc(synfilter); deleted by Sharp (99/2/16) // begin: added by Sharp (99/2/16) } if (mzte_codec.m_tiling_disable==0 && mzte_codec.m_tiling_jump_table_enable == 1){ bitfile = fopen(mzte_codec.m_cBitFile,"r+b"); garbage = ftell(bitfile); if (fseek(bitfile, tile_table_pos, SEEK_SET)!=0){ fprintf(stderr, "rewind failed\n"); exit(111); } garbage = ftell(bitfile); { unsigned char byte_buf; Int bits; fread(&byte_buf, sizeof(char), 1, bitfile); fflush(bitfile); fseek(bitfile, -1L, SEEK_CUR); byte_buf = (byte_buf >> (8 - used_bits)); bits = emit_bits_local ( byte_buf, used_bits, bitfile ); for (Int iTile=0; iTile<mzte_codec.m_iNumOfTile; iTile++) { bits = emit_bits_local ( (table[iTile]>>16), 16, bitfile ); bits = emit_bits_local ( 1, 1, bitfile ); bits = emit_bits_local ( (table[iTile]&0xffff), 16, bitfile ); bits = emit_bits_local ( 1, 1, bitfile ); } fflush(bitfile); fread(&byte_buf, sizeof(char), 1, bitfile); fflush(bitfile); fseek(bitfile, -1L, SEEK_CUR); emit_bits_local ( byte_buf, bits, bitfile ); } fclose(bitfile); free(table); // added by Sharp (99/5/10) } // end: added by Sharp (99/2/16) /*----- free up coeff data structure -----*/ noteDetail("Freeing up encoding data structures...."); for (col=0; col<mzte_codec.m_iColors; col++) { // begin: added by Sharp (99/2/16) /* delete */ free (mzte_codec.m_Image[col].data);/* delete (mzte_codec.m_Image[col].mask);*/ if ( mzte_codec.m_tiling_disable == 0 ){ //modified by SL 030399 free /*delete*/ (mzte_codec.m_ImageOrg[col].data);/* delete (mzte_codec.m_ImageOrg[col].mask);*/ } // end: added by Sharp (99/2/16) if (mzte_codec.m_SPlayer[col].coeffinfo[0] != NULL) delete (mzte_codec.m_SPlayer[col].coeffinfo[0]); mzte_codec.m_SPlayer[col].coeffinfo[0] = NULL; if (mzte_codec.m_SPlayer[col].coeffinfo) delete (mzte_codec.m_SPlayer[col].coeffinfo); mzte_codec.m_SPlayer[col].coeffinfo = NULL; }// begin: added by Sharp (99/2/16) delete (mzte_codec.m_Image); delete (mzte_codec.m_ImageOrg);// end: added by Sharp (99/2/16)// begin: added by Sharp (99/3/29) delete anafilter; delete synfilter;// end: added by Sharp (99/3/29) noteDetail("Completed freeing up encoding data structures."); noteProgress("\n----- Encoding Completed. -----\n"); } else { /* this part should be copyed from VERSION 1 FCD software later */ // allocate memory for source image mzte_codec.m_Image = new PICTURE[3]; // hjlee 0901 anafilter = (FILTER **) malloc(sizeof(FILTER *)*mzte_codec.m_iWvtDecmpLev); synfilter = (FILTER **) malloc(sizeof(FILTER *)*mzte_codec.m_iWvtDecmpLev); if(anafilter == NULL || synfilter == NULL) errorHandler("Error allocating memory for filters\n"); for(i=0;i<mzte_codec.m_iWvtDecmpLev; i++) { choose_wavelet_filter(&(anafilter[i]), &(synfilter[mzte_codec.m_iWvtDecmpLev-1-i]), mzte_codec.m_WvtFilters[mzte_codec.m_iWvtUniform?0:i]); } // read source image read_image( m_cImagePath, mzte_codec.m_iWidth, mzte_codec.m_iHeight, mzte_codec.m_iColors, 8, mzte_codec.m_Image ); if (mzte_codec.m_iAlphaChannel != 0) { // arbitrary shape coding // allocate meory for segmentation mzte_codec.m_SegImage = new PICTURE[3]; // read the segmentation map of the source image */ mzte_codec.m_iAlphaChannel = read_segimage(m_cSegImagePath, mzte_codec.m_Image[0].width, mzte_codec.m_Image[0].height, mzte_codec.m_iColors, mzte_codec.m_Image); } get_virtual_image_V1(mzte_codec.m_Image, mzte_codec.m_iWvtDecmpLev, mzte_codec.m_iAlphaChannel, mzte_codec.m_iColors, mzte_codec.m_iAlphaTh, mzte_codec.m_iChangeCRDisable, anafilter[0]); for (col=0; col<mzte_codec.m_iColors; col++) { mzte_codec.m_Image[col].height = mzte_codec.m_iHeight >> (Int)(col>0); mzte_codec.m_Image[col].width = mzte_codec.m_iWidth >> (Int)(col>0); } mzte_codec.m_iAcmOrder = 0; mzte_codec.m_iAcmMaxFreqChg = 0; init_acm_maxf_enc();// fprintf(stdout,"init ac model!\n"); int height; int width; for (col=0; col<mzte_codec.m_iColors; col++) { int x,y; height = mzte_codec.m_Image[col].height; width = mzte_codec.m_Image[col].width; mzte_codec.m_SPlayer[col].coeffinfo = new COEFFINFO * [height]; if (mzte_codec.m_SPlayer[col].coeffinfo == NULL) exit(fprintf(stderr,"Allocating memory for coefficient structure (I).")); mzte_codec.m_SPlayer[col].coeffinfo[0] = new COEFFINFO [height*width]; if (mzte_codec.m_SPlayer[col].coeffinfo[0] == NULL) exit(fprintf(stderr,"Allocating memory for coefficient structure (II).")); for (y = 1; y < height; ++y) mzte_codec.m_SPlayer[col].coeffinfo[y] = mzte_codec.m_SPlayer[col].coeffinfo[y-1]+width; for (y=0; y<height; y++) for (x=0; x<width; x++) { mzte_codec.m_SPlayer[col].coeffinfo[y][x].skip =0; } }// fprintf(stdout,"Coeffinfo memory allocation done!\n"); /* DISCRETE WAVELET TRANSFORM */ noteProgress("Wavelet Transform...."); // choose_wavelet_filter(&anafilter, &synfilter, mzte_codec.m_iWvtType); // hjlee 0901 perform_DWT(anafilter); noteProgress("Completed wavelet transform."); TextureObjectLayer_enc_V1(synfilter); /*----- free up coeff data structure -----*/ noteDetail("Freeing up encoding data structures...."); for (col=0; col<mzte_codec.m_iColors; col++) { if (mzte_codec.m_SPlayer[col].coeffinfo[0] != NULL) delete (mzte_codec.m_SPlayer[col].coeffinfo[0]); mzte_codec.m_SPlayer[col].coeffinfo[0] = NULL; if (mzte_codec.m_SPlayer[col].coeffinfo) delete (mzte_codec.m_SPlayer[col].coeffinfo); mzte_codec.m_SPlayer[col].coeffinfo = NULL; } noteDetail("Completed freeing up encoding data structures."); noteProgress("\n----- Encoding Completed. -----\n"); }}// begin: added by Sharp (99/2/16)Int CVTCEncoder::emit_bits_local( UShort data, Int size, FILE *fp ){ static Int remain_bits = 0; static UInt buf = 0; UInt put_buffer = data; unsigned char c; assert(sizeof(UShort)==2); /* Mask off any excess bits in code */ put_buffer &= (((Int)1) << size) - 1; /* new number of bits in buffer */ remain_bits += size; /* align incoming bits */ put_buffer <<= 24 - remain_bits; /* and merge with old buffer contents */ put_buffer |= buf; while (remain_bits >= 8) { c = (unsigned char) ((put_buffer >> 16) & 0xFF);// printf("%d at %d\n", c, ftell(fp));// getchar(); fwrite(&c, sizeof(char), 1, fp); put_buffer <<= 8; remain_bits -= 8; } buf = put_buffer; return remain_bits;}Void CVTCEncoder::tile_header_Enc(FILTER **wvtfilter, Int tile_id){ if ( mzte_codec.m_tiling_disable == 0 ){ emit_bits((UShort)(TEXTURE_TILE_START_CODE>>16), 16); emit_bits((UShort)TEXTURE_TILE_START_CODE, 16); emit_bits((UShort)tile_id, 16); if ( mzte_codec.m_extension_type == 1 ){ emit_bits((UShort)1, 16); /* reference tile_id1 */ emit_bits((UShort)1, 16); /* reference tile_id2 */ } }// FPDAM begin: added by Sharp if ( mzte_codec.m_usErrResiDisable ) { if ( mzte_codec.m_iAlphaChannel ) { emit_bits((UShort)MARKER_BIT, 1); emit_bits((UShort)mzte_codec.m_iTextureTileType, 2); emit_bits((UShort)MARKER_BIT, 1);#ifdef _FPDAM_DBG_fprintf(stderr,".............texture_tile_type=%d\n",mzte_codec.m_iTextureTileType);#endif } if ( mzte_codec.m_iAlphaChannel && mzte_codec.m_iTextureTileType == BOUNDA_TILE ){ noteProgress("Encoding Tile Shape Bitstream ...."); ShapeEnCoding(mzte_codec.m_Image[0].mask, mzte_codec.m_iWidth, mzte_codec.m_iHeight, mzte_codec.m_iWvtDecmpLev, mzte_codec.m_iSTOConstAlpha, mzte_codec.m_iSTOConstAlphaValue, mzte_codec.m_iChangeCRDisable, mzte_codec.m_iShapeScalable, mzte_codec.m_bStartCodeEnable, wvtfilter); } }// FPDAM end: added by Sharp}// end: added by Sharp (99/2/16)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -