📄 pezw_utils.cpp
字号:
else
emit_bits_checksc (data[len-1]>>bits_to_go,8-bits_to_go);
/* if last bit is 1, output 1 */
if(bits_to_go==8)
bits_to_go = 0;
Bit = (data[len-1]>>bits_to_go)&0x01;
if(!Bit)
emit_bits_checksc(1,1);
if(DEBUG_BS)
fprintf(stdout, "color %d spa_lev %d snr_lev %d: %d\n",
col, spalev, snr_lev-snroffset, len);
} /* end of !all_zero */
} /* end of color plane */
} /* end of spatial level */
}
} /* end of else scan_order */
}
/* unpacke the bitstream into Spatial and SNR layer bitstreams
SPlayer data structure will be created here */
void CVTCDecoder::PEZW_bit_unpack (PEZW_SPATIAL_LAYER **SPlayer)
{
int splev, snrlev;
int spatial_id, snr_id;
int color;
int Quant[3]={0,0,0}, q;
int snr_scalability_levels;
int texture_spatial_layer_start_code;
int snr_layer_start_code;
unsigned char buffer[MAXSIZE];
long len;
int h,w;
int n;
int Snrlevels;
// int i, j;
/* initialize data structure */
h=mzte_codec.m_iHeight;
w=mzte_codec.m_iWidth;
for (color=0;color<mzte_codec.m_iColors;color++)
SPlayer[color] = (PEZW_SPATIAL_LAYER *)calloc (mzte_codec.m_iWvtDecmpLev,
sizeof(PEZW_SPATIAL_LAYER));
/* get the quantization step sizes */
get_X_bits_checksc_init();
for (color=0;color<mzte_codec.m_iColors;color++){
do {
q = get_X_bits_checksc(8);
Quant[color] <<= 7;
Quant[color] += q%128;
} while (q>=128);
}
/* get the snr scalability levels
this is the maximum level for all three color components,
it will be adjusted later on according to all_zero flag */
snr_scalability_levels = get_X_bits(5);
/* get the snr layer */
if (mzte_codec.m_bStartCodeEnable)
Snrlevels=snr_scalability_levels;
else
Snrlevels=1;
for (color=0;color<mzte_codec.m_iColors;color++){
/* allocate SNR data structure */
for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
{
SPlayer[color][splev].SNR_scalability_levels = snr_scalability_levels;
SPlayer[color][splev].SNRlayer = (PEZW_SNR_LAYER *)
calloc(snr_scalability_levels, sizeof(PEZW_SNR_LAYER));
SPlayer[color][splev].SNRlayer[0].Quant = Quant[color];
if (color==0){
SPlayer[color][0].SNRlayer[0].snr_image.height = h;
SPlayer[color][0].SNRlayer[0].snr_image.width = w;
}
else{
SPlayer[color][0].SNRlayer[0].snr_image.height = h/2;
SPlayer[color][0].SNRlayer[0].snr_image.width = w/2;
}
}
} /* end of color */
/* for bileve mode, start code is always enabled */
if (!mzte_codec.m_bStartCodeEnable)
{
fprintf(stdout,"\nFor bilevel mode, SNR_start_code must be enabled!\n");
exit(-1);
}
/* parse the bitstream */
if (mzte_codec.m_bStartCodeEnable){
/* align byte. Note the difference between
align_byte and align_byte1. */
align_byte();
if(mzte_codec.m_iScanOrder==1){
for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
{
/* check start code */
if (mzte_codec.m_bStartCodeEnable){
align_byte1();
texture_spatial_layer_start_code = get_X_bits(32);
if (texture_spatial_layer_start_code !=
TEXTURE_SPATIAL_LAYER_START_CODE)
printf("Wrong texture_spatial_layer_start_code.");
spatial_id = get_X_bits(5);
}
for (snrlev=0;snrlev<Snrlevels;snrlev++)
{
if (mzte_codec.m_bStartCodeEnable)
{
align_byte1();
snr_layer_start_code = get_X_bits(32);
if (snr_layer_start_code != texture_snr_layer_start_code)
printf("Wrong texture_snr_layer_start_code.");
snr_id = get_X_bits(5);
get_X_bits_checksc_init();
}
len=0;
/* first put all the data in SPlayer[0] */
/* the separation of the color components bitstreams will
be done by the decoding process */
if ((splev==mzte_codec.m_iWvtDecmpLev-1)&&
(snrlev == Snrlevels-1))
len=get_allbits_checksc(buffer);
else{
if ((!mzte_codec.m_bStartCodeEnable) /* only one bitstream */
|| (snrlev==Snrlevels-1))
{
/* look for the next spatial layer start code */
while(1){
/* chekc for the next start code*/
if(!Is_startcode(TEXTURE_SPATIAL_LAYER_START_CODE)){
buffer[len] = get_X_bits_checksc(8);
len++;
}
else{
buffer[len++]=align_byte_checksc();
break; /* start code found */
}
} /* end of while */
}
else{
while(1){
/* chekc for the next start code*/
if(!Is_startcode(texture_snr_layer_start_code)){
buffer[len] = get_X_bits_checksc(8);
len++;
}
else{
buffer[len++]=align_byte_checksc();
break; /* start code found */
}
} /* end of while(1) */
} /* end of if(!mzte_...) */
} /* end of if(splev== ...) */
SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.length = len;
SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data =
(char *)calloc(len+2,sizeof(char));
memcpy(SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data,
buffer,len);
if(DEBUG_BS_DETAIL)
for(n=0;n<len;n++)
fprintf(stdout,"%d ",
((unsigned char *)SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data)[n]);
if (DEBUG_BS)
fprintf(stdout,"spa_lev %d snr_lev %d: %d\n", splev, snrlev, len);
} /* snr levels */
} /* spatial levels */
}
else /* scan_order == 0 */
{
for (snrlev=0;snrlev<Snrlevels;snrlev++)
{
/* check start code */
if (mzte_codec.m_bStartCodeEnable){
align_byte1();
snr_layer_start_code = get_X_bits(32);
if (snr_layer_start_code != texture_snr_layer_start_code)
printf("Wrong texture_snr_layer_start_code.");
snr_id = get_X_bits(5);
}
for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
{
if (mzte_codec.m_bStartCodeEnable)
{
align_byte1();
texture_spatial_layer_start_code = get_X_bits(32);
if (texture_spatial_layer_start_code !=
TEXTURE_SPATIAL_LAYER_START_CODE)
printf("Wrong texture_spatial_layer_start_code.");
spatial_id = get_X_bits(5);
get_X_bits_checksc_init();
}
len=0;
/* first put all the data in SPlayer[0] */
/* the separation of the color components bitstreams will
be done by the decoding process */
if ((splev==mzte_codec.m_iWvtDecmpLev-1)&&
(snrlev == Snrlevels-1))
len=get_allbits_checksc(buffer);
else{
if ((!mzte_codec.m_bStartCodeEnable) /* only one bitstream */
|| (splev==mzte_codec.m_iWvtDecmpLev-1))
{
/* look for the next spatial layer start code */
while(1){
/* chekc for the next start code*/
if(!Is_startcode(texture_snr_layer_start_code)){
buffer[len] = get_X_bits_checksc(8);
len++;
}
else{
buffer[len++]=align_byte_checksc();
break; /* start code found */
}
} /* end of while */
}
else{
while(1){
/* chekc for the next start code*/
if(!Is_startcode(TEXTURE_SPATIAL_LAYER_START_CODE)){
buffer[len] = get_X_bits_checksc(8);
len++;
}
else{
buffer[len++]=align_byte_checksc();
break; /* start code found */
}
} /* end of while(1) */
} /* end of if(!mzte_...) */
} /* end of if(splev== ...) */
SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.length = len;
SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data =
(char *)calloc(len+2,sizeof(char));
memcpy(SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data,
buffer,len);
if(DEBUG_BS_DETAIL)
for(n=0;n<len;n++)
fprintf(stdout,"%d ",
((unsigned char *)SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data)[n]);
if (DEBUG_BS)
fprintf(stdout,"spa_lev %d snr_lev %d: %d\n", splev, snrlev, len);
} /* spatial levels */
} /* snr levels */
} /* end of else scan_order */
}
else { /* no start code enabled */
fprintf(stdout,"\nFor bilevel mode, SNR_start_code must be enabled!\n");
exit(-1);
}
for(color=0;color<mzte_codec.m_iColors;color++) {
h = SPlayer[color][0].SNRlayer[0].snr_image.height;
w = SPlayer[color][0].SNRlayer[0].snr_image.width;
if ((SPlayer[color][0].SNRlayer[0].snr_image.data = calloc(h*w, sizeof(WINT)))
== NULL){
printf ("Can not allocate memory in Init_PEZWdata()");
exit(-1);
}
}
}
/* left shift a stream by N<8 bits */
int CVTCCommon::lshift_by_NBit (unsigned char *data, int len, int N)
{
int n;
char mask=0;
int output;
if(len==0)
return 1;
output = data[0]>>(8-N);
for(n=0;n<N;n++)
mask = (mask<<1) | 0x01;
for (n=0;n<len-1;n++)
data[n] = (data[n]<<N) | ((data[n+1]>>(8-N)) & mask);
data[len-1] <<= N;
return output;
}
/* free up memory at the encoder */
void CVTCEncoder::PEZW_freeEnc (PEZW_SPATIAL_LAYER **SPlayer)
{
int levels;
int col, l;
int snrlev;
for (col=0; col<mzte_codec.m_iColors; col++)
{
/* free the image buffer */
free(SPlayer[col][0].SNRlayer[0].snr_image.data);
/* free the mask buffer */
free(SPlayer[col]->SNRlayer[0].snr_image.mask);
if (col ==0)
levels = mzte_codec.m_iWvtDecmpLev;
else
levels = mzte_codec.m_iWvtDecmpLev-1;
/* free the SNR layer */
for(l=0;l<levels;l++){
for (snrlev=0;snrlev<SPlayer[col][l].SNR_scalability_levels;
snrlev++)
if(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data!=NULL)
free(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data);
free(SPlayer[col][l].SNRlayer);
}
/* free SPlayer */
free(SPlayer[col]);
}
/* parameters for inverse wvt */
mzte_codec.m_iSpatialLev = mzte_codec.m_iTargetSpatialLev;
mzte_codec.m_iTargetSpatialLev = PEZW_target_spatial_levels;
}
void CVTCDecoder::PEZW_freeDec (PEZW_SPATIAL_LAYER **SPlayer)
{
int levels;
int col, l;
int snrlev;
for (col=0; col<mzte_codec.m_iColors; col++)
{
/* free the image buffer */
free(SPlayer[col][0].SNRlayer[0].snr_image.data);
/* free the mask buffer */
free(SPlayer[col][0].SNRlayer[0].snr_image.mask );
if (col ==0)
levels = mzte_codec.m_iWvtDecmpLev;
else
levels = mzte_codec.m_iWvtDecmpLev-1;
/* free the SNR layer */
for(l=0;l<levels;l++){
if (!mzte_codec.m_bStartCodeEnable)
free(SPlayer[col][l].SNRlayer[0].snr_bitstream.data);
else {
if (col==0){
for (snrlev=0;snrlev<SPlayer[col][l].SNR_scalability_levels;
snrlev++)
if(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data!=NULL)
free(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data);
}
}
}
}
/* free SNRlayer */
levels = mzte_codec.m_iWvtDecmpLev;
for (col=0; col<mzte_codec.m_iColors; col++)
for(l=0;l<levels;l++)
free(SPlayer[col][l].SNRlayer);
/* free SPlayer */
for (col=0; col<mzte_codec.m_iColors; col++)
free(SPlayer[col]);
/* parameters for inverse wvt */
if(PEZW_target_spatial_levels>mzte_codec.m_iWvtDecmpLev)
PEZW_target_spatial_levels=mzte_codec.m_iWvtDecmpLev;
mzte_codec.m_iSpatialLev = PEZW_target_spatial_levels;
mzte_codec.m_iTargetSpatialLev = PEZW_target_spatial_levels;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -