📄 vtcdec.cpp
字号:
free(Image);
#endif
// end: deleted by sharp (99/3/29)
#endif
if (mzte_codec.m_iSingleBitFile==0){
if(!mzte_codec.m_bStartCodeEnable)
align_byte();
fclose(bitfile);
}
} else {
// if ( iTile == 0 ) // FPDAM : added by SAIT (99/09/03)
if ( count == 0 )
{ // added by Sharp (99/2/16)
for (col=0; col<mzte_codec.m_iColors; col++) {
h = mzte_codec.m_iHeight >> (Int)(col>0);
w = mzte_codec.m_iWidth >> (Int)(col>0);
mzte_codec.m_SPlayer[col].coeffinfo = new COEFFINFO * [h];
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 [h*w];
if (mzte_codec.m_SPlayer[col].coeffinfo[0] == NULL)
exit(fprintf(stderr,"Allocating memory for coefficient structure (II)."));
for (/*int*/ y = 1; y < h; ++y)
mzte_codec.m_SPlayer[col].coeffinfo[y] =
mzte_codec.m_SPlayer[col].coeffinfo[y-1]+w;
for (y=0; y<h; y++)
for (/*int*/ x=0; x<w; x++) {
mzte_codec.m_SPlayer[col].coeffinfo[y][x].skip =0;
mzte_codec.m_SPlayer[col].coeffinfo[y][x].wvt_coeff = 0;
mzte_codec.m_SPlayer[col].coeffinfo[y][x].rec_coeff = 0;
mzte_codec.m_SPlayer[col].coeffinfo[y][x].quantized_value = 0;
// mzte_codec.m_SPlayer[col].coeffinfo[y][x].qState = 0;
mzte_codec.m_SPlayer[col].coeffinfo[y][x].type = 0;
mzte_codec.m_SPlayer[col].coeffinfo[y][x].mask = 0;
}
}
noteDetail("Completed creating and initializing data structures.");
} // added by Sharp (99/2/16)
if (mzte_codec.m_iSingleBitFile==0){
if(!mzte_codec.m_bStartCodeEnable)
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, TileX, TileY;
// end: added by Sharp (99/5/10)
noteProgress("\n----- MPEG-4 Visual Texture Coding: Decoding -----\n");
mzte_codec.m_visual_object_verid = 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -