📄 errdec.cpp
字号:
} else { bRightBndry = !((pmbmd - m_iNumMBX + 1) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber); } decodeMV (pmbmd, pmv, bLeftBndry, bRightBndry, bTopBndry, FALSE, iMBX, iMBY); if(bMBBackup){ if (pmbmdBackup->m_dctMd == INTER || pmbmdBackup->m_dctMd == INTERQ) { motionCompMB ( m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (), pmvBackup, pmbmdBackup, iMBXBackup, iMBYBackup, x, y, pmbmdBackup->m_bSkip, FALSE, &m_rctRefVOPY0 ); if (!pmbmdBackup->m_bSkip) { CoordI iXRefUV, iYRefUV, iXRefUV1, iYRefUV1; mvLookupUV (pmbmdBackup, pmvBackup, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1); motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl, &m_rctRefVOPY0); addErrorAndPredToCurrQ (ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup); } else { if (m_volmd.bAdvPredDisable) copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, NULL); else copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, NULL); } } bMBBackup = FALSE; } pmbmd++; pmv += PVOP_MV_PER_REF_PER_MB; mbn++; piMCBPC++; assert(mbn<=(m_iNumMBX*m_iNumMBY)); } while( !checkMotionMarker() ); m_pbitstrmIn -> getBits (NUMBITS_DP_MOTION_MARKER); pmbmd = pmbmdFirst; piMCBPC = piMCBPCFirst; piIntraDC = piIntraDCFirst; for(i=mbnFirst;i<mbn;i++) { decodeMBTextureHeadOfPVOP_DataPartitioning (pmbmd, iCurrentQP, piMCBPC, piIntraDC, bRestartDelayedQP); pmbmd++; piMCBPC++; piIntraDC += V_BLOCK; } pmbmd = pmbmdFirst; pmv = pmvFirst; piIntraDC = piIntraDCFirst; for(i=mbnFirst;i<mbn;i++) { iMBX = i % m_iNumMBX; iMBY = i / m_iNumMBX; if(iMBX == 0 ) { ppxlcCurrQMBY = ppxlcCurrQY; ppxlcCurrQMBU = ppxlcCurrQU; ppxlcCurrQMBV = ppxlcCurrQV; x = 0; if(iMBY != 0) y += MB_SIZE; } else { x += MB_SIZE; } if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, piIntraDC); else { if (!pmbmd->m_bSkip) decodeTextureInterMB (pmbmd); } if(i==mbn-1){ bMBBackup = TRUE; pmbmdBackup = pmbmd; pmvBackup = pmv; iMBXBackup = iMBX; iMBYBackup = iMBY; ppxlcCurrQMBYBackup = ppxlcCurrQMBY; ppxlcCurrQMBUBackup = ppxlcCurrQMBU; ppxlcCurrQMBVBackup = ppxlcCurrQMBV; } if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) { motionCompMB ( m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (), pmv, pmbmd, iMBX, iMBY, x, y, pmbmd->m_bSkip, FALSE, &m_rctRefVOPY0 ); if (!pmbmd->m_bSkip) { CoordI iXRefUV, iYRefUV, iXRefUV1, iYRefUV1; mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1); motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl, &m_rctRefVOPY0); addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV); } else { if (m_volmd.bAdvPredDisable) copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL); else copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL); } } pmbmd++; pmv += PVOP_MV_PER_REF_PER_MB; piIntraDC += V_BLOCK; ppxlcCurrQMBY += MB_SIZE; ppxlcCurrQMBU += BLOCK_SIZE; ppxlcCurrQMBV += BLOCK_SIZE; if(iMBX == m_iNumMBX - 1) { MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove; m_rgpmbmAbove = m_rgpmbmCurr; m_rgpmbmCurr = ppmbmTemp; ppxlcCurrQY += m_iFrameWidthYxMBSize; ppxlcCurrQU += m_iFrameWidthUVxBlkSize; ppxlcCurrQV += m_iFrameWidthUVxBlkSize; } } } while( checkResyncMarker() ); delete m_piIntraDC; delete m_piMCBPC;}Void CVideoObjectDecoder::decodeMBTextureHeadOfPVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP, Int* piMCBPC, Int* piIntraDC, Bool &bUseNewQPForVlcThr){ assert (pmbmd->m_rgTranspStatus [0] != ALL); Int iBlk = 0, cNonTrnspBlk = 0; for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } Int iCBPC = 0; Int iCBPY = 0; if (!pmbmd->m_bSkip) { //Int iMBtype = *piMCBPC / 4; //per H.263's MBtype iCBPC = *piMCBPC % 4; if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1); switch (cNonTrnspBlk) { case 1: iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol (); break; case 2: iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol (); break; case 3: iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol (); break; case 4: iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol (); break; default: assert (FALSE); } } else { switch (cNonTrnspBlk) { case 1: iCBPY = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol (); break; case 2: iCBPY = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol (); break; case 3: iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol (); break; case 4: iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol (); break; default: assert (FALSE); } } assert (iCBPY >= 0 && iCBPY <= 15); } else { //skipped pmbmd->m_dctMd = INTER; pmbmd -> m_bhas4MVForward = FALSE; } setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk); pmbmd->m_stepSize = iCurrentQP; pmbmd->m_stepSizeDelayed = iCurrentQP; if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) { assert (!pmbmd->m_bSkip); Int iDQUANT = m_pbitstrmIn->getBits (2); switch (iDQUANT) { case 0: pmbmd->m_intStepDelta = -1; break; case 1: pmbmd->m_intStepDelta = -2; break; case 2: pmbmd->m_intStepDelta = 1; break; case 3: pmbmd->m_intStepDelta = 2; break; default: assert (FALSE); } pmbmd->m_stepSize += pmbmd->m_intStepDelta; if(bUseNewQPForVlcThr) pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; if (pmbmd->m_stepSize < 1) pmbmd->m_stepSize = 1; else if (pmbmd->m_stepSize > iQuantMax) pmbmd->m_stepSize = iQuantMax; iCurrentQP = pmbmd->m_stepSize; } if (!pmbmd->m_bSkip) bUseNewQPForVlcThr = FALSE; if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { Int iQP = pmbmd->m_stepSize; for (Int i = 0; i <= 31; i++) { if (iQP <= 4) { m_rgiDcScalerY [i] = 8; m_rgiDcScalerC [i] = 8; } else if (iQP >= 5 && iQP <= 8) { m_rgiDcScalerY [i] = 2 * iQP; m_rgiDcScalerC [i] = (iQP + 13) / 2; } else if (iQP >= 9 && iQP <= 24) { m_rgiDcScalerY [i] = iQP + 8; m_rgiDcScalerC [i] = (iQP + 13) / 2; } else { m_rgiDcScalerY [i] = 2 * iQP - 16; m_rgiDcScalerC [i] = iQP - 6; } } assert (iQP > 0); assert (pmbmd -> m_stepSizeDelayed > 0); if (pmbmd -> m_stepSizeDelayed >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr]) pmbmd->m_bCodeDcAsAc = TRUE; else pmbmd->m_bCodeDcAsAc = FALSE; for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC); } for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) { decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC); } }}Void CVideoObjectDecoder::decodeIVOP_WithShape_DataPartitioning () { //assert (m_volmd.nBits==8); assert (m_volmd.fAUsage!=EIGHT_BIT); //in case the IVOP is used as an ref for direct mode memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector)); Int iMBX, iMBY; CMBMode* pmbmd = m_rgmbmd; PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV; Int iCurrentQP = m_vopmd.intStepI; Int iVideoPacketNumber = 0; m_iVPMBnum = 0; m_piMCBPC = new Int[m_iNumMBX*m_iNumMBY]; Int* piMCBPC = m_piMCBPC; m_piIntraDC = new Int[m_iNumMBX*m_iNumMBY*V_BLOCK]; Int* piIntraDC = m_piIntraDC; Bool bRestartDelayedQP = TRUE; Int i; Int mbn = 0, mbnFirst = 0; PixelC* ppxlcRefMBBY = NULL; PixelC* ppxlcRefMBBUV; PixelC* ppxlcRefMBY = NULL; PixelC* ppxlcRefMBU = NULL; PixelC* ppxlcRefMBV = NULL; PixelC* ppxlcRefMBA = NULL; do { if( checkResyncMarker() ) { decodeVideoPacketHeader(iCurrentQP); iVideoPacketNumber++; bRestartDelayedQP = TRUE; } CMBMode* pmbmdFirst = pmbmd; Int* piMCBPCFirst = piMCBPC; Int* piIntraDCFirst = piIntraDC; mbnFirst = mbn; do{ iMBX = mbn % m_iNumMBX; iMBY = mbn / m_iNumMBX; if(iMBX == 0 ) { ppxlcRefMBBY = ppxlcRefBY; ppxlcRefMBBUV = ppxlcRefBUV; } pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY, ppxlcRefMBBY); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape) if(m_volmd.bShapeOnly==FALSE) { pmbmd->m_bPadded=FALSE; if (pmbmd->m_rgTranspStatus [0] != ALL) { *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCintra->decodeSymbol (); assert (*piMCBPC >= 0 && *piMCBPC <= 7); pmbmd->m_dctMd = INTRA; if (*piMCBPC > 3) pmbmd->m_dctMd = INTRAQ; decodeMBTextureDCOfIVOP_DataPartitioning (pmbmd, iCurrentQP, piIntraDC, bRestartDelayedQP); } } else { assert(FALSE); } pmbmd++; mbn++; piMCBPC++; piIntraDC+=V_BLOCK; ppxlcRefMBBY += MB_SIZE; ppxlcRefMBBUV += BLOCK_SIZE; if(iMBX == m_iNumMBX - 1) { ppxlcRefBY += m_iFrameWidthYxMBSize; ppxlcRefBUV += m_iFrameWidthUVxBlkSize; } } while( !checkDCMarker() ); m_pbitstrmIn -> getBits (NUMBITS_DP_DC_MARKER); pmbmd = pmbmdFirst; piMCBPC = piMCBPCFirst; for(i=mbnFirst;i<mbn;i++) { if (pmbmd->m_rgTranspStatus [0] != ALL) decodeMBTextureHeadOfIVOP_DataPartitioning (pmbmd, piMCBPC); pmbmd++; piMCBPC++; } pmbmd = pmbmdFirst; piIntraDC = piIntraDCFirst; ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY + (mbnFirst/m_iNumMBX)*m_iFrameWidthYxMBSize; ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV + (mbnFirst/m_iNumMBX)*m_iFrameWidthUVxBlkSize; ppxlcRefMBBY = ppxlcRefBY + (mbnFirst%m_iNumMBX)*MB_SIZE; ppxlcRefMBBUV = ppxlcRefBUV + (mbnFirst%m_iNumMBX)*BLOCK_SIZE; for(i=mbnFirst;i<mbn;i++) { pmbmd->m_bPadded = FALSE; iMBX = i % m_iNumMBX; iMBY = i / m_iNumMBX; if(iMBX == 0 ) { ppxlcRefMBY = ppxlcRefY; ppxlcRefMBU = ppxlcRefU; ppxlcRefMBV = ppxlcRefV; ppxlcRefMBA = ppxlcRefA; ppxlcRefMBBY = ppxlcRefBY; ppxlcRefMBBUV = ppxlcRefBUV; } copyRefShapeToMb(m_ppxlcCurrMBBY, ppxlcRefMBBY); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape) if (pmbmd->m_rgTranspStatus [0] != ALL) { decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, piIntraDC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -