📄 pred.cpp
字号:
mvA.x = mvA.y = 0;
BlockDistanceA = 1;
RefIdxA = -1;
}
else
{
mvA = pMbInfo[dwMbIndex-1].mv[1];
BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[1];
RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1];
}
if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[0] &&
pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM))
{
mvB.x = mvB.y = 0;
BlockDistanceB = 1;
RefIdxB = -1;
}
else
{
mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[2];
BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2];
RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2];
}
if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth-1].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != pMbInfo[dwMbIndex].predDir[0] &&
pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != PREDDIRSYM))
{
mvD.x = mvD.y = 0;
BlockDistanceD = 1;
RefIdxD = -1;
}
else
{
mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mv[3];
BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistance[3];
RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndex[3];
}
if(!C_BlockAvailable)
{
mvC = mvD;
BlockDistanceC = BlockDistanceD;
RefIdxC = RefIdxD;
}
else if(pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[0]&&
pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM))
{
mvC.x = mvC.y = 0;
BlockDistanceC = 1;
RefIdxC = -1;
}
else
{
mvC = pMbInfo[dwMbIndex-dwMbWidth].mv[3];
BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3];
RefIdxC = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3];
}
break;
case 1:
A_BlockAvailable = TRUE;
if(MbY>0)
B_BlockAvailable = TRUE;
if(MbY>0)
D_BlockAvailable = TRUE;
if(MbY>0 && MbX<dwMbWidth-1)
C_BlockAvailable = TRUE;
if(pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[1])
{
mvA.x = mvA.y = 0;
BlockDistanceA = 1;
RefIdxA = -1;
}
else
{
mvA = pMbInfo[dwMbIndex].mv[0];
BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistance[0];
RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
}
if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[1] &&
pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM))
{
mvB.x = mvB.y = 0;
BlockDistanceB = 1;
RefIdxB = -1;
}
else
{
mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[3];
BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3];
RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3];
}
if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[1]&&
pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM))
{
mvD.x = mvD.y = 0;
BlockDistanceD = 1;
RefIdxD = -1;
}
else
{
mvD = pMbInfo[dwMbIndex-dwMbWidth].mv[2];
BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2];
RefIdxD = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2];
}
if(!C_BlockAvailable)
{
mvC = mvD;
BlockDistanceC = BlockDistanceD;
RefIdxC = RefIdxD;
}
else if(pMbInfo[dwMbIndex-dwMbWidth+1].dwMbType==I_8x8 ||
(pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2]!=pMbInfo[dwMbIndex].predDir[1]&&
pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2]!= PREDDIRSYM))
{
mvC.x = mvC.y = 0;
BlockDistanceC = 1;
RefIdxC = -1;
}
else
{
mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mv[2];
BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistance[2];
RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndex[2];
}
break;
case 2:
B_BlockAvailable = TRUE;
C_BlockAvailable = TRUE;
if(MbX>0)
D_BlockAvailable = TRUE;
if(MbX>0)
A_BlockAvailable = TRUE;
if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-1].predDir[3] != pMbInfo[dwMbIndex].predDir[2] &&
pMbInfo[dwMbIndex-1].predDir[3] != PREDDIRSYM))
{
mvA.x = mvA.y = 0;
BlockDistanceA = 1;
RefIdxA = -1;
}
else
{
mvA = pMbInfo[dwMbIndex-1].mv[3];
BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[3];
RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[3];
}
if((pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[2] &&
pMbInfo[dwMbIndex].predDir[0] != PREDDIRSYM))
{
mvB.x = mvB.y = 0;
BlockDistanceB = 1;
RefIdxB = -1;
}
else
{
mvB = pMbInfo[dwMbIndex].mv[0];
BlockDistanceB = pMbInfo[dwMbIndex].iBlockDistance[0];
RefIdxB = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
}
if(!D_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 ||
(pMbInfo[dwMbIndex-1].predDir[1] != pMbInfo[dwMbIndex].predDir[2] &&
pMbInfo[dwMbIndex-1].predDir[1] != PREDDIRSYM))
{
mvD.x = mvD.y = 0;
BlockDistanceD = 1;
RefIdxD = -1;
}
else
{
mvD = pMbInfo[dwMbIndex-1].mv[1];
BlockDistanceD = pMbInfo[dwMbIndex-1].iBlockDistance[1];
RefIdxD = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1];
}
mvC = pMbInfo[dwMbIndex].mv[1];
BlockDistanceC = pMbInfo[dwMbIndex].iBlockDistance[1];
RefIdxC = pMbInfo[dwMbIndex].dwMbReferenceIndex[1];
break;
case 3:
A_BlockAvailable = TRUE;
B_BlockAvailable = TRUE;
D_BlockAvailable = TRUE;
if((pMbInfo[dwMbIndex].predDir[2] != pMbInfo[dwMbIndex].predDir[3] &&
pMbInfo[dwMbIndex].predDir[2] != PREDDIRSYM))
{
mvA.x = mvA.y = 0;
BlockDistanceA = 1;
RefIdxA = -1;
}
else
{
mvA = pMbInfo[dwMbIndex].mv[2];
BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistance[2];
RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndex[2];
}
if(pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[3] &&
pMbInfo[dwMbIndex].predDir[0] != PREDDIRSYM)
{
mvD.x = mvD.y = 0;
BlockDistanceD = 1;
RefIdxD = -1;
}
else
{
mvD = pMbInfo[dwMbIndex].mv[0];
BlockDistanceD = pMbInfo[dwMbIndex].iBlockDistance[0];
RefIdxD = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
}
if(pMbInfo[dwMbIndex].predDir[1] != pMbInfo[dwMbIndex].predDir[3] &&
pMbInfo[dwMbIndex].predDir[1] != PREDDIRSYM)
{
mvB.x = mvB.y = 0;
BlockDistanceB = 1;
RefIdxB = -1;
}
else
{
mvB = pMbInfo[dwMbIndex].mv[1];
BlockDistanceB = pMbInfo[dwMbIndex].iBlockDistance[1];
RefIdxB = pMbInfo[dwMbIndex].dwMbReferenceIndex[1];
}
mvC = mvD;
BlockDistanceC = BlockDistanceD;
RefIdxC = RefIdxD;
break;
default:
break;
}
if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1)
{
MVEPred = mvA;
}
else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1)
{
MVEPred = mvB;
}
else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1)
{
MVEPred = mvC;
}
else
{
MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC);
}
if(pBwRefInfo[dwMbIndex].dwMbType == I_8x8)
{
//mvE = MVEPred;
mvFw = mvBw = MVEPred;
idxBw = idxFw;
}
else
{
if(mvRef.x < 0)
{
mvFw.x = -(((16384/BlockDistanceRef)*(1-mvRef.x * iBlockDistance)-1)>>14);
mvBw.x = (((16384/BlockDistanceRef)*(1-mvRef.x * iBlockDistanceBw)-1)>>14);
}
else
{
mvFw.x = (((16384/BlockDistanceRef)*(1+mvRef.x * iBlockDistance)-1)>>14);
mvBw.x = -(((16384/BlockDistanceRef)*(1+mvRef.x * iBlockDistanceBw)-1)>>14);
}
if(mvRef.y < 0)
{
mvFw.y = -(((16384/BlockDistanceRef)*(1-mvRef.y * iBlockDistance)-1)>>14);
mvBw.y = (((16384/BlockDistanceRef)*(1-mvRef.y * iBlockDistanceBw)-1)>>14);
}
else
{
mvFw.y = (((16384/BlockDistanceRef)*(1+mvRef.y * iBlockDistance)-1)>>14);
mvBw.y = -(((16384/BlockDistanceRef)*(1+mvRef.y * iBlockDistanceBw)-1)>>14);
}
}
pMbInfo[dwMbIndex].mv[dwSubMb] = mvFw;
pMbInfo[dwMbIndex].mvBw[dwSubMb] = mvBw;
pMbInfo[dwMbIndex].iBlockDistance[dwSubMb] = iBlockDistance;
pMbInfo[dwMbIndex].iBlockDistanceBw[dwSubMb] = iBlockDistanceBw;
AVS_INT iImgWidth = dwMbWidth*16;
AVS_INT iImgHeight = dwMbHeight*16;
AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16 + (dwSubMb%2)*8;
AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16 + (dwSubMb/2)*8;
AVS_BYTE PredBw[4][8][8];
GetBlock(&(pMbInfo[dwMbIndex].mv[dwSubMb]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxFw]->y, pPred+dwSubMb*64);
GetBlock(&(pMbInfo[dwMbIndex].mvBw[dwSubMb]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxBw]->y, &(PredBw[0][0][0])+dwSubMb*64);
AVS_BYTE* pDst = pPred+dwSubMb*64;
AVS_BYTE* pSrc = &(PredBw[0][0][0])+dwSubMb*64;
AverageB8x(pDst, pSrc, 8, 8);
return AVS_NOERROR;
}
AVS_HRESULT InterPredLumaBSkipDirect2(MBINFO* pMbInfo,
AVS_DWORD dwMbIndex,
const VIDEODATA** ppRefFrame,
AVS_DWORD dwRefNum,
AVS_DWORD dwMbWidth,
AVS_DWORD dwMbHeight,
AVS_DWORD dwCurrDistanceIndex,
AVS_DWORD dwSubMb,
AVS_INT PictureStructure,
const BWREFINFO* pBwRefInfo,
AVS_BYTE* pPred)
{
AVS_INT idxFw = 1;
AVS_INT idxBw = 0;
MOTIONVECTOR mvFw, mvBw;
MOTIONVECTOR mvRef;
AVS_INT DistanceIndexRef;
mvRef = pBwRefInfo[dwMbIndex].mvRef[dwSubMb];
DistanceIndexRef = pBwRefInfo[dwMbIndex].iDistanceIndexRef[dwSubMb];
AVS_INT DistanceIndexFw0 = ppRefFrame[2]->dwDistanceIndex;
AVS_INT DistanceIndexFw1 = ppRefFrame[3]->dwDistanceIndex;
AVS_INT DistanceIndexBw0 = ppRefFrame[1]->dwDistanceIndex;
AVS_INT DistanceIndexBw1 = ppRefFrame[0]->dwDistanceIndex;
AVS_INT DistanceIndexFw, DistanceIndexBw;
AVS_INT iBlockDistance;
AVS_INT iBlockDistanceBw;
// step 1:
if(DistanceIndexRef == DistanceIndexFw0)
{
idxFw = 2;
DistanceIndexFw = DistanceIndexFw0;
}
else
{
idxFw = 3;
DistanceIndexFw = DistanceIndexFw1;
}
idxBw = 1;
DistanceIndexBw = DistanceIndexBw0;
pMbInfo[dwMbIndex].dwMbReferenceIndex[dwSubMb] = idxFw;
pMbInfo[dwMbIndex].dwMbReferenceIndexBw[dwSubMb] = idxBw;
// step 2:
AVS_INT BlockDistanceRef = (DistanceIndexBw - DistanceIndexRef + 512) % 512;
iBlockDistance = (dwCurrDistanceIndex - DistanceIndexFw + 512) % 512;
iBlockDistanceBw = (DistanceIndexBw - dwCurrDistanceIndex + 512) % 512;
if(PictureStructure == 1 && pBwRefInfo->PictureStructure == 0)
mvRef.y <<= 1;
else if(PictureStructure == 0 && pBwRefInfo->PictureStructure == 1)
mvRef.y >>= 1;
// step 3:
if(mvRef.x < 0)
{
mvFw.x = -(((16384/BlockDistanceRef)*(1-mvRef.x * iBlockDistance)-1)>>14);
mvBw.x = (((16384/BlockDistanceRef)*(1-mvRef.x * iBlockDistanceBw)-1)>>14);
}
else
{
mvFw.x = (((16384/BlockDistanceRef)*(1+mvRef.x * iBlockDistance)-1)>>14);
mvBw.x = -(((16384/BlockDistanceRef)*(1+mvRef.x * iBlockDistanceBw)-1)>>14);
}
if(mvRef.y < 0)
{
mvFw.y = -(((16384/BlockDistanceRef)*(1-mvRef.y * iBlockDistance)-1)>>14);
mvBw.y = (((16384/BlockDistanceRef)*(1-mvRef.y * iBlockDistanceBw)-1)>>14);
}
else
{
mvFw.y = (((16384/BlockDistanceRef)*(1+mvRef.y * iBlockDistance)-1)>>14);
mvBw.y = -(((16384/BlockDistanceRef)*(1+mvRef.y * iBlockDistanceBw)-1)>>14);
}
pMbInfo[dwMbIndex].mv[dwSubMb] = mvFw;
pMbInfo[dwMbIndex].mvBw[dwSubMb] = mvBw;
pMbInfo[dwMbIndex].iBlockDistance[dwSubMb] = iBlockDistance;
pMbInfo[dwMbIndex].iBlockDistanceBw[dwSubMb] = iBlockDistanceBw;
// pMbInfo[dwMbIndex].dwMbReferenceIndex[dwSubMb] = idxFw;
// pMbInfo[dwMbIndex].dwMbReferenceIndexBw[dwSubMb] = idxBw;
AVS_INT iImgWidth = dwMbWidth*16;
AVS_INT iImgHeight = dwMbHeight*16;
AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16 + (dwSubMb%2)*8;
AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16 + (dwSubMb/2)*8;
AVS_BYTE PredBw[4][8][8];
GetBlock(&(pMbInfo[dwMbIndex].mv[dwSubMb]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxFw]->y, pPred+dwSubMb*64);
GetBlock(&(pMbInfo[dwMbIndex].mvBw[dwSubMb]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxBw]->y, &(PredBw[0][0][0])+dwSubMb*64);
AVS_BYTE* pDst = pPred+dwSubMb*64;
AVS_BYTE* pSrc = &(PredBw[0][0][0])+dwSubMb*64;
AverageB8x(pDst, pSrc, 8, 8);
return AVS_NOERROR;
}
AVS_HRESULT InterPredLumaSym16x16(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, const VIDEODATA** ppRefFrame, AVS_DWORD dwRefNum, AVS_DWORD dwMbWidth, AVS_DWORD dwMbHeight, AVS_DWORD dwCurrDistanceIndex, AVS_BYTE* pPred)
{
AVS_BOOL A_BlockAvailable = FALSE;
AVS_BOOL B_BlockAvailable = FALSE;
AVS_BOOL C_BlockAvailable = FALSE;
AVS_BOOL D_BlockAvailable = FALSE;
AVS_INT BlockDistanceA=1;
AVS_INT BlockDistanceB=1;
AVS_INT BlockDistanceC=1;
AVS_INT BlockDistanceD=1;
AVS_INT RefIdxA = -1;
AVS_INT RefIdxB = -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -