📄 vtcdec.cpp
字号:
align_byte(); fclose(bitfile); } }} Void CVTCDecoder::decode(Char *InBitsFile, Char *RecImageFile, Int DisplayWidth, Int DisplayHeight, // FPDAM : added by SAIT (99/09/03) Int TargetSpaLev, Int TargetSNRLev, Int TargetShapeLev, Int FullSizeOut, //added by SL@Sarnoff (03/02/99) Int TargetTileFrom, Int TargetTileTo) // modified by Sharp (99/2/16){ Int col; FILTER **wvtfilter; // hjlee 0901// begin: added by Sharp (99/2/16) Int /* iTile = 0,*/ iNumOfTile; Int target_iNum;// max_iNum; FILE *bitfile; UChar *frm[3], *frm_mask[3]; // modified by Sharp (99/5/10) // FPDAM added by Sharp //Int tileX, tileY; Int id_to; Int *table; Int *jump_table; Int *decode_tile_id; Int header_size; PICTURE *Image;// Int h, w, y;// end: added by Sharp (99/2/16)// begin: added by Sharp (99/5/10) Int MinLevel = 0, TileX = 0, TileY = 0;// end: added by Sharp (99/5/10) noteProgress("\n----- MPEG-4 Visual Texture Coding: Decoding -----\n"); mzte_codec.m_visual_object_verid = 2; //VERSION; // This value is set to 2 tentatively// begin: added by Sharp (99/11/18) if ( strstr(InBitsFile, "v1") != NULL || strstr(InBitsFile, "V1") != NULL ) mzte_codec.m_visual_object_verid = 1; else mzte_codec.m_visual_object_verid = 2;// end: added by Sharp (99/11/18) if ( mzte_codec.m_visual_object_verid != 1 ){ noteProgress("Version 2 bitstream\n");//Added by Sarnoff for error resilience, 3/5/99 if(!mzte_codec.m_usErrResiDisable) errSignal = errWarnSignal = errMagSignal = 0;//End: Added by Sarnoff for error resilience, 3/5/99 strcpy(m_cInBitsFile, InBitsFile); strcpy(m_cRecImageFile, RecImageFile); mzte_codec.m_iTargetSpatialLev = TargetSpaLev; mzte_codec.m_iTargetSNRLev = TargetSNRLev; mzte_codec.m_iTargetShapeLev = TargetShapeLev; //added by SL@Sarnoff (03/02/99) mzte_codec.m_iFullSizeOut = FullSizeOut; //added by SL@Sarnoff (03/02/99) mzte_codec.m_iScanOrder = 0; mzte_codec.m_iAcmMaxFreqChg =0; mzte_codec.m_iAcmOrder =0; mzte_codec.m_iColors=3;// init_acm_maxf_dec(); // hjlee 0901 mzte_codec.m_iSingleBitFile = 1; /* hjlee 0511 */ mzte_codec.m_cBitFile = NULL; mzte_codec.m_cBitFileAC = NULL;// FPDAM begin: added by Sharp mzte_codec.m_display_width = DisplayWidth; mzte_codec.m_display_height = DisplayHeight;// FPDAM end: added by Sharp// begin: added by Sharp (99/2/16) if ((bitfile=fopen(m_cInBitsFile,"rb"))==NULL) errorHandler("Can't open file '%s' for reading.",m_cInBitsFile); /* initialize variables */ init_bit_packing_fp(bitfile,1); /*------- DC: Read header info from bitstream file -------*/ header_Dec(&wvtfilter, &Image, &header_size); // hjlee 0901/* printf("Header(DEC)=%d\n", header_size);*/// @@@@@@@@@@// deleted for FDAM1 by Samsung AIT on 2000/02/03// if(!mzte_codec.m_usErrResiDisable)// mzte_codec.m_usSegmentThresh=get_X_bits(16);// ~deleted for FDAM1 by Samsung AIT on 2000/02/03 if ( mzte_codec.m_tiling_disable == 0){// begin: modified by Sharp (99/5/10) if ( mzte_codec.m_iNumOfTile > TargetTileFrom ) mzte_codec.m_target_tile_id_from = TargetTileFrom; else mzte_codec.m_target_tile_id_from = mzte_codec.m_iNumOfTile; if ( mzte_codec.m_iNumOfTile > TargetTileTo ) mzte_codec.m_target_tile_id_to = TargetTileTo; else// FPDAM begin : modified by Sharp// mzte_codec.m_target_tile_id_to = mzte_codec.m_iNumOfTile; mzte_codec.m_target_tile_id_to = mzte_codec.m_iNumOfTile-1;// FPDAM end : modified by Sharp// mzte_codec.m_target_tile_id_from = TargetTileFrom;// mzte_codec.m_target_tile_id_to = TargetTileTo;// end: modified by Sharp (99/5/10)#ifdef _FPDAM_DBG_fprintf(stderr,".......mzte_codec.iNumofTile=%d\n",mzte_codec.m_iNumOfTile);fprintf(stderr,".......mzte_codec.target_tile_id_from=%d\n",mzte_codec.m_target_tile_id_from);fprintf(stderr,".......mzte_codec.target_tile_id_to=%d\n",mzte_codec.m_target_tile_id_to);getchar();#endif target_iNum = mzte_codec.m_target_tile_id_to + 1 - mzte_codec.m_target_tile_id_from;// begin: added by Sharp (99/5/10) if ( mzte_codec.m_iNumOfTile < target_iNum ) iNumOfTile = mzte_codec.m_iNumOfTile; else// end: added by Sharp (99/5/10) iNumOfTile = target_iNum;// begin: modified by Sharp (99/5/10) table = (Int *)malloc(sizeof(Int)*mzte_codec.m_iNumOfTile+1); jump_table = (Int *)malloc(sizeof(Int)*mzte_codec.m_iNumOfTile+1); decode_tile_id = (Int *)malloc(sizeof(Int)*mzte_codec.m_iNumOfTile+1);// end: modified by Sharp (99/5/10) if ( mzte_codec.m_tiling_jump_table_enable == 1 ) tile_table_Dec(table);// begin: modified by Sharp (99/5/10// FPDAM begin : modified by Sharp TileX = mzte_codec.m_iObjectWidth / mzte_codec.m_tile_width + ((mzte_codec.m_iObjectWidth%mzte_codec.m_tile_width)?1:0); TileY = mzte_codec.m_iObjectHeight / mzte_codec.m_tile_height+((mzte_codec.m_iObjectHeight%mzte_codec.m_tile_height)?1:0);// TileX = mzte_codec.m_display_width / mzte_codec.m_tile_width + ((mzte_codec.m_display_width%mzte_codec.m_tile_width)?1:0);// TileY = mzte_codec.m_display_height / mzte_codec.m_tile_height+((mzte_codec.m_display_height%mzte_codec.m_tile_height)?1:0);// FPDAM end : modified by Sharp// Int TileX = mzte_codec.m_display_width / mzte_codec.m_tile_width;// Int TileY = mzte_codec.m_display_height / mzte_codec.m_tile_height;// end: modified by Sharp (99/5/10 Int FromX = mzte_codec.m_target_tile_id_from % TileX; Int ToX = mzte_codec.m_target_tile_id_to % TileX; Int FromY = mzte_codec.m_target_tile_id_from / TileX; Int ToY = mzte_codec.m_target_tile_id_to / TileX; set_decode_tile_id_and_position(&iNumOfTile, &jump_table, &decode_tile_id, table, header_size); mzte_codec.m_display_height = (ToY-FromY+1)*mzte_codec.m_tile_height;// begin : added by Sharp (99/5/10) if ( ToX == TileX-1 ) mzte_codec.m_display_width = mzte_codec.m_iPictWidth - FromX * mzte_codec.m_tile_width; else mzte_codec.m_display_width = (ToX-FromX+1) * mzte_codec.m_tile_width; if ( ToY == TileY-1 ) mzte_codec.m_display_height = mzte_codec.m_iPictHeight - FromY * mzte_codec.m_tile_height; else mzte_codec.m_display_height = (ToY-FromY+1)*mzte_codec.m_tile_height;// FPDAM begin: modifed by Sharp mzte_codec.m_iObjectOriginX += FromX*mzte_codec.m_tile_width; mzte_codec.m_iObjectOriginY += FromY*mzte_codec.m_tile_height;// FPDAM begin: modifed by Sharp if(mzte_codec.m_iQuantType==2) { Int target_spatial_levels; target_spatial_levels=MIN(mzte_codec.m_iSpatialLev, mzte_codec.m_iTargetSpatialLev); MinLevel = mzte_codec.m_iWvtDecmpLev -1- mzte_codec.m_lastWvtDecompInSpaLayer[target_spatial_levels-1][0]; } else { MinLevel = mzte_codec.m_iSpatialLev - mzte_codec.m_iTargetSpatialLev; } if (MinLevel < 0) MinLevel = 0;// FPDAM begin mzte_codec.m_iObjectWidth = mzte_codec.m_iObjectWidth>>MinLevel; mzte_codec.m_iObjectHeight = mzte_codec.m_iObjectHeight>>MinLevel;// mzte_codec.m_display_width = mzte_codec.m_display_width>>MinLevel;// mzte_codec.m_display_height = mzte_codec.m_display_height>>MinLevel;// FPDAM end// end : added by Sharp (99/5/10) /* allocate full frame buffer to store wvt coefficients */// begin: modified by Sharp (99/5/10)// FPDAM begin// frm[0]=(UChar *)malloc(sizeof(UChar)*mzte_codec.m_display_width*mzte_codec.m_display_height);// frm[1]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_display_width>>1)*(mzte_codec.m_display_height>>1));// frm[2]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_display_width>>1)*(mzte_codec.m_display_height>>1)); frm[0]=(UChar *)malloc(sizeof(UChar)*mzte_codec.m_iObjectWidth*mzte_codec.m_iObjectHeight); frm[1]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_iObjectWidth>>1)*(mzte_codec.m_iObjectHeight>>1)); frm[2]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_iObjectWidth>>1)*(mzte_codec.m_iObjectHeight>>1)); frm_mask[0]=(UChar *)malloc(sizeof(UChar)*mzte_codec.m_iObjectWidth*mzte_codec.m_iObjectHeight); frm_mask[1]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_iObjectWidth>>1)*(mzte_codec.m_iObjectHeight>>1)); frm_mask[2]=(UChar *)malloc(sizeof(UChar)*(mzte_codec.m_iObjectWidth>>1)*(mzte_codec.m_iObjectHeight>>1));// FPDAM end// end: modified by Sharp (99/5/10) /* set last tile_id */ id_to = mzte_codec.m_target_tile_id_to; }// begin: added by Sharp (99/4/7) else iNumOfTile = 1;// end: added by Sharp (99/4/7) for (Int ii=0; ii<iNumOfTile; ii++ ){// begin: added by Sharp (99/4/7) if ( mzte_codec.m_tiling_disable == 0 ){ if ( mzte_codec.m_tiling_jump_table_enable == 1 ){ noteProgress("Jump to %d", jump_table[ii]); relative_jump(jump_table[ii]); } else search_tile(decode_tile_id[ii]);// PDAM begin: modified by Sharp// get_virtual_tile_mask(decode_tile_id[ii], TileX, TileY, Image);// tile_header_Dec(); tile_header_Dec(wvtfilter, decode_tile_id[ii], ii, TileX, TileY, &Image);// PDAM end: modified by Sharp } if(!mzte_codec.m_usErrResiDisable) texture_packet_header_Dec(&wvtfilter, &Image, &header_size);// end: added by Sharp (99/4/7) TextureObjectLayer_dec(mzte_codec.m_iTargetSpatialLev, mzte_codec.m_iTargetSNRLev, &wvtfilter, (mzte_codec.m_tiling_disable?ii:decode_tile_id[ii]), ii, bitfile, &table, Image); //modified by SL 03/03/99 // FPDAM : added by SAIT (99/09/03)// begin: added by Sharp (99/5/10) noteProgress("\nInverse Wavelet Transform...."); if ( mzte_codec.m_tiling_disable == 0 ) { // FPDAM : added by SAIT if ( !mzte_codec.m_iAlphaChannel || mzte_codec.m_iTextureTileType != TRANSP_TILE) // FPDAM modified by Sharp perform_IDWT_Tile(wvtfilter, frm, frm_mask, decode_tile_id[ii], TileX); // hjlee 0901 } // FPDAM : added by SAIT else perform_IDWT(wvtfilter, m_cRecImageFile); // hjlee 0901 noteProgress("Completed inverse wavelet transform.");// end: added by Sharp (99/5/10)// begin: added by Sharp (99/4/7) if ( mzte_codec.m_tiling_disable == 0 ){// copy_coeffs(ii, frm); // deleted by Sharp (99/5/10) align_byte(); clear_coeffinfo(); }// end: added by Sharp (99/4/7) }// begin: added by Sharp (99/5/10) if (mzte_codec.m_tiling_disable == 0)// FPDAM begin: modified by Sharp// write_image_tile(m_cRecImageFile, frm); write_image(m_cRecImageFile, mzte_codec.m_iColors, mzte_codec.m_iObjectWidth, mzte_codec.m_iObjectHeight, DisplayWidth, DisplayHeight, mzte_codec.m_iObjectOriginX, mzte_codec.m_iObjectOriginY, frm, frm_mask, mzte_codec.m_iAlphaChannel, FULLSIZE, MinLevel);// FPDAM end: modified by Sharp// end: added by Sharp (99/5/10)// begin: deleted by Sharp (99/4/7)#if 0 else { header_Dec_Common(&wvtfilter, &Image, &header_size); TextureObjectLayer_dec(mzte_codec.m_iTargetSpatialLev, mzte_codec.m_iTargetSNRLev, &wvtfilter, 0, bitfile, &table, Image); //modified by SL@Sarnoff (03/03/99) }#endif// end: deleted by Sharp (99/4/7)// end: added by Sharp (99/2/16)// end: deleted by Sharp (99/2/16)// TextureObjectLayer_dec(mzte_codec.m_iTargetSpatialLev,// mzte_codec.m_iTargetSNRLev, &wvtfilter); // end: deleted by Sharp (99/2/16) /* DISCRETE INVERSE WAVELET TRANSFORM */// begin: deleted by Sharp (99/5/10)// noteProgress("\nInverse Wavelet Transform....");// begin: added by Sharp (99/2/16)// if (mzte_codec.m_tiling_disable== 0)// perform_IDWT_Tile(wvtfilter,m_cRecImageFile,frm);// else// end: added by Sharp (99/2/16)// perform_IDWT(wvtfilter, m_cRecImageFile); // hjlee 0901// noteProgress("Completed inverse wavelet transform.");// end: deleted by Sharp (99/5/10) noteDetail("Freeing up decoding data structures...."); /*----- free up coeff data structure -----*/ 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 decoding data structures."); } else { // version 1 code is copied from here noteProgress("Version 1 bitstream\n"); strcpy(m_cInBitsFile, InBitsFile); strcpy(m_cRecImageFile, RecImageFile); mzte_codec.m_iTargetSpatialLev = TargetSpaLev; mzte_codec.m_iTargetSNRLev = TargetSNRLev; mzte_codec.m_iScanOrder = 0; mzte_codec.m_iAcmMaxFreqChg =0; mzte_codec.m_iAcmOrder =0; mzte_codec.m_iColors=3;// init_acm_maxf_dec(); // hjlee 0901 mzte_codec.m_iSingleBitFile = 1; /* hjlee 0511 */ mzte_codec.m_cBitFile = NULL; mzte_codec.m_cBitFileAC = NULL; TextureObjectLayer_dec_V1(mzte_codec.m_iTargetSpatialLev, mzte_codec.m_iTargetSNRLev, &wvtfilter); /* DISCRETE INVERSE WAVELET TRANSFORM */ noteProgress("\nInverse Wavelet Transform...."); perform_IDWT(wvtfilter, m_cRecImageFile); // hjlee 0901 noteProgress("Completed inverse wavelet transform."); noteDetail("Freeing up decoding data structures...."); /*----- free up coeff data structure -----*/ 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 decoding data structures."); } noteProgress("\n----- Decoding Completed. -----\n");}// begin: added by Sharp (99/2/16)Void CVTCDecoder::tile_table_Dec(Int *table){ Int i; Int tmp; if ( mzte_codec.m_tiling_jump_table_enable == 1 ) for ( i=0; i<mzte_codec.m_iNumOfTile; i++ ){ tmp = (get_X_bits(16) << 16); get_X_bits(1); tmp += get_X_bits(16); get_X_bits(1); table[i] = tmp;/* printf("Decoded Table[%d] = %d\n", i, table[i]);*/ } align_byte1();}Void CVTCDecoder::set_decode_tile_id_and_position(Int *iNumOfTile, Int **jump_table, Int **decode_tile_id, Int *table,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -