📄 vtcenc.cpp
字号:
{ snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image); /* Set global color variable */ mzte_codec.m_iCurColor = col; snr_image->quant = mzte_codec.m_Qinfo[col][0].Quant[0]; /* initialization of spatial dimensions for each color component */ setSpatialLevelAndDimensions(0, col); /* initialize AC coefficient info for each color component */ if ((err=ztqInitAC(0, col))) errorHandler("ztqInitAC"); /* quantize and mark zerotree structure for AC coefficients */ if ((err=encQuantizeAndMarkAC(col))) errorHandler("encQuantizeAndMarkAC"); } /*------- AC: encode all color components -------*/ if (mzte_codec.m_iScanDirection==0) /* tree-depth scan */ { /* put quant value and maximums on the bitstream */ for(col=0;col<mzte_codec.m_iColors; col++){ snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image); Put_Quant_and_Max(snr_image,0,col); // hjlee 0901 } /* losslessly encoding AC coefficients */ wavelet_higher_bands_encode_SQ_tree(); } else /* band by band scan */ { setSpatialLayerDimsSQ(1); // hjlee 0901 /* Assumes all three color components have the same number of SNR levels */ for (col=0; col<mzte_codec.m_iColors; col++) mzte_codec.m_SPlayer[col].SNR_scalability_levels = 1; /* Loop through spatial layers */ for (spa_lev=0; spa_lev<mzte_codec.m_iSpatialLev; spa_lev++) { mzte_codec.m_iCurSpatialLev=spa_lev; for (col=0; col<mzte_codec.m_iColors; col++) setSpatialLevelAndDimensions(spa_lev,col); /*----- AC: Set global spatial layer. -----*/ mzte_codec.m_iCurSpatialLev = spa_lev; /* Update spatial level coeff info if changing spatial levels. Do this for all color components */ if (mzte_codec.m_bStartCodeEnable) { TextureSpatialLayerSQ_enc(spa_lev,bitfile); } else TextureSpatialLayerSQNSC_enc(spa_lev); } } /* store the max snr_lev and spa_lev so that the decoder can decode the bitstream up to the max level. */ mzte_codec.m_iTargetSpatialLev = 1; mzte_codec.m_iTargetSNRLev = 1; noteProgress("Completed encoding AC coefficients - Single-Quant Mode.");}/**********************************************************/Void CVTCEncoder::TextureSNRLayerMQ_encode(Int spa_lev, Int snr_lev, FILE *fp){ SNR_IMAGE *snr_image; Int col; static Int texture_snr_layer_id=0; if(mzte_codec.m_bStartCodeEnable){ noteProgress("Encoding Multi-Quant Mode Layer with SNR start code...."); /* header */ emit_bits((UShort)texture_snr_layer_start_code>>16,16); emit_bits((UShort)texture_snr_layer_start_code,16); emit_bits((UShort)texture_snr_layer_id++,5); } else noteProgress("Encoding Multi-Quant Mode Layer without SNR start code...."); noteProgress("Multi-Quant Mode - Spatial %d, SNR %d", spa_lev,snr_lev); for(col=0; col < NCOL; col++) { noteDetail("width=%d height=%d",mzte_codec.m_SPlayer[col].width, mzte_codec.m_SPlayer[col].height); /* Set global color variable */ mzte_codec.m_iCurColor = col; /* Set quant value */ snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image); snr_image->quant = mzte_codec.m_Qinfo[col][spa_lev].Quant[snr_lev]; noteDebug("AC quant=%d", mzte_codec.m_Qinfo[col][spa_lev].Quant[snr_lev]); /* initialization of spatial dimensions for each color component */ if (snr_lev==0) setSpatialLevelAndDimensions(spa_lev, col); /* get maximum residual value - this one is derived from user Q inputs not actual values. Also assign skip modes. */ updateResidMaxAndAssignSkips(col); noteDebug("resid_max=%d\n",snr_image->residual_max); /* quantize and mark zerotree structure for AC coefficients */ if (encQuantizeAndMarkAC(col)) errorHandler("encQuantizeAndMarkAC"); // Put_Quant_and_Max(snr_image); // hjlee 0901 Put_Quant_and_Max(snr_image,spa_lev,col); // hjlee 0901 } wavelet_higher_bands_encode_MQ(mzte_codec.m_iScanDirection); for(col=0; col < NCOL; col++) { /* Set global color variable */ mzte_codec.m_iCurColor = col; /* Update states of AC coefficients */ if (encUpdateStateAC(mzte_codec.m_iCurColor)) errorHandler("encUpdateStateAC"); }} Void CVTCEncoder::textureLayerMQ_Enc(FILE *bitfile){ Int err, spa_lev, snr_lev=0, snr_scalability_levels; Char fname[100]; // hjlee getSpatialLayerDims(); // hjlee 0901 // hjlee 0901 /*------- AC: Initialize QList Structure -------*/ if ((err=ztqQListInit())) errorHandler("Allocating memory for QList information."); /* Initialize coeffs */ setSpatialLevelAndDimensions(0,0); if ((err=ztqInitAC(0,0))) errorHandler("ztqInitAC"); if (mzte_codec.m_iColors > 1) { if (mzte_codec.m_lastWvtDecompInSpaLayer[0][1]<0) setSpatialLevelAndDimensions(1,1); else setSpatialLevelAndDimensions(0,1); if ((err=ztqInitAC(0,1))) errorHandler("ztqInitAC"); } if (mzte_codec.m_iColors > 2) { if (mzte_codec.m_lastWvtDecompInSpaLayer[0][2]<0) setSpatialLevelAndDimensions(1,2); else setSpatialLevelAndDimensions(0,2); if ((err=ztqInitAC(0,2))) errorHandler("ztqInitAC"); } /* Loop through spatial layers */ for (spa_lev=0; spa_lev<mzte_codec.m_iSpatialLev; spa_lev++) { /*----- AC: Set global spatial layer and SNR scalability level. -----*/ /* Assumes all three color components have the same number of SNR levels */ mzte_codec.m_iCurSpatialLev = spa_lev; mzte_codec.m_SPlayer[0].SNR_scalability_levels = mzte_codec.m_Qinfo[0][spa_lev].SNR_scalability_levels; snr_scalability_levels = mzte_codec.m_SPlayer[0].SNR_scalability_levels; /* Update spatial level coeff info if changing spatial levels. Do this for all color components. */ if (spa_lev != 0) { for (mzte_codec.m_iCurColor = 0; mzte_codec.m_iCurColor<mzte_codec.m_iColors; mzte_codec.m_iCurColor++) { setSpatialLevelAndDimensions(mzte_codec.m_iCurSpatialLev, mzte_codec.m_iCurColor);// hjlee 0901 if (mzte_codec.m_lastWvtDecompInSpaLayer[spa_lev-1][mzte_codec.m_iCurColor] >=0) spatialLayerChangeUpdate(mzte_codec.m_iCurColor); } } if (!mzte_codec.m_bStartCodeEnable) /*------- AC: Write header info to bitstream file -------*/ emit_bits(snr_scalability_levels, 5); /* Loop through SNR layers */ for (snr_lev=0; snr_lev<snr_scalability_levels; snr_lev++) { /*----- AC: Set global SNR layer -----*/ mzte_codec.m_iCurSNRLev = snr_lev; if (mzte_codec.m_bStartCodeEnable) { /*------- AC: Open and initialize bitstream file -------*/ if (mzte_codec.m_iSingleBitFile==0) { sprintf(fname,mzte_codec.m_cBitFileAC, mzte_codec.m_iCurSpatialLev, mzte_codec.m_iCurSNRLev); if ((bitfile=fopen(fname,"wb"))==NULL) errorHandler("Can't open file '%s' for writing.",fname); } /* initialize the buffer */ init_bit_packing_fp(bitfile,1); if (snr_lev==0) { /*------- AC: Write header info to bitstream file -------*/ emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE >> 16, 16); emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE, 16); emit_bits(spa_lev, 5); emit_bits(snr_scalability_levels, 5); flush_bits(); /* byte alignment before start code */ } } /*------- AC: Quantize and encode all color components -------*/ TextureSNRLayerMQ_encode(spa_lev, snr_lev, bitfile); if (mzte_codec.m_bStartCodeEnable) { if (mzte_codec.m_iSingleBitFile) flush_buffer_file(); else close_buffer_file(bitfile); } } /* snr_lev */ } /* spa_lev */ /* store the max snr_lev and spa_lev so that the decoder can decode the bitstream up to the max level. */ mzte_codec.m_iTargetSpatialLev = spa_lev; mzte_codec.m_iTargetSNRLev = snr_lev; /*------- AC: Free Qlist structure -------*/ ztqQListExit(); }/**********************************************************/Void CVTCEncoder::TextureObjectLayer_enc(FILTER **wvtfilter)//Void CVTCEncoder::TextureObjectLayer_enc(FILTER *wvtfilter) // hjlee 0901{ FILE *bitfile; /*------- 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); /* for PEZW, always enabled */ if (mzte_codec.m_iQuantType == BILEVEL_Q) mzte_codec.m_bStartCodeEnable = 1; /* initialize variables */ init_bit_packing_fp(bitfile,1); /* Write header info to bitstream */ header_Enc(wvtfilter); /*------- DC: Quantize and encode all color components -------*/ textureLayerDC_Enc(); /*------- DC: Close bitstream file -------*/ /* hjlee 001 */ if (mzte_codec.m_bStartCodeEnable){ if(mzte_codec.m_iSingleBitFile) flush_buffer_file(); else close_buffer_file(bitfile); } /*-------------------------------------------------*/ /*--------------------- AC ------------------------*/ /*-------------------------------------------------*/ /*------- AC: SINGLE-QUANT MODE -------*/ if (mzte_codec.m_iQuantType == SINGLE_Q) textureLayerSQ_Enc(bitfile); /*------- AC: MULTI-QUANT MODE -------*/ else if (mzte_codec.m_iQuantType == MULTIPLE_Q) textureLayerMQ_Enc(bitfile); else if (mzte_codec.m_iQuantType == BILEVEL_Q) { textureLayerBQ_Enc(bitfile); } if (mzte_codec.m_iSingleBitFile){ if(!mzte_codec.m_bStartCodeEnable) close_buffer_file(bitfile); else fclose(bitfile); }}/**************************************************************/Void CVTCEncoder::encode(){ FILTER **synfilter,**anafilter; // hjlee 0901 Int i; // hjlee 0901 // 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(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]); int col; for (/*int*/ 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++) { 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).")); int y; for (/* int*/ 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 (int 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(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"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -