📄 ztscan_dec.cpp
字号:
break; case S_ZTR_D: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR_D]); coeffinfo[h][w].type=zt_type=czt_type; break; case S_IZ: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_IZ]); coeffinfo[h][w].type=zt_type = czt_type ? VAL : IZ; break; case S_LINIT: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LINIT]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; case S_LZTR: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; case S_LZTR_D: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR_D]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; default: errorHandler("Invalid state (%d) in multi-quant encoding.", coeffinfo[h][w].state); }#ifdef _SHAPE_ } else /* treat out-node as isolated zero for decoding purpose */ { switch(coeffinfo[h][w].state) { case S_INIT: case S_ZTR: case S_ZTR_D: case S_IZ: zt_type = coeffinfo[h][w].type = IZ; break; case S_LINIT: case S_LZTR: case S_LZTR_D: zt_type = coeffinfo[h][w].type = ZTR; break; default: errorHandler("Invalid state (%d) in multi-quant encoding.", coeffinfo[h][w].state); } }#endif } /*~~~~~~~~~~~~~~~~ mark ztr_d and encode magnitudes ~~~~~~~~~~~~~~~~~*/ switch(zt_type) { case ZTR:#ifdef _SHAPE_ if(coeffinfo[h][w].mask!=1) return;#endif case ZTR_D: mark_ZTR_D(h,w); case IZ: coeffinfo[h][w].quantized_value=0; return; case VZTR: mark_ZTR_D(h,w); case VAL:#ifdef _SHAPE_ if(coeffinfo[h][w].mask==1) #endif mag_sign_decode_MQ(h,w); break; default: errorHandler("Invalid type in multi quant decoding."); }}/**********************************************************************//*************** MQ TREE ********************************//**********************************************************************//******************************************************** Function Name ------------- static Void cachb_decode_MQ_tree() Arguments --------- None. Description ----------- Decode AC information for one color component. Multiple quant, treewise scan. Functions Called ---------------- clear_ZTR_D(); decode_pixel_MQ_tree() Return Value ------------ None.********************************************************/ Void CVTCDecoder::cachb_decode_MQ_tree(){ Int h,w, dc_h, dc_w; /* clear the ZTR_D type from the previous pass */ for (color=0; color<NCOL; ++color) { coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo; height=mzte_codec.m_SPlayer[color].height; width=mzte_codec.m_SPlayer[color].width; clear_ZTR_D(coeffinfo, width, height); } for (color=0; color<NCOL; ++color) probModelInitMQ(color); /* ac_h, ac_w init */ dc_h=mzte_codec.m_iDCHeight; dc_w=mzte_codec.m_iDCWidth; for (h=0; h<dc_h; ++h) for (w=0; w<dc_w; ++w) { for (color=0; color<NCOL; ++color) { SNR_IMAGE *snr_image; int tw,sw,sh,n; // 1124 snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image); coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo; height=mzte_codec.m_SPlayer[color].height; width=mzte_codec.m_SPlayer[color].width; setProbModelsMQ(color); /* LH */ n = 0; for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1) { sh = h << n; sw = (w+dc_w) << n; decodeMQBlocks(sh,sw,n); n++; } /* HL */ n = 0; for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1) { sh = (h+dc_h) << n; sw = w << n; decodeMQBlocks(sh,sw,n); n++; } /* HH */ n = 0; for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1) { sh = (h+dc_h) << n; sw = (w+dc_w) << n; decodeMQBlocks(sh,sw,n); n++; }#if 0 decode_pixel_MQ_tree(h,w+dc_w); /* LH */ decode_pixel_MQ_tree(h+dc_h,w); /* HL */ decode_pixel_MQ_tree(h+dc_h,w+dc_w); /* HH */#endif } } for (color=0; color<NCOL; ++color) probModelFreeMQ(color);}#if 0/******************************************************** Function Name ------------- static Void decode_pixel_MQ_tree(Int h,Int w) Arguments --------- Int h,Int w - position of a pixel in height and width Description ----------- Decoding the type and/or value of a coefficient, a recursive function, multi quant mode. Functions Called ---------------- mzte_ac_decode_symbol() mark_ZTR_D() mag_sign_decode_MQ() Return Value ------------ None.********************************************************/ Void CVTCDecoder::decode_pixel_MQ_tree(Int h0,Int w0){ Int zt_type, h, w, k; Int dcc[4]; /* Don't Code Children */ Int nSib; /* number siblings */ nSib = (h0<(mzte_codec.m_iDCHeight<<1) && w0<(mzte_codec.m_iDCWidth<<1)) ? 1 : 4; /********************* CODE SIBLINGS *****************************/ for (k=0; k<nSib; ++k) { h = h0 + (k/2); w = w0 + (k%2); /* decode zero tree symbol */ if (IS_RESID(w,h,color)) { zt_type=VAL; } else { 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=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_INIT]); coeffinfo[h][w].type=zt_type=czt_type; break; case S_ZTR: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR]); coeffinfo[h][w].type=zt_type=czt_type; break; case S_ZTR_D: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR_D]); coeffinfo[h][w].type=zt_type=czt_type; break; case S_IZ: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_IZ]); coeffinfo[h][w].type=zt_type = czt_type ? VAL : IZ; break; case S_LINIT: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LINIT]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; case S_LZTR: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; case S_LZTR_D: czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR_D]); coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR; break; default: errorHandler("Invalid state (%d) in multi-quant encoding.", coeffinfo[h][w].state); }#ifdef _SHAPE_ } else /* treat out-node as isolated zero for decoding purpose */ { switch(coeffinfo[h][w].state) { case S_INIT: case S_ZTR: case S_ZTR_D: case S_IZ: zt_type = coeffinfo[h][w].type = IZ; break; case S_LINIT: case S_LZTR: case S_LZTR_D: zt_type = coeffinfo[h][w].type = ZTR; break; default: errorHandler("Invalid state (%d) in multi-quant encoding.", coeffinfo[h][w].state); } }#endif } /* mark ztr_d and decode magnitudes */ switch(zt_type) { case ZTR:#ifdef _SHAPE_ if(coeffinfo[h][w].mask==1) { #endif dcc[k]=1; mark_ZTR_D(h,w); /* here it's just to zero out descendents */#ifdef _SHAPE_ } else { dcc[k]=0; }#endif coeffinfo[h][w].quantized_value=0; break; case IZ: dcc[k]=0; coeffinfo[h][w].quantized_value=0; break; case VZTR: dcc[k]=1; mark_ZTR_D(h,w); /* here it's just to zero out descendents */#ifdef _SHAPE_ if(coeffinfo[h][w].mask==1) #endif mag_sign_decode_MQ(h,w); break; case VAL: dcc[k]=0;#ifdef _SHAPE_ if(coeffinfo[h][w].mask==1) #endif mag_sign_decode_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; decode_pixel_MQ_tree(i,j); } } }}#endif/******************************************************** Function Name ------------- static Void mark_ZTR_D(Int h,Int w) Arguments --------- Int h,Int w - position of a pixel Description ----------- Mark the coefficient at (h,w) and its descendents as zerotree descendents. Functions Called ---------------- mark_ZTR_D() Return Value ------------ None.********************************************************/ Void CVTCDecoder::mark_ZTR_D(Int h,Int w){ Int i,j; i=h<<1; j=w<<1; if(i<height && j<width) { coeffinfo[i][j].quantized_value = 0; coeffinfo[i+1][j].quantized_value = 0; coeffinfo[i][j+1].quantized_value = 0; coeffinfo[i+1][j+1].quantized_value = 0; coeffinfo[i][j].type = ZTR_D; coeffinfo[i+1][j].type = ZTR_D; coeffinfo[i][j+1].type = ZTR_D; coeffinfo[i+1][j+1].type = ZTR_D; mark_ZTR_D(i,j); mark_ZTR_D(i+1,j); mark_ZTR_D(i,j+1); mark_ZTR_D(i+1,j+1); }}/******************************************************** Function Name ------------- static Void mag_sign_decode_MQ(Int h,Int w) Arguments --------- Int h,Int w - position of a pixel Description ----------- Decode the value of a coefficient. Functions Called ---------------- mzte_ac_decode_symbol() Return Value ------------ None.********************************************************/ // hjlee 0901 Void CVTCDecoder::mag_sign_decode_MQ(Int h,Int w){ Int val,v_sign; Int l; if(coeffinfo[h][w].skip) { coeffinfo[h][w].quantized_value=0; return; } l=xy2wvtDecompLev(w,h); if (IS_RESID(w,h,color)) { val=bitplane_res_decode(l,WVTDECOMP_RES_NUMBITPLANES(color)); coeffinfo[h][w].quantized_value=val; } else { val=bitplane_decode(l,WVTDECOMP_NUMBITPLANES(color,l))+1; v_sign=mzte_ac_decode_symbol(&acd,acm_sign[l]); coeffinfo[h][w].quantized_value=(v_sign==0) ? val : -val; }}/************************************************************* Function Name ------------- Void decodeSQBlocks() 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 ---------------- decodeBlocks recursively. Return Value ------------ None.*************************************************************/Void CVTCDecoder::decodeSQBlocks(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); */ decode_pixel_SQ(y,x); } else { Int k; --n; k = 1<<n; decodeSQBlocks(y,x,n); x += k; decodeSQBlocks(y,x,n); x -= k; y += k; decodeSQBlocks(y,x,n); x += k; decodeSQBlocks(y,x,n); }}/************************************************************* Function Name ------------- Void decodeSQBlocks() 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 ---------------- decodeBlocks recursively. Return Value ------------ None.*************************************************************/Void CVTCDecoder::decodeMQBlocks(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); */ decode_pixel_MQ(y,x); } else { Int k; --n; k = 1<<n; decodeMQBlocks(y,x,n); x += k; decodeMQBlocks(y,x,n); x -= k; y += k; decodeMQBlocks(y,x,n); x += k; decodeMQBlocks(y,x,n); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -