?? motest.cpp
字號:
// 8x8
iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, x, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
pmv8++;
// RRV modification
ppxlcCodedBlkY += (BLOCK_SIZE *m_iRRVScale);
// ppxlcCodedBlkY += BLOCK_SIZE;
// ~RRV
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
pmv8++;
// RRV modification
ppxlcCodedBlkY += (BLOCK_SIZE *m_iRRVScale) *(MB_SIZE *m_iRRVScale)
-(BLOCK_SIZE *m_iRRVScale);
// ppxlcCodedBlkY += BLOCK_SIZE * MB_SIZE - BLOCK_SIZE;
// ~RRV
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
pmv8++;
// RRV modification
ppxlcCodedBlkY += (BLOCK_SIZE *m_iRRVScale);
// ppxlcCodedBlkY += BLOCK_SIZE;
// ~RRV
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
#endif // DISABLE_4MV_FOR_PVOP
/* NBIT: change
iSADInter -= FAVOR_16x16;
*/
// RRV modification
if(m_vopmd.RRVmode.iRRVOnOff == 1)
{
iSADInter -= iFavor32x32;
iSAD16x8 -= FAVOR_FIELD_RRV;
}
else
{
iSADInter -= iFavor16x16;
iSAD16x8 -= FAVOR_FIELD;
}
// iSADInter -= iFavor16x16;
// iSAD16x8 -= FAVOR_FIELD;
// ~RRV
if ((iSADInter <= iSAD8) && (iSADInter <= iSAD16x8)) {
/* NBIT: change
iSADInter += FAVOR_16x16;
*/
// RRV modification
if(m_vopmd.RRVmode.iRRVOnOff == 1)
{
iSADInter += iFavor32x32;
}
else
{
iSADInter += iFavor16x16;
}
// iSADInter += iFavor16x16;
// ~RRV
pmbmd -> m_bhas4MVForward = FALSE;
pmv -> computeTrueMV (); // compute here instead of blkmatch to save computation
pmv -> computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++) {// didn't increment the last pmv
pmv[i].m_vctTrueHalfPel = pmv->m_vctTrueHalfPel; // Save (iMVX, iMVY) for MV file
pmv[i].computeMV();
}
}
// INTERLACE
else if (iSAD16x8 <= iSAD8) { // Field-based
pmbmd -> m_bhas4MVForward = FALSE;
pmbmd -> m_bFieldMV = TRUE;
Int iTempX1, iTempY1, iTempX2, iTempY2;
if(pmbmd->m_bForwardTop) {
pmv [6].computeTrueMV ();
pmv [6].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX1 = pmv[6].m_vctTrueHalfPel.x;
iTempY1 = pmv[6].m_vctTrueHalfPel.y;
}
else {
pmv [5].computeTrueMV ();
pmv [5].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX1 = pmv[5].m_vctTrueHalfPel.x;
iTempY1 = pmv[5].m_vctTrueHalfPel.y;
}
if(pmbmd->m_bForwardBottom) {
pmv [8].computeTrueMV ();
pmv [8].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX2 = pmv[8].m_vctTrueHalfPel.x;
iTempY2 = pmv[8].m_vctTrueHalfPel.y;
}
else {
pmv [7].computeTrueMV ();
pmv [7].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX2 = pmv[7].m_vctTrueHalfPel.x;
iTempY2 = pmv[7].m_vctTrueHalfPel.y;
}
iSADInter = iSAD16x8 + FAVOR_FIELD;
Int iTemp;
for (UInt i = 1; i < 5; i++) {
iTemp = iTempX1 + iTempX2;
pmv [i].m_vctTrueHalfPel.x = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);
iTemp = iTempY1 + iTempY2;
pmv [i].m_vctTrueHalfPel.y = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);
pmv[i].computeMV ();
}
}
// ~INTERLACE
else {
pmv [1].computeTrueMV ();
pmv [2].computeTrueMV ();
pmv [3].computeTrueMV ();
pmv [4].computeTrueMV ();
pmv [1].computeMV ();
pmv [2].computeMV ();
pmv [3].computeMV ();
pmv [4].computeMV ();
pmbmd -> m_bhas4MVForward = TRUE;
iSADInter = iSAD8;
}
// GMC
pmbmd -> m_bMCSEL = FALSE;
if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE){
Int iMSADG = 4096*256;
PixelC* ppxlcRefforgme = (PixelC*) m_pvopcRefQ0->pixelsY () ;
iMSADG = globalme (x,y,ppxlcRefforgme);
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iMSADG, "MB_GMC");
#endif // __TRACE_AND_STATS_
Int ioffset, iQP=m_uiGMCQP; // GMC_V2 *m_rgiQPpred;
if(pmbmd -> m_bhas4MVForward == TRUE)
//ioffset = iQP*256/24;
ioffset = iQP*256/16;
else
{
if(pmbmd -> m_bFieldMV == TRUE)
{
ioffset = iQP*256/32;
}else{
if(pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)
ioffset = iFavorZero*2;
else
ioffset = iQP*256/64;
}
}
if((iMSADG - ioffset) <= iSADInter)
{
iSADInter = iMSADG;
pmbmd -> m_dctMd = INTER;
pmbmd -> m_bFieldMV = FALSE;
pmbmd -> m_bhas4MVForward = FALSE;
pmbmd -> m_bMCSEL = TRUE;
Int iPmvx, iPmvy, iHalfx, iHalfy;
globalmv (iPmvx, iPmvy, iHalfx, iHalfy,
x,y,m_vopmd.mvInfoForward.uiRange,m_volmd.bQuarterSample);
*pmv = CMotionVector (iPmvx, iPmvy);
pmv -> iHalfX = iHalfx;
pmv -> iHalfY = iHalfy;
pmv -> computeTrueMV ();
pmv -> computeMV ();
for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++)
pmv[i] = *pmv;
}
else
{
pmbmd -> m_bMCSEL = FALSE;
}
}
// ~GMC
/* NBIT: change
if (iSumDev < (iSADInter - FAVOR_INTER)) {
*/
// GMC
Int iIntraOffset;
if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)
iIntraOffset = iFavorInter;
//iIntraOffset = iFavorInter/2;
else
iIntraOffset = iFavorInter;
// ~GMC
if (iSumDev < (iSADInter - iIntraOffset)) { // GMC
pmbmd -> m_bSkip = FALSE;
pmbmd -> m_dctMd = INTRA;
pmbmd -> m_bFieldMV = FALSE;
// GMC
pmbmd -> m_bMCSEL = FALSE;
// ~GMC
memset (pmv, 0, PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
return ((m_uiRateControl==RC_MPEG4) ? sumAbsCurrMB () : 0);
}
else {
pmbmd -> m_dctMd = INTER;
if (pmbmd->m_bhas4MVForward == FALSE
&& pmbmd -> m_bFieldMV == FALSE
// GMC
&& pmbmd -> m_bMCSEL == FALSE
// ~GMC
&& pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)
/* NBIT: change
return (iSADInter + FAVORZERO);
*/
return (iSADInter + iFavorZero);
else
return iSADInter;
}
}
Int CVideoObjectEncoder::motionEstMB_PVOP_WithShape (
CoordI x, CoordI y,
CMotionVector* pmv, CMBMode* pmbmd,
const PixelC* ppxlcRefMBY
)
{
assert (pmbmd->m_rgTranspStatus [0] == PARTIAL);
UInt nBits = m_volmd.nBits; // NBIT
Int iFavorZero = FAVORZERO;
Int iFavor16x16 = (pmbmd->m_rgNumNonTranspPixels [0] >> 1) + 1; // NBIT
Int iFavorInter = pmbmd->m_rgNumNonTranspPixels [0] << 1; // NBIT
// NBIT: addjust mode selection thresholds
if (nBits > 8) {
iFavor16x16 <<= (nBits-8);
iFavorInter <<= (nBits-8);
iFavorZero <<= (nBits-8);
} else if (nBits < 8) {
iFavor16x16 >>= (8-nBits);
iFavorInter >>= (8-nBits);
iFavorZero >>= (8-nBits);
}
Int iInitSAD = sad16x16At0WithShape (ppxlcRefMBY, pmbmd);
Int iSADInter = blkmatch16WithShape (pmv, x, y, x, y, iInitSAD, ppxlcRefMBY, m_puciRefQZoom0, pmbmd, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);
Int iSumDev = sumDevWithShape (pmbmd -> m_rgNumNonTranspPixels [0]);
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSADInter, "MB_SAD16");
#endif // __TRACE_AND_STATS_
// INTERLACE
// New Changes
Int iSAD16x8 = 4096*256;
pmbmd -> m_bFieldMV = FALSE;
if(m_vopmd.bInterlace) {
// Field-Based Estimation
CMotionVector* pmv16x8 = pmv + 5;
const PixelC *ppxlcHalfPelRef = m_pvopcRefQ0->pixelsY()
+EXPANDY_REF_FRAME*m_iFrameWidthY + EXPANDY_REF_FRAME + x + y * m_iFrameWidthY; // 1.31.99 changes
// top to top
Int iSAD16x8top = blkmatch16x8WithShape (pmv16x8, x, y, 0, ppxlcRefMBY,
ppxlcHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);
pmv16x8++;
// bot to top
Int iSAD16x8bot = blkmatch16x8WithShape (pmv16x8, x, y, 0, ppxlcRefMBY + m_iFrameWidthY,
ppxlcHalfPelRef + m_iFrameWidthY, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);
iSAD16x8=(iSAD16x8top<iSAD16x8bot) ? iSAD16x8top : iSAD16x8bot;
pmbmd->m_bForwardTop = (iSAD16x8top<iSAD16x8bot) ? 0 : 1;
pmv16x8++;
// top to bot
iSAD16x8top = blkmatch16x8WithShape (pmv16x8, x, y, MB_SIZE, ppxlcRefMBY,
ppxlcHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);
pmv16x8++;
// bot to bot
iSAD16x8bot = blkmatch16x8WithShape (pmv16x8, x, y, MB_SIZE, ppxlcRefMBY + m_iFrameWidthY,
ppxlcHalfPelRef + m_iFrameWidthY, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);
iSAD16x8 += (iSAD16x8top<iSAD16x8bot) ? iSAD16x8top : iSAD16x8bot;
pmbmd->m_bForwardBottom = (iSAD16x8top<iSAD16x8bot) ? 0 : 1;
} else {
iSAD16x8 = 4096*256;
for (Int iBlk = 5; iBlk <= 8; iBlk++) { // 04/28/99 david ruhoff
pmv [iBlk] = pmv [0]; // fill in field info to make mv file deterministic
}
}
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD16x8, "MB_SAD16x8");
#endif // __TRACE_AND_STATS_
// end of New changes
// ~INTERLACE
CoordI blkX, blkY;
Int iSAD8 = 0;
CMotionVector* pmv8 = pmv + 1;
blkX = x + BLOCK_SIZE;
blkY = y + BLOCK_SIZE;
const PixelC* ppxlcCodedBlkY = m_ppxlcCurrMBY;
const PixelC* ppxlcCodedBlkBY = m_ppxlcCurrMBBY;
// 8 x 8
iSAD8 +=
(pmbmd->m_rgTranspStatus [1] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, x, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :
(pmbmd->m_rgTranspStatus [1] == NONE) ? blockmatch8 (ppxlcCodedBlkY, pmv8, x, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;
pmv8++;
ppxlcCodedBlkY += BLOCK_SIZE;
ppxlcCodedBlkBY += BLOCK_SIZE;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 +=
(pmbmd->m_rgTranspStatus [2] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, blkX, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :
(pmbmd->m_rgTranspStatus [2] == NONE) ? blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;
pmv8++;
ppxlcCodedBlkY += BLOCK_SIZE * MB_SIZE - BLOCK_SIZE;
ppxlcCodedBlkBY += BLOCK_SIZE * MB_SIZE - BLOCK_SIZE;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 +=
(pmbmd->m_rgTranspStatus [3] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :
(pmbmd->m_rgTranspStatus [3] == NONE) ? blockmatch8 (ppxlcCodedBlkY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;
pmv8++;
ppxlcCodedBlkY += BLOCK_SIZE;
ppxlcCodedBlkBY += BLOCK_SIZE;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
iSAD8 +=
(pmbmd->m_rgTranspStatus [4] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :
(pmbmd->m_rgTranspStatus [4] == NONE) ? blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
// begin added by Sharp (98/9/10) prevents inter4v with one transp block
if (( pmbmd->m_rgTranspStatus [1] != ALL && pmbmd->m_rgTranspStatus [2] == ALL
&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] == ALL )||
( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] != ALL
&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] == ALL )||
( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] == ALL
&& pmbmd->m_rgTranspStatus [3] != ALL && pmbmd->m_rgTranspStatus [4] == ALL )||
( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] == ALL
&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] != ALL ))
iSAD8 = 256 * 4096;
// end added by Sharp (98/9/10)
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iSAD8, "MB_SAD8");
#endif // __TRACE_AND_STATS_
/* NBIT: change
if ((iSADInter - ((pmbmd->m_rgNumNonTranspPixels [0] >> 1) + 1)) <= iSAD8) {
*/
// new changes
iSADInter -= iFavor16x16;
iSAD16x8 -= FAVOR_FIELD;
if ((iSADInter <= iSAD8)&&(iSADInter <= iSAD16x8)) {
iSADInter += iFavor16x16;
// end of new changes
pmbmd -> m_bhas4MVForward = FALSE;
pmv -> computeTrueMV (); // compute here instead of blkmatch to save computation
pmv -> computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++) // didn't increment the last pmv
pmv [i] = *pmv;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -