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

📄 vtcenc.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	//	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 (mzte_codec.m_Image[col].data);
/*			delete (mzte_codec.m_Image[col].mask);*/
			if ( mzte_codec.m_tiling_disable == 0 ){ //modified by SL 030399
				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 + -