📄 mc.cpp
字号:
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, CRct* prctMVLimit, // added by Y.Suzuki for the extended bounding box support int nUVMVConfigSelect, int nDumpRef){ UInt ix, iy; CoordI maeXRefUV, maeYRefUV;// added by Y.Suzuki for the extended bounding box support maeXRefUV = xRefUV; maeYRefUV = yRefUV; CoordI iTmpX = x + xRefUV; CoordI iTmpY = y + yRefUV; LIMITMVRANGETOEXTENDEDBBFULLPEL(&iTmpX, &iTmpY, prctMVLimit, MB_SIZE); xRefUV = iTmpX - x; yRefUV = iTmpY - y;// ~extended bounding box support // 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; const PixelC* ppxlcPrevV;// HV For Travis if (nFlipToRef == FLIP_TO_REF) {#ifdef COPY_FRAME_FROM_CMODEL ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;#else if (m_ActiveRef == FORWARD_REFERENCES) { ppxlcPrevU = m_OOFFlipQ0_U + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; ppxlcPrevV = m_OOFFlipQ0_V + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; } else if (m_ActiveRef == BACKWARD_REFERENCES) { ppxlcPrevU = m_OOFFlipQ1_U + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; ppxlcPrevV = m_OOFFlipQ1_V + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; }#endif } else { ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV; }// ~HV For Travis Int iRound = 1 - m_vopmd.iRoundingControl; Int iFieldStep = 2 * m_iFrameWidthUV;#ifdef DUAL_MODE if (nBldOpt == USE_REF) {#ifdef MEMSET_ALL memset(&gRefBlockChecks, 0, sizeof(REF_BLK_MV_CHECKERS));#endif // The reference blocks for the Chroma blocks are being processed // in 2 blocks each of size 8*4 bytes. But, here we need to dump // only once in a double-sequence!! if (1/*nDumpRef == DUMP_CHROMA_IC_BLKS*/) { gRefBlockChecks.nActMVX = xRefUV; gRefBlockChecks.nActMVY = yRefUV; gRefBlockChecks.nMBType = MBT_16x8; gRefBlockChecks.nMBMode = g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__); gRefBlockChecks.nWidthY = // assign both so don't break other code gRefBlockChecks.nWidthUV = iFieldStep; // Intermediate Checking stuff for the Cb reference block // & Motion Vector with the Reference code // ****************************************************** gRefBlockChecks.refblk = (unsigned char *)(ppxlcPrevU); gRefBlockChecks.nBlockNum = 5; sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_INTER_P_REF_BLOCKS_MV : FILE_INTER_B_REF_BLOCKS_MV, m_vopmd.iFrameNumber, gFileExt); InterChecksForRefBlkAndMVOnInterlacedMB(&gRefBlockChecks, gFileName, FROM_MPEG4_REF_HPEL); // Intermediate Checking stuff for the Cr reference block // & Motion Vector with the Reference code // ****************************************************** gRefBlockChecks.refblk = (unsigned char *)(ppxlcPrevV); gRefBlockChecks.nBlockNum = 6; // Same file name // sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_INTER_P_REF_BLOCKS_MV : FILE_INTER_B_REF_BLOCKS_MV, m_vopmd.iFrameNumber, gFileExt); InterChecksForRefBlkAndMVOnInterlacedMB(&gRefBlockChecks, gFileName, FROM_MPEG4_REF_HPEL); }#ifdef DUMP_REF_FRAME if(!m_vopmd.bDumpRefFrameUV) { // Process the U frame pointer now // ******************************* unsigned char *ActualRefFrame = (unsigned char*)(pvopcRef->pixelsU () + (m_iFrameWidthUV * EXPANDUV_REF_FRAME) + EXPANDUV_REF_FRAME); sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_REF_FRAME_U_FOR_P : FILE_REF_FRAME_U_FOR_B, m_vopmd.iFrameNumber, gFileExt); PrintRefFrame(ActualRefFrame, gFileName, EXPANDUV_REF_FRAMEx2, g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2, g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2);#ifdef DUMP_OOF_REF_FRAME sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_OOF_REF_FRAME_U_FOR_P : FILE_OOF_REF_FRAME_U_FOR_B, m_vopmd.iFrameNumber, gFileExt); PrintRefFrame((unsigned char*)pvopcRef->pixelsU(), gFileName, 0, g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2, g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2);#endif // Process the V frame pointer now // ******************************* ActualRefFrame = (unsigned char*)(pvopcRef->pixelsV () + (m_iFrameWidthUV * EXPANDUV_REF_FRAME) + EXPANDUV_REF_FRAME); sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_REF_FRAME_V_FOR_P : FILE_REF_FRAME_V_FOR_B, m_vopmd.iFrameNumber, gFileExt); PrintRefFrame(ActualRefFrame, gFileName, EXPANDUV_REF_FRAMEx2, g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2, g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2);#ifdef DUMP_OOF_REF_FRAME sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ? FILE_OOF_REF_FRAME_V_FOR_P : FILE_OOF_REF_FRAME_V_FOR_B, m_vopmd.iFrameNumber, gFileExt); PrintRefFrame((unsigned char*)pvopcRef->pixelsV(), gFileName, 0, g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2, g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2);#endif // Set the flag so that we don't re-enter here for this frame m_vopmd.bDumpRefFrameUV = TRUE; }#endif 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; } } } } else if (nBldOpt == USE_MAE)#endif { // Store the chroma MV here if ((m_vopmd.vopPredType == PVOP) && (g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__) != MBM_BIDIRECTIONAL)) { // U & V Motion Vectors are already in Half-Pel // units. So, lets just pass it down // ******************************************** if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV) { g_MAEWrapper->Set_MAEMB_mv_uv ((maeXRefUV << 16) | (maeYRefUV & 0x0000FFFF), 0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__); } else if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) { g_MAEWrapper->Set_MAEMB_mv_uv1 ((maeXRefUV << 16) | (maeYRefUV & 0x0000FFFF), 0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__); } else { // MAEMB_CONFIG_MV_NONE } } }}// Called only in USE_MAE & Interalced modeVoid CVideoObject::Get_PVOP_YILMVs ( PixelC* ppxlcPredMB, const PixelC* ppxlcRefLeftTop, const CMotionVector* pmv, const CMBMode* pmbmd, Int imbX, Int imbY, CoordI x, CoordI y, Bool bSkipNonOBMC, Bool bAlphaMB, CRct *prctMVLimit) { int MVX, MVY; const CMotionVector* pmv16x8 = pmv+5; if (bSkipNonOBMC) return; // Initialize some basic stuff g_MAEWrapper->Set_MAEMB_mbmode(MBM_FORWARD,"CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); // 4 forward MVs only g_MAEWrapper->Set_MAEMB_mbtype(MBT_16x8,"CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); // ForwardTop Stuff if(pmbmd->m_bForwardTop) { pmv16x8++; // Get the half-pel values MVX = TRUEMVHALFPEL_X(pmv16x8); MVY = TRUEMVHALFPEL_Y(pmv16x8); // Use hpel g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 0, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 1, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); pmv16x8++; } // BackwardTop Stuff else { // Get the half-pel values MVX = TRUEMVHALFPEL_X(pmv16x8); MVY = TRUEMVHALFPEL_Y(pmv16x8); // Use hpel g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 0, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 1, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); pmv16x8++; pmv16x8++; } // ForwardBottom Stuff if (pmbmd->m_bForwardBottom) { pmv16x8++; // Get the half-pel values MVX = TRUEMVHALFPEL_X(pmv16x8); MVY = TRUEMVHALFPEL_Y(pmv16x8); // Use hpel g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 2, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 3, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); } // BackwardBottom Stuff else { // Get the half-pel values MVX = TRUEMVHALFPEL_X(pmv16x8); MVY = TRUEMVHALFPEL_Y(pmv16x8); // Use hpel g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 2, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF), 3, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__); } // Set the ft & fb fields here g_MAEWrapper->Set_MAEMB_ft ((pmbmd->m_bForwardTop ? 0 : 1), "CVideoObjectDecoder::Get_PVOP_YILMVs", __LINE__, __FILE__); g_MAEWrapper->Set_MAEMB_fb ((pmbmd->m_bForwardBottom ? 0 : 1), "CVideoObjectDecoder::Get_PVOP_YILMVs", __LINE__, __FILE__); // Now that we have all MVs, lets check if any of these go Out-Of-Frame // If so, since MAE constructs the OOF differently // it will fail to get the correct Reference-Blocks & hence fail // MotionComp. For such MBs, we will NOT invoke MAE at all. if(g_MAEWrapper->CheckForOOFYFields(imbY)) { nFlipToRef = FLIP_TO_REF; nBldOpt = USE_REF; }}Void CVideoObject::Get_PVOP_UVILMVs ( PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV, const CVOPU8YUVBA* pvopcRef, Int imbX, Int imbY, CoordI x, CoordI y, CoordI xRefUV, CoordI yRefUV,Int iRefFieldSelect, CRct* prctMVLimit, // added by Y.Suzuki for the extended bounding box support int nUVMVConfigSelect, int nDumpRef){// added by Y.Suzuki for the extended bounding box support CoordI iTmpX = x + xRefUV; CoordI iTmpY = y + yRefUV; LIMITMVRANGETOEXTENDEDBBFULLPEL(&iTmpX, &iTmpY, prctMVLimit, MB_SIZE); xRefUV = iTmpX - x; yRefUV = iTmpY - y;// ~extended bounding box support // 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; // Store the chroma MV here if ((m_vopmd.vopPredType == PVOP) && (g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__) != MBM_BIDIRECTIONAL)) { // U & V Motion Vectors are already in Half-Pel // units. So, lets just pass it down // ******************************************** if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV) { g_MAEWrapper->Set_MAEMB_mv_uv ((xRefUV << 16) | ((yRefUV >> 1) & 0x0000FFFF), 0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__); } else if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) { g_MAEWrapper->Set_MAEMB_mv_uv1 ((xRefUV << 16) | ((yRefUV >> 1) & 0x0000FFFF), 0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__); } else { // MAEMB_CONFIG_MV_NONE } } // Now that we have all MVs, lets check if any of these go Out-Of-Frame // If so, since MAE constructs the OOF differently // it will fail to get the correct Reference-Blocks & hence fail // MotionComp. For such MBs, we will NOT invoke MAE at all. if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) // Call the checker after we fill in both uv & uv1 array elements { if(g_MAEWrapper->CheckForOOFUVFields(imbY)) { nFlipToRef = FLIP_TO_REF; nBldOpt = USE_REF; } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -