📄 umc_vc1_dec_mb_interpolate_adv.cpp
字号:
pMB->pInterpolLumaSrc[back] = interp_params->pSrc;
pMB->InterpolsrcLumaStep[back] = interp_params->srcStep;
}
else
_own_ippiInterpolateQPBicubicIC_VC1_8u_C1R(interp_params);
break;
default:
VM_ASSERT(0);
}
return VC1_OK;
}
static VC1Status InterpolateBlock_InterlaceFieldPictureLuma4MV(VC1Context* pContext,
Ipp8u *pDst, Ipp32s dstStep,
Ipp32s blk_num, Ipp32s back)
{
_IppVCInterpolate_8u* interp_params = &pContext->interp_params_luma;
Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;
VC1MB *pMB = pContext->m_pCurrMB;
VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
Ipp8u* pRefData = NULL;
Ipp32s refPitch;
Ipp32s f = 0;
Ipp16s xMV = pMB->m_pBlocks[blk_num].mv[back][0];
Ipp16s yMV = pMB->m_pBlocks[blk_num].mv[back][1];
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field xMv, yMv %d, %d\n"),xMV,yMV);
if ((pPicHeader->CurrField == 1) &&
(((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
(pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[blk_num].mv_s_polarity[back]) && (!back)))
{
index = pContext->m_frmBuff.m_iCurrIndex;
}
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pY;
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iYPitch;
f = CalcMVInterpolateFieldLuma(pContext, pMB->m_pBlocks[blk_num].mv_s_polarity[back], &xMV, &yMV);
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field X, Y %d, %d\n"),X,Y);
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("%block number %d \n"),blk_num );
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field f %d\n"),f);
xMV = xMV + offset_table_x[blk_num];
yMV = yMV + offset_table_y[blk_num];
if (f)
pRefData += refPitch;
refPitch <<= 1;
interp_params->pSrc = pRefData;
interp_params->pDst = pDst;
interp_params->dstStep = dstStep;
#ifdef VC1_DEBUG_ON
// VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field luma%d, %d\n"),X,Y);
#endif
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING(" vc1_MVMode1MV\n"));
interp_params->dx = xMV&3;
interp_params->dy = yMV&3;
interp_params->pSrc += ( (xMV>>2) +( yMV>>2) * refPitch);
interp_params->roiSize.width = 8;
interp_params->roiSize.height = 8;
_own_ippiInterpolateQPBicubicIC_VC1_8u_C1R(interp_params);
return VC1_OK;
}
static Ipp32s CalcMVInterpolateFieldChroma(VC1Context* pContext, Ipp32s polarity,
Ipp16s* xMV, Ipp16s* yMV)
{
VC1SingletonMB* sMB = pContext->m_pSingleMB;
VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
Ipp32s X, Y;
Ipp32s f = 0;
X = pContext->m_pSingleMB->m_currMBXpos;
Y = pContext->m_pSingleMB->m_currMBYpos;
if (pPicHeader->CurrField)
Y -= sMB->heightMB/2;
DeriveSecondStageChromaMV(pContext, xMV, yMV);
if(!polarity)
{
f = !pPicHeader->BottomField;
*yMV = *yMV + (pPicHeader->BottomField<<2) - 2;
}
else
{
f = pPicHeader->BottomField;
}
CropChromaPullBack_Adv(pContext, xMV, yMV);
*xMV = (Ipp16s)((X << 5) + *xMV);
*yMV = (Ipp16s)((Y << 5) + *yMV);
return f;
}
static VC1Status InterpolateBlock_InterlaceFieldPictureChroma1MV(VC1Context* pContext,
Ipp8u* pDst1, Ipp32s dstStep1,
Ipp8u* pDst2, Ipp32s dstStep2,
Ipp32s back)
{
_IppVCInterpolate_8u* interp_params = &pContext->interp_params_chroma;
VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
VC1MB *pMB = pContext->m_pCurrMB;
Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;
Ipp8u* pRefData = NULL;
Ipp16s xMV = pMB->m_pBlocks[0].mv[back][0];
Ipp16s yMV = pMB->m_pBlocks[0].mv[back][1];
Ipp32s f = 0;
Ipp32s refPitch;
if ((pPicHeader->CurrField == 1) &&
(((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
(pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[0].mv_s_polarity[back]) && (!back)))
{
index = pContext->m_frmBuff.m_iCurrIndex;
}
//1MV
xMV = pMB->m_pBlocks[0].mv[back][0];
yMV = pMB->m_pBlocks[0].mv[back][1];
pMB->m_pBlocks[4].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
pMB->m_pBlocks[5].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iUPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pU;
f = CalcMVInterpolateFieldChroma(pContext, pMB->m_pBlocks[4].mv_s_polarity[back], &xMV, &yMV);
if (f)
pRefData += refPitch;
refPitch <<= 1;
#ifdef VC1_DEBUG_ON
// VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field chroma%d, %d\n"),X,Y);
#endif
interp_params->roiSize.width = 8;
interp_params->roiSize.height = 8;
interp_params->dx = xMV&3;
interp_params->dy = yMV&3;
if((interp_params->dx + interp_params->dy == 0))
{
//U channel
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
pMB->pInterpolChromaUSrc[back] = interp_params->pSrc;
pMB->InterpolsrcChromaUStep[back] = interp_params->srcStep;
//V channel
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pV;
if (f)
pRefData += refPitch;
refPitch <<= 1;
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
pMB->pInterpolChromaVSrc[back] = interp_params->pSrc;
pMB->InterpolsrcChromaVStep[back] = interp_params->srcStep;
}
else
{
//BLOCK 4
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
interp_params->pDst = pDst1;
interp_params->dstStep = dstStep1;
ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);
//BLOCK 5
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pV;
if (f)
pRefData += refPitch;
refPitch <<= 1;
interp_params->pDst = pDst2;
interp_params->dstStep = dstStep2;
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);
}
return VC1_OK;
}
static VC1Status InterpolateBlock_InterlaceFieldPictureChroma4MV(VC1Context* pContext,
Ipp8u* pDst1, Ipp32s dstStep1,
Ipp8u* pDst2, Ipp32s dstStep2,
Ipp32s back)
{
_IppVCInterpolate_8u* interp_params = &pContext->interp_params_chroma;
Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;
VC1MB *pMB = pContext->m_pCurrMB;
VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
VC1SingletonMB* sMB = pContext->m_pSingleMB;
Ipp8u* pRefData = NULL;
Ipp16s xMV = pMB->m_pBlocks[0].mv[back][0];
Ipp16s yMV = pMB->m_pBlocks[0].mv[back][1];
Ipp32u MVBcount = 0;
Ipp32u MVTcount = 0;
Ipp32s f = 0;
Ipp32s refPitch;
if (pPicHeader->NUMREF)
{
//4MV NUMREF == 1
Ipp32s count=0;
sMB->MVcount =0;
for (count = 0; count < 4; count++)
{
if((pMB->m_pBlocks[count].mv_s_polarity[back] + pPicHeader->BottomField) & 0x1)
{
sMB->xLuMVT[MVTcount] = pMB->m_pBlocks[count].mv[back][0];
sMB->yLuMVT[MVTcount] = pMB->m_pBlocks[count].mv[back][1];
++MVTcount;
}
else
{
sMB->xLuMVB[MVBcount] = pMB->m_pBlocks[count].mv[back][0];
sMB->yLuMVB[MVBcount] = pMB->m_pBlocks[count].mv[back][1];
++MVBcount;
}
}
if (MVBcount == MVTcount)
{
sMB->MVcount = 2;
pMB->m_pBlocks[4].mv_s_polarity[back] = 1;
pMB->m_pBlocks[5].mv_s_polarity[back] = 1;
if (pPicHeader->BottomField)
{
sMB->x_LuMV = sMB->xLuMVB;
sMB->y_LuMV = sMB->yLuMVB;
}
else
{
sMB->x_LuMV = sMB->xLuMVT;
sMB->y_LuMV = sMB->yLuMVT;
}
}
else if (MVBcount > MVTcount)
{
pMB->m_pBlocks[4].mv_s_polarity[back] = pPicHeader->BottomField;
pMB->m_pBlocks[5].mv_s_polarity[back] = pPicHeader->BottomField;
sMB->MVcount = MVBcount;
sMB->x_LuMV = sMB->xLuMVB;
sMB->y_LuMV = sMB->yLuMVB;
}
else
{
pMB->m_pBlocks[4].mv_s_polarity[back] = !pPicHeader->BottomField;
pMB->m_pBlocks[5].mv_s_polarity[back] = !pPicHeader->BottomField;
sMB->MVcount = MVTcount;
sMB->x_LuMV = sMB->xLuMVT;
sMB->y_LuMV = sMB->yLuMVT;
}
Derive4MV_Field(sMB->MVcount,&xMV,&yMV, sMB->x_LuMV, sMB->y_LuMV);
}
else
{
//4MV NUMREF == 0
Ipp32s count;
for (count=0;count<4;count++)
{
sMB->xLuMV[count] = pMB->m_pBlocks[count].mv[back][0];
sMB->yLuMV[count] = pMB->m_pBlocks[count].mv[back][1];
}
//NEED 4mv field one reference picture
xMV = median4(sMB->xLuMV);
yMV = median4(sMB->yLuMV);
pMB->m_pBlocks[4].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
pMB->m_pBlocks[5].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
}
if ((pPicHeader->CurrField == 1) &&
(((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
(pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[4].mv_s_polarity[back]) && (!back)))
{
index = pContext->m_frmBuff.m_iCurrIndex;
}
//VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iUPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pU;
f = CalcMVInterpolateFieldChroma(pContext, pMB->m_pBlocks[4].mv_s_polarity[back], &xMV, &yMV);
if (f)
pRefData += refPitch;
refPitch <<= 1;
#ifdef VC1_DEBUG_ON
// VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field chroma%d, %d\n"),X,Y);
#endif
interp_params->dx = xMV&3;
interp_params->dy = yMV&3;
if((interp_params->dx + interp_params->dy == 0))
{
//U channel
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
pMB->pInterpolChromaUSrc[back] = interp_params->pSrc;
pMB->InterpolsrcChromaUStep[back] = interp_params->srcStep;
//V channel
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pV;
if (f)
pRefData += refPitch;
refPitch <<= 1;
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
pMB->pInterpolChromaVSrc[back] = interp_params->pSrc;
pMB->InterpolsrcChromaVStep[back] = interp_params->srcStep;
}
else
{
interp_params->roiSize.width = 8;
interp_params->roiSize.height = 8;
interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
interp_params->pDst = pDst1;
interp_params->dstStep = dstStep1;
ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);
//BLOCK 5
refPitch = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
pRefData = pContext->m_frmBuff.m_pFrames[index].m_pV;
if (f)
pRefData += refPitch;
refPitch <<= 1;
interp_params->pDst = pDst2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -