📄 umc_h264_segment_decoder_templates.h
字号:
// decode macroblock having I type
if (MBTYPE_PCM != sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
DecodeMacroblock_I_CABAC(sd);
// macroblock has PCM type
else
DecodeMacroblock_PCM(sd);
} // void DecodeMacroblock_ISlice_CABAC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_PSlice_CABAC(H264SegmentDecoderMultiThreaded *sd)
{
Ipp32s iSkip;
// reset macroblock info
memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
// decode skip flag
// sometimes we have decoded the flag,
// when we were doing decoding of the previous macroblock
if ((!sd->m_isMBAFF) ||
(0 == (sd->m_CurMBAddr & 1)) ||
(!pGetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockPairInfo)))
iSkip = sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_P_SP);
else
iSkip = sd->m_iSkipNextMacroblock;
if (iSkip)
{
// reset macroblock variables
memset((void *) sd->m_cur_mb.RefIdxs[0], 0, sizeof(H264DecoderMacroblockRefIdxs));
memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
sd->m_prev_dquant = 0;
sd->m_iSkipNextMacroblock = 0;
if (sd->m_isMBAFF)
{
// but we don't know the spatial structure of the current macroblock.
// we need to decode next macroblock for obtaining the structure.
if (0 == (sd->m_CurMBAddr & 1))
{
sd->m_CurMBAddr += 1;
sd->m_CurMB_Y += 1;
// the next macroblock isn't skipped, obtain the structure
if (0 == sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_P_SP))
sd->DecodeMBFieldDecodingFlag_CABAC();
// the next macroblock is skipped too
else
sd->m_iSkipNextMacroblock = 1;
sd->m_CurMBAddr -= 1;
sd->m_CurMB_Y -= 1;
}
}
sd->UpdateNeighbouringAddresses();
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
sd->ReconstructSkipMotionVectors();
return;
}
else
sd->m_iSkipNextMacroblock = 0;
// decode macroblock field flag
if (sd->m_isMBAFF)
{
if (0 == (sd->m_CurMBAddr & 1))
sd->DecodeMBFieldDecodingFlag_CABAC();
}
else
pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);
// update neighbouring addresses
sd->UpdateNeighbouringAddresses();
// update neighbouring block positions
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
// First decode the "macroblock header", e.g., macroblock type,
// intra-coding types.
sd->DecodeMBTypePSlice_CABAC();
// decode macroblock having P type
if (MBTYPE_PCM < sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
{
DecodeMacroblock_P_CABAC(sd);
}
else
{
memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
memset((void *) sd->m_cur_mb.MVs[0], 0, sizeof(H264DecoderMacroblockMVs));
memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
// decode macroblock having I type
if (MBTYPE_PCM > sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
DecodeMacroblock_I_CABAC(sd);
// macroblock has PCM type
else
DecodeMacroblock_PCM(sd);
}
} // void DecodeMacroblock_PSlice_CABAC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_BSlice_CABAC(H264SegmentDecoderMultiThreaded * sd)
{
Ipp32s iSkip;
// reset macroblock info
memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
// decode skip flag
// sometimes we have decoded the flag,
// when we were doing decoding of the previous macroblock
if ((!sd->m_isMBAFF) ||
(0 == (sd->m_CurMBAddr & 1)) ||
(!pGetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockPairInfo)))
iSkip = sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_B);
else
iSkip = sd->m_iSkipNextMacroblock;
if (iSkip)
{
// reset macroblock variables
memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
memset(sd->m_cur_mb.MVs[1 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
// reset macroblock variables
sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
sd->m_prev_dquant = 0;
sd->m_iSkipNextMacroblock = 0;
if (sd->m_isMBAFF)
{
// but we don't know the spatial structure of the current macroblock.
// we need to decode next macroblock for obtaining the structure.
if (0 == (sd->m_CurMBAddr & 1))
{
sd->m_CurMBAddr += 1;
sd->m_CurMB_Y += 1;
// the next macroblock isn't skipped, obtain the structure
if (0 == sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_B))
sd->DecodeMBFieldDecodingFlag_CABAC();
// the next macroblock is skipped too
else
sd->m_iSkipNextMacroblock = 1;
sd->m_CurMBAddr -= 1;
sd->m_CurMB_Y -= 1;
sd->UpdateNeighbouringAddresses();
}
}
else
{
if (sd->m_IsUseSpatialDirectMode)
{
sd->UpdateNeighbouringAddresses();
}
}
if (sd->m_IsUseSpatialDirectMode)
{
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
}
sd->DecodeDirectMotionVectors(true);
return;
}
else
sd->m_iSkipNextMacroblock = 0;
// decode macroblock field flag
if (sd->m_isMBAFF)
{
if (0 == (sd->m_CurMBAddr & 1))
sd->DecodeMBFieldDecodingFlag_CABAC();
}
else
pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);
sd->UpdateNeighbouringAddresses();
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
// First decode the "macroblock header", e.g., macroblock type,
// intra-coding types.
sd->DecodeMBTypeBSlice_CABAC();
// decode macroblock having P type
if (MBTYPE_PCM < sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
{
DecodeMacroblock_B_CABAC(sd);
}
else
{
memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
memset((void *) sd->m_cur_mb.MVs[0], 0, sizeof(H264DecoderMacroblockMVs));
memset((void *) sd->m_cur_mb.MVs[1], 0, sizeof(H264DecoderMacroblockMVs));
memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
memset(sd->m_cur_mb.MVs[1 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
// decode macroblock having I type
if (MBTYPE_PCM > sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
DecodeMacroblock_I_CABAC(sd);
// macroblock has PCM type
else
DecodeMacroblock_PCM(sd);
}
} // void DecodeMacroblock_BSlice_CABAC(H264SegmentDecoderMultiThreaded * sd)
void DecodeMacroblock_ISlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)
{
memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
// decode macroblock field flag
if (sd->m_isMBAFF)
{
if (0 == (sd->m_CurMBAddr & 1))
sd->DecodeMBFieldDecodingFlag_CAVLC();
}
else
pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);
// update neighbouring addresses
sd->UpdateNeighbouringAddresses();
// update neighbouring block positions
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
// First decode the "macroblock header", e.g., macroblock type,
// intra-coding types.
sd->DecodeMBTypeISlice_CAVLC();
// decode macroblock having I type
if (MBTYPE_PCM != sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
DecodeMacroblock_I_CAVLC(sd);
// macroblock has PCM type
else
DecodeMacroblock_PCM(sd);
} // void DecodeMacroblock_ISlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_PSlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)
{
// reset macroblock info
memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
if (0 == sd->m_MBSkipCount)
sd->m_MBSkipCount = sd->DecodeMBSkipRun_CAVLC();
else
sd->m_MBSkipCount -= 1;
if (0 < sd->m_MBSkipCount)
{
// reset macroblock variables
memset((void *) sd->m_cur_mb.RefIdxs[0], 0, sizeof(H264DecoderMacroblockRefIdxs));
sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
sd->m_prev_dquant = 0;
if ((sd->m_isMBAFF) &&
(0 == (sd->m_CurMBAddr & 1)))
{
// but we don't know the spatial structure of the current macroblock.
// we need to decode next macroblock for obtaining the structure.
if (1 == sd->m_MBSkipCount)
{
sd->m_CurMBAddr += 1;
sd->m_CurMB_Y += 1;
// the next macroblock isn't skipped, obtain the structure
sd->DecodeMBFieldDecodingFlag_CAVLC();
// the next macroblock is skipped too
sd->m_CurMBAddr -= 1;
sd->m_CurMB_Y -= 1;
}
else
sd->DecodeMBFieldDecodingFlag();
}
sd->UpdateNeighbouringAddresses();
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
sd->ReconstructSkipMotionVectors();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -