📄 shape.cpp
字号:
ppxlcDstTop1 [iPixel] = *ppxlcSrcTop1; //src pixel never out of bound due to padding of Ref1 ppxlcDstTop2 [iPixel] = *ppxlcSrcTop2; //BY should be intialized as zero outside of VOP } else { ppxlcDstTop1 [iPixel] = (PixelC) 0; ppxlcDstTop2 [iPixel] = (PixelC) 0; } ppxlcSrcTop1++; ppxlcSrcTop2++; } for (iPixel = TOTAL_BAB_SIZE-BAB_BORDER; iPixel < TOTAL_BAB_SIZE; iPixel++) { if (!m_bVPNoRightTop) { ppxlcDstTop1 [iPixel] = *ppxlcSrcTop1; //src pixel never out of bound due to padding of Ref1 ppxlcDstTop2 [iPixel] = *ppxlcSrcTop2; //BY should be intialized as zero outside of VOP } else { ppxlcDstTop1 [iPixel] = (PixelC) 0; ppxlcDstTop2 [iPixel] = (PixelC) 0; } ppxlcSrcTop1++; ppxlcSrcTop2++; } ppxlcSrcLeft1 += BAB_BORDER*m_iFrameWidthY; ppxlcSrcLeft2 += BAB_BORDER*m_iFrameWidthY; ppxlcDstLeft += BAB_BORDER*TOTAL_BAB_SIZE; for (iPixel = BAB_BORDER; iPixel < TOTAL_BAB_SIZE; iPixel++) { if (!m_bVPNoLeft) { *ppxlcDstLeft = *ppxlcSrcLeft1; *(ppxlcDstLeft + 1) = *ppxlcSrcLeft2; } else { *ppxlcDstLeft = (PixelC) 0; *(ppxlcDstLeft + 1) = (PixelC) 0; } ppxlcSrcLeft1 += m_iFrameWidthY; ppxlcSrcLeft2 += m_iFrameWidthY; ppxlcDstLeft += TOTAL_BAB_SIZE; //last two values of left border will be over written after the loop } //repeat pad the left border (this will be done again in right bottom border; improve in the future) if (!m_bVPNoLeft) { Int iLastValidSrcLeft1 = *(ppxlcSrcLeft1 - (BAB_BORDER+1) * m_iFrameWidthY); Int iLastValidSrcLeft2 = *(ppxlcSrcLeft2 - (BAB_BORDER+1) * m_iFrameWidthY); for (iPixel = 0; iPixel < BAB_BORDER; iPixel++) { ppxlcDstLeft -= TOTAL_BAB_SIZE; *ppxlcDstLeft = iLastValidSrcLeft1; *(ppxlcDstLeft + 1) = iLastValidSrcLeft2; } }// End Toshiba(1997-11-14)}Void CVideoObject::subsampleLeftTopBorderFromVOP (PixelC* ppxlcSrc, PixelC* ppxlcDst){ PixelC* ppxlcSrcTop1 = ppxlcSrc - BAB_BORDER * m_iFrameWidthY - BAB_BORDER; PixelC* ppxlcSrcTop2 = ppxlcSrcTop1 + m_iFrameWidthY; PixelC* ppxlcSrcLft1 = ppxlcSrcTop1; PixelC* ppxlcSrcLft2 = ppxlcSrcLft1 + 1; PixelC* ppxlcDstTop1 = ppxlcDst; PixelC* ppxlcDstTop2 = ppxlcDst + m_iWidthCurrBAB; PixelC* ppxlcDstLft1 = ppxlcDst; PixelC* ppxlcDstLft2 = ppxlcDst + 1; Int iThresh = (m_iInverseCR == 2) ? 0 : opaqueValue; CoordI iPixel, iPixelSub, iSampleInterval; // Modified for error resilient mode by Toshiba(1997-11-14) for (iPixelSub = BAB_BORDER, iSampleInterval = BAB_BORDER; iPixelSub < m_iWidthCurrBAB - BAB_BORDER; iPixelSub++, iSampleInterval += m_iInverseCR) { //get each subsample Int iTempSumTop1 = 0, iTempSumTop2 = 0; Int iTempSumLft1 = 0, iTempSumLft2 = 0; for (iPixel = 0; iPixel < m_iInverseCR; iPixel++) { iTempSumTop1 += ppxlcSrcTop1 [iSampleInterval + iPixel]; iTempSumTop2 += ppxlcSrcTop2 [iSampleInterval + iPixel]; iTempSumLft1 += ppxlcSrcLft1 [(iSampleInterval + iPixel) * m_iFrameWidthY]; iTempSumLft2 += ppxlcSrcLft2 [(iSampleInterval + iPixel) * m_iFrameWidthY]; } if (!m_bVPNoTop) { ppxlcDstTop1 [iPixelSub] = (iTempSumTop1 > iThresh) ? opaqueValue : transpValue; ppxlcDstTop2 [iPixelSub] = (iTempSumTop2 > iThresh) ? opaqueValue : transpValue; } else { ppxlcDstTop1 [iPixelSub] = 0; ppxlcDstTop2 [iPixelSub] = 0; } if (!m_bVPNoLeft) { ppxlcDstLft1 [iPixelSub * m_iWidthCurrBAB] = (iTempSumLft1 > iThresh) ? opaqueValue : transpValue; ppxlcDstLft2 [iPixelSub * m_iWidthCurrBAB] = (iTempSumLft2 > iThresh) ? opaqueValue : transpValue; } else { ppxlcDstLft1 [iPixelSub * m_iWidthCurrBAB] = 0; ppxlcDstLft2 [iPixelSub * m_iWidthCurrBAB] = 0; } } //boundary conditions 0, 1, 18, 19 CoordI iBorder; for (iBorder = 0; iBorder < BAB_BORDER; iBorder++) { if (!m_bVPNoLeftTop) { ppxlcDstTop1 [iBorder] = ppxlcSrcTop1 [iBorder]; ppxlcDstTop2 [iBorder] = ppxlcSrcTop2 [iBorder]; } else { ppxlcDstTop1 [iBorder] = 0; ppxlcDstTop2 [iBorder] = 0; } if (!m_bVPNoRightTop) { ppxlcDstTop1 [m_iWidthCurrBAB - 1 - iBorder] = ppxlcSrcTop1 [TOTAL_BAB_SIZE - 1 - iBorder]; ppxlcDstTop2 [m_iWidthCurrBAB - 1 - iBorder] = ppxlcSrcTop2 [TOTAL_BAB_SIZE - 1 - iBorder]; } else { ppxlcDstTop1 [m_iWidthCurrBAB - 1 - iBorder] = 0; ppxlcDstTop2 [m_iWidthCurrBAB - 1 - iBorder] = 0; } } // End Toshiba(1997-11-14) //repeat pad left-bottom corner ppxlcDstLft1 [(m_iWidthCurrBAB - 1) * m_iWidthCurrBAB] = ppxlcDstLft1 [(m_iWidthCurrBAB - 2) * m_iWidthCurrBAB] = ppxlcDstLft1 [(m_iWidthCurrBAB - 3) * m_iWidthCurrBAB]; ppxlcDstLft2 [(m_iWidthCurrBAB - 1) * m_iWidthCurrBAB] = ppxlcDstLft2 [(m_iWidthCurrBAB - 2) * m_iWidthCurrBAB] = ppxlcDstLft2 [(m_iWidthCurrBAB - 3) * m_iWidthCurrBAB];}Void CVideoObject::makeRightBottomBorder (PixelC* ppxlcSrc, Int iWidth){ Int i; PixelC* ppxlcDst = ppxlcSrc + BAB_BORDER * iWidth + iWidth - BAB_BORDER; //make right border for (i = 0; i < iWidth - 2*BAB_BORDER; i++) { *ppxlcDst = *(ppxlcDst - 1); *(ppxlcDst + 1) = *ppxlcDst; ppxlcDst += iWidth; } ppxlcDst = ppxlcSrc + (iWidth - BAB_BORDER) * iWidth; //make bottom border for (i = 0; i < iWidth; i++) { *ppxlcDst = *(ppxlcDst - iWidth); *(ppxlcDst + iWidth) = *ppxlcDst; ppxlcDst++; }}Int CVideoObject::contextIntra (const PixelC* ppxlcSrc){ Int iContext = 0, i; static Int rgiNeighbourIndx [10]; rgiNeighbourIndx [0] = -1; rgiNeighbourIndx [1] = -2; rgiNeighbourIndx [2] = -m_iWidthCurrBAB + 2; rgiNeighbourIndx [3] = -m_iWidthCurrBAB + 1; rgiNeighbourIndx [4] = -m_iWidthCurrBAB; rgiNeighbourIndx [5] = -m_iWidthCurrBAB - 1; rgiNeighbourIndx [6] = -m_iWidthCurrBAB - 2; rgiNeighbourIndx [7] = -2 * m_iWidthCurrBAB + 1; rgiNeighbourIndx [8] = -2 * m_iWidthCurrBAB; rgiNeighbourIndx [9] = -2 * m_iWidthCurrBAB - 1; for (i = 0; i < 10; i++) iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; assert (iContext >= 0 && iContext < 1024); return iContext;}Int CVideoObject::contextIntraTranspose (const PixelC* ppxlcSrc){ Int iContext = 0, i; static Int rgiNeighbourIndx [10]; rgiNeighbourIndx [0] = -m_iWidthCurrBAB; rgiNeighbourIndx [1] = -2 * m_iWidthCurrBAB; rgiNeighbourIndx [2] = -1 + 2 * m_iWidthCurrBAB; rgiNeighbourIndx [3] = -1 + m_iWidthCurrBAB; rgiNeighbourIndx [4] = -1; rgiNeighbourIndx [5] = -m_iWidthCurrBAB - 1; rgiNeighbourIndx [6] = -1 - 2 * m_iWidthCurrBAB; rgiNeighbourIndx [7] = -2 + m_iWidthCurrBAB; rgiNeighbourIndx [8] = -2; rgiNeighbourIndx [9] = -2 - m_iWidthCurrBAB; for (i = 0; i < 10; i++) iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; assert (iContext >= 0 && iContext < 1024); return iContext;}Int CVideoObject::contextInter (const PixelC* ppxlcSrc, const PixelC* ppxlcPred){ Int i, iContext = 0; static Int rgiNeighbourIndx [9]; Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; rgiNeighbourIndx [0] = -1; rgiNeighbourIndx [1] = -m_iWidthCurrBAB + 1; rgiNeighbourIndx [2] = -m_iWidthCurrBAB; rgiNeighbourIndx [3] = -m_iWidthCurrBAB - 1; rgiNeighbourIndx [4] = iSizePredBAB; rgiNeighbourIndx [5] = 1; rgiNeighbourIndx [6] = 0; rgiNeighbourIndx [7] = -1; rgiNeighbourIndx [8] = -iSizePredBAB; for (i = 0; i < 4; i++) { iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; } for (i = 4; i < 9; i++) { iContext += (ppxlcPred [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; } assert (iContext >= 0 && iContext < 1024); return iContext;}Int CVideoObject::contextInterTranspose (const PixelC* ppxlcSrc, const PixelC* ppxlcPred){ Int i, iContext = 0; static Int rgiNeighbourIndx [9]; Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER; rgiNeighbourIndx [0] = -m_iWidthCurrBAB; rgiNeighbourIndx [1] = m_iWidthCurrBAB - 1; rgiNeighbourIndx [2] = -1; rgiNeighbourIndx [3] = -m_iWidthCurrBAB - 1; rgiNeighbourIndx [4] = 1; rgiNeighbourIndx [5] = iSizePredBAB; rgiNeighbourIndx [6] = 0; rgiNeighbourIndx [7] = -iSizePredBAB; rgiNeighbourIndx [8] = -1; for (i = 0; i < 4; i++) iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; for (i = 4; i < 9; i++) iContext += (ppxlcPred [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i; assert (iContext >= 0 && iContext < 1024); return iContext;}Void CVideoObject::copyReconShapeToMbAndRef ( PixelC* ppxlcDstMB, PixelC* ppxlcRefFrm, PixelC pxlcSrc){ pxlcmemset (ppxlcDstMB, pxlcSrc, MB_SQUARE_SIZE); // Modified by swinder for (Int i = 0; i < MB_SIZE; i++) { pxlcmemset (ppxlcRefFrm, pxlcSrc, MB_SIZE); ppxlcRefFrm += m_iFrameWidthY; }}Void CVideoObject::copyReconShapeUVToRef ( PixelC* ppxlcRefFrm, const PixelC* ppxlcSrc){ for (Int i = 0; i < BLOCK_SIZE; i++) { memcpy (ppxlcRefFrm, ppxlcSrc, BLOCK_SIZE*sizeof(PixelC)); ppxlcRefFrm += m_iFrameWidthUV; ppxlcSrc += BLOCK_SIZE; }}Void CVideoObject::copyReconShapeToMbAndRef ( PixelC* ppxlcDstMB, PixelC* ppxlcRefFrm, const PixelC* ppxlcSrc, Int iSrcWidth, Int iBorder){ Int iUnit = sizeof(PixelC); // NBIT: for memcpy ppxlcSrc += iSrcWidth * iBorder + iBorder; for (Int i = 0; i < MB_SIZE; i++) { memcpy (ppxlcDstMB, ppxlcSrc, MB_SIZE*iUnit); memcpy (ppxlcRefFrm, ppxlcSrc, MB_SIZE*iUnit); ppxlcRefFrm += m_iFrameWidthY; ppxlcDstMB += MB_SIZE; ppxlcSrc += iSrcWidth; }}CMotionVector CVideoObject::findShapeMVP ( const CMotionVector* pmv, const CMotionVector* pmvBY, const CMBMode* pmbmd, Int iMBX, Int iMBY) const{ CMotionVector mvRet; // try shape vector first Bool bLeftBndry, bRightBndry, bTopBndry; Int iMBnum = VPMBnum(iMBX, iMBY); bLeftBndry = bVPNoLeft(iMBnum, iMBX); bTopBndry = bVPNoTop(iMBnum); bRightBndry = bVPNoRightTop(iMBnum, iMBX); mvRet = *(pmvBY - 1); // Modified for error resilient mode by Toshiba(1997-11-14)// if ((iMBX > 0) && ((pmbmd - 1)->m_shpmd == INTER_CAE_MVDZ || if (!bLeftBndry && ((pmbmd - 1)->m_shpmd == INTER_CAE_MVDZ || (pmbmd - 1)->m_shpmd == INTER_CAE_MVDNZ || (pmbmd - 1)->m_shpmd == MVDZ_NOUPDT || (pmbmd - 1)->m_shpmd == MVDNZ_NOUPDT)) return mvRet; if (iMBY > 0) { mvRet = *(pmvBY - m_iNumMBX);// Modified for error resilient mode by Toshiba(1997-11-14)// if ((pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDZ || if (!bTopBndry && ((pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDZ || (pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDNZ || (pmbmd - m_iNumMBX)->m_shpmd == MVDZ_NOUPDT || (pmbmd - m_iNumMBX)->m_shpmd == MVDNZ_NOUPDT// Modified for error resilient mode by Toshiba(1997-11-14)// ) )) return mvRet; mvRet = *(pmvBY - m_iNumMBX + 1);// Modified for error resilient mode by Toshiba(1997-11-14)// if ((iMBX < m_iNumMBX - 1) && ((pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDZ || if (!bRightBndry && ((pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDZ || (pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDNZ || (pmbmd - m_iNumMBX + 1)->m_shpmd == MVDZ_NOUPDT || (pmbmd - m_iNumMBX + 1)->m_shpmd == MVDNZ_NOUPDT) ) return mvRet; } // try texture vector then; truncate half pel if(m_volmd.bShapeOnly==FALSE && m_vopmd.vopPredType==PVOP) {// Modified for error resilient mode by Toshiba(1997-11-14)// if (iMBX != 0 && validBlock (pmbmd - 1, gIndexOfCandBlk [1] [0])) if (!bLeftBndry && validBlock (pmbmd, pmbmd - 1, gIndexOfCandBlk [1] [0])) return CMotionVector ((pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0])->m_vctTrueHalfPel.x / 2, (pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0])->m_vctTrueHalfPel.y / 2); if (iMBY != 0) {// Modified for error resilient mode by Toshiba(1997-11-14)// if (validBlock (pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1])) if (!bTopBndry && validBlock (pmbmd, pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1])) return CMotionVector ((pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1])->m_vctTrueHalfPel.x / 2, (pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1])->m_vctTrueHalfPel.y / 2);// Modified for error resilient mode by Toshiba(1997-11-14)// if (iMBX < m_iNumMBX - 1 && validBlock (pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2])) if (!bRightBndry && validBlock (pmbmd, pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2])) return CMotionVector ((pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2])->m_vctTrueHalfPel.x / 2, (pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2])->m_vctTrueHalfPel.y / 2); } } return CMotionVector (); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -