📄 umc_h264_reconstruct_templates.h
字号:
params.m_lumaSize = sd->m_pCurrentFrame->lumaSize();
params.m_chromaSize = sd->m_pCurrentFrame->chromaSize();
params.m_lumaSize.height >>= is_field;
params.m_chromaSize.height >>= is_field;
// reconstruct macro block
switch (mbtype)
{
case MBTYPE_INTER_16x8:
{
params.roi.width = 16;
params.roi.height = 8;
params.roi_chroma.width = 16 >> ((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 == psbdir[0])
{
params.m_iIntraMBLumaOffsetTmp = 0;
params.m_iIntraMBChromaOffsetTmp = 0;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
0);
}
else
{
Ipp32s iDir = (D_DIR_BWD == psbdir[0]) ? (D_DIR_BWD) : (D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
0);
}
// set sub-block offset for second half of MB
params.m_iLumaYPos += 8;
params.m_iChromaYPos += 8 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 8 * iPitchLuma;
params.m_iIntraMBChromaOffset = (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
if (D_DIR_BIDIR == psbdir[1])
{
params.m_iIntraMBLumaOffsetTmp = 8 * 16;
params.m_iIntraMBChromaOffsetTmp = (8 >> ((Ipp32s) (2 > color_format))) * 16;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
8);
}
else
{
Ipp32s iDir = (D_DIR_BWD == psbdir[1]) ? (D_DIR_BWD) : (D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
8);
}
}
break;
case MBTYPE_INTER_8x16:
{
params.roi.width = 8;
params.roi.height = 16;
params.roi_chroma.width = 8 >> ((Ipp32s) (3 > color_format));
params.roi_chroma.height = 16 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 0;
params.m_iIntraMBChromaOffset = 0;
if (D_DIR_BIDIR == psbdir[0])
{
params.m_iIntraMBLumaOffsetTmp = 0;
params.m_iIntraMBChromaOffsetTmp = 0;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
0);
}
else
{
Ipp32s iDir = (D_DIR_BWD == psbdir[0]) ? (D_DIR_BWD) : (D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
0);
}
// set sub-block offset for second half of MB
params.m_iLumaXPos += 8;
params.m_iChromaXPos += 8 >> ((Ipp32s) (3 > color_format));
params.m_iIntraMBLumaOffset = 8;
params.m_iIntraMBChromaOffset = 8 >> ((Ipp32s) (3 > color_format));
if (D_DIR_BIDIR == psbdir[1])
{
params.m_iIntraMBLumaOffsetTmp = 8;
params.m_iIntraMBChromaOffsetTmp = 8 >> ((Ipp32s) (3 > color_format));
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
2);
}
else
{
Ipp32s iDir = (D_DIR_BWD == psbdir[1]) ? (D_DIR_BWD) : (D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
2);
}
}
break;
default:
{
params.roi.width = 16;
params.roi.height = 16;
params.roi_chroma.width = 16 >> ((Ipp32s) (3 > color_format));
params.roi_chroma.height = 16 >> ((Ipp32s) (2 > color_format));
params.m_iIntraMBLumaOffset = 0;
params.m_iIntraMBChromaOffset = 0;
if (MBTYPE_BIDIR == mbtype)
{
params.m_iIntraMBLumaOffsetTmp = 0;
params.m_iIntraMBChromaOffsetTmp = 0;
CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
0);
}
else
{
Ipp32s iDir = (MBTYPE_BACKWARD == mbtype) ? (D_DIR_BWD) : (D_DIR_FWD);
CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
0);
}
}
break;
}
}
else
{
Ipp8s *pSubBlockType = sd->m_cur_mb.GlobalMacroblockInfo->sbtype;
Ipp8s *pSubBlockDir = sd->m_cur_mb.LocalMacroblockInfo->sbdir;
// 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;
params.m_lumaSize = sd->m_pCurrentFrame->lumaSize();
params.m_chromaSize = sd->m_pCurrentFrame->chromaSize();
params.m_lumaSize.height >>= is_field;
params.m_chromaSize.height >>= is_field;
// sub block 0
CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
params, pSubBlockType[0], pSubBlockDir[0], 0);
// sub block 1
pDstY += 8;
pDstU += (8 >> ((Ipp32s) (3 > color_format)));
pDstV += (8 >> ((Ipp32s) (3 > color_format)));
params.m_iOffsetLuma = offsetY + 8;
params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (3 > color_format)));
params.m_iLumaXPos = mbXOffset + 8;
params.m_iLumaYPos = mbYOffset;
params.m_iChromaXPos = (mbXOffset + 8) >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos = mbYOffset >> ((Ipp32s) (2 > color_format));
CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
params, pSubBlockType[1], pSubBlockDir[1], 2);
// sub block 2
pDstY += - 8 + 8 * iPitchLuma;
pDstU += - (8 >> ((Ipp32s) (3 > color_format))) +
(8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
pDstV += - (8 >> ((Ipp32s) (3 > color_format))) +
(8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
params.m_iOffsetLuma = offsetY + 8 * iPitchLuma;
params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
params.m_iLumaXPos = mbXOffset;
params.m_iLumaYPos = mbYOffset + 8;
params.m_iChromaXPos = mbXOffset >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos = (mbYOffset + 8) >> ((Ipp32s) (2 > color_format));
CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
params, pSubBlockType[2], pSubBlockDir[2], 8);
// sub block 3
pDstY += 8;
pDstU += (8 >> ((Ipp32s) (3 > color_format)));
pDstV += (8 >> ((Ipp32s) (3 > color_format)));
params.m_iOffsetLuma = offsetY + 8 + 8 * iPitchLuma;
params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (3 > color_format))) +
(8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
params.m_iLumaXPos = mbXOffset + 8;
params.m_iLumaYPos = mbYOffset + 8;
params.m_iChromaXPos = (mbXOffset + 8) >> ((Ipp32s) (3 > color_format));
params.m_iChromaYPos = (mbYOffset + 8) >> ((Ipp32s) (2 > color_format));
CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
params, pSubBlockType[3], pSubBlockDir[3], 10);
/* DEBUG : should be removed *//*
pDstY = pDstY - 8 - 8 * iPitchLuma;
pDstU = pDstU - (8 >> ((Ipp32s) (3 > color_format))) - (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
pDstV = pDstV - (8 >> ((Ipp32s) (3 > color_format))) - (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;*/
}
/*
y_writer.Write(pDstY, iPitchLuma);
u_writer.Write(pDstU, iPitchChroma);
u_writer.Write(pDstV, iPitchChroma);*/
/*
QueryPerformanceCounter((LARGE_INTEGER *) &iStamp);
iTime += iStamp;*/
} // void CompensateMotionMacroBlock(PlanePtrY pDstY,
////////////////////////////////////////////////////////////////////////////////
// Copy raw pixel values from the bitstream to the reconstructed frame for
// all luma and chroma blocks of one macroblock.
////////////////////////////////////////////////////////////////////////////////
void ReconstructPCMMB(Ipp32u offsetY, Ipp32u offsetC, Ipp32s pitch_luma, Ipp32s pitch_chroma,
H264SegmentDecoder * sd)
{
PlanePtrY pDstY;
PlanePtrUV pDstU;
PlanePtrUV pDstV;
Ipp32s i;
// to retrieve non-aligned pointer from m_pCoeffBlocksRead
pDstY = (PlanePtrY)sd->m_pYPlane + offsetY;
pDstU = (PlanePtrUV)sd->m_pUPlane + offsetC;
pDstV = (PlanePtrUV)sd->m_pVPlane + offsetC;
PlanePtrY pCoeffBlocksRead_Y = reinterpret_cast<PlanePtrY> (sd->m_pCoeffBlocksRead);
// get pointer to raw bytes from m_pCoeffBlocksRead
for (i = 0; i<16; i++)
memcpy(pDstY + i * pitch_luma, pCoeffBlocksRead_Y + i * 16, 16*sizeof(PlaneY));
sd->m_pCoeffBlocksRead = (UMC::CoeffsPtrCommon)((Ipp8u*)sd->m_pCoeffBlocksRead +
256*sizeof(PlaneY));
if (color_format)
{
Ipp32s iWidth = (color_format == 3) ? 16 : 8;
Ipp32s iHeight = 8 + 8 * (color_format >> 1);
PlanePtrUV pCoeffBlocksRead_UV = (PlanePtrUV) (sd->m_pCoeffBlocksRead);
for (i = 0; i < iHeight; i += 1)
memcpy(pDstU + i * pitch_chroma, pCoeffBlocksRead_UV + i * iWidth, iWidth*sizeof(PlaneUV));
pCoeffBlocksRead_UV += iWidth * iHeight * sizeof(PlaneUV);
for (i = 0; i < iHeight; i += 1)
memcpy(pDstV + i * pitch_chroma, pCoeffBlocksRead_UV + i * iWidth, iWidth*sizeof(PlaneUV));
sd->m_pCoeffBlocksRead = (UMC::CoeffsPtrCommon)((Ipp8u*)sd->m_pCoeffBlocksRead +
2* iWidth * iHeight * sizeof(PlaneUV));
}
} // void ReconstructPCMMB(
};
#pragma warning(default: 4127)
} // namespace UMC
#endif // __UMC_H264_RECONSTRUCT_TEMPLATE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -