📄 umc_h264_pack.cpp
字号:
H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
CH264pBs<PixType,CoeffsType> *pBitstream = curr_slice->m_pbitstream;
MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;
bool noSubMbPartSizeLessThan8x8Flag = 1;
switch (mb_type)
{
case MBTYPE_INTER:
case MBTYPE_SKIPPED:
N = 0;
break;
case MBTYPE_INTER_16x8:
N = 1;
break;
case MBTYPE_INTER_8x16:
N = 2;
break;
case MBTYPE_INTER_8x8:
N = 3;
break;
case MBTYPE_INTER_8x8_REF0:
N = 4;
// P_8x8ref0 is not allowed for CABAC coding => for CAVLC we
// do code P_8x8ref0 and for CABAC we switch to P_8x8.
if(m_PicParamSet.entropy_coding_mode) {
mb_type = cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_INTER_8x8;
N -= 1;//for cabac
}
break;
default:
N = -1;
break;
}
if (m_PicParamSet.entropy_coding_mode)
{
Ipp32s uLeftMBType = cur_mb.CurrentMacroblockNeighbours.mb_A < 0 ? NUMBER_OF_MBTYPES :
m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentMacroblockNeighbours.mb_A].mbtype;
Ipp32s uTopMBType = cur_mb.CurrentMacroblockNeighbours.mb_B < 0 ? NUMBER_OF_MBTYPES :
m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentMacroblockNeighbours.mb_B].mbtype;;
pBitstream->MBTypeInfo_CABAC(slice_type,N,(MB_Type)mb_type,(MB_Type)uLeftMBType,(MB_Type)uTopMBType);
} else
length = pBitstream->PutVLCCode(N);
if (mb_type == MBTYPE_INTER_8x8 || mb_type == MBTYPE_INTER_8x8_REF0) {
// for each of the 8x8 blocks
for (Ipp32u block=0; block<4; block++) {
switch (cur_mb.GlobalMacroblockInfo->sbtype[block]) {
case SBTYPE_8x8:
N = 0;
break;
case SBTYPE_8x4:
N = 1;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_4x8:
N = 2;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_4x4:
N = 3;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
default:
break;
}
// Sub MB Type
if (m_PicParamSet.entropy_coding_mode)
pBitstream->SubTypeInfo_CABAC(slice_type,N);
else
length = pBitstream->PutVLCCode(N);
}
}
return noSubMbPartSizeLessThan8x8Flag;
} // Encode_Inter_Type
////////////////////////////////////////////////////////////////////////////////
//
// Encode_BiPred_Type
//
////////////////////////////////////////////////////////////////////////////////
template <class PixType, class CoeffsType>
bool H264CoreEncoder<PixType,CoeffsType>::Encode_BiPred_Type(H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice)
{
Ipp32s N;
H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;
CH264pBs<PixType,CoeffsType> *pBitstream = curr_slice->m_pbitstream;
EnumSliceType slice_type = curr_slice->m_slice_type;
bool noSubMbPartSizeLessThan8x8Flag = 1;
switch (mb_type) {
case MBTYPE_DIRECT:
N = 0;
break;
case MBTYPE_FORWARD:
N = 1;
break;
case MBTYPE_BACKWARD:
N = 2;
break;
case MBTYPE_BIDIR:
N = 3;
break;
case MBTYPE_FWD_FWD_16x8:
N = 4;
break;
case MBTYPE_FWD_FWD_8x16:
N = 5;
break;
case MBTYPE_BWD_BWD_16x8:
N = 6;
break;
case MBTYPE_BWD_BWD_8x16:
N = 7;
break;
case MBTYPE_FWD_BWD_16x8:
N = 8;
break;
case MBTYPE_FWD_BWD_8x16:
N = 9;
break;
case MBTYPE_BWD_FWD_16x8:
N = 10;
break;
case MBTYPE_BWD_FWD_8x16:
N = 11;
break;
case MBTYPE_FWD_BIDIR_16x8:
N = 12;
break;
case MBTYPE_FWD_BIDIR_8x16:
N = 13;
break;
case MBTYPE_BWD_BIDIR_16x8:
N = 14;
break;
case MBTYPE_BWD_BIDIR_8x16:
N = 15;
break;
case MBTYPE_BIDIR_FWD_16x8:
N = 16;
break;
case MBTYPE_BIDIR_FWD_8x16:
N = 17;
break;
case MBTYPE_BIDIR_BWD_16x8:
N = 18;
break;
case MBTYPE_BIDIR_BWD_8x16:
N = 19;
break;
case MBTYPE_BIDIR_BIDIR_16x8:
N = 20;
break;
case MBTYPE_BIDIR_BIDIR_8x16:
N = 21;
break;
case MBTYPE_B_8x8:
N = 22;
break;
default:
N = -1;
break;
}
if (m_PicParamSet.entropy_coding_mode)
{
MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;
Ipp32s uLeftMBType = cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num < 0 ? NUMBER_OF_MBTYPES :
m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].mbtype;
Ipp32s uTopMBType = cur_mb.CurrentBlockNeighbours.mb_above.mb_num < 0 ? NUMBER_OF_MBTYPES :
m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentBlockNeighbours.mb_above.mb_num].mbtype;
pBitstream->MBTypeInfo_CABAC(slice_type,N,(MB_Type)mb_type,(MB_Type)uLeftMBType,(MB_Type)uTopMBType);
}
else {
pBitstream->PutVLCCode(N);
}
if (mb_type == MBTYPE_B_8x8) {
// for each of the 8x8 blocks
for (Ipp32u block=0; block<4; block++)
{
switch (cur_mb.GlobalMacroblockInfo->sbtype[block])
{
case SBTYPE_DIRECT:
N = 0;
if( !m_SeqParamSet.direct_8x8_inference_flag )
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_FORWARD_8x8:
N = 1;
break;
case SBTYPE_BACKWARD_8x8:
N = 2;
break;
case SBTYPE_BIDIR_8x8:
N = 3;
break;
case SBTYPE_FORWARD_8x4:
N = 4;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_FORWARD_4x8:
N = 5;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BACKWARD_8x4:
N = 6;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BACKWARD_4x8:
N = 7;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BIDIR_8x4:
N = 8;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BIDIR_4x8:
N = 9;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_FORWARD_4x4:
N = 10;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BACKWARD_4x4:
N = 11;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
case SBTYPE_BIDIR_4x4:
N = 12;
noSubMbPartSizeLessThan8x8Flag = 0;
break;
default: // Unknown SBTYPE!
break;
}
// Sub MB Type
if (m_PicParamSet.entropy_coding_mode)
pBitstream->SubTypeInfo_CABAC(slice_type,N);
else
pBitstream->PutVLCCode(N);
}
}
return noSubMbPartSizeLessThan8x8Flag;
} // Encode_BiPred_Type
template <class PixType, class CoeffsType>
Ipp32s H264CoreEncoder<PixType,CoeffsType>::Derive_ctxIdxInc_CABAC(
H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice,
Ipp32s list_num, Ipp32s block_idx)
{
H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
Ipp32s ref_idx_ctxIdxInc;
H264BlockLocation block_a, block_b;
if (BLOCK_IS_ON_LEFT_EDGE(block_idx))
{
block_a = cur_mb.CurrentBlockNeighbours.mbs_left[block_idx / 4];
} else {
block_a.mb_num = curr_slice->m_CurMBAddr;
block_a.block_num = block_idx - 1;
}
if (BLOCK_IS_ON_TOP_EDGE(block_idx))
{
block_b = cur_mb.CurrentBlockNeighbours.mb_above;
if (block_b.mb_num >= 0)
{
block_b.block_num += block_idx;
}
} else {
block_b.mb_num = curr_slice->m_CurMBAddr;
block_b.block_num = block_idx - 4;
}
Ipp32s condTermFlagA = 0;
if (block_a.mb_num >= 0)
{
Ipp8u lval = (Ipp8u) (pGetMBFieldDecodingFlag(cur_mb.GlobalMacroblockInfo) <
GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num]));
MBTypeValue mb_type = m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num].mbtype;
Ipp32s ref_idx = m_pCurrentFrame->m_mbinfo.RefIdxs[list_num][block_a.mb_num].RefIdxs[block_a.block_num];
Ipp32s refIdxZeroFlag = ref_idx > lval ? 0 : 1; // predModeEqualFlag here
Ipp32s block_8x8 = block_subblock_mapping[block_a.block_num] / 4;
SBTypeValue sbtype = m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num].sbtype[block_8x8];
condTermFlagA = (IS_SKIP_MBTYPE(mb_type)
|| IS_INTRA_MBTYPE(mb_type)
|| (sbtype == SBTYPE_DIRECT)
|| refIdxZeroFlag) ? 0 : 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -