📄 umc_h264_reconstruct_templates.h
字号:
}
} // void CompensateMotionLumaBlock(ReconstructParams *pParams,
void CompensateMotionChromaBlock(ReconstructParams *pParams,
Ipp32s iDir,
Ipp32s iBlockNumber,
Ipp32s iUniDir,
Ipp8u *)
{
IppVCInterpolateBlock_8u interpolateInfo;
Ipp32s iRefIndex;
Ipp32s iRefFieldTop;
// get reference index
iRefIndex = pParams->m_pRefIndex[iDir][iBlockNumber];
if (is_field && pParams->is_mbaff)
iRefIndex >>= 1;
VM_ASSERT(iRefIndex >= 0);
// get reference frame & pitch
interpolateInfo.pSrc[0] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pUPlane;
interpolateInfo.pSrc[1] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pVPlane;
VM_ASSERT(interpolateInfo.pSrc[0]);
VM_ASSERT(interpolateInfo.pSrc[1]);
interpolateInfo.srcStep = pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->pitch_chroma();
if (is_field)
{
if (pParams->is_mbaff)
{
iRefFieldTop = pParams->is_bottom_mb ^ (pParams->m_pRefIndex[iDir][iBlockNumber] & 1);
pParams->m_iRefIndex[iDir] = iRefIndex;
}
else
iRefFieldTop = GetReferenceField(pParams->m_pSegDec->m_pFields[iDir], iRefIndex);
if (iRefFieldTop)
{
interpolateInfo.pSrc[0] += interpolateInfo.srcStep;
interpolateInfo.pSrc[1] += interpolateInfo.srcStep;
}
interpolateInfo.srcStep *= 2;
}
// save vector
interpolateInfo.pointVector.x = pParams->m_pMV[iDir][iBlockNumber].mvx;
interpolateInfo.pointVector.y = pParams->m_pMV[iDir][iBlockNumber].mvy;
// adjust vectors when we decode a field
if ((is_field) && (1 == color_format))
{
if (pParams->is_mbaff)
{
interpolateInfo.pointVector.y += (pParams->is_bottom_mb - iRefFieldTop) * 2;
}
else
{
if (!pParams->m_pSegDec->m_field_index && iRefFieldTop)
interpolateInfo.pointVector.y -= 2;
else if(pParams->m_pSegDec->m_field_index && !iRefFieldTop)
interpolateInfo.pointVector.y += 2;
}
}
// we should do interpolation if vertical or horizontal vector isn't zero
if ((interpolateInfo.pointVector.x | interpolateInfo.pointVector.y) ||
(iUniDir))
{
// scale motion vector
interpolateInfo.pointVector.x <<= ((Ipp32s) (3 <= color_format));
interpolateInfo.pointVector.y <<= ((Ipp32s) (2 <= color_format));
// fill parameters
interpolateInfo.pDst[0] = pParams->m_pDstU;
interpolateInfo.pDst[1] = pParams->m_pDstV;
interpolateInfo.dstStep = pParams->m_iDstPitchChroma;
interpolateInfo.sizeFrame = pParams->m_chromaSize;
interpolateInfo.sizeBlock = pParams->roi_chroma;
interpolateInfo.pointBlockPos.x = pParams->m_iChromaXPos;
interpolateInfo.pointBlockPos.y = pParams->m_iChromaYPos;
ippiInterpolateChromaBlock_H264_8u_P2R(&interpolateInfo);
// save pointers for optimized interpolation
pParams->m_pSrcU[iDir] = pParams->m_pDstU;
pParams->m_pSrcV[iDir] = pParams->m_pDstV;
pParams->m_iSrcPitchChroma[iDir] = pParams->m_iDstPitchChroma;
}
else
{
Ipp32s iOffset = pParams->m_iOffsetChroma +
pParams->m_iIntraMBChromaOffset;
// save pointers for optimized interpolation
pParams->m_pSrcU[iDir] = (PlanePtrUV) interpolateInfo.pSrc[0] + iOffset;
pParams->m_pSrcV[iDir] = (PlanePtrUV) interpolateInfo.pSrc[1] + iOffset;
pParams->m_iSrcPitchChroma[iDir] = interpolateInfo.srcStep;
}
} // void CompensateMotionChromaBlock(ReconstructParams *pParams,
void CompensateMotionChromaBlock(ReconstructParams *pParams,
Ipp32s iDir,
Ipp32s iBlockNumber,
Ipp32s iUniDir,
Ipp16u *)
{
IppVCInterpolateBlock_16u interpolateInfo;
Ipp32s iRefIndex;
Ipp32s iRefFieldTop;
// get reference index
iRefIndex = pParams->m_pRefIndex[iDir][iBlockNumber];
if (is_field && pParams->is_mbaff)
iRefIndex >>= 1;
VM_ASSERT(iRefIndex >= 0);
// get reference frame & pitch
interpolateInfo.pSrc[0] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pUPlane;
interpolateInfo.pSrc[1] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pVPlane;
VM_ASSERT(interpolateInfo.pSrc[0]);
VM_ASSERT(interpolateInfo.pSrc[1]);
interpolateInfo.srcStep = pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->pitch_chroma();
if (is_field)
{
if (pParams->is_mbaff)
{
iRefFieldTop = pParams->is_bottom_mb ^ (pParams->m_pRefIndex[iDir][iBlockNumber] & 1);
pParams->m_iRefIndex[iDir] = iRefIndex;
}
else
iRefFieldTop = GetReferenceField(pParams->m_pSegDec->m_pFields[iDir], iRefIndex);
if (iRefFieldTop)
{
interpolateInfo.pSrc[0] += interpolateInfo.srcStep;
interpolateInfo.pSrc[1] += interpolateInfo.srcStep;
}
interpolateInfo.srcStep *= 2;
}
// save vector
interpolateInfo.pointVector.x = pParams->m_pMV[iDir][iBlockNumber].mvx;
interpolateInfo.pointVector.y = pParams->m_pMV[iDir][iBlockNumber].mvy;
// adjust vectors when we decode a field
if ((is_field) && (1 == color_format))
{
if (pParams->is_mbaff)
{
interpolateInfo.pointVector.y += (pParams->is_bottom_mb - iRefFieldTop) * 2;
}
else
{
if (!pParams->m_pSegDec->m_field_index && iRefFieldTop)
interpolateInfo.pointVector.y -= 2;
else if(pParams->m_pSegDec->m_field_index && !iRefFieldTop)
interpolateInfo.pointVector.y += 2;
}
}
// we should do interpolation if vertical or horizontal vector isn't zero
if ((interpolateInfo.pointVector.x | interpolateInfo.pointVector.y) ||
(iUniDir))
{
// scale motion vector
interpolateInfo.pointVector.x <<= ((Ipp32s) (3 <= color_format));
interpolateInfo.pointVector.y <<= ((Ipp32s) (2 <= color_format));
// fill parameters
interpolateInfo.pDst[0] = pParams->m_pDstU;
interpolateInfo.pDst[1] = pParams->m_pDstV;
interpolateInfo.dstStep = pParams->m_iDstPitchChroma;
interpolateInfo.sizeFrame = pParams->m_chromaSize;
interpolateInfo.sizeBlock = pParams->roi_chroma;
interpolateInfo.pointBlockPos.x = pParams->m_iChromaXPos;
interpolateInfo.pointBlockPos.y = pParams->m_iChromaYPos;
interpolateInfo.bitDepth = pParams->bit_depth_chroma;
ippiInterpolateChromaBlock_H264_16u_P2R(&interpolateInfo);
// save pointers for optimized interpolation
pParams->m_pSrcU[iDir] = pParams->m_pDstU;
pParams->m_pSrcV[iDir] = pParams->m_pDstV;
pParams->m_iSrcPitchChroma[iDir] = pParams->m_iDstPitchChroma;
}
else
{
Ipp32s iOffset = pParams->m_iOffsetChroma +
pParams->m_iIntraMBChromaOffset;
// save pointers for optimized interpolation
pParams->m_pSrcU[iDir] = (PlanePtrUV) interpolateInfo.pSrc[0] + iOffset;
pParams->m_pSrcV[iDir] = (PlanePtrUV) interpolateInfo.pSrc[1] + iOffset;
pParams->m_iSrcPitchChroma[iDir] = interpolateInfo.srcStep;
}
} // void CompensateMotionChromaBlock(ReconstructParams *pParams,
inline
void InterpolateMacroblock(ReconstructParams *pParams)
{
// combine bidir predictions into one,
// no weighting
InterpolateBlock(pParams->m_pSrcY[0],
pParams->m_pSrcY[1],
pParams->m_pDstY,
pParams->roi.width,
pParams->roi.height,
pParams->m_iSrcPitchLuma[0],
pParams->m_iSrcPitchLuma[1],
pParams->m_iDstPitchLuma,
pParams->bit_depth_luma);
if (color_format)
{
InterpolateBlock(pParams->m_pSrcV[0],
pParams->m_pSrcV[1],
pParams->m_pDstV,
pParams->roi_chroma.width,
pParams->roi_chroma.height,
pParams->m_iSrcPitchChroma[0],
pParams->m_iSrcPitchChroma[1],
pParams->m_iDstPitchChroma,
pParams->bit_depth_chroma);
InterpolateBlock(pParams->m_pSrcU[0],
pParams->m_pSrcU[1],
pParams->m_pDstU,
pParams->roi_chroma.width,
pParams->roi_chroma.height,
pParams->m_iSrcPitchChroma[0],
pParams->m_iSrcPitchChroma[1],
pParams->m_iDstPitchChroma,
pParams->bit_depth_chroma);
}
} // void InterpolateMacroblock(ReconstructParams *pParams)
inline
void BiDirWeightMacroblock(ReconstructParams *pParams)
{
// combine bidir predictions into one,
// explicit weighting
BiDirWeightBlock(pParams->m_pSrcY[0],
pParams->m_pSrcY[1],
pParams->m_pDstY,
pParams->m_iSrcPitchLuma[0],
pParams->m_iSrcPitchLuma[1],
pParams->m_iDstPitchLuma,
pParams->luma_log2_weight_denom,
pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].luma_weight,
pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].luma_offset,
pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].luma_weight,
pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].luma_offset,
pParams->roi,
pParams->bit_depth_luma);
if (color_format)
{
BiDirWeightBlock(pParams->m_pSrcV[0],
pParams->m_pSrcV[1],
pParams->m_pDstV,
pParams->m_iSrcPitchChroma[0],
pParams->m_iSrcPitchChroma[1],
pParams->m_iDstPitchChroma,
pParams->chroma_log2_weight_denom,
pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].chroma_weight[1],
pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].chroma_offset[1],
pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].chroma_weight[1],
pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].chroma_offset[1],
pParams->roi_chroma,
pParams->bit_depth_chroma);
BiDirWeightBlock(pParams->m_pSrcU[0],
pParams->m_pSrcU[1],
pParams->m_pDstU,
pParams->m_iSrcPitchChroma[0],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -