📄 errenc.cpp
字号:
}
}
}
}
for(iMBnum = iVPMBnum, pmbmd = m_rgmbmd+iVPMBnum, pmv = m_rgmv+iVPMBnum*PVOP_MV_PER_REF_PER_MB;
iMBnum <= iVPlastMBnum; iMBnum++, pmbmd++, pmv+=PVOP_MV_PER_REF_PER_MB) {
if (pmbmd->m_bSkip || pmbmd -> m_rgTranspStatus [0] == ALL)
continue;
iMBX = iMBnum % m_iNumMBX;
iMBY = iMBnum / m_iNumMBX;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CSite (iMBX, iMBY), "TextureTcoef_MB_X_Y");
#endif // __TRACE_AND_STATS_
if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) {
UInt iBlk = 0;
for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
UInt nBits = 0;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "BLK_NO");
#endif // __TRACE_AND_STATS_
if (iBlk < U_BLOCK)
if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;
//// Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
Int iCoefStart;
if (pmbmd->m_bCodeDcAsAc != TRUE) {
iCoefStart = 1;
} else {
iCoefStart = 0;
}
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
Int* rgiZigzag = grgiStandardZigzag;
if (pmbmd->m_bACPrediction)
rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;
if( m_volmd.bReversibleVlc == TRUE )
nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, FALSE);
else
nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);
}
switch (iBlk) {
case U_BLOCK:
m_statsVP->nBitsCr += nBits;
break;
case V_BLOCK:
m_statsVP->nBitsCb += nBits;
break;
default:
m_statsVP->nBitsY += nBits;
}
}
} else {
UInt nBits, iBlk = 0;
for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "BLK_NO");
#endif // __TRACE_AND_STATS_
if (iBlk < U_BLOCK)
if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
//// Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
if( m_volmd.bReversibleVlc == TRUE )
nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, FALSE);
else
nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag);
switch (iBlk) {
case U_BLOCK:
m_statsVP->nBitsCr += nBits;
break;
case V_BLOCK:
m_statsVP->nBitsCb += nBits;
break;
default:
m_statsVP->nBitsY += nBits;
}
}
}
}
}
}
Void CVideoObjectEncoder::encodeNSForIVOP_WithShape_DP ()
{
assert( m_volmd.bDataPartitioning );
assert( m_vopmd.vopPredType==IVOP );
assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE );
assert(m_volmd.nBits==8);
//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));
//#ifdef __SHARP_FIX_
memset (m_rgmvBY, 0, m_iNumMB * sizeof (CMotionVector));
//#endif
Int iMBX, iMBY;
CMBMode* pmbmd = m_rgmbmd;
Int iQPPrev = m_vopmd.intStepI; //initialization
Int iVPCounter = m_statsVOP.total();
Int iVPtotal;
m_iVPMBnum = 0;
CStatistics m_statsVP;
// DCT coefficient buffer for Data Partitioning mode
Int*** iCoefQ_DP = new Int** [m_iNumMB];
// Set not to output but count bitstream
// m_pbitstrmOut->SetDontSendBits(TRUE);
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 *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();
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;
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
#endif // __TRACE_AND_STATS_
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
if(bRestartDelayedQP)
pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
else
pmbmd->m_stepSizeDelayed = iQPPrev;
Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX;
// shape bitstream is set to shape cache
m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iVPlastMBnum];
m_statsMB.reset ();
pmbmd->m_bSkip = FALSE; //reset for direct mode
pmbmd->m_bPadded=FALSE;
copyToCurrBuffWithShape (
ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,
ppxlcOrigMBBY, ppxlcOrigMBA,
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);
if(m_volmd.bShapeOnly == FALSE) {
// // Set not to output but count bitstream
m_pbitstrmOut->SetDontSendBits(TRUE);
if (pmbmd -> m_rgTranspStatus [0] != ALL) {
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
bRestartDelayedQP = FALSE;
Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
assert (pmbmd->m_stepSize <= iQuantMax && pmbmd->m_stepSize > 0);
iQPPrev = pmbmd->m_stepSize;
if (pmbmd->m_intStepDelta == 0)
pmbmd->m_dctMd = INTRA;
else
pmbmd->m_dctMd = INTRAQ;
quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
codeMBTextureHeadOfIVOP (pmbmd);
sendDCTCoefOfIntraMBTexture (pmbmd);
// MC padding
if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
padNeighborTranspMBs (
iMBX, iMBY,
pmbmd,
ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
);
}
else {
padCurrAndTopTranspMBFromNeighbor (
iMBX, iMBY,
pmbmd,
ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
);
}
// // Set to output bitstream
m_pbitstrmOut->SetDontSendBits(FALSE);
}
// copy DCT coefficient to buffer
iCoefQ_DP[iVPlastMBnum] = new Int* [6];
Int iBlk;
for (iBlk = 0; iBlk < 6; iBlk++) {
iCoefQ_DP [iVPlastMBnum] [iBlk] = new Int [BLOCK_SQUARE_SIZE];
for( Int t = 0; t < BLOCK_SQUARE_SIZE; t++ )
iCoefQ_DP[iVPlastMBnum][iBlk][t] = m_rgpiCoefQ[iBlk][t];
}
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;
iVPtotal = (int) m_statsVOP.total() - iVPCounter;
if( iVPtotal > m_volmd.bVPBitTh || iVPlastMBnum == m_iNumMB-1 /* last MB in a VOP */) {
// Set to output bitstream
m_pbitstrmOut->SetDontSendBits(FALSE);
// encode video packet
iVPCounter = m_statsVOP.total();
m_statsVP.reset();
if( m_iVPMBnum > 0 )
{
m_statsVP.nBitsHead = codeVideoPacketHeader (m_rgmbmd[m_iVPMBnum].m_stepSize);
bRestartDelayedQP = TRUE;
}
DataPartitioningMotionCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);
m_pbitstrmOut -> putBits (DC_MARKER, NUMBITS_DP_DC_MARKER, "DC_marker");
m_statsVP.nBitsHead += NUMBITS_DP_DC_MARKER;
DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);
assert( iVPtotal + m_statsVP.nBitsHead == (int) m_statsVP.total() );
m_iVPMBnum = iVPlastMBnum + 1;
}
}
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
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;
}
// delete CoefQ_DP
for( Int iMB = 0; iMB < m_iNumMB; iMB++ ) {
for (Int iBlk = 0; iBlk < 6; iBlk++) {
delete [] iCoefQ_DP [iMB] [iBlk];
}
delete [] iCoefQ_DP[iMB];
}
delete [] iCoefQ_DP;
// restore normal output stream
m_pbitstrmShapeMBOut = m_pbitstrmOut;
// Set to output bitstream
m_pbitstrmOut->SetDontSendBits(FALSE);
}
Void CVideoObjectEncoder::encodeNSForPVOP_WithShape_DP ()
{
assert( m_volmd.bDataPartitioning );
assert( m_vopmd.vopPredType==PVOP );
assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE );
assert(m_volmd.nBits==8);
Int iMBX, iMBY;
motionEstPVOP_WithShape ();
// Rate Control
if (m_uiRateControl == RC_MPEG4) {
Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16);
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);
}
CoordI y = m_rctCurrVOPY.top;
CMBMode* pmbmd = m_rgmbmd;
Int iQPPrev = m_vopmd.intStep;
Int iQPPrevAlpha = m_vopmd.intStepPAlpha;
CMotionVector* pmv = m_rgmv;
CMotionVector* pmvBY = m_rgmvBY;
Int iVPCounter = m_statsVOP.total();
Int iVPtotal;
m_iVPMBnum = 0;
CStatistics m_statsVP;
// DCT coefficient buffer for Data Partitioning mode
Int*** iCoefQ_DP = new Int** [m_iNumMB];
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 *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();
// Added for error resilient mode by Toshiba(1997-11-14)
Bool bCodeVPHeaderNext = FALSE; // needed only for OBMC
Int iTempVPMBnum = 0;
Int iCounter;
// End Toshiba(1997-11-14)
Bool bRestartDelayedQP = TRUE;
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
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;
CoordI x = m_rctCurrVOPY.left;
#ifdef __TRACE_AND_STATS_
m_statsMB.reset ();
#endif // __TRACE_AND_STATS_
// initiate advance shape coding
// shape bitstream is set to shape cache
m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iMBY * m_iNumMBX];
// pmbmd->m_bPadded=FALSE;
// Added for error resilient mode by Toshiba(1997-11-14)
// The following operation is needed only for OBMC
// if( bCodeVPHeaderNext ) {
// iTempVPMBnum = m_iVPMBnum;
// m_iVPMBnum = VPMBnum(0, iMBY);
// }
// End Toshiba(1997-11-14)
copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY);
// Modified for error resilient mode by Toshiba(1997-11-14)
ShapeMode shpmdColocatedMB;
if(m_vopmd.bShapeCodingType) {
shpmdColocatedMB = m_rgmbmdRef [
min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY);
}
else {
m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY);
decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);
}
// 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) {
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)");
// shape quantization part
m_statsMB.reset ();
#endif // __TRACE_AND_STATS_
Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX;
pmbmd->m_bPadded=FALSE;
if(iMBX<m_iNumMBX-1)
{
// shape bitstream is set to shape cache
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -