📄 sys_decoder_mbdec.cpp
字号:
iDcScaler, iBlk, m_rgpmbmCurr [iMBX], pmbmd, blkmPred, //for intra-pred iQpPred, rgchBlkShape, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE); }}Void CVideoObjectDecoder::decodeAlphaIntraMB (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcRefMBA, Int iAuxComp, const PixelC *ppxlcCurrMBBY){ assert (pmbmd != NULL); if (pmbmd -> m_rgTranspStatus [0] == ALL) return; assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ); Int iQP = pmbmd->m_stepSizeAlpha; Int iDcScalerA; if (pmbmd -> m_stepSizeAlpha < 1) pmbmd -> m_stepSizeAlpha = 1; if (iQP <= 4) { iDcScalerA = 8; } else if (iQP >= 5 && iQP <= 8) { iDcScalerA = 2 * iQP; } else if (iQP >= 9 && iQP <= 24) { iDcScalerA = iQP + 8; } else { iDcScalerA = 2 * iQP - 16; } assert (iQP > 0 && iQP < 64); pmbmd->m_bCodeDcAsAcAlpha = FALSE; if(pmbmd->m_pCODAlpha[iAuxComp]==ALPHA_ALL255) { // fill curr macroblock with 255 Int iY; PixelC *ppxlc = ppxlcRefMBA; for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY) pxlcmemset(ppxlc, 255, MB_SIZE); // fix intra prediction Int iBlk; MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX]; for(iBlk = A_BLOCK1; iBlk<=A_BLOCK4; iBlk++) { Int i; pmbmCurr->rgblkm [iBlk - 1] [0] = divroundnearest(255 * 8, iDcScalerA) * iDcScalerA; //save recon value of DC for intra pred //save Qcoef in memory for (i = 1; i < BLOCK_SIZE; i++) { pmbmCurr->rgblkm [iBlk - 1] [i] = 0; pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = 0; } } return; } //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; // HHI Schueuer: for sadct, see also the cond. assignments inside the next switch stmt. const PixelC* rgchBlkShape = NULL; // end HHI Int* rgiCoefQ; for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) { if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) continue; switch (iBlk) { case (A_BLOCK1): rgchBlkDst = ppxlcRefMBA; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY : NULL; break; case (A_BLOCK2): rgchBlkDst = ppxlcRefMBA + BLOCK_SIZE; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL; break; case (A_BLOCK3): rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL; break; case (A_BLOCK4): rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize + BLOCK_SIZE; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL; break; } rgiCoefQ = m_rgpiCoefQ [iBlk - 1]; const BlockMemory blkmPred = NULL; Int iQpPred = iQP; decideIntraPred (blkmPred, pmbmd, iQpPred, (BlockNum)(iBlk+iAuxComp*4), pmbmLeft, pmbmTop, pmbmLeftTop, m_rgpmbmCurr [iMBX], // save for curr coefs pmbmdLeft, pmbmdTop, pmbmdLeftTop); decodeIntraBlockTexture (rgchBlkDst, m_iFrameWidthY, iQP, iDcScalerA, iBlk+iAuxComp*4, m_rgpmbmCurr [iMBX], pmbmd, blkmPred, //for intra-pred iQpPred, rgchBlkShape, MB_SIZE, iAuxComp); // 01/27/99 HHI Schueuer: added rgchBlkShape, MB_SIZE }}Void CVideoObjectDecoder::decodeTextureInterMB (CMBMode* pmbmd, const PixelC *ppxlcCurrMBBY, const PixelC *ppxlcCurrMBBUV){ assert (pmbmd != NULL); if (pmbmd->m_rgTranspStatus [0] == ALL || pmbmd->m_bSkip) return; assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ); Int iQP = pmbmd->m_stepSize; Int* rgiBlkCurrQ = m_ppxliErrorMBY; // HHI Schueuer: for sadct, see also the cond. assignments inside the next switch stmt. const PixelC* rgchBlkShape = NULL; // end HHI Int iWidthCurrQ;// RRV insertion PixelI* pi_block16x16 = NULL; if(m_vopmd.RRVmode.iRRVOnOff == 1) { pi_block16x16 = new PixelI [256]; }// ~RRV 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): rgiBlkCurrQ = m_ppxliErrorMBY; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL; break; case (Y_BLOCK2): // RRV modification rgiBlkCurrQ = m_ppxliErrorMBY + (BLOCK_SIZE *m_iRRVScale);// rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;// ~RRV rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL; break; case (Y_BLOCK3): // RRV modification rgiBlkCurrQ = m_ppxliErrorMBY + (MB_SIZE * BLOCK_SIZE *m_iRRVScale *m_iRRVScale);// rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;// ~RRV rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL; break; case (Y_BLOCK4): // RRV modification rgiBlkCurrQ = m_ppxliErrorMBY + (MB_SIZE * BLOCK_SIZE *m_iRRVScale *m_iRRVScale) + (BLOCK_SIZE *m_iRRVScale);// rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;// ~RRV rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL; break; }// RRV modification iWidthCurrQ = (MB_SIZE *m_iRRVScale);// iWidthCurrQ = MB_SIZE;// ~RRV } else {// RRV modification iWidthCurrQ = (BLOCK_SIZE *m_iRRVScale);// iWidthCurrQ = BLOCK_SIZE;// ~RRV rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV; rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL; } if (pmbmd->getCodedBlockPattern (iBlk)) // HHI Schueuer : pmbmd, iBlk, rgchBlkShape, (iBlk < U_BLOCK) ? MB_SIZE : BLOCK_SIZE added decodeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, iQP, FALSE, pmbmd, iBlk, rgchBlkShape, (iBlk < U_BLOCK) ? MB_SIZE : BLOCK_SIZE); //all for intra-pred else // RRV modification if(m_vopmd.RRVmode.iRRVOnOff == 1) { memset (pi_block16x16, 0, sizeof (Int) * 256); writeCubicRct(MB_SIZE, iWidthCurrQ, pi_block16x16, rgiBlkCurrQ); } else { for (Int i = 0; i < BLOCK_SIZE; i++) { memset (rgiBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE); rgiBlkCurrQ += iWidthCurrQ; } }// ~RRV }// RRV insertion if(m_vopmd.RRVmode.iRRVOnOff == 1) { delete pi_block16x16; }// ~RRV}// HHI Schueuer. const PixelC *ppxlcCurrMBBY added for sadctVoid CVideoObjectDecoder::decodeAlphaInterMB (CMBMode* pmbmd, PixelC *ppxlcRefMBA, Int iAuxComp, const PixelC *ppxlcCurrMBBY){ assert (pmbmd != NULL); if (pmbmd->m_rgTranspStatus [0] == ALL) return; if(pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_ALL255) { // fill curr macroblock with 255 Int iY; PixelC *ppxlc = ppxlcRefMBA; for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY) pxlcmemset(ppxlc, 255, MB_SIZE); return; } if(pmbmd->m_pCODAlpha[iAuxComp] != ALPHA_CODED) return; assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ); Int iQP = pmbmd->m_stepSizeAlpha; Int* piBlkCurrQ = NULL; // HHI Schueuer : for sadct, see also the cond. assignments inside the next switch stmt. const PixelC* rgchBlkShape = NULL; // end HHI for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) { if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) continue; switch (iBlk) { case (A_BLOCK1): piBlkCurrQ = m_ppxliErrorMBA[iAuxComp]; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY : NULL; break; case (A_BLOCK2): piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + BLOCK_SIZE; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL; break; case (A_BLOCK3): piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + MB_SIZE * BLOCK_SIZE; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL; break; case (A_BLOCK4): piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE; rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL; break; } // Int *pix = piBlkCurrQ; Int i; if (pmbmd->getCodedBlockPattern (iBlk+iAuxComp*4)) { // HHI Schueuer : pmbmd, iBlk, rgchBlkShape, MB_SIZE added decodeTextureInterBlock (piBlkCurrQ, MB_SIZE, iQP, TRUE, pmbmd, iBlk+iAuxComp*4, rgchBlkShape, MB_SIZE, iAuxComp); } else for (i = 0; i < BLOCK_SIZE; i++) { memset (piBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE); piBlkCurrQ += MB_SIZE; } }}Void CVideoObjectDecoder::setCBPYandC (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk){ pmbmd->setCodedBlockPattern (U_BLOCK, (iCBPC >> 1) & 1) ; pmbmd->setCodedBlockPattern (V_BLOCK, iCBPC & 1) ; Int iBitPos = 1, iBlk; for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) { pmbmd->setCodedBlockPattern ( iBlk, (iCBPY >> (cNonTrnspBlk - iBitPos)) & 1 ); iBitPos++; } else pmbmd->setCodedBlockPattern (iBlk, 0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -