📄 ztscan_enc.cpp
字号:
Int czt_type; /* what to put on bitstream */
Int l;
l=xy2wvtDecompLev(w,h);
zt_type = coeffinfo[h][w].type;
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1) /* skip out-node */
#endif
switch(coeffinfo[h][w].state)
{
case S_INIT:
czt_type=zt_type;
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],czt_type);
break;
case S_ZTR:
czt_type=zt_type;
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR],czt_type);
break;
case S_ZTR_D:
czt_type=zt_type;
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR_D],czt_type);
break;
case S_IZ:
czt_type = (zt_type!=IZ);
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_IZ],czt_type);
break;
case S_LINIT:
czt_type = (zt_type!=ZTR);
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],czt_type);
break;
case S_LZTR:
czt_type = (zt_type!=ZTR);
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR],czt_type);
break;
case S_LZTR_D:
czt_type = (zt_type!=ZTR);
mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR_D],czt_type);
break;
default:
errorHandler("Invalid state (%d) in multi-quant encoding.",
coeffinfo[h][w].state);
}
}
/* mark ztr_d and encode magnitudes */
switch(zt_type)
{
case ZTR:
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1) {
#endif
dcc[k]=1;
mark_ZTR_D(h,w);
#ifdef _SHAPE_
}
else
dcc[k]=0;
#endif
break;
case IZ:
dcc[k]=0;
break;
case VZTR:
dcc[k]=1;
mark_ZTR_D(h,w);
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1) /* only code for in-node */
#endif
mag_sign_encode_MQ(h,w);
break;
case VAL:
dcc[k]=0;
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1) /* only code for in-node*/
#endif
mag_sign_encode_MQ(h,w);
break;
default:
errorHandler("Invalid type in multi quant decoding.");
}
}
/********************* CODE CHILDREN *****************************/
if (!IS_STATE_LEAF(coeffinfo[h0][w0].state))
{
Int i, j;
for (k=0; k<nSib; ++k)
{
if (dcc[k]==0)
{
h = h0 + (k/2);
w = w0 + (k%2);
/* scan children */
i=h<<1; j=w<<1;
encode_pixel_MQ_tree(i,j);
}
}
}
}
#endif
/********************************************************
Function Name
-------------
static Void mag_sign_encode_MQ(Int h,Int w)
Arguments
---------
Int h,Int w - position of a pixel
Description
-----------
Encode the value of a coefficient.
Functions Called
----------------
mzte_ac_encode_symbol()
Return Value
------------
None.
********************************************************/
Void CVTCEncoder::mag_sign_encode_MQ(Int h,Int w)
{
Int val,v_sign;
Int l;
if(coeffinfo[h][w].skip)
return;
l=xy2wvtDecompLev(w,h);
if((val=coeffinfo[h][w].quantized_value)>=0)
v_sign=0;
else
{
val=-val;
v_sign=1;
}
/* code magnitude */
if (IS_RESID(w,h,color))
{
bitplane_res_encode(val,l,WVTDECOMP_RES_NUMBITPLANES(color));
}
else
{
bitplane_encode(val-1,l,WVTDECOMP_NUMBITPLANES(color,l));
mzte_ac_encode_symbol(&ace,acm_sign[l],v_sign);
}
}
/*************************************************************
Function Name
-------------
Void encodeBlocks()
Arguments
---------
Int y, Int x - Coordinate of upper left hand corner of block.
Int n - Number of 4 blocks in a side of the total block. 0 means do only
pixel at (x,y).
Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.
Description
-----------
Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan
manner.
Functions Called
----------------
encodeBlocks recursively.
Return Value
------------
None.
*************************************************************/
Void CVTCEncoder::encodeSQBlocks(Int y, Int x, Int n)
{
/* Call the encoding function for the 4 block pixels */
if (n == 0)
{
/* For checking scan-order : use 16x16 mono image
for comparison with Figure 7-38 scan order table in
document.
static Int i=4;
noteStat("%d: y=%d, x=%d\n",i++, y,x);
*/
encode_pixel_SQ(y,x);
}
else
{
Int k;
--n;
k = 1<<n;
encodeSQBlocks(y,x,n);
x += k;
encodeSQBlocks(y,x,n);
x -= k;
y += k;
encodeSQBlocks(y,x,n);
x += k;
encodeSQBlocks(y,x,n);
}
}
/*************************************************************
Function Name
-------------
Void encodeBlocks()
Arguments
---------
Int y, Int x - Coordinate of upper left hand corner of block.
Int n - Number of 4 blocks in a side of the total block. 0 means do only
pixel at (x,y).
Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.
Description
-----------
Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan
manner.
Functions Called
----------------
encodeBlocks recursively.
Return Value
------------
None.
*************************************************************/
Void CVTCEncoder::encodeMQBlocks(Int y, Int x, Int n)
{
/* Call the encoding function for the 4 block pixels */
if (n == 0)
{
/* For checking scan-order : use 16x16 mono image
for comparison with Figure 7-38 scan order table in
document.
static Int i=4;
noteStat("%d: y=%d, x=%d\n",i++, y,x);
*/
encode_pixel_MQ(y,x);
}
else
{
Int k;
--n;
k = 1<<n;
encodeMQBlocks(y,x,n);
x += k;
encodeMQBlocks(y,x,n);
x -= k;
y += k;
encodeMQBlocks(y,x,n);
x += k;
encodeMQBlocks(y,x,n);
}
}
//Added by Sarnoff for error resilience, 3/5/99
/* ----------------------------------------------------------------- */
/* ----------------- Error resilience related routines ------------- */
/* ----------------------------------------------------------------- */
/*************************************************************
Function Name
-------------
Void encodeSQBlocks_ErrResi()
Arguments
---------
Int y, Int x - Coordinate of upper left hand corner of block.
Int n - Number of 4 blocks in a side of the total block. 0 means do only
pixel at (x,y).
Int c - color.
Description
-----------
Call function encode_pixel_SQ for all pixels (x,y) in block in band scan
manner.
Functions Called
----------------
encodeSQBlocks recursively.
Return Value
------------
None.
*************************************************************/
Void CVTCEncoder::encodeSQBlocks_ErrResi(Int y, Int x, Int n, Int c)
{
/* Call the encoding function for the 4 block pixels */
if (n == 0)
{
/* For checking scan-order : use 16x16 mono image
for comparison with Figure 7-38 scan order table in
document.
static Int i=4;
noteStat("%d: y=%d, x=%d\n",i++, y,x);
*/
encode_pixel_SQ(y,x);
}
else
{
Int k;
--n;
k = 1<<n;
encodeSQBlocks_ErrResi(y,x,n,c);
if (n==4)
check_segment_size(c);
x += k;
encodeSQBlocks_ErrResi(y,x,n,c);
if (n==4)
check_segment_size(c);
x -= k;
y += k;
encodeSQBlocks_ErrResi(y,x,n,c);
if (n==4)
check_segment_size(c);
x += k;
encodeSQBlocks_ErrResi(y,x,n,c);
if (n==4)
check_segment_size(c);
}
}
/* bbc, 11/5/98 */
/* ph, 11/13/98 - added color argument for band-by-band */
void CVTCEncoder::init_arith_encoder_model(Int color)
{
/* init arithmetic coder */
mzte_ac_encoder_init(&ace);
if(mzte_codec.m_iScanDirection ==0 ){ /* tree depth */
for (color=0; color<mzte_codec.m_iColors; color++)
probModelInitSQ(color);
}
else{ /* band-by-band */
probModelInitSQ(color); /* ph - 11/13/98 */
}
}
/* bbc, 11/6/98 */
/* ph, 11/13/98 - added color argument for band-by-band */
Void CVTCEncoder::close_arith_encoder_model(Int color, Int mode)
{
noteProgress(" ==>E packet [TU_%d,TU_%d], l=%d bits",TU_first,TU_last,
packet_size+ace.bitCount+ace.followBits);
if(mzte_codec.m_iScanDirection == 0)
{
/* tree depth */
for (color=0; color<mzte_codec.m_iColors; color++)
/* close arithmetic coder */
probModelFreeSQ(color);
}
else
{
probModelFreeSQ(color); /* ph - 11/13/98 */
}
bit_stream_length=mzte_ac_encoder_done(&ace);
if(mode==1)
write_packet_header_to_file();
ace.bitCount=ace.followBits=0;
}
/****************************************************/
/* to check if a segment in a packet has exceeded a */
/* threshold. Add a marker if so. bbc, 11/6/98 */
/****************************************************/
Void CVTCEncoder::check_segment_size(Int col)
{
/* segment not long enough, bbc, 11/16/98 */
if(packet_size+ace.bitCount+ace.followBits-prev_segs_size<
(Int)mzte_codec.m_usSegmentThresh)
return;
prev_segs_size=packet_size+ace.bitCount+ace.followBits;
/* add marker, use ZTR, bbc, 11/10/98 */
mzte_ac_encode_symbol(&ace,&acmType[col][0][CONTEXT_INIT],ZTR);
}
/* check if end of packet is reached, bbc, 11/6/98 */
Void CVTCEncoder::check_end_of_packet(Int color)
{
if(packet_size+ace.bitCount+ace.followBits>=
mzte_codec.m_usPacketThresh){
/* write full packet to file, assume that output_buffer */
/* is large enough to hold the arith part without writing to file */
close_arith_encoder_model(color,1);
flush_bits();
flush_bytes();
prev_segs_size=0; /* reset segment size */
/* start new packet */
emit_bits((UShort)0,2); /* first bit dummy, second bit HEC=0 */
packet_size=0;
if (mzte_codec.m_iScanDirection==0)
init_arith_encoder_model(color);
else
{
/* don't reinitialize if color change */
if ((TU_last-TU_max_dc+1) % mzte_codec.m_iDCHeight != 0)
init_arith_encoder_model(color);
}
TU_first=TU_last+1;
}
TU_last++;
}
#ifdef _DC_PACKET_
/* check if end of packet is reached, bbc, 11/18/98 */
Void CVTCEncoder::check_end_of_DC_packet(int numBP)
{
int i;
if(packet_size+ace.bitCount+ace.followBits>=
mzte_codec.m_usPacketThresh){
noteProgress(" ==>E packet [TU_%d,TU_%d], l=%d bits",TU_first,TU_last,
packet_size+ace.bitCount+ace.followBits);
for (i=0; i<numBP; i++)
mzte_ac_model_done(&(acm_bpdc[i]));
mzte_ac_model_done(&acmType[color][0][CONTEXT_INIT]);
bit_stream_length=mzte_ac_encoder_done(&ace);
write_packet_header_to_file();
flush_bits();
flush_bytes();
prev_segs_size=0; /* reset segment size */
/* start new packet */
emit_bits((UShort)0,2); /* first bit dummy, second bit HEC=0 */
packet_size=0;
mzte_ac_encoder_init(&ace);
for (i=0; i<numBP; i++) {
acm_bpdc[i].Max_frequency = Bitplane_Max_frequency;
mzte_ac_model_init(&(acm_bpdc[i]),2,NULL,ADAPT,1);
}
mzte_ac_model_init(&acmType[color][0][CONTEXT_INIT],NUMCHAR_TYPE,
NULL,ADAPT,1); /* bbc, 11/20/98 */
TU_first=TU_last+1;
}
TU_last++;
}
#endif _DC_PACKET_
/* force end of packet is reached, ph, 11/19/98 */
Void CVTCEncoder::force_end_of_packet()
{
flush_bits();
flush_bytes();
prev_segs_size=0; /* reset segment size */
/* start new packet */
emit_bits((UShort)0,2); /* first bit dummy, second bit HEC=0 */
packet_size=0;
TU_first=TU_last+1;
TU_last++;
}
//End: Added by Sarnoff for error resilience, 3/5/99
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -