📄 umc_h264_segment_decoder_templates.h
字号:
sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
// Now, decode the coefficients
if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
this->DecodeCoefficients8x8_CABAC(sd);
else
this->DecodeCoefficients4x4_CABAC(sd);
}
} // void DecodeMacroblock_P_CABAC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_B_CABAC(H264SegmentDecoderMultiThreaded *sd)
{
bool noSubMbPartSizeLessThan8x8Flag;
if (is_high_profile)
noSubMbPartSizeLessThan8x8Flag = false;
Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;
if (is_high_profile)
{
if ((MBTYPE_INTER_8x8 == mbtype) || (MBTYPE_DIRECT == mbtype))
{
Ipp32s sum_partnum =
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];
if (sum_partnum==0)
noSubMbPartSizeLessThan8x8Flag = true;
}
else
noSubMbPartSizeLessThan8x8Flag = true;
}
if (mbtype != MBTYPE_DIRECT)
{
// Motion Vector Computation
if (mbtype == MBTYPE_INTER_8x8)
{
// First, if B slice and MB is 8x8, set the MV for any DIRECT
// 8x8 partitions. The MV for the 8x8 DIRECT partition need to
// be properly set before the MV for subsequent 8x8 partitions
// can be computed, due to prediction. The DIRECT MV are computed
// by a separate function and do not depend upon block neighbors for
// predictors, so it is done here first.
if (sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0] == SBTYPE_DIRECT ||
sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1] == SBTYPE_DIRECT ||
sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2] == SBTYPE_DIRECT ||
sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3] == SBTYPE_DIRECT)
{
sd->DecodeDirectMotionVectors(false);
}
}
sd->DecodeMotionVectors_CABAC();
}
else
{
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));
sd->DecodeDirectMotionVectors(true);
}
// cbp
sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u)sd->DecodeCBP_CABAC(color_format);
if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
{
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
sd->m_prev_dquant = 0;
}
else
{ // // delta QP
if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
{
Ipp8u transform_size_8x8_mode_flag = 0;
if (sd->m_pPicParamSet->transform_8x8_mode_flag)
{
Ipp32u ctxIdxInc;
Ipp32s left_inc = sd->m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num>=0?
GetMB8x8TSFlag(sd->m_gmbinfo->mbs[sd->m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num]):0;
Ipp32s top_inc = sd->m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num>=0?
GetMB8x8TSFlag(sd->m_gmbinfo->mbs[sd->m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num]):0;
ctxIdxInc = top_inc+left_inc;
transform_size_8x8_mode_flag = (Ipp8u) sd->m_pBitStream->DecodeSingleBin_CABAC(ctxIdxOffset[TRANSFORM_SIZE_8X8_FLAG] + ctxIdxInc);
pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo,transform_size_8x8_mode_flag);
}
}
// decode delta for quant value
{
sd->DecodeMBQPDelta_CABAC();
sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
}
// Now, decode the coefficients
if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
this->DecodeCoefficients8x8_CABAC(sd);
else
this->DecodeCoefficients4x4_CABAC(sd);
}
} // void DecodeMacroblock_B_CABAC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_I_CAVLC(H264SegmentDecoderMultiThreaded *sd)
{
bool noSubMbPartSizeLessThan8x8Flag;
// Reset buffer pointers to start
// This works only as long as "batch size" for VLD and reconstruct
// is th same. When/if want to make them different, need to change this.
IntraType * pMBIntraTypes = sd->m_pMBIntraTypes + sd->m_CurMBAddr*NUM_INTRA_TYPE_ELEMENTS;
// First decode the "macroblock header", e.g., macroblock type,
// intra-coding types, motion vectors and CBP.
// Get MB type, possibly change MBSKipCount to non-zero
if (is_high_profile)
noSubMbPartSizeLessThan8x8Flag = false;
Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;
if (mbtype == MBTYPE_INTRA)
{
Ipp8u transform_size_8x8_mode_flag = 0;
if (is_high_profile)
{
if (sd->m_pPicParamSet->transform_8x8_mode_flag)
{
transform_size_8x8_mode_flag = (Ipp8u) sd->m_pBitStream->Get1Bit();
pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo,transform_size_8x8_mode_flag);
}
}
if (transform_size_8x8_mode_flag)
sd->DecodeIntraTypes8x8_CAVLC(pMBIntraTypes, sd->m_IsUseConstrainedIntra);
else
sd->DecodeIntraTypes4x4_CAVLC(pMBIntraTypes, sd->m_IsUseConstrainedIntra);
}
else
{
pMBIntraTypes[0] =
pMBIntraTypes[1] =
pMBIntraTypes[2] =
pMBIntraTypes[3] = (sd->original_mb_type) & 0x03;
}
if (color_format)
{
// Get chroma prediction mode
sd->m_cur_mb.LocalMacroblockInfo->IntraTypes.intra_chroma_mode = (Ipp8u) sd->m_pBitStream->GetVLCElement(false);
if (sd->m_cur_mb.LocalMacroblockInfo->IntraTypes.intra_chroma_mode > 3)
throw h264_exception(UMC_ERR_INVALID_STREAM);
}
sd->DecodeEdgeType();
// cbp
if (mbtype != MBTYPE_INTRA_16x16)
{
sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u) sd->DecodeCBP_CAVLC(color_format);
if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
{
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
sd->m_prev_dquant = 0;
}
}
if ((sd->m_cur_mb.LocalMacroblockInfo->cbp) ||
(mbtype == MBTYPE_INTRA_16x16))
{
if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
{
Ipp8u transform_size_8x8_mode_flag = 0;
if (sd->m_pPicParamSet->transform_8x8_mode_flag)
{
transform_size_8x8_mode_flag = (Ipp8u) sd->m_pBitStream->Get1Bit();
pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo, transform_size_8x8_mode_flag);
}
}
// decode delta for quant value
if (!sd->m_pBitStream->NextBit())
{
sd->DecodeMBQPDelta_CAVLC();
sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
}
// Now, decode the coefficients
if (MBTYPE_INTRA_16x16 != mbtype)
{
if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
this->DecodeCoefficients8x8_CAVLC(sd);
else
this->DecodeCoefficients4x4_CAVLC(sd);
}
else
this->DecodeCoefficients16x16_CAVLC(sd);
}
} // void DecodeMacroblock_I_CAVLC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_P_CAVLC(H264SegmentDecoderMultiThreaded *sd)
{
bool noSubMbPartSizeLessThan8x8Flag;
// Get MB type, possibly change MBSKipCount to non-zero
if (is_high_profile)
noSubMbPartSizeLessThan8x8Flag = false;
Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;
if (is_high_profile)
{
if (mbtype==MBTYPE_INTER_8x8 || mbtype==MBTYPE_INTER_8x8_REF0)
{
Ipp32s sum_partnum =
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];
if (sum_partnum == 0)
noSubMbPartSizeLessThan8x8Flag = true;
}
else
noSubMbPartSizeLessThan8x8Flag = true;
}
// MV and Ref Index
sd->DecodeMotionVectorsPSlice_CAVLC();
//sd->ReconstructMotionVectors();
// cbp
sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u) sd->DecodeCBP_CAVLC(color_format);
if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
{
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
sd->m_prev_dquant = 0;
}
else
{
if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
{
Ipp8u transform_size_8x8_mode_flag = 0;
if (sd->m_pPicParamSet->transform_8x8_mode_flag)
{
transform_size_8x8_mode_flag = (Ipp8u) sd->m_pBitStream->Get1Bit();
pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo, transform_size_8x8_mode_flag);
}
}
// check for usual case of zero QP delta
if (!sd->m_pBitStream->NextBit())
{
sd->DecodeMBQPDelta_CAVLC();
sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
}
// Now, decode the coefficients
if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
this->DecodeCoefficients8x8_CAVLC(sd);
else
this->DecodeCoefficients4x4_CAVLC(sd);
}
} // void DecodeMacroblock_P_CAVLC(H264SegmentDecoderMultiThreaded *sd)
void DecodeMacroblock_B_CAVLC(H264SegmentDecoderMultiThreaded *sd)
{
bool noSubMbPartSizeLessThan8x8Flag;
// Get MB type, possibly change MBSKipCount to non-zero
if (is_high_profile)
noSubMbPartSizeLessThan8x8Flag = false;
Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;
if (is_high_profile)
{
if ((MBTYPE_INTER_8x8 == mbtype) ||
(MBTYPE_DIRECT == mbtype))
{
Ipp32s sum_partnum =
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -