⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtcdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				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 + -