📄 mc.cpp
字号:
(((yRef >> 1) & ~1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRef >> 1) + EXPANDY_REF_FRAME; Int iRound = 1 - m_vopmd.iRoundingControl; Int iFieldStep = 2 * m_iFrameWidthY; if (!(yRef & 2)) { if (!(xRef & 1)) { //!bXSubPxl && !bYSubPxl for (iy = 0; iy < MB_SIZE; iy+=2) { memcpy (ppxlcPred, ppxlcRef, MB_SIZE*sizeof(PixelC)); ppxlcRef += iFieldStep; ppxlcPred += MB_SIZE*2; } } else { //bXSubPxl && !bYSubPxl for (iy = 0; iy < MB_SIZE; iy+=2){ for (ix = 0; ix < MB_SIZE; ix++) ppxlcPred [ix] = (ppxlcRef [ix] + ppxlcRef [ix + 1] + iRound) >> 1; ppxlcRef += iFieldStep; ppxlcPred += MB_SIZE*2; } } } else { const PixelC* ppxlcRefBot; if (!(xRef & 1)) { //!bXSubPxl&& bYSubPxl for (iy = 0; iy < MB_SIZE; iy+=2) { ppxlcRefBot = ppxlcRef + iFieldStep; //UPln -> pixels (xInt,yInt+1); for (ix = 0; ix < MB_SIZE; ix++) ppxlcPred [ix] = (ppxlcRef [ix] + ppxlcRefBot [ix] + iRound) >> 1; ppxlcRef = ppxlcRefBot; ppxlcPred += MB_SIZE*2; } } else { // bXSubPxl && bYSubPxl iRound++; for (iy = 0; iy < MB_SIZE; iy+=2) { ppxlcRefBot = ppxlcRef + iFieldStep; //UPln -> pixels (xInt,yInt+1); for (ix = 0; ix < MB_SIZE; ix++){ ppxlcPred [ix] = (ppxlcRef [ix + 1] + ppxlcRef [ix] + ppxlcRefBot [ix + 1] + ppxlcRefBot [ix] + iRound) >> 2; } ppxlcRef = ppxlcRefBot; ppxlcPred += MB_SIZE*2; } } }}Void CVideoObject::motionCompFieldUV ( PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV, const CVOPU8YUVBA* pvopcRef, CoordI x, CoordI y, CoordI xRefUV, CoordI yRefUV,Int iRefFieldSelect ){ UInt ix, iy; // delete by Hyundai for Microsoft and MoMusys alignment //Int iPxLoc = ((((y + yRefUV) >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME; // insert by Hyundai for Microsoft and MoMusys alignment Int iPxLoc = (y/2 + ((yRefUV >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME; const PixelC* ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; const PixelC* ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; Int iRound = 1 - m_vopmd.iRoundingControl; Int iFieldStep = 2 * m_iFrameWidthUV; if (!(yRefUV & 2)) { if (!(xRefUV & 1)) { //!bXSubPxl && !bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy+=2) { memcpy (ppxlcPredMBU, ppxlcPrevU, BLOCK_SIZE*sizeof(PixelC)); memcpy (ppxlcPredMBV, ppxlcPrevV, BLOCK_SIZE*sizeof(PixelC)); ppxlcPrevU += iFieldStep; ppxlcPrevV += iFieldStep; ppxlcPredMBU += 2*BLOCK_SIZE; ppxlcPredMBV += 2*BLOCK_SIZE; } } else { //bXSubPxl && !bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy+=2) { for (ix = 0; ix < BLOCK_SIZE; ix++) { ppxlcPredMBU [ix] = (ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + iRound) >> 1; ppxlcPredMBV [ix] = (ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + iRound) >> 1; } ppxlcPrevU += iFieldStep; ppxlcPrevV += iFieldStep; ppxlcPredMBU += 2*BLOCK_SIZE; ppxlcPredMBV += 2*BLOCK_SIZE; } } } else { const PixelC* ppxlcPrevUBot; const PixelC* ppxlcPrevVBot; if (!(xRefUV & 1)) { //!bXSubPxl&& bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy+=2) { ppxlcPrevUBot = ppxlcPrevU + iFieldStep; //UPln -> pixels (xInt,yInt+1); ppxlcPrevVBot = ppxlcPrevV + iFieldStep; //VPln -> pixels (xInt,yInt+1); for (ix = 0; ix < BLOCK_SIZE; ix++) { ppxlcPredMBU [ix] = (ppxlcPrevU [ix] + ppxlcPrevUBot [ix] + iRound) >> 1; ppxlcPredMBV [ix] = (ppxlcPrevV [ix] + ppxlcPrevVBot [ix] + iRound) >> 1; } ppxlcPredMBU += 2*BLOCK_SIZE; ppxlcPredMBV += 2*BLOCK_SIZE; ppxlcPrevU = ppxlcPrevUBot; ppxlcPrevV = ppxlcPrevVBot; } } else { // bXSubPxl && bYSubPxl iRound++; for (iy = 0; iy < BLOCK_SIZE; iy+=2){ ppxlcPrevUBot = ppxlcPrevU + iFieldStep; //UPln -> pixels (xInt,yInt+1); ppxlcPrevVBot = ppxlcPrevV + iFieldStep; //VPln -> pixels (xInt,yInt+1); for (ix = 0; ix < BLOCK_SIZE; ix++){ ppxlcPredMBU [ix] = (ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + ppxlcPrevUBot [ix + 1] + ppxlcPrevUBot [ix] + iRound) >> 2; ppxlcPredMBV [ix] = (ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + ppxlcPrevVBot [ix + 1] + ppxlcPrevVBot [ix] + iRound) >> 2; } ppxlcPredMBU += 2*BLOCK_SIZE; ppxlcPredMBV += 2*BLOCK_SIZE; ppxlcPrevU = ppxlcPrevUBot; ppxlcPrevV = ppxlcPrevVBot; } } }}// #endif // INTERLACEVoid CVideoObject::motionCompUV ( PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV, const CVOPU8YUVBA* pvopcRef, CoordI x, CoordI y, CoordI xRefUV, CoordI yRefUV, Int iRoundingControl, CRct *prctMVLimit){ UInt ix, iy; CoordI iTmpX = x + xRefUV; CoordI iTmpY = y + yRefUV; limitMVRangeToExtendedBBFullPel (iTmpX,iTmpY,prctMVLimit,MB_SIZE); xRefUV = iTmpX - x; yRefUV = iTmpY - y; Int iPxLoc = (((y + yRefUV) >> 1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME; const PixelC* ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc; const PixelC* ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc; if (!(yRefUV & 1)) { if (!(xRefUV & 1)) { //!bXSubPxl && !bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy++) { memcpy (ppxlcPredMBU, ppxlcPrevU, BLOCK_SIZE*sizeof(PixelC)); memcpy (ppxlcPredMBV, ppxlcPrevV, BLOCK_SIZE*sizeof(PixelC)); ppxlcPrevU += m_iFrameWidthUV; ppxlcPrevV += m_iFrameWidthUV; ppxlcPredMBU += BLOCK_SIZE; ppxlcPredMBV += BLOCK_SIZE; } } else { //bXSubPxl && !bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy++) { for (ix = 0; ix < BLOCK_SIZE; ix++) { ppxlcPredMBU [ix] = (ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + 1 - iRoundingControl) >> 1; ppxlcPredMBV [ix] = (ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + 1 - iRoundingControl) >> 1; } ppxlcPrevU += m_iFrameWidthUV; ppxlcPrevV += m_iFrameWidthUV; ppxlcPredMBU += BLOCK_SIZE; ppxlcPredMBV += BLOCK_SIZE; } } } else { const PixelC* ppxlcPrevUBot; const PixelC* ppxlcPrevVBot; if (!(xRefUV & 1)) { //!bXSubPxl&& bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy++) { ppxlcPrevUBot = ppxlcPrevU + m_iFrameWidthUV; //UPln -> pixels (xInt,yInt+1); ppxlcPrevVBot = ppxlcPrevV + m_iFrameWidthUV; //VPln -> pixels (xInt,yInt+1); for (ix = 0; ix < BLOCK_SIZE; ix++) {// ppxlcPredMBU [ix] = (ppxlcPrevU [ix] + ppxlcPrevUBot [ix] + 1) >> 1;// ppxlcPredMBV [ix] = (ppxlcPrevV [ix] + ppxlcPrevVBot [ix] + 1) >> 1; ppxlcPredMBU [ix] = (ppxlcPrevU [ix] + ppxlcPrevUBot [ix] + 1 - iRoundingControl) >> 1; ppxlcPredMBV [ix] = (ppxlcPrevV [ix] + ppxlcPrevVBot [ix] + 1 - iRoundingControl) >> 1; } ppxlcPredMBU += BLOCK_SIZE; ppxlcPredMBV += BLOCK_SIZE; ppxlcPrevU = ppxlcPrevUBot; ppxlcPrevV = ppxlcPrevVBot; } } else { // bXSubPxl && bYSubPxl for (iy = 0; iy < BLOCK_SIZE; iy++){ ppxlcPrevUBot = ppxlcPrevU + m_iFrameWidthUV; //UPln -> pixels (xInt,yInt+1); ppxlcPrevVBot = ppxlcPrevV + m_iFrameWidthUV; //VPln -> pixels (xInt,yInt+1); for (ix = 0; ix < BLOCK_SIZE; ix++){/* ppxlcPredMBU [ix] = ( ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + ppxlcPrevUBot [ix + 1] + ppxlcPrevUBot [ix] + 2 ) >> 2; ppxlcPredMBV [ix] = ( ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + ppxlcPrevVBot [ix + 1] + ppxlcPrevVBot [ix] + 2 ) >> 2;*/ ppxlcPredMBU [ix] = ( ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + ppxlcPrevUBot [ix + 1] + ppxlcPrevUBot [ix] + 2 - iRoundingControl ) >> 2; ppxlcPredMBV [ix] = ( ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + ppxlcPrevVBot [ix + 1] + ppxlcPrevVBot [ix] + 2 - iRoundingControl ) >> 2; } ppxlcPredMBU += BLOCK_SIZE; ppxlcPredMBV += BLOCK_SIZE; ppxlcPrevU = ppxlcPrevUBot; ppxlcPrevV = ppxlcPrevVBot; } } }}UInt gOvrlpPredY [64];Void CVideoObject::motionCompOverLap ( PixelC* ppxlcPredMB, const PixelC* ppxlcRefLeftTop, const CMotionVector* pmv, // motion vector const CMBMode* pmbmd, // macroblk mode Int imbx, // current macroblk index Int imby, // current macroblk index CoordI x, // current coordinate system CoordI y, // current coordinate system CRct *prctMVLimit){ // Overlap Motion Comp use motion vector of current blk and motion vectors of neighboring blks. const CMotionVector *pmvC,*pmvT = NULL,*pmvB = NULL,*pmvR = NULL,*pmvL = NULL; // MVs of Cur, Top, Bot, Right and Left Blocks. const CMotionVector *pmvCurrMb,*pmvTopMb = NULL; const CMotionVector *pmvRightMb = NULL,*pmvLeftMb = NULL; // MVs of Cur, Top, Right and Left MacroBlocks. const CMBMode *pmbmdTopMb = NULL, *pmbmdRightMb = NULL, *pmbmdLeftMb = NULL; // MVs of Cur, Top, Right and Left MacroBlocks. Bool bIntraT = FALSE, bIntraR = FALSE, bIntraL = FALSE; // flags of 4MV for Cur, Top, Right and Left MacroBlocks. Bool bLeftBndry, bRightBndry, bTopBndry; bLeftBndry = (imbx == 0); bRightBndry = (imbx == m_iNumMBX - 1); bTopBndry = (imby == 0); pmvCurrMb = pmv; // assign the neighboring blk's MVs to pmv[TBRLC] if (!bTopBndry) { pmbmdTopMb = pmbmd - m_iNumMBX; bIntraT = (pmbmdTopMb->m_dctMd == INTRA || pmbmdTopMb->m_dctMd == INTRAQ); pmvTopMb = pmv - m_iNumOfTotalMVPerRow; } if (!bLeftBndry) { pmbmdLeftMb = pmbmd - 1; bIntraL = (pmbmdLeftMb->m_dctMd == INTRA || pmbmdLeftMb->m_dctMd == INTRAQ); pmvLeftMb = pmv - PVOP_MV_PER_REF_PER_MB; } if (!bRightBndry) { pmbmdRightMb = pmbmd + 1; bIntraR = (pmbmdRightMb->m_dctMd == INTRA || pmbmdRightMb->m_dctMd == INTRAQ); pmvRightMb = pmv + PVOP_MV_PER_REF_PER_MB; } UInt i; // assign the neighboring blk's MVs to pmv[TBRLC] for (i = 1; i < 5; i++) { if (pmbmd->m_rgTranspStatus [i] == ALL) continue; pmvC = pmvCurrMb + i; switch (i) { case 1: if (pmbmd->m_rgTranspStatus [3] == ALL) pmvB = pmvCurrMb + 1; else pmvB = pmvCurrMb + 3; if (pmbmd->m_rgTranspStatus [2] == ALL) pmvR = pmvCurrMb + 1; else pmvR = pmvCurrMb + 2; if (bTopBndry || bIntraT || pmbmdTopMb->m_rgTranspStatus [3] == ALL) pmvT = pmvCurrMb + 1; else pmvT = pmvTopMb + 3; if (bLeftBndry || bIntraL || pmbmdLeftMb->m_rgTranspStatus [2] == ALL) pmvL = pmvCurrMb + 1; else pmvL = pmvLeftMb + 2; break; case 2: if (pmbmd->m_rgTranspStatus [4] == ALL) pmvB = pmvCurrMb + 2; else pmvB = pmvCurrMb + 4; if (pmbmd->m_rgTranspStatus [1] == ALL) pmvL = pmvCurrMb + 2; else pmvL = pmvCurrMb + 1; if (bTopBndry || bIntraT || pmbmdTopMb->m_rgTranspStatus [4] == ALL) pmvT = pmvCurrMb + 2; else pmvT = pmvTopMb + 4; if (bRightBndry || bIntraR || pmbmdRightMb->m_rgTranspStatus [1] == ALL) pmvR = pmvCurrMb + 2; else pmvR = pmvRightMb + 1; break; case 3: if (pmbmd->m_rgTranspStatus [1] == ALL) pmvT = pmvCurrMb + 3; else pmvT = pmvCurrMb + 1; pmvB = pmvCurrMb + 3; // use the current mv if (pmbmd->m_rgTranspStatus [4] == ALL) pmvR = pmvCurrMb + 3; else pmvR = pmvCurrMb + 4; if (bLeftBndry || bIntraL || pmbmdLeftMb->m_rgTranspStatus [4] == ALL) pmvL = pmvCurrMb + 3; else pmvL = pmvLeftMb + 4; break; case 4: if (pmbmd->m_rgTranspStatus [2] == ALL) pmvT = pmvCurrMb + 4; else pmvT = pmvCurrMb + 2; pmvB = pmvCurrMb + 4; if (pmbmd->m_rgTranspStatus [3] == ALL) pmvL = pmvCurrMb + 4; else pmvL = pmvCurrMb + 3; if (bRightBndry || bIntraR || pmbmdRightMb->m_rgTranspStatus [3] == ALL) pmvR = pmvCurrMb + 4; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -