📄 sys_decoder_shpdec.cpp
字号:
CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeSSModeInter [colocatedIndex[shpmdColocatedMB]]; pmbmd->m_shpssmd = (ShapeSSMode) pentrdec->decodeSymbol (); } if (pmbmd->m_shpssmd == INTRA_NOT_CODED) { motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ1->getPlane(BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decideTransparencyStatus (pmbmd, ppxlcMBBY); } else if (pmbmd->m_shpssmd == INTRA_CODED) { motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ1->getPlane (BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decodeSIBAB ( ppxlcMBBY, ppxlcMBBYFrm, (pvopcRefQ1->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, (pvopcRefQ1->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY, iMBX, iMBY, (PixelC*)((pvopcRefQ1->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME)); decideTransparencyStatus (pmbmd, ppxlcMBBY); } else {//if lower layer has no MV then current MV is set to (0,0) if( pmvBaseBY->iMVX == NOT_MV && pmvBaseBY->iMVY == NOT_MV) { pmvBaseBY->iMVX = 0; pmvBaseBY->iMVY = 0; } motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ0->getPlane (BY_PLANE)->pixels (), (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape) + iX - 1, (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape) + iY - 1); //-1 due to 18x18 motion comp if (pmbmd->m_shpssmd == INTER_NOT_CODED) copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); else if (pmbmd->m_shpssmd == INTER_CODED){ m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; const PixelC *ppxlcPredBAB = m_puciPredBAB->pixels ();//for bordering copyLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcReconCurrBAB); //used for upsample and CAE m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; //assign encoding buffer if (m_pbitstrmIn->getBits (1) == 1) decodeInterCAEH (ppxlcPredBAB); //right bottom border made on the fly else decodeInterCAEV (ppxlcPredBAB); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER); //copy rounded data } decideTransparencyStatus (pmbmd, ppxlcMBBY); }}//for SI decodingVoid CVideoObjectDecoder::decodeSIBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm, Bool* HorSamplingChk, Bool* VerSamplingChk, Int iMBX, Int iMBY, PixelC* ppxlcRefSrc){ Int q0, si_coding_mode; m_iWidthCurrBAB = BAB_SIZE; PixelC* ppxlcReconCurrBABTr = NULL; //for st_order Int scan_order = 0; copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB); //used for upsample and CAE Int i; Int j; PixelC* PredSrc = ppxlcBYMB; PixelC* PredDst = m_ppxlcReconCurrBAB+20*2+2; double h_factor = log((double)m_volmd.ihor_sampling_factor_n_shape/m_volmd.ihor_sampling_factor_m_shape)/log((double)2); int h_factor_int = (int)floor(h_factor+0.000001); double v_factor = log((double)m_volmd.iver_sampling_factor_n_shape/m_volmd.iver_sampling_factor_m_shape)/log((double)2); int v_factor_int = (int)floor(v_factor+0.000001); Int NumTwoPowerLoopX = h_factor_int; Bool ResidualLoopX = 0; if(h_factor - h_factor_int > 0.000001 ) ResidualLoopX = 1; Int NumTwoPowerLoopY = v_factor_int ; Bool ResidualLoopY = 0 ; if(v_factor - v_factor_int > 0.000001 ) ResidualLoopY = 1; for(j=0;j<16;j++){ for(i=0;i<16;i++){ *PredDst =*PredSrc; PredDst++;PredSrc++; } PredDst+=4; } makeRightBottomBorder (m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE,(PixelC*)(ppxlcRefSrc),m_iFrameWidthY); m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; //assign encoding buffer if ( m_volmd.ihor_sampling_factor_n_shape == 2 && m_volmd.ihor_sampling_factor_m_shape == 1 && m_volmd.iver_sampling_factor_n_shape == 2 && m_volmd.iver_sampling_factor_m_shape == 1) { //for st_order scan_order = decideScanOrder((PixelC*) m_puciPredBAB->pixels ()); /*-- Curr BAB transposing --*/ if (scan_order){ ppxlcReconCurrBABTr = new PixelC [BAB_SIZE * BAB_SIZE]; for(Int j=0; j<BAB_SIZE; j++) for(Int i=0; i<BAB_SIZE; i++) ppxlcReconCurrBABTr[j*BAB_SIZE+i]=m_ppxlcReconCurrBAB[i*BAB_SIZE+j]; m_rgpxlcCaeSymbol = ppxlcReconCurrBABTr; Bool *tmp; tmp = HorSamplingChk; HorSamplingChk = VerSamplingChk; VerSamplingChk = tmp; } } StartArDecoder (m_parcodec, m_pbitstrmIn); q0=SI_bab_type_prob[0]; si_coding_mode=ArDecodeSymbol(q0,m_parcodec,m_pbitstrmIn); //SISC if(si_coding_mode==0) { if(ResidualLoopX == 1 || h_factor_int>0) VerticalXORdecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC if(ResidualLoopY == 1 || v_factor_int>0) HorizontalXORdecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC } else { if(ResidualLoopX == 1 || h_factor_int>0) VerticalFulldecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC if(ResidualLoopY == 1 || v_factor_int>0) HorizontalFulldecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC } StopArDecoder (m_parcodec, m_pbitstrmIn); if ( m_volmd.ihor_sampling_factor_n_shape == 2 && m_volmd.ihor_sampling_factor_m_shape == 1 && m_volmd.iver_sampling_factor_n_shape == 2 && m_volmd.iver_sampling_factor_m_shape == 1) { //for st_order /*-- Curr BAB transposing --*/ if (scan_order){ for(j=0; j<BAB_SIZE; j++) for(Int i=0; i<BAB_SIZE; i++) m_ppxlcReconCurrBAB[j*BAB_SIZE+i]=ppxlcReconCurrBABTr[i*BAB_SIZE+j]; delete [] ppxlcReconCurrBABTr; Bool *tmp; tmp = HorSamplingChk; HorSamplingChk = VerSamplingChk; VerSamplingChk = tmp; } } copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);}Void CVideoObjectDecoder::VerticalXORdecoding (Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){ //Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; // Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER; PixelC* ppxlcDst = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; { Int i, j; //, xor_type=0; Int start_v=0, start_h=0; Int width=20, height=20; // UChar xor_value=0; Int prev=0, next=0; PixelC* smb_data = ppxlcDst; Int skip_upper=0, skip_bottom=0, skip_hor=0, skip_right=0, skip_left=0; Int h_scan_freq=1, v_scan_freq=1; i=0; while(*(HorSamplingChk+i) == 0) i++; int tmp = i; if (residual_scanning_hor) { start_v = 0; start_h = 0; h_scan_freq=1<<num_loop_hor; v_scan_freq=1<<num_loop_ver; skip_hor = 1<<num_loop_hor; if( tmp-(1<<num_loop_hor) >= 0 ) start_h = tmp-(1<<num_loop_hor); else if( tmp+(1<<num_loop_hor) <= MB_SIZE-1 ) start_h = tmp+(1<<(num_loop_hor)) ; else printf("Out of Sampling Ratio\n"); i=0; while(*(VerSamplingChk+i) == 0) i++; start_v = i; for(j=start_h;j<width-4;j+=h_scan_freq){ if( *(HorSamplingChk+j) == 1) continue; skip_upper = start_v+1; for(i=start_v;i<height-4;i+=v_scan_freq) { if( *(VerSamplingChk+i) == 1) { if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i; else { if( *(VerSamplingChk+i+v_scan_freq) == 0) { if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = v_scan_freq*2; } else skip_bottom = v_scan_freq; } } else continue; if(j-h_scan_freq < -2) prev=*(smb_data+i*width-2); else prev=*(smb_data+i*width+j-h_scan_freq); if(j+h_scan_freq > 17) next=*(smb_data+i*width+17); else next=*(smb_data+i*width+j+h_scan_freq); if ( j+skip_hor >15) skip_right = MB_SIZE+1-j; else skip_right = skip_hor; if ( j-skip_hor <0) skip_left = j+2; else skip_left = skip_hor; if(prev==next) *(smb_data+i*width+j)=prev; else *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_v_prob [contextSIVertical(smb_data+i*width+j,skip_right,skip_left,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; if(skip_bottom == v_scan_freq) skip_upper = v_scan_freq; else skip_upper = v_scan_freq*2; } } } i=0; while(*(HorSamplingChk+i) == 0) i++; if(i>start_h && residual_scanning_hor) tmp = start_h; else tmp = i; while (num_loop_hor >0){ start_v = 0; start_h = 0; h_scan_freq=1<<num_loop_hor; v_scan_freq=1<<num_loop_ver; skip_hor = 1<<(num_loop_hor-1); if( tmp-(1<<(num_loop_hor-1)) >= 0 ) tmp = start_h = tmp-(1<<(num_loop_hor-1)); else start_h = tmp+(1<<(num_loop_hor-1)) ; i=0; while(*(VerSamplingChk+i) == 0) i++; start_v = i; for(j=start_h;j<(width-4);j+=h_scan_freq){ skip_upper = start_v+1; for(i=start_v;i<(height-4);i+=v_scan_freq){ if( *(VerSamplingChk+i) == 1) { if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i; else { if( *(VerSamplingChk+i+v_scan_freq) == 0) { if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = v_scan_freq*2; } else skip_bottom = v_scan_freq; } } else continue; prev=*(smb_data+i*width+j-(1<<(num_loop_hor-1))); if(j==width-1) next=prev; else next=*(smb_data+i*width+j+(1<<(num_loop_hor-1))); if(j-(1<<(num_loop_hor-1)) < -2) prev=*(smb_data+i*width-2); else prev=*(smb_data+i*width+j-(1<<(num_loop_hor-1))); if(j+(1<<(num_loop_hor-1)) > 17) next=*(smb_data+i*width+17); else next=*(smb_data+i*width+j+(1<<(num_loop_hor-1))); if ( j+skip_hor >15) skip_right = MB_SIZE+1-j; else skip_right = skip_hor; if ( j-skip_hor <0) skip_left = j+2; else skip_left = skip_hor; if(prev==next) *(smb_data+i*width+j)=prev; else *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_v_prob [contextSIVertical(smb_data+i*width+j,skip_right,skip_left,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; if(skip_bottom == v_scan_freq) skip_upper = v_scan_freq; else skip_upper = v_scan_freq*2; } } num_loop_hor--; } }}Void CVideoObjectDecoder::VerticalFulldecoding (Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){ // Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; // Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER; PixelC* ppxlcDst = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; { Int i, j; //, xor_type=0; Int start_v=0, start_h=0; Int width=20, height=20; // UChar xor_value=0; // Int prev=0, next=0; PixelC* smb_data = ppxlcDst; Int skip_upper=0, skip_bottom=0, skip_hor=0, skip_right=0, skip_left=0; Int h_scan_freq=1, v_scan_freq=1; i=0; while(*(HorSamplingChk+i) == 1) i++; while(*(HorSamplingChk+i) == 0) i++; int tmp = i; if (residual_scanning_hor) { start_v = 0; start_h = 0; h_scan_freq=1<<num_loop_hor; v_scan_freq=1<<num_loop_ver; skip_hor = 1<<num_loop_hor; if( tmp-(1<<num_loop_hor) >= 0 ) start_h = tmp-(1<<num_loop_hor); else if( tmp+(1<<num_loop_hor) <= MB_SIZE-1 ) start_h = tmp+(1<<(num_loop_hor)) ; else printf("Out of Sampling Ratio\n"); i=0; while(*(VerSamplingChk+i) == 0) i++; start_v = i; for(j=start_h;j<width-4;j+=h_scan_freq){ if( *(HorSamplingChk+j) == 1) continue; skip_upper = start_v+1; for(i=start_v;i<height-4;i+=v_scan_freq) { if( *(VerSamplingChk+i) == 1) { if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i; else { if( *(VerSamplingChk+i+v_scan_freq) == 0) { if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = v_scan_freq*2; } else skip_bottom = v_scan_freq; } } else continue; if ( j+skip_hor >15) skip_right = MB_SIZE+1-j; else skip_right = skip_hor; if ( j-skip_hor <0) skip_left = j+2; else skip_left = skip_hor; *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_v_prob [contextSIVertical(smb_data+i*width+j,skip_right,skip_left,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; if(skip_bottom == v_scan_freq) skip_upper = v_scan_freq; else skip_upper = v_scan_freq*2; } } } i=0; while(*(HorSamplingChk+i) == 1) i++; while(*(HorSamplingChk+i) == 0) i++; if(i>start_h && residual_scanning_hor) tmp = start_h; else tmp = i; while (num_loop_hor >0){ start_v = 0; start_h = 0; h_scan_freq=1<<num_loop_hor; v_scan_freq=1<<num_loop_ver; skip_hor = 1<<(num_loop_hor-1); if( tmp-(1<<(num_loop_hor-1)) >= 0 ) tmp = start_h = tmp-(1<<(num_loop_hor-1)); else start_h = tmp+(1<<(num_loop_hor-1)) ; i=0; while(*(VerSamplingChk+i) == 0) i++; start_v = i; for(j=start_h;j<(width-4);j+=h_scan_freq){ skip_upper = start_v+1; for(i=start_v;i<(height-4);i+=v_scan_freq){ if( *(VerSamplingChk+i) == 1) { if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i; else { if( *(VerSamplingChk+i+v_scan_freq) == 0) { if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = v_scan_freq*2; } else skip_bottom = v_scan_freq; } } else continue; if ( j+skip_hor > 15) skip_right = MB_SIZE+1-j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -