📄 errdec.cpp
字号:
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; checkrange (pmbmd->m_stepSize, 1, iQuantMax); iCurrentQP = pmbmd->m_stepSize; } assert (pmbmd != NULL); if (pmbmd -> m_rgTranspStatus [0] == ALL) return; bUseNewQPForVlcThr = FALSE; assert (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::decodeMBTextureHeadOfIVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC){ 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;// bug fix by toshiba 98-9-24 start pmbmd->m_dctMd = INTRA; pmbmd->m_bSkip = FALSE; //reset for direct mode if (*piMCBPC > 3) pmbmd->m_dctMd = INTRAQ;// bug fix by toshiba 98-9-24 end iCBPC = *piMCBPC % 4; 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); } setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);}Void CVideoObjectDecoder::decodeTextureIntraMB_DataPartitioning ( CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV, Int* piIntraDC){ assert (pmbmd != NULL); if (pmbmd -> m_rgTranspStatus [0] == ALL) return; assert (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 intra pred MacroBlockMemory* pmbmLeft = NULL; MacroBlockMemory* pmbmTop = NULL; MacroBlockMemory* pmbmLeftTop = NULL; CMBMode* pmbmdLeft = NULL; CMBMode* pmbmdTop = NULL; CMBMode* pmbmdLeftTop = NULL; Int iMBTop = iMBY - 1; if (iMBTop >= 0) { if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX)->m_iVideoPacketNumber) { pmbmTop = m_rgpmbmAbove [iMBX]; pmbmdTop = pmbmd - m_iNumMBX; } } if (iMBX > 0) { if(pmbmd->m_iVideoPacketNumber==(pmbmd - 1)->m_iVideoPacketNumber) { pmbmLeft = m_rgpmbmCurr [iMBX - 1]; pmbmdLeft = pmbmd - 1; } } if (iMBTop >= 0 && iMBX > 0) { if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber) { pmbmLeftTop = m_rgpmbmAbove [iMBX - 1]; pmbmdLeftTop = pmbmd - m_iNumMBX - 1; } } PixelC* rgchBlkDst = NULL; Int iWidthDst; Int iDcScaler; Int* rgiCoefQ; for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) { if (iBlk < U_BLOCK) { if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue; switch (iBlk) { case (Y_BLOCK1): rgchBlkDst = ppxlcCurrFrmQY; break; case (Y_BLOCK2): rgchBlkDst = ppxlcCurrFrmQY + BLOCK_SIZE; break; case (Y_BLOCK3): rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize; break; case (Y_BLOCK4): rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + BLOCK_SIZE; break; } iWidthDst = m_iFrameWidthY; iDcScaler = m_rgiDcScalerY [iQP]; } else { iWidthDst = m_iFrameWidthUV; rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrFrmQU: ppxlcCurrFrmQV; iDcScaler = m_rgiDcScalerC [iQP]; } rgiCoefQ = m_rgpiCoefQ [iBlk - 1]; const BlockMemory blkmPred = NULL; Int iQpPred = iQP; //default to current if no pred (use 128 case) decideIntraPred (blkmPred, pmbmd, iQpPred, (BlockNum) iBlk, pmbmLeft, pmbmTop, pmbmLeftTop, m_rgpmbmCurr[iMBX], pmbmdLeft, pmbmdTop, pmbmdLeftTop); decodeIntraBlockTextureTcoef_DataPartitioning (rgchBlkDst, iWidthDst, iQP, iDcScaler, iBlk, *(m_rgpmbmCurr + iMBX), pmbmd, blkmPred, //for intra-pred iQpPred, piIntraDC); }}Void CVideoObjectDecoder::decodeIntraBlockTexture_DataPartitioning (Int iBlk, CMBMode* pmbmd, Int* piIntraDC){ if (!pmbmd->m_bCodeDcAsAc) piIntraDC[iBlk - 1] = decodeIntraDCmpeg (iBlk <= Y_BLOCK4 || iBlk >=A_BLOCK1);}Void CVideoObjectDecoder::decodeIntraBlockTextureTcoef_DataPartitioning (PixelC* rgpxlcBlkDst, Int iWidthDst, Int iQP, Int iDcScaler, Int iBlk, MacroBlockMemory* pmbmCurr, CMBMode* pmbmd, const BlockMemory blkmPred, Int iQpPred, Int* piIntraDC){ Int iCoefStart = 0; if (!pmbmd->m_bCodeDcAsAc) { iCoefStart++; } Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1]; rgiCoefQ[0] = piIntraDC [iBlk - 1]; if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiZigzag = grgiStandardZigzag; if (pmbmd->m_bACPrediction) rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag; if(m_volmd.bReversibleVlc) decodeIntraRVLCTCOEF (rgiCoefQ, iCoefStart, rgiZigzag); else decodeIntraTCOEF (rgiCoefQ, iCoefStart, rgiZigzag); } else memset (rgiCoefQ + iCoefStart, 0, sizeof (Int) * (BLOCK_SQUARE_SIZE - iCoefStart)); inverseDCACPred (pmbmd, iBlk - 1, rgiCoefQ, iQP, iDcScaler, blkmPred, iQpPred); inverseQuantizeIntraDc (rgiCoefQ, iDcScaler); if (m_volmd.fQuantizer == Q_H263) inverseQuantizeDCTcoefH263 (rgiCoefQ, 1, iQP); else inverseQuantizeIntraDCTcoefMPEG (rgiCoefQ, 1, iQP, iBlk>=A_BLOCK1); Int i, j; //save coefQ (ac) for intra pred pmbmCurr->rgblkm [iBlk - 1] [0] = m_rgiDCTcoef [0]; //save recon value of DC for intra pred //save Qcoef in memory for (i = 1, j = 8; i < BLOCK_SIZE; i++, j += BLOCK_SIZE) { pmbmCurr->rgblkm [iBlk - 1] [i] = rgiCoefQ [i]; pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = rgiCoefQ [j]; } m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);}Void CVideoObjectDecoder::decodePVOP_DataPartitioning (){// assert (m_volmd.nBits==8); Int iMBX, iMBY; //CoordI y = 0; CMBMode* pmbmd = m_rgmbmd; CMotionVector* pmv = m_rgmv; PixelC* ppxlcCurrQY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcCurrQU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcCurrQV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV; Int iCurrentQP = m_vopmd.intStep; Int iVideoPacketNumber = 0; m_iVPMBnum = 0; Bool bLeftBndry; Bool bRightBndry; Bool bTopBndry; 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; // End Toshiba Int i; Int mbn = 0, mbnFirst = 0; CoordI x = 0; CoordI y = 0; PixelC* ppxlcCurrQMBY = NULL; PixelC* ppxlcCurrQMBU = NULL; PixelC* ppxlcCurrQMBV = NULL; Bool bMBBackup = FALSE; CMBMode* pmbmdBackup = NULL; Int iMBXBackup = 0, iMBYBackup = 0; CMotionVector* pmvBackup = 0; PixelC* ppxlcCurrQMBYBackup = NULL; PixelC* ppxlcCurrQMBUBackup = NULL; PixelC* ppxlcCurrQMBVBackup = NULL; Bool bRestartDelayedQP = TRUE; do{ CMBMode* pmbmdFirst = pmbmd; CMotionVector* pmvFirst = pmv; Int* piMCBPCFirst = piMCBPC; Int* piIntraDCFirst = piIntraDC; mbnFirst = mbn; if( checkResyncMarker() ){ decodeVideoPacketHeader(iCurrentQP); iVideoPacketNumber++; bRestartDelayedQP = TRUE; } do{ pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; iMBX = mbn % m_iNumMBX; iMBY = mbn / m_iNumMBX; pmbmd->m_bSkip = m_pbitstrmIn->getBits (1); if (!pmbmd->m_bSkip) { *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol (); assert (*piMCBPC >= 0 && *piMCBPC <= 20); Int iMBtype = *piMCBPC / 4; //per H.263's MBtype switch (iMBtype) { case 0: pmbmd->m_dctMd = INTER; pmbmd -> m_bhas4MVForward = FALSE; break; case 1: pmbmd->m_dctMd = INTERQ; pmbmd -> m_bhas4MVForward = FALSE; break; case 2: pmbmd -> m_dctMd = INTER; pmbmd -> m_bhas4MVForward = TRUE; break; case 3: pmbmd->m_dctMd = INTRA; break; case 4: pmbmd->m_dctMd = INTRAQ; break; default: assert (FALSE); } } else { //skipped pmbmd->m_dctMd = INTER; pmbmd -> m_bhas4MVForward = FALSE; } if(iMBX == 0) { bLeftBndry = TRUE; } else { bLeftBndry = !((pmbmd - 1) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber); } if(iMBY == 0) { bTopBndry = TRUE; } else { bTopBndry = !((pmbmd - m_iNumMBX) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber); } if((iMBX == m_iNumMBX - 1) || (iMBY == 0)) { bRightBndry = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -