📄 mcenc.cpp
字号:
motionCompOneBVOPReference(m_pvopcPredMB, FORWARD, x, y, pmbmd, pmvForward, prctMVLimitForward); computeTextureErrorWithShape(); break; case BACKWARD: motionCompOneBVOPReference(m_pvopcPredMB, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward); computeTextureErrorWithShape(); break; case DIRECT: motionCompDirectMode(x, y, pmbmd, &m_rgmvRef[(PVOP_MV_PER_REF_PER_MB*(x + m_iNumMBX * y)) / MB_SIZE], prctMVLimitForward, prctMVLimitBackward,0); // new change 02-19-99 averagePredAndComputeErrorY_WithShape(); averagePredAndComputeErrorUV_WithShape(); break; case INTERPOLATE: motionCompOneBVOPReference(m_pvopcPredMB, FORWARD, x, y, pmbmd, pmvForward, prctMVLimitForward); motionCompOneBVOPReference(m_pvopcPredMBBack, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward); averagePredAndComputeErrorY_WithShape(); averagePredAndComputeErrorUV_WithShape(); break; } return; }// INTERLACED// end of new changes if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) { // Y is done when doing motion estimation motionCompInterpAndError_WithShape (pmvForward, pmvBackward, x, y,prctMVLimitForward,prctMVLimitBackward); CoordI xRefUVForward, yRefUVForward; mvLookupUVWithShape (pmbmd, pmvForward, xRefUVForward, yRefUVForward); motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, xRefUVForward, yRefUVForward, 0, prctMVLimitForward); CoordI xRefUVBackward, yRefUVBackward; mvLookupUVWithShape (pmbmd, pmvBackward, xRefUVBackward, yRefUVBackward); motionCompUV (m_ppxlcPredMBBackU, m_ppxlcPredMBBackV, m_pvopcRefQ1, x, y, xRefUVBackward, yRefUVBackward, 0, prctMVLimitBackward); averagePredAndComputeErrorUV_WithShape (); } else { const CMotionVector* pmv; const PixelC* ppxlcRef; // point to left-top of the reference VOP const PixelC* ppxlcRefZoom; // point to left-top of the reference VOP const CVOPU8YUVBA* pvopcRef; CRct *prctMVLimit; if (pmbmd->m_mbType == FORWARD) { // Y is done when doing motion estimation pmv = pmvForward; pvopcRef = m_pvopcRefQ0; ppxlcRef = m_pvopcRefQ0->pixelsY (); // point to left-top of the reference VOP ppxlcRefZoom = m_puciRefQZoom0->pixels (); // point to left-top of the reference VOP prctMVLimit = prctMVLimitForward; } else { pmv = pmvBackward; pvopcRef = m_pvopcRefQ1; ppxlcRef = m_pvopcRefQ1->pixelsY (); // point to left-top of the reference VOP ppxlcRefZoom = m_puciRefQZoom1->pixels (); // point to left-top of the reference VOP prctMVLimit = prctMVLimitBackward; } CoordI xRefUV, yRefUV; mvLookupUVWithShape (pmbmd, pmv, xRefUV, yRefUV); motionCompEncY (ppxlcRef, ppxlcRefZoom, m_ppxlcPredMBY, MB_SIZE, pmv, x, y,prctMVLimit); motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, pvopcRef, x, y, xRefUV, yRefUV, 0, prctMVLimit); computeTextureErrorWithShape (); }}Void CVideoObjectEncoder::motionCompAndDiffAlpha_BVOP_MB ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, const CMBMode* pmbmd, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) { motionCompMBAEnc (pmvForward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ0, x, y, 0, prctMVLimitForward,0); motionCompMBAEnc (pmvBackward, pmbmd, m_ppxlcPredMBBackA, m_pvopcRefQ1, x, y, 0, prctMVLimitBackward,1); // average predictions Int i; for(i = 0; i<MB_SQUARE_SIZE; i++) m_ppxlcPredMBA[i] = (m_ppxlcPredMBA[i] + m_ppxlcPredMBBackA[i] + 1)>>1; } else { const CMotionVector* pmv; const PixelC* ppxlcRef; // point to left-top of the reference VOP CRct *prctMVLimit; if (pmbmd->m_mbType == FORWARD) { pmv = pmvForward; ppxlcRef = m_pvopcRefQ0->pixelsA (); // point to left-top of the reference VOP prctMVLimit = prctMVLimitForward;// 12.22.98 begin of changes if(m_vopmd.bInterlace&&pmbmd->m_bFieldMV) motionCompMBAEnc (pmvForward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ0, x, y, 0, prctMVLimitForward,0);// end of changes } else { pmv = pmvBackward; ppxlcRef = m_pvopcRefQ1->pixelsA (); // point to left-top of the reference VOP prctMVLimit = prctMVLimitBackward;// 12.22.98 begin of changes if(m_vopmd.bInterlace&&pmbmd->m_bFieldMV) motionCompMBAEnc (pmvBackward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ1, x, y, 0, prctMVLimitBackward,1);// end of changes } if((!m_vopmd.bInterlace||(m_vopmd.bInterlace&&!pmbmd->m_bFieldMV))) // 12.22.98 changes motionComp ( m_ppxlcPredMBA, ppxlcRef, MB_SIZE, // MB size x * 2 + pmv->trueMVHalfPel ().x, y * 2 + pmv->trueMVHalfPel ().y, 0, prctMVLimit ); } computeAlphaError();}Void CVideoObjectEncoder::averagePredAndComputeErrorUV (){ Int i = 0; for (i = 0; i < BLOCK_SQUARE_SIZE; i++) { m_ppxlcPredMBU [i] = (m_ppxlcPredMBU [i] + m_ppxlcPredMBBackU [i] + 1) >> 1; m_ppxlcPredMBV [i] = (m_ppxlcPredMBV [i] + m_ppxlcPredMBBackV [i] + 1) >> 1; m_ppxliErrorMBU [i] = m_ppxlcCurrMBU [i] - m_ppxlcPredMBU [i]; m_ppxliErrorMBV [i] = m_ppxlcCurrMBV [i] - m_ppxlcPredMBV [i]; }}Void CVideoObjectEncoder::averagePredAndComputeErrorUV_WithShape (){ Int i = 0; for (i = 0; i < BLOCK_SQUARE_SIZE; i++) { if (m_ppxlcCurrMBBUV [i] == transpValue) m_ppxliErrorMBU [i] = m_ppxliErrorMBV [i] = 0; else { m_ppxlcPredMBU [i] = (m_ppxlcPredMBU [i] + m_ppxlcPredMBBackU [i] + 1) >> 1; m_ppxlcPredMBV [i] = (m_ppxlcPredMBV [i] + m_ppxlcPredMBBackV [i] + 1) >> 1; m_ppxliErrorMBU [i] = m_ppxlcCurrMBU [i] - m_ppxlcPredMBU [i]; m_ppxliErrorMBV [i] = m_ppxlcCurrMBV [i] - m_ppxlcPredMBV [i]; } }}// B-VOP ME/MC stuffInt CVideoObjectEncoder::interpolateAndDiffY ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ motionCompEncY ( m_pvopcRefQ0->pixelsY (), m_puciRefQZoom0->pixels (), m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y, prctMVLimitForward ); /*Int iLeft = (x << 1) + pmvBackward->m_vctTrueHalfPel.x; Int iRight = (y << 1) + pmvBackward->m_vctTrueHalfPel.y; //make sure don't end up with a mv that points out of a frame; object-based not done if (!m_puciRefQZoom1->where ().includes (CRct (iLeft, iRight, iLeft + (MB_SIZE << 1), iRight + (MB_SIZE << 1)))) return 1000000000; else*/ motionCompEncY ( m_pvopcRefQ1->pixelsY (), m_puciRefQZoom1->pixels (), m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y, prctMVLimitBackward ); Int ic; Int iSAD = 0; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1)); return iSAD;}Int CVideoObjectEncoder::interpolateAndDiffY_WithShape ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ motionCompEncY ( m_pvopcRefQ0->pixelsY (), m_puciRefQZoom0->pixels (), m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y, prctMVLimitForward ); motionCompEncY ( m_pvopcRefQ1->pixelsY (), m_puciRefQZoom1->pixels (), m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y, prctMVLimitBackward ); Int ic; Int iSAD = 0; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { if (m_ppxlcCurrMBBY [ic] != transpValue) iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1)); } return iSAD;}Int CVideoObjectEncoder::interpolateAndDiffYField( const CMotionVector* pmvFwdTop, const CMotionVector* pmvFwdBot, const CMotionVector* pmvBakTop, const CMotionVector* pmvBakBot, CoordI x, CoordI y, CMBMode *pmbmd){ x <<= 1; y <<= 1; motionCompYField(m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardTop * m_iFrameWidthY, x + pmvFwdTop->m_vctTrueHalfPel.x, y + pmvFwdTop->m_vctTrueHalfPel.y); motionCompYField(m_ppxlcPredMBY + MB_SIZE, m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardBottom * m_iFrameWidthY, x + pmvFwdBot->m_vctTrueHalfPel.x, y + pmvFwdBot->m_vctTrueHalfPel.y); motionCompYField(m_ppxlcPredMBBackY, m_pvopcRefQ1->pixelsY () + pmbmd->m_bBackwardTop * m_iFrameWidthY, x + pmvBakTop->m_vctTrueHalfPel.x, y + pmvBakTop->m_vctTrueHalfPel.y); motionCompYField(m_ppxlcPredMBBackY + MB_SIZE, m_pvopcRefQ1->pixelsY () + pmbmd->m_bBackwardBottom * m_iFrameWidthY, x + pmvBakBot->m_vctTrueHalfPel.x, y + pmvBakBot->m_vctTrueHalfPel.y); Int ic; Int iSAD = 0;// new changes by X. Chen if (pmbmd->m_rgTranspStatus[0]==NONE) { for (ic = 0; ic < MB_SQUARE_SIZE; ic++) iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1)); } else if (pmbmd->m_rgTranspStatus[0]==PARTIAL) { for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { if (m_ppxlcCurrMBBY [ic] != transpValue) iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1)); } }// end of new changes return iSAD;}Void CVideoObjectEncoder::motionCompInterpAndError ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ motionCompEncY ( m_pvopcRefQ0->pixelsY (), m_puciRefQZoom0->pixels (), m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y, prctMVLimitForward ); motionCompEncY ( m_pvopcRefQ1->pixelsY (), m_puciRefQZoom1->pixels (), m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y, prctMVLimitBackward ); Int ic; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1; m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic]; }}Void CVideoObjectEncoder::motionCompInterpAndError_WithShape ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ motionCompEncY ( m_pvopcRefQ0->pixelsY (), m_puciRefQZoom0->pixels (), m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y, prctMVLimitForward ); motionCompEncY ( m_pvopcRefQ1->pixelsY (), m_puciRefQZoom1->pixels (), m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y, prctMVLimitBackward ); Int ic; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { if (m_ppxlcCurrMBBY [ic] == transpValue){ m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1; /*m_ppxlcPredMBY [ic] = */m_ppxliErrorMBY [ic] = 0; } else { m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1; m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic]; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -