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

📄 vtcdec.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  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 + -