📄 vtcenc.cpp
字号:
// 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 + -