📄 pezw_texturelayerbq.cpp
字号:
}
/* get the bitstreams for each color */
/* for YUV420, the U,V color component has one less level */
if(col==1)
splev_start=1;
else
splev_start=0;
for (splev=0;splev<levels-spatial_leveloff;splev++) /* from coarse scale to fine scale */
{
for(snrlev=SPlayer[0][splev].SNR_scalability_levels-1;snrlev>=Min_Bitplane;snrlev--) /* from msb to lsb */
{
/* for SPlayer, snrlayer 0 means msb bits, need to invert order */
bplane = SPlayer[col][splev].SNR_scalability_levels-snrlev-1;
if(col==0)
{
Init_Bufsize[splev][snrlev] = SPlayer[0][splev].SNRlayer[bplane].snr_bitstream.length;
PEZW_bitstream[splev][snrlev] = (unsigned char *) SPlayer[0][splev].SNRlayer[bplane].snr_bitstream.data;
if(splev==0){
splev0_bitstream[snrlev] = PEZW_bitstream[0][snrlev];
splev0_bitstream_len[snrlev] = Init_Bufsize[0][snrlev];
}
}
else{
Init_Bufsize[splev][snrlev] = Init_Bufsize[splev+splev_start][snrlev];
PEZW_bitstream[splev][snrlev] = PEZW_bitstream[splev+splev_start][snrlev];
reach_budget[splev][snrlev] = reach_budget[splev+splev_start][snrlev];
}
/* get all zero and subband skipping info. */
if(splev==0){
all_non_zero[col] = lshift_by_NBit (splev0_bitstream[snrlev], splev0_bitstream_len[snrlev], 1);
if(!all_non_zero[col]){
all_zero[col] = lshift_by_NBit (splev0_bitstream[snrlev], splev0_bitstream_len[snrlev], 1);
if(!all_zero[col]){
LH_zero[col] = lshift_by_NBit (splev0_bitstream[snrlev], splev0_bitstream_len[snrlev], 1);
HL_zero[col] = lshift_by_NBit (splev0_bitstream[snrlev], splev0_bitstream_len[snrlev], 1);
HH_zero[col] = lshift_by_NBit (splev0_bitstream[snrlev], splev0_bitstream_len[snrlev], 1);
}
}
else
all_zero[col]=0;
}
if(all_zero[col] && (splev==0))
Max_Bitplane--;
if(all_zero[col]){
decoded_bytes[splev][snrlev] = 0;
continue;
}
else /* skip the leading '1' */
lshift_by_NBit (PEZW_bitstream[splev][snrlev], Init_Bufsize[splev][snrlev], 1);
} /* end of snrlev */
} /* end of splev */
/* allocate wvt_coeffs */
wvt_coeffs = (WINT **)calloc(h,sizeof(WINT *));
wvt_coeffs[0] = (WINT *)(SPlayer[col][0].SNRlayer[0].snr_image.data);
for(i=1;i<h;i++)
wvt_coeffs[i] = wvt_coeffs[0]+i*w;
if(Max_Bitplane>0){
/* this step must follow the previous step */
setbuffer_PEZW_decode ();
/* decode the bitstream for this color component */
PEZW_decode_block (wvt_coeffs,w,h);
/* finish PEZW coding for this color component
retrun the number of bytes decoded in Init_Bufsize */
PEZW_decode_done ( );
for(splev=0;splev<levels-spatial_leveloff;splev++)
for(snrlev=Min_Bitplane;snrlev<Max_Bitplane;snrlev++)
{
total_decoded_bytes += decoded_bytes[splev][snrlev];
if(col<2){
/* adjust for residue bits in last byte */
unsigned char Bit;
//unsigned char *data;
PEZW_bitstream[splev][snrlev] += decoded_bytes[splev][snrlev];
Init_Bufsize[splev][snrlev] -= decoded_bytes[splev][snrlev];
Bit = (*(PEZW_bitstream[splev][snrlev]-1)>>bits_to_go_inBuffer[splev][snrlev])&0x01;
if(bits_to_go_inBuffer[splev][snrlev]>0){
PEZW_bitstream[splev][snrlev]--;
Init_Bufsize[splev][snrlev]++;
lshift_by_NBit(PEZW_bitstream[splev][snrlev],Init_Bufsize[splev][snrlev],
8-bits_to_go_inBuffer[splev][snrlev]);
}
/* check last bit */
if(!Bit)
lshift_by_NBit(PEZW_bitstream[splev][snrlev],Init_Bufsize[splev][snrlev],1);
if((splev==0)&&(col==0)){
splev0_bitstream[snrlev] = PEZW_bitstream[0][snrlev];
splev0_bitstream_len[snrlev] = Init_Bufsize[0][snrlev];
}
}
}
}
/* dequantize */
Quant[col] = SPlayer[col][0].SNRlayer[0].Quant;
dc_w = w>>levels;
dc_h = h>>levels;
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
if((i<dc_h) && (j<dc_w))
continue;
if(wvt_coeffs[i][j]==0)
temp = 0;
else
temp = (int)((abs(wvt_coeffs[i][j])+0.5)*Quant[col]);
wvt_coeffs[i][j] = (wvt_coeffs[i][j]>0)?temp:-temp;
}
/* copy data to structure */
(SPlayer[col][0].SNRlayer[0].snr_image.data) = (WINT *) wvt_coeffs[0];
/* free memory */
free(wvt_coeffs);
}
printf("total actually decoded bits: %ld\n", (total_decoded_bytes+bytes_decoded)*8);
printf("total actually decoded AC band bits: %ld", total_decoded_bytes*8);
/* put the decoded wavelet coefficients back into the data structure */
restore_PEZWdata (SPlayer);
/* free memory */
PEZW_freeDec (SPlayer);
free(SPlayer);
for(i=0;i<levels;i++)
free(PEZW_bitstream[i]);
free(PEZW_bitstream);
for (i=0;i<levels;i++)
free(Init_Bufsize[i]);
free(Init_Bufsize);
for (i=0;i<levels;i++)
free(reach_budget[i]);
free(reach_budget);
for (i=0;i<levels+1;i++)
free(bits_to_go_inBuffer[i]);
free(bits_to_go_inBuffer);
for (i=0;i<levels+1;i++)
free(decoded_bytes[i]);
free(decoded_bytes);
free(splev0_bitstream);
free(splev0_bitstream_len);
}
/* rate control at decoding */
void CVTCDecoder::PEZW_decode_ratecontrol (PEZW_SPATIAL_LAYER **SPlayer, int bytes_decoded)
{
int i, levels;
long decoded_bits=bytes_decoded;
int splayer, snrlev, bplane;
int MaxBitplanes;
int last_bplane = 0, last_splayer = 0, adjusted_rate=0;
int diffrate;
int min_snrlev;
levels = mzte_codec.m_iWvtDecmpLev;
/* allocate rate control structure */
reach_budget = (unsigned char **) calloc(levels,sizeof(char *));
for(i=0;i<levels;i++)
reach_budget[i]= (unsigned char *)calloc(Max_Bitplane,sizeof(char));
/* target bitplane */
Min_Bitplane = SPlayer[0][0].SNR_scalability_levels-PEZW_target_snr_levels;
if ( Min_Bitplane < 0)
Min_Bitplane = 0;
/* target spatial level */
spatial_leveloff = mzte_codec.m_iWvtDecmpLev-PEZW_target_spatial_levels;
if (spatial_leveloff <0)
spatial_leveloff=0;
/* figure out the target snr and spatial layer
and the length for the last layer for target_bitrate options */
MaxBitplanes = SPlayer[0][0].SNR_scalability_levels;
if ((decoded_bits < PEZW_target_bitrate/8) && (PEZW_target_bitrate >0)){
if(mzte_codec.m_iScanOrder==1)
{
for (splayer=0;splayer<mzte_codec.m_iWvtDecmpLev-spatial_leveloff ;splayer++)
for (snrlev=MaxBitplanes-1;snrlev>=Min_Bitplane;snrlev--)
{
/* for SPlayer, snrlayer 0 means msb bits, need to invert order */
bplane = SPlayer[0][splayer].SNR_scalability_levels
-snrlev-1;
decoded_bits += SPlayer[0][splayer].SNRlayer[bplane].snr_bitstream.length;
if ( decoded_bits >= mzte_codec.m_iTargetBitrate/8){
adjusted_rate = 1;
last_bplane = bplane;
last_splayer = splayer;
goto outside;
}
}
}
else if (mzte_codec.m_iScanOrder==0)
{
for (snrlev=MaxBitplanes-1;snrlev>=Min_Bitplane;snrlev--)
for (splayer=0;splayer<mzte_codec.m_iWvtDecmpLev-spatial_leveloff ;splayer++)
{
/* for SPlayer, snrlayer 0 means msb bits, need to invert order */
bplane = SPlayer[0][splayer].SNR_scalability_levels
-snrlev-1;
decoded_bits += SPlayer[0][splayer].SNRlayer[bplane].snr_bitstream.length;
if ( decoded_bits >= PEZW_target_bitrate/8){
adjusted_rate = 1;
last_bplane = bplane;
last_splayer = splayer;
goto outside;
}
}
}
}
outside:
if(adjusted_rate){
diffrate = decoded_bits - PEZW_target_bitrate/8;
SPlayer[0][last_splayer].SNRlayer[last_bplane].snr_bitstream.length
-= diffrate;
/* set up target snr and spatial levels, as well as
the rate control matrix */
if (mzte_codec.m_iScanOrder==0){
min_snrlev = MaxBitplanes-1-last_bplane;
for (splayer=last_splayer;splayer<mzte_codec.m_iWvtDecmpLev-spatial_leveloff;splayer++)
reach_budget[splayer][min_snrlev] = 1;
reach_budget[last_splayer][min_snrlev]=0;
Min_Bitplane = min_snrlev;
}
else if (mzte_codec.m_iScanOrder==1){
min_snrlev = MaxBitplanes-1-last_bplane;
for (bplane=min_snrlev;bplane>=Min_Bitplane;bplane--)
reach_budget[last_splayer][bplane] = 1;
reach_budget[last_splayer][min_snrlev]=0;
spatial_leveloff = mzte_codec.m_iWvtDecmpLev-1-last_splayer;
}
decoded_bits = PEZW_target_bitrate;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -