📄 umc_h264_reconstruct_templates.h
字号:
{
Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
(D_DIR_BWD) :
(D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber);
// set sub-block offset for second half of MB
params.m_iLumaYPos += 4;
params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber + 4);
}
}
break;
case SBTYPE_4x8:
{
params.roi.width = 4;
params.roi.height = 8;
params.roi_chroma.width = 4 >> ((Ipp32s) (3 > color_format));
params.roi_chroma.height = 8 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 0;
params.m_iIntraMBChromaOffset = 0;
if ((D_DIR_BIDIR == iSubBlockDir) ||
(D_DIR_DIRECT == iSubBlockDir) ||
(D_DIR_DIRECT_SPATIAL_BIDIR == iSubBlockDir))
{
params.m_iIntraMBLumaOffsetTmp = 0;
params.m_iIntraMBChromaOffsetTmp = 0;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber);
// set sub-block offset for second half of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));
params.m_iIntraMBLumaOffsetTmp = 4;
params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format)));
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber + 1);
}
else
{
Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
(D_DIR_BWD) :
(D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber);
// set sub-block offset for second half of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber + 1);
}
}
break;
default:
// 4x4 sub division
{
params.roi.width = 4;
params.roi.height = 4;
params.roi_chroma.width = 4 >> ((Ipp32s) (3 > color_format));
params.roi_chroma.height = 4 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 0;
params.m_iIntraMBChromaOffset = 0;
if ((D_DIR_BIDIR == iSubBlockDir) ||
(D_DIR_DIRECT == iSubBlockDir) ||
(D_DIR_DIRECT_SPATIAL_BIDIR == iSubBlockDir))
{
params.m_iIntraMBLumaOffsetTmp = 0;
params.m_iIntraMBChromaOffsetTmp = 0;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber);
// set sub-block offset for second quarter of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));
params.m_iIntraMBLumaOffsetTmp = 4;
params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format)));
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber + 1);
// set sub-block offset for third quarter of MB
params.m_iLumaXPos -= 4;
params.m_iLumaYPos += 4;
params.m_iChromaXPos -= 4 >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
params.m_iIntraMBLumaOffsetTmp = 4 * 16;
params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (2 > color_format))) * 16;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber + 4);
// set sub-block offset for fourth quarter of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4 + 4 * iPitchLuma;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format))) +
(4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
params.m_iIntraMBLumaOffsetTmp = 4 + 4 * 16;
params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format))) +
(4 >> ((Ipp32s) (2 > color_format))) * 16;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
iSubBlockNumber + 5);
}
else
{
Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
(D_DIR_BWD) :
(D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber);
// set sub-block offset for second quarter of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber + 1);
// set sub-block offset for third quarter of MB
params.m_iLumaXPos -= 4;
params.m_iLumaYPos += 4;
params.m_iChromaXPos -= 4 >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber + 4);
// set sub-block offset for fourth quarter of MB
params.m_iLumaXPos += 4;
params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 4 + 4 * iPitchLuma;
params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format))) +
(4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
iSubBlockNumber + 5);
}
}
break;
}
} // void CompensateBlock8x8(PlanePtrY pDstY,
void CompensateMotionMacroBlock(PlanePtrY pDstY,
PlanePtrUV pDstV,
PlanePtrUV pDstU,
Ipp32u mbXOffset, // for edge clipping
Ipp32u mbYOffset,
Ipp32s offsetY,
Ipp32s offsetC,
Ipp32s pitch_luma,
Ipp32s pitch_chroma,
H264SegmentDecoder *sd)
{
Ipp32s mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;
Ipp8s *psbdir = sd->m_cur_mb.LocalMacroblockInfo->sbdir;
bool bBidirWeightMB = false; // is bidir weighting in effect for the MB?
bool bUnidirWeightMB = false; // is explicit L0 weighting in effect for the MB?
// Optional weighting vars
Ipp32u weighted_bipred_idc = 0;
Ipp32u luma_log2_weight_denom = 0;
Ipp32u chroma_log2_weight_denom = 0;
Ipp8s *pRefIndexL0 = NULL;
Ipp8s *pRefIndexL1 = NULL;
Ipp32s bit_depth_luma = sd->bit_depth_luma;
Ipp32s bit_depth_cr = sd->bit_depth_chroma;
VM_ASSERT(IS_INTER_MBTYPE(sd->m_cur_mb.GlobalMacroblockInfo->mbtype));
ReconstructParams params;
params.is_mbaff = (sd->m_pSliceHeader->MbaffFrameFlag != 0);
params.is_bottom_mb = (params.is_mbaff && (sd->m_CurMBAddr & 1)) ? 1 : 0;
pRefIndexL0 = sd->m_cur_mb.RefIdxs[0]->RefIdxs;
if (((PREDSLICE == sd->m_pSliceHeader->slice_type) ||
(S_PREDSLICE == sd->m_pSliceHeader->slice_type)) &&
(sd->m_pPicParamSet->weighted_pred_flag != 0))
{
// L0 weighting specified in pic param set. Get weighting params
// for the slice.
luma_log2_weight_denom = sd->m_pSliceHeader->luma_log2_weight_denom;
chroma_log2_weight_denom = sd->m_pSliceHeader->chroma_log2_weight_denom;
bUnidirWeightMB = true;
}
// get luma interp func pointer table in cache
if (sd->m_pSliceHeader->slice_type == BPREDSLICE)
{
VM_ASSERT(sd->m_pRefPicList[1][0]);
pRefIndexL1 = sd->m_cur_mb.RefIdxs[1]->RefIdxs;
// DIRECT MB have the same subblock partition structure as the
// colocated MB. Take advantage of that to perform motion comp
// for the direct MB using the largest partitions possible.
if (mbtype == MBTYPE_DIRECT || mbtype == MBTYPE_SKIPPED)
{
mbtype = MBTYPE_INTER_8x8;
}
// Bi-dir weighting?
weighted_bipred_idc = sd->m_pPicParamSet->weighted_bipred_idc;
if (weighted_bipred_idc == 1)
{
// explicit bidir weighting
luma_log2_weight_denom = sd->m_pSliceHeader->luma_log2_weight_denom;
chroma_log2_weight_denom = sd->m_pSliceHeader->chroma_log2_weight_denom;
bUnidirWeightMB = true;
bBidirWeightMB = true;
}
if (weighted_bipred_idc == 2)
{
bBidirWeightMB = true;
}
}
Ipp32s iPitchLuma = pitch_luma;
Ipp32s iPitchChroma = pitch_chroma;
if (mbtype != MBTYPE_INTER_8x8 && mbtype != MBTYPE_INTER_8x8_REF0)
{
// fill the reconstruct parameters
params.m_pMV[0] = sd->m_cur_mb.MVs[0]->MotionVectors;
params.m_pMV[1] = (BPREDSLICE == sd->m_pSliceHeader->slice_type) ? (sd->m_cur_mb.MVs[1]->MotionVectors) : (NULL);
params.m_pRefIndex[0] = pRefIndexL0;
params.m_pRefIndex[1] = pRefIndexL1;
params.m_iOffsetLuma = offsetY;
params.m_iOffsetChroma = offsetC;
params.m_iLumaXPos = mbXOffset;
params.m_iLumaYPos = mbYOffset;
params.m_iChromaXPos = mbXOffset >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos = mbYOffset >> ((Ipp32s) (2 > color_format));
if (is_weight)
{
params.luma_log2_weight_denom = luma_log2_weight_denom;
params.chroma_log2_weight_denom = chroma_log2_weight_denom;
params.weighted_bipred_idc = weighted_bipred_idc;
params.m_bBidirWeightMB = bBidirWeightMB;
params.m_bUnidirWeightMB = bUnidirWeightMB;
}
params.bit_depth_luma = bit_depth_luma;
params.bit_depth_chroma = bit_depth_cr;
params.m_pSegDec = sd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -