📄 vopmbenc.cpp
字号:
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
SaveMBmCurrRow (iMBY, m_rgpmbmCurr); // save current row pointed by *m_rgpmbmCurr
m_rgpmbmCurr = ppmbmTemp;
ppxlcRefY += m_iFrameWidthYxMBSize;
ppxlcRefU += m_iFrameWidthUVxBlkSize;
ppxlcRefV += m_iFrameWidthUVxBlkSize;
ppxlcOrigY += m_iFrameWidthYxMBSize;
ppxlcOrigU += m_iFrameWidthUVxBlkSize;
ppxlcOrigV += m_iFrameWidthUVxBlkSize;
}
if(m_vopmd.RRVmode.iRRVOnOff == 1)
{
ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY ()
+ m_iStartInRefToCurrRctY;
ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU ()
+ m_iStartInRefToCurrRctUV;
ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV ()
+ m_iStartInRefToCurrRctUV;
filterCodedPictureForRRV(ppxlcRefY, ppxlcRefU, ppxlcRefV,
m_ivolWidth, m_ivolHeight,
m_iNumMBX,
m_iNumMBY,
m_iFrameWidthY, m_iFrameWidthUV);
}
}
Void CVideoObjectEncoder::encodeNSForIVOP_WithShape ()
{
//in case the IVOP is used as an ref for direct mode
memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
memset (m_rgmvBY, 0, m_iNumMB * sizeof (CMotionVector));
Int iMBX, iMBY, iMB = 0;
Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
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.intStepI; //initialization
Int iQPPrevAlpha = m_vopmd.intStepIAlpha[0];
if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
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* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;
PixelC **pppxlcRefA, **pppxlcOrigA;
PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
//OBSS_SAIT_991015
if(m_volmd.volType == BASE_LAYER && m_volmd.bSpatialScalability)
m_rctBase = m_rctCurrVOPY;
for(Int i=0; i<m_iNumMB; i++) {
m_rgmvBaseBY[i].iMVX = 0; // for shape
m_rgmvBaseBY[i].iMVY = 0; // for shape
m_rgmvBaseBY[i].iHalfX = 0; // for shape
m_rgmvBaseBY[i].iHalfY = 0; // for shape
}
//~OBSS_SAIT_991015
// MAC (SB) 26-Nov-99
PixelC** pppxlcRefMBA;
const PixelC** pppxlcOrigMBA;
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;
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
PixelC* ppxlcRefMBY = ppxlcRefY;
PixelC* ppxlcRefMBU = ppxlcRefU;
PixelC* ppxlcRefMBV = ppxlcRefV;
PixelC* ppxlcRefMBBY = ppxlcRefBY;
PixelC* ppxlcRefMBBUV = ppxlcRefBUV;
//PixelC* ppxlcRefMBA = ppxlcRefA;
PixelC* ppxlcOrigMBY = ppxlcOrigY;
PixelC* ppxlcOrigMBU = ppxlcOrigU;
PixelC* ppxlcOrigMBV = ppxlcOrigV;
PixelC* ppxlcOrigMBBY = ppxlcOrigBY;
//PixelC* ppxlcOrigMBA = ppxlcOrigA;
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {
pppxlcRefMBA[iAuxComp] = pppxlcRefA[iAuxComp];
pppxlcOrigMBA[iAuxComp] = pppxlcOrigA[iAuxComp];
}
}
// In a given Sprite object piece, identify whether current macroblock is not a hole and should be coded ?
Bool bSptMB_NOT_HOLE= TRUE;
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);
RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);
}
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, iMB++) {
// code current macroblock only if it is not a hole
m_bSptMB_NOT_HOLE = bSptMB_NOT_HOLE;
if (!m_bSptMB_NOT_HOLE)
goto EOMB2;
// MB rate control
if (m_uiRateControl>=RC_TM5) {
pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
m_statsVOP.total()) - iQPPrev;
if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
}
// Added for error resilient mode by Toshiba(1997-11-14)
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
if ( m_volmd.bVPBitTh >= 0) {
Int iCounter = m_pbitstrmOut -> getCounter();
if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
m_iVPCounter = iCounter;
bRestartDelayedQP = TRUE;
}
}
// End Toshiba(1997-11-14)
#ifdef __TRACE_AND_STATS_
m_statsMB.reset ();
m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
#endif // __TRACE_AND_STATS_
pmbmd->m_bSkip = FALSE; //reset for direct mode
// GMC
pmbmd->m_bMCSEL = FALSE; //reset for direct mode
// ~GMC
pmbmd->m_bPadded=FALSE;
copyToCurrBuffWithShape (
ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,
ppxlcOrigMBBY, pppxlcOrigMBA,
m_iFrameWidthY, m_iFrameWidthUV
);
downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);
if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) {
LPEPadding (pmbmd);
m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);
downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // need to modify it a little (NONE block won't change)
}
else
m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace) initMergedMode (pmbmd);
// End of Hyundai(1998-5-9)*/
if(m_volmd.bShapeOnly == FALSE) {// shape only mode
pmbmd->m_stepSizeDelayed = iQPPrev;
if (pmbmd -> m_rgTranspStatus [0] != ALL) {
// HHI Schueuer: sadct
if (!m_volmd.bSadctDisable)
deriveSADCTRowLengths (m_rgiCurrMBCoeffWidth, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd->m_rgTranspStatus);
// end HHI
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);
if(bRestartDelayedQP)
{
pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
bRestartDelayedQP = FALSE;
}
iQPPrev = pmbmd->m_stepSize;
if (pmbmd->m_intStepDelta == 0)
pmbmd->m_dctMd = INTRA;
else
pmbmd->m_dctMd = INTRAQ;
if (m_volmd.fAUsage == EIGHT_BIT) {
// update alpha quant
if(!m_volmd.bNoGrayQuantUpdate)
{
iQPPrevAlpha = (iQPPrev * m_vopmd.intStepIAlpha[0]) / m_vopmd.intStepI;
if(iQPPrevAlpha<1)
iQPPrevAlpha=1;
}
pmbmd->m_stepSizeAlpha = iQPPrevAlpha;
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus[0] == PARTIAL)
boundaryMacroBlockMerge (pmbmd);
// End of Hyundai(1998-5-9)*/
// HHI Schueuer: sadct
if (!m_volmd.bSadctDisable)
quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
else
quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA);
// end HHI
codeMBTextureHeadOfIVOP (pmbmd);
sendDCTCoefOfIntraMBTexture (pmbmd);
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99
codeMBAlphaHeadOfIVOP (pmbmd,iAuxComp);
sendDCTCoefOfIntraMBAlpha (pmbmd,iAuxComp);
}
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
mergedMacroBlockSplit (pmbmd, ppxlcRefMBY, ppxlcRefMBA);
// End of Hyundai(1998-5-9)*/
// MC padding
// 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 {
// 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)
}
}
EOMB2:
//ppxlcRefMBA += MB_SIZE;
ppxlcOrigMBBY += MB_SIZE;
//ppxlcOrigMBA += MB_SIZE;
pmbmd++;
#ifdef __TRACE_AND_STATS_
m_statsVOP += m_statsMB;
#endif // __TRACE_AND_STATS_
ppxlcRefMBY += MB_SIZE;
ppxlcRefMBU += BLOCK_SIZE;
ppxlcRefMBV += BLOCK_SIZE;
ppxlcRefMBBY += MB_SIZE;
ppxlcRefMBBUV += 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;
}
}
// Identify whether next Sprite object macroblock is not a hole and should be coded ?
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);
}
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
// dshu: begin of modification
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
SaveMBmCurrRow (iMBY, m_rgpmbmCurr); // save current row pointed by *m_rgpmbmCurr
// dshu: end of modification
m_rgpmbmCurr = ppmbmTemp;
ppxlcRefY += m_iFrameWidthYxMBSize;
//ppxlcRefA += m_iFrameWidthYxMBSize;
ppxlcRefU += m_iFrameWidthUVxBlkSize;
ppxlcRefV += m_iFrameWidthUVxBlkSize;
ppxlcRefBY += m_iFrameWidthYxMBSize;
ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
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)
if (m_volmd.fAUsage == EIGHT_BIT) {
delete [] pppxlcRefA;
delete [] pppxlcOrigA;
delete [] pppxlcRefMBA;
delete [] pppxlcOrigMBA;
}
}
Void CVideoObjectEncoder::encodeNSForPVOP ()
{
if (m_uiSprite == 0 || m_uiSprite == 2) // GMC
motionEstPVOP ();
// Rate Control
if (m_uiRateControl==RC_MPEG4) {
// RRV modification
Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16 * m_iRRVScale *m_iRRVScale);
// Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16);
// ~RRV
m_statRC.setMad (Ec);
if (m_statRC.noCodedFrame () >= RC_START_RATE_CONTROL) {
UInt newQStep = m_statRC.updateQuanStepsize ();
m_vopmd.intStepDiff = newQStep - m_vopmd.intStep; // DQUANT
m_vopmd.intStep = newQStep;
}
cout << "\t" << "Q:" << "\t\t\t" << m_vopmd.intStep << "\n";
m_statRC.setQc (m_vopmd.intStep);
}
// RRV insertion
// CMotionVector pmv_RRV[m_iNumMB *PVOP_MV_PER_REF_PER_MB];
CMotionVector *pmv_RRV = new CMotionVector[m_iNumMB *PVOP_MV_PER_REF_PER_MB];
if(m_vopmd.RRVmode.iRRVOnOff == 1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -