📄 sys_decoder_shpdec.cpp
字号:
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; } } num_loop_hor--; } }}Void CVideoObjectDecoder::HorizontalXORdecoding (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_ver=0, skip_upper=0, skip_bottom=0; Int h_scan_freq=1, v_scan_freq=1; i=0; while(*(VerSamplingChk+i) == 1) i++; while(*(VerSamplingChk+i) == 0) i++; int tmp = i; if ( residual_scanning_ver) { start_h = 0; start_v = 0; v_scan_freq=1<<num_loop_ver; h_scan_freq=1; skip_ver = v_scan_freq; if( tmp-(1<<num_loop_ver) >= 0 ) start_v = tmp-(1<<num_loop_ver); else if( tmp+(1<<num_loop_ver) <= MB_SIZE-1 ) start_v = tmp+(1<<(num_loop_ver)) ; else printf("Out of Sampling Ratio\n"); for(i=start_v;i<(height-4);i+=v_scan_freq){ if( *(VerSamplingChk+i) == 1) continue; for(j=start_h;j<(width-4);j+=h_scan_freq){ if(i-v_scan_freq < -2) prev=*(smb_data+(-2)*width+j); else prev=*(smb_data+(i-v_scan_freq)*width+j); if(i+v_scan_freq > 17) next=*(smb_data+(17)*width+j); else next=*(smb_data+(i+v_scan_freq)*width+j); if ( i+skip_ver >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = skip_ver; if ( i-skip_ver <0) skip_upper = i+2; else skip_upper = skip_ver; if(prev==next) *(smb_data+i*width+j)=prev; else *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; } } } i=0; while(*(VerSamplingChk+i) == 1) i++; while(*(VerSamplingChk+i) == 0) i++; if(i>start_v && residual_scanning_ver) tmp = start_v; else tmp = i; while (num_loop_ver >0){ start_h = 0; start_v = 0; v_scan_freq=1<<num_loop_ver; h_scan_freq=1; skip_ver = 1<<(num_loop_ver-1); if( tmp-(1<<(num_loop_ver-1)) >= 0 ) tmp = start_v = tmp-(1<<(num_loop_ver-1)); else start_v = tmp+(1<<(num_loop_ver-1)) ; skip_ver = 1<<(num_loop_ver-1); for(i=start_v;i<(height-4);i+=v_scan_freq){ for(j=start_h;j<(width-4);j+=h_scan_freq){ if(i-skip_ver < -2) prev=*(smb_data+(-2)*width+j); else prev=*(smb_data+(i-skip_ver)*width+j); if(i+skip_ver > 17) next=*(smb_data+(17)*width+j); else next=*(smb_data+(i+skip_ver)*width+j); if(i - skip_ver < 0) skip_upper = i +2; else skip_upper = skip_ver; if(i + skip_ver > 15) skip_bottom = MB_SIZE+1 - i ; else skip_bottom = skip_ver; if(prev==next) *(smb_data+i*width+j)=prev; else *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; } } num_loop_ver--; } }}Void CVideoObjectDecoder::HorizontalFulldecoding (Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){ // 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_ver=0, skip_upper=0, skip_bottom=0; Int h_scan_freq=1, v_scan_freq=1; i=0; while(*(VerSamplingChk+i) == 1) i++; while(*(VerSamplingChk+i) == 0) i++; int tmp = i; if ( residual_scanning_ver) { start_h = 0; start_v = 0; v_scan_freq = 1<<num_loop_ver; h_scan_freq = 1; skip_ver = v_scan_freq; if( tmp-(1<<num_loop_ver) >= 0 ) start_v = tmp-(1<<num_loop_ver); else if( tmp+(1<<num_loop_ver) <= MB_SIZE-1 ) start_v = tmp+(1<<(num_loop_ver)) ; else printf("Out of Sampling Ratio\n"); for(i=start_v;i<(height-4);i+=v_scan_freq){ if( *(VerSamplingChk+i) == 1) continue; for(j=start_h;j<(width-4);j+=h_scan_freq){ if ( i+skip_ver >15) skip_bottom = MB_SIZE+1-i; else skip_bottom = skip_ver; if ( i-skip_ver <0) skip_upper = i+2; else skip_upper = skip_ver; *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; } } } i=0; while(*(VerSamplingChk+i) == 1) i++; while(*(VerSamplingChk+i) == 0) i++; if(i>start_v && residual_scanning_ver) tmp = start_v; else tmp = i; while (num_loop_ver >0){ start_h = 0; start_v = 0; v_scan_freq=1<<num_loop_ver; h_scan_freq=1; skip_ver = 1<<(num_loop_ver-1); if( tmp-(1<<(num_loop_ver-1)) >= 0 ) tmp = start_v = tmp-(1<<(num_loop_ver-1)); else start_v = tmp+(1<<(num_loop_ver-1)) ; skip_ver = 1<<(num_loop_ver-1); for(i=start_v;i<(height-4);i+=v_scan_freq){ for(j=start_h;j<(width-4);j+=h_scan_freq){ if(i - skip_ver < 0) skip_upper = i +2; else skip_upper = skip_ver; if(i + skip_ver > 15) skip_bottom = MB_SIZE+1 - i ; else skip_bottom = skip_ver; *(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; } } num_loop_ver--; } }}//~OBSS_SAIT_991015Int CVideoObjectDecoder::shpMdTableIndex (const CMBMode* pmbmd, Int iMBX, Int iMBY){ //get previous shape codes; // Added for error resilient mode by Toshiba(1997-11-14) Bool bLeftBndry, bRightTopBndry, bTopBndry, bLeftTopBndry; Int iMBnum = VPMBnum(iMBX, iMBY); bLeftBndry = bVPNoLeft(iMBnum, iMBX); bTopBndry = bVPNoTop(iMBnum); bRightTopBndry = bVPNoRightTop(iMBnum, iMBX); bLeftTopBndry = bVPNoLeftTop(iMBnum, iMBX); ShapeMode shpmdTop = !bTopBndry ? (pmbmd - m_iNumMBX)->m_shpmd : ALL_TRANSP; ShapeMode shpmdTopR = !bRightTopBndry ? (pmbmd - m_iNumMBX + 1)->m_shpmd : ALL_TRANSP; ShapeMode shpmdTopL = !bLeftTopBndry ? (pmbmd - m_iNumMBX - 1)->m_shpmd : ALL_TRANSP; ShapeMode shpmdLeft = !bLeftBndry ? (pmbmd - 1)->m_shpmd : ALL_TRANSP; return (shpmdTopL * 81 + shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3); //const CMBMode* pmbmdTop = pmbmd - m_iNumMBX; //ShapeMode shpmdTop = (iMBY > 0) ? pmbmdTop->m_shpmd : ALL_TRANSP; //ShapeMode shpmdTopR = (iMBY > 0 && iMBX < m_iNumMBX - 1) ? (pmbmdTop + 1)->m_shpmd : ALL_TRANSP; //ShapeMode shpmdTopL = (iMBY > 0 && iMBX > 0) ? (pmbmdTop - 1)->m_shpmd : ALL_TRANSP; //ShapeMode shpmdLeft = (iMBX > 0) ? (pmbmd - 1)->m_shpmd : ALL_TRANSP; //return (shpmdTopL * 81 + shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3); // End Toshiba(1997-11-14)}Void CVideoObjectDecoder::decodeIntraCaeBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm){ if (m_volmd.bNoCrChange == TRUE || m_pbitstrmIn->getBits (1) == 0) { m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB); //used for upsample and CAE m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; //assign encoding buffer if (m_pbitstrmIn->getBits (1) == 1) decodeIntraCAEH (); //right bottom border made on the fly else decodeIntraCAEV (); } else { if (m_pbitstrmIn->getBits (1) == 0) { m_iInverseCR = 2; m_iWidthCurrBAB = 12; subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown2); m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2; //assign encoding buffer } else { m_iInverseCR = 4; m_iWidthCurrBAB = 8; subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown4); m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4; //assign encoding buffer } if (m_pbitstrmIn->getBits (1) == 1) decodeIntraCAEH (); //right bottom border made on the fly else decodeIntraCAEV (); upSampleShape(ppxlcBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB); } copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);}Void CVideoObjectDecoder::decodeIntraCAEH (){ StartArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++) { PixelC* ppxlcDst = ppxlcDstRow; for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++) { Int iContext = contextIntra (ppxlcDst);//printf("%d ",iContext); *ppxlcDst++ = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; } *ppxlcDst = *(ppxlcDst - 1); *(ppxlcDst + 1) = *ppxlcDst; //make right border on the fly ppxlcDstRow += m_iWidthCurrBAB; }//printf("\n\n"); StopArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDst = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER; for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++) { //make bottom border *ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB); *(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; ppxlcDst++; }}Void CVideoObjectDecoder::decodeIntraCAEV (){ StartArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++) { PixelC* ppxlcDst = ppxlcDstCol; for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++) { Int iContext = contextIntraTranspose (ppxlcDst); *ppxlcDst = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; ppxlcDst += m_iWidthCurrBAB; } *ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB); *(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; //make bottom border on the fly ppxlcDstCol++; } StopArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER; for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++) { //make right border *ppxlcDst = *(ppxlcDst - 1); *(ppxlcDst + 1) = *ppxlcDst; ppxlcDst += m_iWidthCurrBAB; }}Void CVideoObjectDecoder::decodeInterCAEH (const PixelC *ppxlcPredBAB){ StartArDecoder (m_parcodec, m_pbitstrmIn); Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER; PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; const PixelC* ppxlcPredRow = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER; for (Int iRow = 0; iRow < iSizeMB; iRow++) { PixelC* ppxlcDst = ppxlcDstRow; const PixelC* ppxlcPred = ppxlcPredRow; for (Int iCol = 0; iCol < iSizeMB; iCol++) { Int iContext = contextInter (ppxlcDst, ppxlcPred); *ppxlcDst++ = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; ppxlcPred++; } *ppxlcDst = *(ppxlcDst - 1); *(ppxlcDst + 1) = *ppxlcDst; //make right border on the fly ppxlcDstRow += m_iWidthCurrBAB; ppxlcPredRow += iSizePredBAB; } StopArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDst = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER; for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++) { //make bottom border *ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB); *(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; ppxlcDst++; }}Void CVideoObjectDecoder::decodeInterCAEV (const PixelC *ppxlcPredBAB){ StartArDecoder (m_parcodec, m_pbitstrmIn); Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER; PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER; const PixelC* ppxlcPredCol = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER; for (Int iCol = 0; iCol < iSizeMB;iCol++) { PixelC* ppxlcDst = ppxlcDstCol; const PixelC* ppxlcPred = ppxlcPredCol; for (Int iRow = 0; iRow < iSizeMB; iRow++) { Int iContext = contextInterTranspose (ppxlcDst, ppxlcPred); *ppxlcDst = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT; ppxlcDst += m_iWidthCurrBAB; ppxlcPred += iSizePredBAB; } *ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB); *(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; //make bottom border on the fly ppxlcDstCol++; ppxlcPredCol++; } StopArDecoder (m_parcodec, m_pbitstrmIn); PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER; for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++) { //make right border *ppxlcDst = *(ppxlcDst - 1); *(ppxlcDst + 1) = *ppxlcDst; ppxlcDst += m_iWidthCurrBAB; }}Void CVideoObjectDecoder::decodeMVDS (CMotionVector& mvDiff){ mvDiff.iMVX = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol (); if (mvDiff.iMVX != 0) if (m_pbitstrmIn->getBits (1) == 0) mvDiff.iMVX *= -1; if (mvDiff.iMVX == 0) mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV2->decodeSymbol () + 1; else mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol (); if (mvDiff.iMVY != 0) if (m_pbitstrmIn->getBits (1) == 0) mvDiff.iMVY *= -1; mvDiff.computeTrueMV ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -