📄 mcenc.cpp
字号:
pmbmdLeftMb = NULL; bIntraT = FALSE; bIntraR = FALSE; bIntraL = FALSE; pmvCurrMb = pmv; // assign values to bIntra[TRL] and pmv{TRL}Mb, when they are valid. 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 pmvR = pmvRightMb + 3; break; default: assert (FALSE); } // Compute the top left corner's x,y coordinates of current block. UInt dxc = (((i - 1) & 1) << 3); UInt dyc = (((i - 1) & 2) << 2); UInt nxcY = (x + dxc) << 1; UInt nycY = (y + dyc) << 1; // Compute the corresponding positions on Ref frm, using 5 MVs. CoordI xRefC = nxcY + pmvC->m_vctTrueHalfPel.x, yRefC = nycY + pmvC->m_vctTrueHalfPel.y; CoordI xRefT = nxcY + pmvT->m_vctTrueHalfPel.x, yRefT = nycY + pmvT->m_vctTrueHalfPel.y; CoordI xRefB = nxcY + pmvB->m_vctTrueHalfPel.x, yRefB = nycY + pmvB->m_vctTrueHalfPel.y; CoordI xRefR = nxcY + pmvR->m_vctTrueHalfPel.x, yRefR = nycY + pmvR->m_vctTrueHalfPel.y; CoordI xRefL = nxcY + pmvL->m_vctTrueHalfPel.x, yRefL = nycY + pmvL->m_vctTrueHalfPel.y;// UInt nxcY = x + dxc; // UInt nycY = y + dyc; // // Compute the corresponding positions on Ref frm, using 5 MVs.// CoordI xRefC = ((nxcY + pmvC->iMVX) << 1) + pmvC->iHalfX, yRefC = ((nycY + pmvC->iMVY) << 1) + pmvC->iHalfY;// CoordI xRefT = ((nxcY + pmvT->iMVX) << 1) + pmvT->iHalfX, yRefT = ((nycY + pmvT->iMVY) << 1) + pmvT->iHalfY;// CoordI xRefB = ((nxcY + pmvB->iMVX) << 1) + pmvB->iHalfX, yRefB = ((nycY + pmvB->iMVY) << 1) + pmvB->iHalfY;// CoordI xRefR = ((nxcY + pmvR->iMVX) << 1) + pmvR->iHalfX, yRefR = ((nycY + pmvR->iMVY) << 1) + pmvR->iHalfY;// CoordI xRefL = ((nxcY + pmvL->iMVX) << 1) + pmvL->iHalfX, yRefL = ((nycY + pmvL->iMVY) << 1) + pmvL->iHalfY; limitMVRangeToExtendedBBHalfPel (xRefC,yRefC,prctMVLimit,BLOCK_SIZE); limitMVRangeToExtendedBBHalfPel (xRefT,yRefT,prctMVLimit,BLOCK_SIZE); limitMVRangeToExtendedBBHalfPel (xRefB,yRefB,prctMVLimit,BLOCK_SIZE); limitMVRangeToExtendedBBHalfPel (xRefR,yRefR,prctMVLimit,BLOCK_SIZE); limitMVRangeToExtendedBBHalfPel (xRefL,yRefL,prctMVLimit,BLOCK_SIZE); //PixelC* ppxlcPredY = ppxlcYMB + dxc + dyc * m_iWidthY; // Starting of Pred. Frame PixelC* ppxlcPred = m_ppxlcPredMBY + dxc + dyc * MB_SIZE; // Starting of Pred. Frame // 5 starting pos. in Zoomed Ref. Frames // m_ppxlcRefZoom0Y + (xRefC, yRefC); const PixelC* ppxlcPrevZoomYC; const PixelC* ppxlcPrevZoomYT; const PixelC* ppxlcPrevZoomYB; const PixelC* ppxlcPrevZoomYR; const PixelC* ppxlcPrevZoomYL; ppxlcPrevZoomYC = m_puciRefQZoom0->pixels () + (yRefC + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY + xRefC + EXPANDY_REF_FRAMEx2; ppxlcPrevZoomYT = m_puciRefQZoom0->pixels () + (yRefT + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY + xRefT + EXPANDY_REF_FRAMEx2; ppxlcPrevZoomYB = m_puciRefQZoom0->pixels () + (yRefB + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY + xRefB + EXPANDY_REF_FRAMEx2; ppxlcPrevZoomYR = m_puciRefQZoom0->pixels () + (yRefR + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY + xRefR + EXPANDY_REF_FRAMEx2; ppxlcPrevZoomYL = m_puciRefQZoom0->pixels () + (yRefL + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY + xRefL + EXPANDY_REF_FRAMEx2; UInt *pWghtC, *pWghtT, *pWghtB, *pWghtR, *pWghtL; pWghtC = (UInt*) gWghtC; pWghtT = (UInt*) gWghtT; pWghtB = (UInt*) gWghtB; pWghtR = (UInt*) gWghtR; pWghtL = (UInt*) gWghtL; for (UInt iy = 0; iy < BLOCK_SIZE; iy++) { for (UInt ix = 0; ix < BLOCK_SIZE; ix++) { *ppxlcPred++ = ( *ppxlcPrevZoomYC * *pWghtC++ + *ppxlcPrevZoomYT * *pWghtT++ + *ppxlcPrevZoomYB * *pWghtB++ + *ppxlcPrevZoomYR * *pWghtR++ + *ppxlcPrevZoomYL * *pWghtL++ + 4 ) >> 3; ppxlcPrevZoomYC += 2; ppxlcPrevZoomYT += 2; ppxlcPrevZoomYB += 2; ppxlcPrevZoomYR += 2; ppxlcPrevZoomYL += 2; } ppxlcPrevZoomYC += m_iFrameWidthZoomYx2Minus2Blk; ppxlcPrevZoomYT += m_iFrameWidthZoomYx2Minus2Blk; ppxlcPrevZoomYB += m_iFrameWidthZoomYx2Minus2Blk; ppxlcPrevZoomYR += m_iFrameWidthZoomYx2Minus2Blk; ppxlcPrevZoomYL += m_iFrameWidthZoomYx2Minus2Blk; ppxlcPred += BLOCK_SIZE; } }}// for B-VOPVoid CVideoObjectEncoder::averagePredAndComputeErrorY(){ 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]; }}//INTERLACE//new changesVoid CVideoObjectEncoder::averagePredAndComputeErrorY_WithShape(){ Int ic; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { if (m_ppxlcCurrMBBY [ic] == transpValue) 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]; } }}// new changes//INTERLACEVoid CVideoObjectEncoder::motionCompAndDiff_BVOP_MB ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CMBMode* pmbmd, CoordI x, CoordI y, CRct *prctMVLimitForward,CRct *prctMVLimitBackward){ if (m_vopmd.bInterlace) { // Should work for both progressive and interlaced, but keep // original code for now due to differences in direct mode. Bob Eifrig switch (pmbmd->m_mbType) { case FORWARD: motionCompOneBVOPReference(m_pvopcPredMB, FORWARD, x, y, pmbmd, pmvForward, prctMVLimitForward); computeTextureError(); break; case BACKWARD: motionCompOneBVOPReference(m_pvopcPredMB, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward); computeTextureError(); 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(); averagePredAndComputeErrorUV(); break; case INTERPOLATE: motionCompOneBVOPReference(m_pvopcPredMB, FORWARD, x, y, pmbmd, pmvForward, prctMVLimitForward); motionCompOneBVOPReference(m_pvopcPredMBBack, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward); averagePredAndComputeErrorY(); averagePredAndComputeErrorUV(); break; } return; } if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) { // Y is done when doing motion estimation motionCompInterpAndError (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 (); } 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); computeTextureError (); }}Void CVideoObjectEncoder::motionCompAndDiff_BVOP_MB_WithShape ( const CMotionVector* pmvForward, const CMotionVector* pmvBackward, CMBMode* pmbmd, CoordI x, CoordI y, CRct *prctMVLimitForward, CRct *prctMVLimitBackward){// INTERLACED// new changes if (m_vopmd.bInterlace&&pmbmd->m_bFieldMV) { // Should work for both progressive and interlaced, but keep // original code for now due to differences in direct mode. Bob Eifrig switch (pmbmd->m_mbType) { case FORWARD:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -