📄 errdec.cpp
字号:
if (pmbmd->m_dctMd == INTRAQ) { 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); } iCurrentQP += pmbmd->m_intStepDelta; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; iCurrentQP = checkrange (iCurrentQP, 1, iQuantMax); } pmbmd->m_stepSize = iCurrentQP; assert (pmbmd != NULL); if (pmbmd -> m_rgTranspStatus [0] == ALL) return; assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ); setDCVLCMode(pmbmd, pbRestart); if (!pmbmd->m_bCodeDcAsAc) { for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) piIntraDC[iBlk - 1] = decodeIntraDCmpeg (1); } for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) { piIntraDC[iBlk - 1] = decodeIntraDCmpeg (0); } }}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; pmbmd->m_dctMd = INTRA; pmbmd->m_bSkip = FALSE; //reset for direct mode if (*piMCBPC > 3) pmbmd->m_dctMd = INTRAQ; pmbmd->m_bMCSEL = FALSE; //reset for direct mode 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);}Bool CVideoObjectDecoder::decodeMBTextureModeOfPVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC){ pmbmd->m_bSkip = m_pbitstrmIn->getBits (1); if (!pmbmd->m_bSkip) { *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol (); assert (*piMCBPC >= 0 && *piMCBPC <= 20); if (*piMCBPC == 20) return TRUE; // stuffing 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); } pmbmd->m_bMCSEL = FALSE; if((pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) && (pmbmd -> m_bhas4MVForward == FALSE) && (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) pmbmd->m_bMCSEL = m_pbitstrmIn->getBits (1); } else { //skipped pmbmd->m_dctMd = INTER; pmbmd->m_bhas4MVForward = FALSE; pmbmd->m_bMCSEL = FALSE; if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE) pmbmd -> m_bMCSEL = TRUE; } return FALSE;}Void CVideoObjectDecoder::decodeMBTextureHeadOfPVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP, Int* piMCBPC, Int* piIntraDC, Bool *pbRestart){ 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_intStepDelta = 0; if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) { 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); } iCurrentQP += pmbmd->m_intStepDelta; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; if (iCurrentQP < 1) iCurrentQP = 1; else if (iCurrentQP > iQuantMax) iCurrentQP = iQuantMax; } pmbmd->m_stepSize = iCurrentQP; setDCVLCMode(pmbmd, pbRestart); if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { if (!pmbmd->m_bCodeDcAsAc) { for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) piIntraDC[iBlk - 1] = decodeIntraDCmpeg (1); } for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) { piIntraDC[iBlk - 1] = decodeIntraDCmpeg (0); } } }}// HHI Schueuer: added const PixelC *rgpxlcBlkShape,Int iBlkShapeWidth for sadctVoid CVideoObjectDecoder::decodeIntraBlockTextureTcoef_DataPartitioning (PixelC* rgpxlcBlkDst, Int iWidthDst, Int iQP, Int iDcScaler, Int iBlk, MacroBlockMemory* pmbmCurr, CMBMode* pmbmd, const BlockMemory blkmPred, Int iQpPred, Int* piIntraDC, const PixelC *rgpxlcBlkShape, Int iBlkShapeWidth){ Int iCoefStart = 0; if (!pmbmd->m_bCodeDcAsAc) { iCoefStart++; } Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1]; rgiCoefQ[0] = piIntraDC [iBlk - 1]; if (pmbmd->getCodedBlockPattern (iBlk)) { Int* rgiZigzag = grgiStandardZigzag; if (pmbmd->m_bACPrediction) rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag; // 09/16/99 HHI Schueuer:added for sadct if (!m_volmd.bSadctDisable) rgiZigzag = m_pscanSelector->select(rgiZigzag, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk); // end HHI 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); // 09/16/99 HHI Schueuer: sadct if (rgpxlcBlkShape) { // HHI Schueuer: for greyscale coding (iBlk-6) // assert(pmbmd->m_rgTranspStatus [iBlk] == PARTIAL); // end HHI 02/04/99 // brute force method to clean out mispredictions outside the active region Int *lx = m_rgiCurrMBCoeffWidth[iBlk]; Int iy, ix; for (ix=lx[0]; ix<BLOCK_SIZE; ix++) rgiCoefQ[ix] = 0; for (iy=1; iy<BLOCK_SIZE; iy++) { if (!lx[iy]) rgiCoefQ[iy*BLOCK_SIZE] = 0; } } // end HHI if (m_volmd.fQuantizer == Q_H263) inverseQuantizeDCTcoefH263 (rgiCoefQ, 1, iQP); else inverseQuantizeIntraDCTcoefMPEG (rgiCoefQ, 1, iQP, iBlk>=A_BLOCK1, 0); 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]; }// RRV modification PixelC *pc_block8x8, *pc_block16x16; if(m_vopmd.RRVmode.iRRVOnOff == 1) { pc_block8x8 = new PixelC [64]; pc_block16x16 = new PixelC [256]; // 09/16/99 HHI Schueuer: added for sadct // m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, pc_block8x8, BLOCK_SIZE); m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, pc_block8x8, BLOCK_SIZE, rgpxlcBlkShape, iBlkShapeWidth); MeanUpSampling(pc_block8x8, pc_block16x16, 8, 8); writeCubicRct(16, iWidthDst, pc_block16x16, rgpxlcBlkDst); delete pc_block8x8; delete pc_block16x16; } else { // 09/16/99 HHI Schueuer: added for sadct // m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst); m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst, rgpxlcBlkShape, iBlkShapeWidth); }// m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);// ~RRV}// 09/16/99 HHI schueuer: added const PixelC* m_ppxlcCurrMBBY = NULL, const PixelC* m_ppxlcCurrMBBUV = NULLVoid CVideoObjectDecoder::decodeTextureIntraMB_DataPartitioning ( CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV, Int* piIntraDC, const PixelC* ppxlcCurrMBBY, const PixelC* ppxlcCurrMBBUV){ assert (pmbmd != NULL); if (pmbmd -> m_rgTranspStatus [0] == ALL) return; assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ); Int iQP = pmbmd->m_stepSize; Int iDcScalerY, iDcScalerC; if (iQP <= 4) { iDcScalerY = 8; iDcScalerC = 8; } else if (iQP >= 5 && iQP <= 8) { iDcScalerY = 2 * iQP; iDcScalerC = (iQP + 13) / 2; } else if (iQP >= 9 && iQP <= 24) { iDcScalerY = iQP + 8; iDcScalerC = (iQP + 13) / 2; } else { iDcScalerY = 2 * iQP - 16; iDcScalerC = iQP - 6; } //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; // 09/16/99 HHI Schueuer : for sadct, see also the cond. assignments inside the next switch stmt. const PixelC* rgchBlkShape = NULL; // end HHI Int iWidthDst; Int iDcScaler; Int* rgiCoefQ; for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) { if (iBlk < /* (UInt)*/ U_BLOCK) { if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue; switch (iBlk) { case (Y_BLOCK1): rgchBlkDst = ppxlcCurrFrmQY; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL; break; case (Y_BLOCK2): // RRV modification rgchBlkDst = ppxlcCurrFrmQY + (BLOCK_SIZE *m_iRRVScale);// rgchBlkDst = ppxlcCurrFrmQY + BLOCK_SIZE;// ~RRV rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL; break; case (Y_BLOCK3): rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL; break; case (Y_BLOCK4): // RRV modification rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + (BLOCK_SIZE *m_iRRVScale);// rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + BLOCK_SIZE;// ~RRV rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL; break; } iWidthDst = m_iFrameWidthY; iDcScaler = iDcScalerY; } else { iWidthDst = m_iFrameWidthUV; rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrFrmQU: ppxlcCurrFrmQV; rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL; // 09/16/99 HHI Schueuer: added for sadct iDcScaler = iDcScalerC; } 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, rgchBlkShape, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE); // HHI Schueuer }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -