📄 vopmbenc.cpp
字号:
}Void CVideoObjectEncoder::encodeNSForPVOP_WithShape (){ Int iMBX, iMBY, iMB = 0; motionEstPVOP_WithShape (); // shape bitstream is set to shape cache m_pbitstrmShapeMBOut = m_pbitstrmShape; // Rate Control UInt newQStep = m_vopmd.intStep; // for frame based rate control // vopmd.intStep is updated at bottom of this function // Rate Control if (m_uiRateControl==RC_MPEG4) { Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16 * m_iRRVScale *m_iRRVScale); m_statRC.setMad (Ec); // calculate for next frame (should be this frame, but its too late to send vop qp!) newQStep = m_statRC.updateQuanStepsize (m_vopmd.intStep); // this is not the correct way to use rate control m_statRC.setQc (m_vopmd.intStep); } 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) Int iQPPrev = m_vopmd.intStep; // Int iQPAlpha = m_vopmd.intStepPAlpha[0]; CMotionVector* pmv = m_rgmv; CMotionVector* pmvBY = m_rgmvBY;//OBSS_SAIT_991015 if(m_volmd.volType == BASE_LAYER && m_volmd.bSpatialScalability) { m_rgmvBaseBY = m_rgmvBY; m_rctBase = m_rctCurrVOPY; } Int xIndex, yIndex; xIndex = yIndex = 0;//OBSSFIX_MODE3 if( m_volmd.volType == ENHN_LAYER && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1)) {// if(m_volmd.volType == ENHN_LAYER && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)) {//~OBSSFIX_MODE3 xIndex = (m_rctCurrVOPY.left - (m_rctBase.left*m_volmd.ihor_sampling_factor_n_shape/m_volmd.ihor_sampling_factor_m_shape) ); yIndex = (m_rctCurrVOPY.top - (m_rctBase.top*m_volmd.iver_sampling_factor_n_shape/m_volmd.iver_sampling_factor_m_shape) ); xIndex /= MB_SIZE; yIndex /= MB_SIZE; }//~OBSS_SAIT_991015 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 **pppxlcRefA = NULL, **pppxlcOrigA = 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 ();// MAC (SB) 26-Nov-99 PixelC** pppxlcRefMBA = NULL; const PixelC** pppxlcOrigMBA = NULL; if (m_volmd.fAUsage == EIGHT_BIT) { pppxlcRefA = new PixelC* [m_volmd.iAuxCompCount]; pppxlcOrigA = new PixelC* [m_volmd.iAuxCompCount]; pppxlcRefMBA = new PixelC* [m_volmd.iAuxCompCount]; pppxlcOrigMBA = new const PixelC* [m_volmd.iAuxCompCount]; for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { pppxlcRefA[iAuxComp] = (PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iStartInRefToCurrRctY; pppxlcOrigA[iAuxComp] = (PixelC*) m_pvopcOrig->pixelsBoundA (iAuxComp); } }// ~MAC Bool bRestartDelayedQP = TRUE;// Added for error resilient mode by Toshiba(1997-11-14) Bool bCodeVPHeaderNext = FALSE; // needed only for OBMC Int iTempVPMBnum = 0;// End Toshiba(1997-11-14) for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) { PixelC* ppxlcRefMBY = ppxlcRefY; PixelC* ppxlcRefMBU = ppxlcRefU; PixelC* ppxlcRefMBV = ppxlcRefV; PixelC* ppxlcRefMBBY = ppxlcRefBY; //PixelC* ppxlcRefMBA = ppxlcRefA; PixelC* ppxlcOrigMBY = ppxlcOrigY; PixelC* ppxlcOrigMBU = ppxlcOrigU; PixelC* ppxlcOrigMBV = ppxlcOrigV; PixelC* ppxlcOrigMBBY = ppxlcOrigBY; //PixelC* ppxlcOrigMBA = ppxlcOrigA; CoordI x = m_rctCurrVOPY.left; if (m_volmd.fAUsage == EIGHT_BIT) { for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { pppxlcRefMBA[iAuxComp] = pppxlcRefA[iAuxComp]; pppxlcOrigMBA[iAuxComp] = pppxlcOrigA[iAuxComp]; } }#ifdef __TRACE_AND_STATS_ m_statsMB.reset ();#endif // __TRACE_AND_STATS_ // initiate advance shape coding // Added for error resilient mode by Toshiba(1997-11-14) // The following operation is needed only for OBMC if ( m_volmd.bVPBitTh >= 0) { Int iCounter = m_pbitstrmOut -> getCounter(); bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh; if( bCodeVPHeaderNext ) { iTempVPMBnum = m_iVPMBnum; m_iVPMBnum = VPMBnum(0, iMBY); m_iVPCounter = iCounter; } } else { bCodeVPHeaderNext = FALSE; } copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY); ShapeMode shpmdColocatedMB = UNKNOWN; if(m_vopmd.bShapeCodingType) { if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){ shpmdColocatedMB = m_rgmbmdRef [ min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd; } else { if(m_volmd.volType == BASE_LAYER) shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd; else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 ) shpmdColocatedMB = ALL_OPAQUE; else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability shpmdColocatedMB = m_rgBaseshpmd [ min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef]; } } encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY); } else { m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY); decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); } // End Toshiba(1997-11-14) // Added for error resilient mode by Toshiba(1997-11-14) // The following operation is needed only for OBMC if( bCodeVPHeaderNext ) m_iVPMBnum = iTempVPMBnum; // End Toshiba(1997-11-14) if(pmbmd->m_bhas4MVForward) padMotionVectors(pmbmd,pmv); for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) { // MB rate control if (m_uiRateControl>=RC_TM5) { updateQP(pmbmd, iQPPrev, m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total()) ); } else {#ifdef _MBQP_CHANGE_ Int iDQuant = (rand() % 5) - 2; updateQP(pmbmd, iQPPrev, iQPPrev + iDQuant);#else // no change in step size, but still need to call... updateQP(pmbmd, iQPPrev, iQPPrev);#endif //_MBQP_CHANGE_ } if ( m_volmd.bVPBitTh >= 0) { if( bCodeVPHeaderNext ) { codeVideoPacketHeader (iMBX, iMBY, iQPPrev); // video packet header bRestartDelayedQP = TRUE; } } else { bCodeVPHeaderNext = FALSE; } // End Toshiba(1997-11-14) #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)"); // shape quantization part m_statsMB.reset ();#endif // __TRACE_AND_STATS_ pmbmd->m_bPadded=FALSE; dumpCachedShapeBits(); if(iMBX<m_iNumMBX-1) { // Added for error resilient mode by Toshiba(1997-11-14) // The following operation is needed only for OBMC if ( m_volmd.bVPBitTh >= 0) { Int iCounter = m_pbitstrmOut -> getCounter(); bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh; if( bCodeVPHeaderNext ) { iTempVPMBnum = m_iVPMBnum; m_iVPMBnum = VPMBnum(iMBX+1, iMBY); m_iVPCounter = iCounter; } } else { bCodeVPHeaderNext = FALSE; } // End Toshiba(1997-11-14) // code shape 1mb in advance copyToCurrBuffJustShape (ppxlcOrigMBBY+MB_SIZE,m_iFrameWidthY); // Modified for error resilient mode by Toshiba(1997-11-14) if(m_vopmd.bShapeCodingType) {//OBSS_SAIT_991015 if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){ shpmdColocatedMB = m_rgmbmdRef [ min (max (0, iMBX+1), m_iNumMBXRef-1) + min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef ].m_shpmd; } else {//OBSSFIX_MODE3 if(m_volmd.volType == BASE_LAYER) shpmdColocatedMB = m_rgmbmdRef [ min (max (0, iMBX+1), m_iNumMBXRef-1) + min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef ].m_shpmd; else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 ) shpmdColocatedMB = ALL_OPAQUE; else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability shpmdColocatedMB = m_rgBaseshpmd [ min (max (0, ((iMBX+xIndex+1)*m_volmd.ihor_sampling_factor_m_shape/m_volmd.ihor_sampling_factor_n_shape)), (m_iNumMBBaseXRef-1)) + min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef]; } }//~OBSS_SAIT_991015 encodePVOPMBJustShape( ppxlcRefMBBY+MB_SIZE, pmbmd+1, shpmdColocatedMB, pmv + PVOP_MV_PER_REF_PER_MB, pmvBY+1, x+MB_SIZE, y, iMBX+1, iMBY ); } else { m_statsMB.nBitsShape += codeIntraShape ( ppxlcRefMBBY+MB_SIZE, pmbmd+1, iMBX+1, iMBY ); decideTransparencyStatus (pmbmd+1, m_ppxlcCurrMBBY); } // End Toshiba(1997-11-14) // Added for error resilient mode by Toshiba(1997-11-14) // The following operation is needed only for OBMC if( bCodeVPHeaderNext ) m_iVPMBnum = iTempVPMBnum; // End Toshiba(1997-11-14) // shape needs padded mvs ready for next mb if((pmbmd+1)->m_bhas4MVForward) padMotionVectors(pmbmd+1, pmv + PVOP_MV_PER_REF_PER_MB); } if(m_volmd.bShapeOnly==FALSE) { if (pmbmd -> m_rgTranspStatus [0] != ALL) { // need to copy binary shape too since curr buff is future shape copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, ppxlcRefMBBY, pppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV); //Changed HHI 2000-04-11 downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd); // HHI Schueuer: sadct if (!m_volmd.bSadctDisable) { deriveSADCTRowLengths (m_rgiCurrMBCoeffWidth, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd->m_rgTranspStatus); encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, &bRestartDelayedQP, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV ); } else encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, &bRestartDelayedQP); // end HHI // 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, pppxlcRefMBA); padNeighborTranspMBs ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA ); } // End of Hyundai(1998-5-9) } else { // all transparent so no update possible (set dquant=0) cancelQPUpdate(pmbmd); // Added for field based MC padding by Hyundai(1998-5-9) if (!m_vopmd.bInterlace) { padCurrAndTopTranspMBFromNeighbor ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA ); } // End of Hyundai(1998-5-9) } iQPPrev = pmbmd->m_stepSize; } 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; if (m_volmd.fAUsage == EIGHT_BIT) { for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { pppxlcRefMBA[iAuxComp] += MB_SIZE; pppxlcOrigMBA[iAuxComp] += MB_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; if (m_volmd.fAUsage == EIGHT_BIT) { for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { pppxlcRefA[iAuxComp] += m_iFrameWidthYxMBSize; pppxlcOrigA[iAuxComp] += 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_pvopcRefQ1); // End of Hyundai(1998-5-9) //OBSS_SAIT_991015//OBSSFIX_MODE3 if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER && !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1) ) { // if SpatialScalability// if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER) { // if SpatialScalability//~OBSSFIX_MODE3 delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbHorSamplingChk; delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbVerSamplingChk; } //~OBSS_SAIT_991015 // MAC if (m_volmd.fAUsage == EIGHT_BIT) { delete [] pppxlcRefA; delete [] pppxlcOrigA; delete [] pppxlcRefMBA; delete [] pppxlcOrigMBA; } //~MAC // restore normal output stream m_pbitstrmShapeMBOut = m_pbitstrmOut; // update the vop header qp if changed by rate control m_vopmd.intStep = newQStep;}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 (); Int iQPPrev = m_vopmd.intStepB; Int iMBX, iMBY, iMB = 0; 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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -