📄 sys_encoder_motest.cpp
字号:
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; }// INTERLACE // new changes 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -