📄 vopmbenc.cpp
字号:
if (m_vopmd.bInterlace) initMergedMode (pmbmd); // End of Hyundai(1998-5-9)*/ if(m_volmd.bShapeOnly==FALSE) { pmbmd->m_stepSizeDelayed = iQPPrev; if (pmbmd -> m_rgTranspStatus [0] != ALL) { // need to copy binary shape too since curr buff is future shape copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, ppxlcRefMBBY, ppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha, bRestartDelayedQP); // Added for field based MC padding by Hyundai(1998-5-9) if (!m_vopmd.bInterlace) { if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA); padNeighborTranspMBs ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA ); } // End of Hyundai(1998-5-9) } else { // Added for field based MC padding by Hyundai(1998-5-9) if (!m_vopmd.bInterlace) { padCurrAndTopTranspMBFromNeighbor ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA ); } // End of Hyundai(1998-5-9) } } pmbmd++; pmv += PVOP_MV_PER_REF_PER_MB; pmvBY++; ppxlcRefMBBY += MB_SIZE; ppxlcRefMBA += MB_SIZE; ppxlcOrigMBBY += MB_SIZE; ppxlcOrigMBA += MB_SIZE;#ifdef __TRACE_AND_STATS_ m_statsVOP += m_statsMB;#endif // __TRACE_AND_STATS_ ppxlcRefMBY += MB_SIZE; ppxlcRefMBU += BLOCK_SIZE; ppxlcRefMBV += BLOCK_SIZE; ppxlcOrigMBY += MB_SIZE; ppxlcOrigMBU += BLOCK_SIZE; ppxlcOrigMBV += BLOCK_SIZE; } MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove; m_rgpmbmAbove = m_rgpmbmCurr; m_rgpmbmCurr = ppmbmTemp; ppxlcRefY += m_iFrameWidthYxMBSize; ppxlcRefU += m_iFrameWidthUVxBlkSize; ppxlcRefV += m_iFrameWidthUVxBlkSize; ppxlcRefBY += m_iFrameWidthYxMBSize; ppxlcRefA += m_iFrameWidthYxMBSize; ppxlcOrigY += m_iFrameWidthYxMBSize; ppxlcOrigBY += m_iFrameWidthYxMBSize; ppxlcOrigA += m_iFrameWidthYxMBSize; ppxlcOrigU += m_iFrameWidthUVxBlkSize; ppxlcOrigV += m_iFrameWidthUVxBlkSize; } // Added for field based MC padding by Hyundai(1998-5-9) if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE) fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1); // End of Hyundai(1998-5-9) // restore normal output stream m_pbitstrmShapeMBOut = m_pbitstrmOut;}Void CVideoObjectEncoder::encodeNSForBVOP (){ motionEstBVOP (); CoordI y = 0; CMBMode* pmbmd = m_rgmbmd; CMotionVector* pmv = m_rgmv; CMotionVector* pmvBackward = m_rgmvBackward; const CMBMode* pmbmdRef = m_rgmbmdRef; //MB mode in ref frame for direct mode const CMotionVector* pmvRef = m_rgmvRef; //MV in ref frame for direct mode PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV; PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY (); PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU (); PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV (); // MB rate control //Int iIndexofQ = 0; //Int rgiQ [4] = {-2, 0, 0, 2}; // ----- Int iQPPrev = m_vopmd.intStepB; Int iMBX, iMBY, iMB = 0; Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) { PixelC* ppxlcCurrQMBY = ppxlcCurrQY; PixelC* ppxlcCurrQMBU = ppxlcCurrQU; PixelC* ppxlcCurrQMBV = ppxlcCurrQV; PixelC* ppxlcOrigMBY = ppxlcOrigY; PixelC* ppxlcOrigMBU = ppxlcOrigU; PixelC* ppxlcOrigMBV = ppxlcOrigV; CoordI x = 0; m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0; m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0; m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0; m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0; for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y"); // shape quantization part m_statsMB.reset ();#endif // __TRACE_AND_STATS_ pmbmd->m_intStepDelta = 0; // MB rate control if (m_uiRateControl>=RC_TM5) { int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total()); // special case for BVOP copied from MoMuSys if (k > iQPPrev) { if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2; } else if (k < iQPPrev) { if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2; } }#ifdef _MBQP_CHANGE_ if (!pmbmd->m_bColocatedMBSkip && pmbmd->m_mbType != DIRECT) { iIndexofQ = (iIndexofQ + 1) % 4; pmbmd->m_dctMd = INTERQ; pmbmd->m_intStepDelta = rgiQ [iIndexofQ]; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; if ((iQPPrev + pmbmd->m_intStepDelta) > iQuantMax) pmbmd->m_intStepDelta = 0; if ((iQPPrev + pmbmd->m_intStepDelta) <= 0) pmbmd->m_intStepDelta = 0; } // -----#endif //_MBQP_CHANGE_ pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;/* NBIT: change 31 to iMaxQP assert (pmbmd->m_stepSize <= 31 && pmbmd->m_stepSize > 0);*/ assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0); if ( m_volmd.bVPBitTh >= 0) { Int iCounter = m_pbitstrmOut -> getCounter(); if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) { // reset DQ to use QP in VP header pmbmd->m_intStepDelta = 0; if (pmbmd ->m_dctMd == INTERQ) pmbmd->m_dctMd = INTER; iQPPrev = pmbmd->m_stepSize; codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header m_iVPCounter = iCounter; //reset MV predictor m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0; m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0; m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0; m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0; } } if (pmbmd->m_bColocatedMBSkip && (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0))) { // don't need to send any bit for this mode copyFromRefToCurrQ ( m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL ); } else { copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV); encodeBVOPMB ( ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, pmbmd, pmv, pmvBackward, pmbmdRef, pmvRef, iMBX, iMBY, x, y ); if (pmbmd->getCodedBlockPattern (U_BLOCK) || pmbmd->getCodedBlockPattern (V_BLOCK) || pmbmd->getCodedBlockPattern (Y_BLOCK1) || pmbmd->getCodedBlockPattern (Y_BLOCK2) || pmbmd->getCodedBlockPattern (Y_BLOCK3) || pmbmd->getCodedBlockPattern (Y_BLOCK4)) iQPPrev = pmbmd->m_stepSize; } pmbmd++; pmv += BVOP_MV_PER_REF_PER_MB; pmvBackward += BVOP_MV_PER_REF_PER_MB; pmvRef += PVOP_MV_PER_REF_PER_MB; pmbmdRef++; m_statsVOP += m_statsMB; ppxlcCurrQMBY += MB_SIZE; ppxlcCurrQMBU += BLOCK_SIZE; ppxlcCurrQMBV += BLOCK_SIZE; ppxlcOrigMBY += MB_SIZE; ppxlcOrigMBU += BLOCK_SIZE; ppxlcOrigMBV += BLOCK_SIZE; } ppxlcCurrQY += m_iFrameWidthYxMBSize; ppxlcCurrQU += m_iFrameWidthUVxBlkSize; ppxlcCurrQV += m_iFrameWidthUVxBlkSize; ppxlcOrigY += m_iFrameWidthYxMBSize; ppxlcOrigU += m_iFrameWidthUVxBlkSize; ppxlcOrigV += m_iFrameWidthUVxBlkSize; }}Void CVideoObjectEncoder::encodeNSForBVOP_WithShape (){ motionEstBVOP_WithShape (); // decide prediction direction for shape if(m_bCodedFutureRef==FALSE) m_vopmd.fShapeBPredDir = B_FORWARD; else { if(m_tFutureRef - m_t >= m_t - m_tPastRef) m_vopmd.fShapeBPredDir = B_FORWARD; else m_vopmd.fShapeBPredDir = B_BACKWARD; } Int iQPPrev = m_vopmd.intStepB; Int iQPPrevAlpha = m_vopmd.intStepBAlpha; if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb(); CoordI y = m_rctCurrVOPY.top; CMBMode* pmbmd = m_rgmbmd; // Added for field based MC padding by Hyundai(1998-5-9) CMBMode* field_pmbmd = m_rgmbmd; // End of Hyundai(1998-5-9) CMotionVector* pmv = m_rgmv; CMotionVector* pmvBackward = m_rgmvBackward; CMotionVector* pmvBY = m_rgmvBY; PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV; PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY; PixelC *ppxlcCurrQA = NULL, * ppxlcOrigA = NULL; PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY (); PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU (); PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV (); PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY (); if (m_volmd.fAUsage == EIGHT_BIT) { ppxlcCurrQA = (PixelC*) m_pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY; ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA (); } Int iMBX, iMBY, iMB = 0; const CMBMode* pmbmdRef; const CMotionVector* pmvRef; for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) { PixelC* ppxlcCurrQMBY = ppxlcCurrQY; PixelC* ppxlcCurrQMBU = ppxlcCurrQU; PixelC* ppxlcCurrQMBV = ppxlcCurrQV; PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY; PixelC* ppxlcCurrQMBA = ppxlcCurrQA; PixelC* ppxlcOrigMBY = ppxlcOrigY; PixelC* ppxlcOrigMBU = ppxlcOrigU; PixelC* ppxlcOrigMBV = ppxlcOrigV; PixelC* ppxlcOrigMBBY = ppxlcOrigBY; PixelC* ppxlcOrigMBA = ppxlcOrigA; CoordI x = m_rctCurrVOPY.left; m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0; m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0; m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0; m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0; Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) { pmbmd->m_intStepDelta = 0; //sharp added this pmbmd->m_bPadded=FALSE; // shape quantization part m_statsMB.reset ();// Modified for error resilience mode by Toshiba(1998-1-16) pmbmd->m_stepSize = m_vopmd.intStepB; // MB rate control -- should this be here?????? if (m_uiRateControl>=RC_TM5) { int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total()); // special case for BVOP copied from MoMuSys if (k > iQPPrev) { if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2; } else if (k < iQPPrev) { if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2; } } if ( m_volmd.bVPBitTh >= 0) { Int iCounter = m_pbitstrmOut -> getCounter(); if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {// // reset DQ to use QP in VP header// pmbmd->m_intStepDelta = 0;// if (pmbmd ->m_dctMd == INTERQ)// pmbmd->m_dctMd = INTER;// iQPPrev = pmbmd->m_stepSize; codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header m_iVPCounter = iCounter; //reset MV predictor m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0; m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0; m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0; m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0; } }// End Toshiba(1998-1-16) findColocatedMB (iMBX, iMBY, pmbmdRef, pmvRef); ShapeMode shpmdColocatedMB; if(m_vopmd.fShapeBPredDir==B_FORWARD) shpmdColocatedMB = m_rgshpmd [min (max (0, iMBX), m_iRefShpNumMBX - 1) + min (max (0, iMBY), m_iRefShpNumMBY - 1) * m_iRefShpNumMBX]; else shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBX), m_iNumMBXRef - 1) + min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd; if (pmbmd->m_bColocatedMBSkip && (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0))) { // don't need to send any bit for this mode copyToCurrBuffJustShape( ppxlcOrigMBBY, m_iFrameWidthY ); m_statsMB.nBitsShape += codeInterShape ( ppxlcCurrQMBBY, m_vopmd.fShapeBPredDir==B_FORWARD ? m_pvopcRefQ0 : m_pvopcRefQ1, pmbmd, shpmdColocatedMB, NULL, pmvBY, x, y, iMBX, iMBY ); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // change pmbmd to inter if all transparent /*BBM// Added for Boundary by Hyundai(1998-5-9) if (m_vopmd.bInterlace) initMergedMode (pmbmd); // End of Hyundai(1998-5-9)*/ // reset motion vectors to zero because of skip memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector)); memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector)); if (m_volmd.fAUsage == EIGHT_BIT) copyAlphaFromRefToCurrQ(m_pvopcRefQ0, x, y, ppxlcCurrQMBA, &m_rctRefVOPY0); copyFromRefToCurrQ( m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0 ); } else { copyToCurrBuffWithShape ( ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, ppxlcOrigMBBY, ppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV ); encodeBVOPMB_WithShape ( ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA, ppxlcCurrQMBBY, pmbmd, pmv, pmvBackward, pmvBY, shpmdColocatedMB, pmbmdRef, pmvRef, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha ); } //padding of bvop is necessary for temporal scalability: bvop in base layer is used for prediction in enhancement layer if(m_volmd.bShapeOnly == FALSE) { // Added for field based MC padding by Hyundai(1998-5-9) if (!m_vopmd.bInterlace) { if (pmbmd -> m_rgTranspStatus [0] != ALL) { if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA); padNeighborTranspMBs ( iMBX, iMBY, pmbmd, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA ); } else { padCurrAndTopTranspMBFromNeighbor ( iMBX, iMBY, pmbmd, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA ); } } // End of Hyundai(1998-5-9) } pmvBY++; pmbmd++; pmv += BVOP_MV_PER_REF_PER_MB; pmvBackward += BVOP_MV_PER_REF_PER_MB; m_statsVOP += m_statsMB; ppxlcCurrQMBY += MB_SIZE; ppxlcCurrQMBU += BLOCK_SIZE; ppxlcCurrQMBV += BLOCK_SIZE; ppxlcCurrQMBBY += MB_SIZE; ppxlcCurrQMBA += MB_SIZE; ppxlcOrigMBY += MB_SIZE; ppxlcOrigMBU += BLOCK_SIZE; ppxlcOrigMBV += BLOCK_SIZE; ppxlcOrigMBBY += MB_SIZE; ppxlcOrigMBA += MB_SIZE; } ppxlcCurrQY += m_iFrameWidthYxMBSize; ppxlcCurrQU += m_iFrameWidthUVxBlkSize; ppxlcCurrQV += m_iFrameWidthUVxBlkSize; ppxlcCurrQBY += m_iFrameWidthYxMBSize; ppxlcCurrQA += m_iFrameWidthYxMBSize; ppxlcOrigY += m_iFrameWidthYxMBSize; ppxlcOrigU += m_iFrameWidthUVxBlkSize; ppxlcOrigV += m_iFrameWidthUVxBlkSize; ppxlcOrigBY += m_iFrameWidthYxMBSize; ppxlcOrigA += m_iFrameWidthYxMBSize; } // Added for field based MC padding by Hyundai(1998-5-9) if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE) fieldBasedMCPadding (field_pmbmd, m_pvopcCurrQ); // End of Hyundai(1998-5-9)}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -