📄 errenc.cpp
字号:
assert(iMBnum >= m_iVPMBnum);
return encodeMV (pmv, pmbmd, bVPNoLeft(iMBnum, iMBX), bVPNoRightTop(iMBnum, iMBX), bVPNoTop(iMBnum),
iMBX, iMBY);
}
//////////////////////////////////////////////////////////////////
//// The following functions are for Data partitioning mode ////
//////////////////////////////////////////////////////////////////
Void CVideoObjectEncoder::encodeNSForPVOP_DP ()
{
assert( m_volmd.bDataPartitioning );
assert( m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType==SPRITE) ); // GMC
//assert(m_volmd.nBits==8);
// 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];
// ~RRV
if (m_uiSprite == 0 || m_uiSprite == 2) // GMC
motionEstPVOP ();
// RRV insertion
if(m_vopmd.RRVmode.iRRVOnOff == 1)
{
for(Int i = 0; i < (m_iNumMB *PVOP_MV_PER_REF_PER_MB); i ++)
{
pmv_RRV[i] = m_rgmv[i];
}
MotionVectorScalingUp(pmv_RRV, m_iNumMB, PVOP_MV_PER_REF_PER_MB);
// for(Int i = 0; i < (m_iNumMB *PVOP_MV_PER_REF_PER_MB); i ++)
// {
// m_rgmv[i].m_vctTrueHalfPel_x2.x = pmv_RRV[i].m_vctTrueHalfPel.x;
// m_rgmv[i].m_vctTrueHalfPel_x2.y = pmv_RRV[i].m_vctTrueHalfPel.y;
// pmv_RRV[i].m_vctTrueHalfPel_x2.x= pmv_RRV[i].m_vctTrueHalfPel.x;
// pmv_RRV[i].m_vctTrueHalfPel_x2.y= pmv_RRV[i].m_vctTrueHalfPel.y;
// }
for(Int j = 0; j < (m_iNumMB *PVOP_MV_PER_REF_PER_MB); j ++)
{
m_rgmv[j].m_vctTrueHalfPel_x2.x = pmv_RRV[j].m_vctTrueHalfPel.x;
m_rgmv[j].m_vctTrueHalfPel_x2.y = pmv_RRV[j].m_vctTrueHalfPel.y;
pmv_RRV[j].m_vctTrueHalfPel_x2.x= pmv_RRV[j].m_vctTrueHalfPel.x;
pmv_RRV[j].m_vctTrueHalfPel_x2.y= pmv_RRV[j].m_vctTrueHalfPel.y;
}
}
// ~RRV
// RRV_2 insertion
Int iVideoPacketNumber = 0;
// ~RRV_2
// 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);
}
// MB rate control
Int iIndexofQ = 0;
Int rgiQ [4] = {-1, -2, 1, 2};
// -----
Int iMBX, iMBY;
// RRV insertion
Int iCurrMBPos;
// ~RRV
CoordI y = 0;
CMBMode* pmbmd = m_rgmbmd;
Int iQPPrev = m_vopmd.intStep;
CMotionVector* pmv = m_rgmv;
// RRV insertion
CMotionVector* plmv_RRV = pmv_RRV;
// ~RRV
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* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
// NEWPRED
const PixelC* RefbufY = (PixelC*)m_pvopcRefQ0-> pixelsY ();
const PixelC* RefbufU = (PixelC*)m_pvopcRefQ0-> pixelsU ();
const PixelC* RefbufV = (PixelC*)m_pvopcRefQ0-> pixelsV ();
if (m_volmd.bNewpredEnable) {
g_pNewPredEnc->CopyReftoBuf(RefbufY, RefbufU, RefbufV, m_rctRefFrameY, m_rctRefFrameUV);
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
// RRV modification
(pmbmd + iMBX + m_iNumMBX*iMBY) -> m_iNPSegmentNumber = g_pNewPredEnc->GetSliceNum((iMBX *m_iRRVScale),(iMBY *m_iRRVScale));
// (pmbmd + iMBX + m_iNumMBX*iMBY) -> m_iNPSegmentNumber = g_pNewPredEnc->GetSliceNum(iMBX,iMBY);
// ~RRV
}
}
}
// ~NEWPRED
Int iVPCounter = m_statsVOP.total();
Int iVPtotal;
m_iVPMBnum = 0;
CStatistics m_statsVP(0);
// 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);
Bool bRestartDelayedQP = TRUE;
// RRV modification
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += (MB_SIZE *m_iRRVScale)) {
// for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
// ~RRV
PixelC* ppxlcRefMBY = ppxlcRefY;
PixelC* ppxlcRefMBU = ppxlcRefU;
PixelC* ppxlcRefMBV = ppxlcRefV;
PixelC* ppxlcOrigMBY = ppxlcOrigY;
PixelC* ppxlcOrigMBU = ppxlcOrigU;
PixelC* ppxlcOrigMBV = ppxlcOrigV;
CoordI x = 0;
// RRV modification
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += (MB_SIZE *m_iRRVScale))
{
// for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
// ~RRV
// NEWPRED
// RRV modification
if((m_volmd.bNewpredEnable) && g_pNewPredEnc->CheckSlice((iMBX *m_iRRVScale),(iMBY *m_iRRVScale))){
PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + m_iStartInRefToCurrRctY + iMBY * (MB_SIZE *m_iRRVScale) * m_rctRefFrameY.width;
PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + m_iStartInRefToCurrRctUV + iMBY * (BLOCK_SIZE *m_iRRVScale) * m_rctRefFrameUV.width;
PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + m_iStartInRefToCurrRctUV + iMBY * (BLOCK_SIZE *m_iRRVScale) * m_rctRefFrameUV.width;
g_pNewPredEnc->ChangeRefOfSlice((const PixelC* )RefpointY, RefbufY,(const PixelC* ) RefpointU, RefbufU,
(const PixelC* )RefpointV, RefbufV, (iMBX *m_iRRVScale), (iMBY *m_iRRVScale),m_rctRefFrameY, m_rctRefFrameUV);
// if((m_volmd.bNewpredEnable) && g_pNewPredEnc->CheckSlice(iMBX,iMBY)){
// PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + m_iStartInRefToCurrRctY + iMBY * MB_SIZE * m_rctRefFrameY.width;
// PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + m_iStartInRefToCurrRctUV + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
// PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + m_iStartInRefToCurrRctUV + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
// g_pNewPredEnc->ChangeRefOfSlice((const PixelC* )RefpointY, RefbufY,(const PixelC* ) RefpointU, RefbufU,
// (const PixelC* )RefpointV, RefbufV, iMBX, iMBY,m_rctRefFrameY, m_rctRefFrameUV);
// ~RRV
m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();
biInterpolateY (m_pvopcRefQ0, m_rctRefVOPY0, m_puciRefQZoom0, m_rctRefVOPZoom0, m_vopmd.iRoundingControl);
}
// ~NEWPRED
////#ifdef __TRACE_AND_STATS_
//// m_statsMB.reset ();
//// m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
////#endif // __TRACE_AND_STATS_
m_statsMB.reset ();
// MB rate control
//pmbmd->m_intStepDelta = 0;
//iIndexofQ = (iIndexofQ + 1) % 4;
//if (!pmbmd ->m_bhas4MVForward && !pmbmd ->m_bSkip) {
// if (pmbmd ->m_dctMd == INTRA)
// pmbmd ->m_dctMd == INTRAQ;
// else if (pmbmd ->m_dctMd == INTER)
// pmbmd->m_dctMd = INTERQ;
// pmbmd->m_intStepDelta = rgiQ [iIndexofQ];
//}
// -----
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
if(bRestartDelayedQP)
pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
else
pmbmd->m_stepSizeDelayed = iQPPrev;
// RRV_2 insertion
pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
// ~RRV_2
copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV);
encodePVOPMB (
ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
// RRV modification
pmbmd, pmv, plmv_RRV,
// pmbmd, pmv,
// ~RRV
iMBX, iMBY,
x, y
);
Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX;
// 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];
}
if (!pmbmd->m_bSkip)
{
iQPPrev = pmbmd->m_stepSize;
bRestartDelayedQP = FALSE;
}
pmbmd++;
pmv += PVOP_MV_PER_REF_PER_MB;
// RRV insertion
if (m_vopmd.RRVmode.iRRVOnOff == 1)
{
plmv_RRV += PVOP_MV_PER_REF_PER_MB;
}
// RRV~
#ifdef __TRACE_AND_STATS_
m_statsVOP += m_statsMB;
#endif // __TRACE_AND_STATS_
// RRV modification
ppxlcRefMBY += (MB_SIZE *m_iRRVScale);
ppxlcRefMBU += (BLOCK_SIZE *m_iRRVScale);
ppxlcRefMBV += (BLOCK_SIZE *m_iRRVScale);
ppxlcOrigMBY += (MB_SIZE *m_iRRVScale);
ppxlcOrigMBU += (BLOCK_SIZE *m_iRRVScale);
ppxlcOrigMBV += (BLOCK_SIZE *m_iRRVScale);
// ppxlcRefMBY += MB_SIZE;
// ppxlcRefMBU += BLOCK_SIZE;
// ppxlcRefMBV += BLOCK_SIZE;
// ppxlcOrigMBY += MB_SIZE;
// ppxlcOrigMBU += BLOCK_SIZE;
// ppxlcOrigMBV += BLOCK_SIZE;
// ~RRV
iVPtotal = (int) m_statsVOP.total() - iVPCounter;
// RRV insertion
iCurrMBPos = (m_iRRVScale == 2) ? (2 *iMBX +1 +(2 *iMBY +1) *(2 *m_iNumMBX)) : ((iMBY *m_iNumMBX) +iMBX);
// ~RRV
// NEWPRED
if( ((m_volmd.bNewpredEnable) && (m_volmd.bNewpredSegmentType == 0)) ?
// RRV modification
(iCurrMBPos == g_pNewPredEnc->SliceTailMBA((iMBX *m_iRRVScale), (iMBY *m_iRRVScale))) : (iVPtotal>m_volmd.bVPBitTh || iVPlastMBnum==m_iNumMB-1)){
// (iMBY*m_iNumMBX+iMBX==g_pNewPredEnc->SliceTailMBA(iMBX, iMBY)) : (iVPtotal>m_volmd.bVPBitTh || iVPlastMBnum==m_iNumMB-1)){
// ~RRV
// if( iVPtotal > m_volmd.bVPBitTh || iVPlastMBnum == m_iNumMB-1 /* last MB in a VOP */){
// ~NEWPRED
// Set to output bitstream
m_pbitstrmOut->SetDontSendBits(FALSE);
// encode video packet
iVPCounter = m_statsVOP.total();
m_statsVP.reset();
// RRV_2 insertion
iVideoPacketNumber ++;
// ~RRV_2
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 (MOTION_MARKER, NUMBITS_DP_MOTION_MARKER, "motion_marker");
m_statsVP.nBitsHead += NUMBITS_DP_MOTION_MARKER;
DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);
//assert( iVPtotal + m_statsVP.nBitsHead == (int) m_statsVP.total() );
m_iVPMBnum = iVPlastMBnum + 1;
// Set not to output but count bitstream
m_pbitstrmOut->SetDontSendBits(TRUE);
}
}
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
m_rgpmbmCurr = ppmbmTemp;
ppxlcRefY += m_iFrameWidthYxMBSize;
ppxlcRefU += m_iFrameWidthUVxBlkSize;
ppxlcRefV += m_iFrameWidthUVxBlkSize;
ppxlcOrigY += m_iFrameWidthYxMBSize;
ppxlcOrigU += m_iFrameWidthUVxBlkSize;
ppxlcOrigV += m_iFrameWidthUVxBlkSize;
}
// RRV insertion
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);
}
// ~RRV
// 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;
// Set to output bitstream
m_pbitstrmOut->SetDontSendBits(FALSE);
// NEWPRED
// copy previous picture to reference picture memory because of output ordering
if(m_volmd.bNewpredEnable) {
for( int iSlice = 0; iSlice < g_pNewPredEnc->m_iNumSlice; iSlice++ ) {
int iMBY = g_pNewPredEnc->NowMBA(iSlice)/((g_pNewPredEnc->getwidth())/MB_SIZE);
PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + (m_iStartInRefToCurrRctY-EXPANDY_REF_FRAME) + iMBY * MB_SIZE * m_rctRefFrameY.width;
PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;
g_pNewPredEnc->CopyNPtoPrev(iSlice, RefpointY, RefpointU, RefpointV);
}
repeatPadYOrA ((PixelC*) m_pvopcRefQ0->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ0);
repeatPadUV (m_pvopcRefQ0);
}
// ~NEWPRED
}
Void CVideoObjectEncoder::encodeNSForIVOP_DP ()
{
assert( m_volmd.bDataPartitioning );
assert( m_vopmd.vopPredType==IVOP );
//assert(m_volmd.nBits==8);
// bug fix by toshiba 98-9-24 start
//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));
// bug fix by toshiba 98-9-24 end
CMBMode* pmbmd = m_rgmbmd;
Int iQPPrev = m_vopmd.intStepI; //initialization
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* 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] = {-1, -2, 1, 2};
// -----
Int iMBX, iMBY;
// RRV insertion
Int iCurrMBPos;
// ~RRV
// RRV_2 insertion
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -