📄 umc_h264_bs.cpp
字号:
{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0} }, // 14 TotalZeros
{ {1,9},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0} } // 15 TotalZeros
};
template <class PixType, class CoeffsType>
Status CH264pBs<PixType,CoeffsType>::PutTotalZeros(Ipp32s TotalZeros,
Ipp32s TotalCoeffs,
Ipp32s bChromaDC)
{
Status ps = UMC_OK;
TotalCoeffs -= 1;
if (bChromaDC) {
PutBits(EncTotalZerosChroma[bChromaDC-1][TotalZeros][TotalCoeffs].code,
EncTotalZerosChroma[bChromaDC-1][TotalZeros][TotalCoeffs].len);
} else {
PutBits(EncTotalZeros4x4[TotalZeros][TotalCoeffs].code,
EncTotalZeros4x4[TotalZeros][TotalCoeffs].len);
}
return ps;
}
// Note, the following table is indexed by RunBefore & ZerosLeft-1
// Up to ZeroLeft = 7. Above 7, Use 7.
static const struct_CodeEntry EncRuns[15][7] = {
// 0 1 2 3 4 5 6+ <- (ZerosLeft-1)
{ {1,1},{1,1},{3,2},{3,2},{3,2},{3,2},{7,3} }, // 0 RunBefore
{ {0,1},{1,2},{2,2},{2,2},{2,2},{0,3},{6,3} }, // 1 RunBefore
{ {0,0},{0,2},{1,2},{1,2},{3,3},{1,3},{5,3} }, // 2 RunBefore
{ {0,0},{0,0},{0,2},{1,3},{2,3},{3,3},{4,3} }, // 3 RunBefore
{ {0,0},{0,0},{0,0},{0,3},{1,3},{2,3},{3,3} }, // 4 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,3},{5,3},{2,3} }, // 5 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{4,3},{1,3} }, // 6 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,4} }, // 7 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,5} }, // 8 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,6} }, // 9 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,7} }, // 10 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,8} }, // 11 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,9} }, // 12 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,10}}, // 13 RunBefore
{ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,11}} // 14 RunBefore
};
template <class PixType, class CoeffsType>
Status CH264pBs<PixType,CoeffsType>::PutRuns(Ipp8u* uRuns,
Ipp32s TotalZeros,
Ipp32s TotalCoeffs)
{
Status ps = UMC_OK;
Ipp32s cnt = 0;
TotalCoeffs--; // Don't write the last run, since it can be inferred.
while (TotalZeros && (cnt != TotalCoeffs)) {
Ipp32u zeros_idx = (TotalZeros > 6) ? 6 : TotalZeros-1;
PutBits(EncRuns[uRuns[cnt]][zeros_idx].code,
EncRuns[uRuns[cnt]][zeros_idx].len);
TotalZeros -= uRuns[cnt];
cnt++;
}
return ps;
}
/**************************** cabac **********************************/
template <class PixType, class CoeffsType>
Status CH264pBs<PixType,CoeffsType>::MBFieldModeInfo_CABAC(Ipp32s mb_field, Ipp32s field_available_left, Ipp32s field_available_above)
{
EncodeSingleBin_CABAC(field_available_left+field_available_above+ctxIdxOffset[MB_FIELD_DECODING_FLAG],mb_field!=0);
return UMC_OK;
}
template <class PixType, class CoeffsType>
Status CH264pBs<PixType,CoeffsType>::MBTypeInfo_CABAC(EnumSliceType SliceType, Ipp32s mb_type_cur, MB_Type type_cur, MB_Type type_left, MB_Type type_above)
{
Ipp32s a, b,c=0;
Ipp32s type_temp;
Ipp32s itype=mb_type_cur-1;Ipp32s start_index = MB_TYPE_I;
if(IS_INTRA_SLICE(SliceType))
{
b = (type_above >= NUMBER_OF_MBTYPES)?0:((type_above != MBTYPE_INTRA) ? 1 : 0 );
a = (type_left >= NUMBER_OF_MBTYPES)?0:((type_left != MBTYPE_INTRA) ? 1 : 0 );
encoding_intra:
if (type_cur==MBTYPE_INTRA) // 4x4 Intra
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index]+a+b,0);
}
else if( type_cur == MBTYPE_PCM) // PCM-MODE
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index]+a+b,1);
EncodeFinalSingleBin_CABAC(1);
}
else // 16x16 Intra
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index]+a+b,1);
EncodeFinalSingleBin_CABAC(0);
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 3+c, itype/12 != 0); // coding of AC/no AC
itype %= 12;
if (itype<4)
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 4+c, 0);
}
else
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 4+c, 1);
if (itype>=4 && itype<8)
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 5, 0);
}
else
{
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 5, 1);
}
}
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 6, (itype&2) != 0 );
EncodeSingleBin_CABAC(ctxIdxOffset[start_index] + 7-c, (itype&1) != 0 );
}
}
else // INTER
{
if (IS_B_SLICE(SliceType))
{
type_temp = mb_type_cur;
b = (type_above >= NUMBER_OF_MBTYPES)?0:(IS_SKIP_MBTYPE(type_above) ? 0 : 1 );
a = (type_left >= NUMBER_OF_MBTYPES)?0:(IS_SKIP_MBTYPE(type_left) ? 0 : 1 );
if (mb_type_cur>=24) type_temp=24;
if (type_temp==0)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b, 0);
}
else if (type_temp<=2)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 3, 0);
if (type_temp-1) EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
}
else if (type_temp<=10)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b,1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 3, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 0);
if (((type_temp-3)>>2)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if (((type_temp-3)>>1)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if ((type_temp-3)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
}
else if (type_temp==11 || type_temp==11*2)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b,1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 3, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
if (type_temp!=11)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
}
else
{
if (type_temp > 22 ) type_temp--;
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b,1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 3, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 1);
if ((type_temp-12)&8)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if ((type_temp-12)&4)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if ((type_temp-12)&2)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if ((type_temp-12)&1)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
//if (type_temp >12) type_temp++;
}
if( type_cur==MBTYPE_PCM )
{
EncodeFinalSingleBin_CABAC(1);
return UMC_OK;
}
if(type_cur==MBTYPE_INTRA_16x16)
{
EncodeFinalSingleBin_CABAC(0);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, (mb_type_cur-24)/12 != 0);
mb_type_cur %= 12;
type_temp = mb_type_cur >> 2;
if (type_temp==0)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 7, 0);
}
else
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 7, 1);
if (type_temp==1)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 7, 0);
}
else
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 7, 1);
}
}
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 8, (mb_type_cur&2) != 0);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 8, (mb_type_cur&1) != 0);
}
}
else // P slice
{
if (IS_INTRA_MBTYPE(type_cur))
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 0, 1);
a=0;b=3;c=1;start_index = MB_TYPE_P_SP;itype-=5;
goto encoding_intra;
}
else
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 0, 0);
switch(mb_type_cur)
{
case 0:
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 1, 0);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 2, 0);
break;
case 1:
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 1, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 3, 1);
break;
case 2:
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 1, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 3, 0);
break;
case 3:
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 1, 0);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_P_SP] + 2, 1);
break;
default:
return UMC_ERR_FAILED;
}
}
}
/*
if (IS_B_SLICE(PicCodType))
{
if (type_temp==0)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b, 0);
}
else if (type_temp<=2)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 0);
if (type_temp-1) EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
else EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 0);
}
else if (type_temp<=10)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b,1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 0);
if (((type_temp-3)>>2)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 0);
if (((type_temp-3)>>1)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 0);
if ((type_temp-3)&0x01)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 0);
}
else if (type_temp==11 || type_temp==11*2)
{
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + a+b,1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 4, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 5, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
if (type_temp!=11)
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 1);
else
EncodeSingleBin_CABAC(ctxIdxOffset[MB_TYPE_B] + 6, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -