📄 umc_h264_dec_bitstream.cpp
字号:
map_unit < pps->SliceGroupInfo.t3.pic_size_in_map_units;
map_unit++)
{
pps->SliceGroupInfo.t3.pSliceGroupIDMap[map_unit] = (Ipp8u)GetBits(num_bits);
if (pps->SliceGroupInfo.t3.pSliceGroupIDMap[map_unit] >
pps->num_slice_groups - 1)
{
return UMC_ERR_INVALID_STREAM;
}
}
}
break;
default:
return UMC_ERR_INVALID_STREAM;
} // switch
} // slice group info
// number of list 0 ref pics used to decode picture, bitstream has value - 1
pps->num_ref_idx_l0_active = GetVLCElement(false) + 1;
// number of list 1 ref pics used to decode picture, bitstream has value - 1
pps->num_ref_idx_l1_active = GetVLCElement(false) + 1;
if (pps->num_ref_idx_l1_active > MAX_NUM_REF_FRAMES || pps->num_ref_idx_l0_active > MAX_NUM_REF_FRAMES)
return UMC_ERR_INVALID_STREAM;
// weighted pediction
pps->weighted_pred_flag = (Ipp8u)Get1Bit();
pps->weighted_bipred_idc = (Ipp8u)GetBits(2);
// default slice QP, bitstream has value - 26
pps->pic_init_qp = (Ipp8s)(GetVLCElement(true) + 26);
if (pps->pic_init_qp > QP_MAX)
{
//return UMC_ERR_INVALID_STREAM;
}
// default SP/SI slice QP, bitstream has value - 26
pps->pic_init_qs = (Ipp8u)(GetVLCElement(true) + 26);
if (pps->pic_init_qs > QP_MAX)
{
//return UMC_ERR_INVALID_STREAM;
}
pps->chroma_qp_index_offset[0] = (Ipp8s)GetVLCElement(true);
if ((pps->chroma_qp_index_offset[0] < -12) || (pps->chroma_qp_index_offset[0] > 12))
{
//return UMC_ERR_INVALID_STREAM;
}
pps->deblocking_filter_variables_present_flag = (Ipp8u)Get1Bit();
pps->constrained_intra_pred_flag = (Ipp8u)Get1Bit();
pps->redundant_pic_cnt_present_flag = (Ipp8u)Get1Bit();
if (More_RBSP_Data())
{
pps->transform_8x8_mode_flag = (Ipp8u) Get1Bit();
if(sps->seq_scaling_matrix_present_flag)
{
//fall-back set rule B
if(Get1Bit())
{
// 0
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[0],(Ipp8u*)default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[0]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[0],(Ipp8u*) sps->ScalingLists4x4[0].ScalingListCoeffs);
pps->type_of_scaling_list_used[0] = SCLDEFAULT;
}
// 1
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[1],(Ipp8u*) default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[1]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[1],(Ipp8u*) pps->ScalingLists4x4[0].ScalingListCoeffs);
pps->type_of_scaling_list_used[1] = SCLDEFAULT;
}
// 2
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[2],(Ipp8u*) default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[2]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[2],(Ipp8u*) pps->ScalingLists4x4[1].ScalingListCoeffs);
pps->type_of_scaling_list_used[2] = SCLDEFAULT;
}
// 3
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[3],(Ipp8u*) default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[3]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[3],(Ipp8u*) sps->ScalingLists4x4[3].ScalingListCoeffs);
pps->type_of_scaling_list_used[3] = SCLDEFAULT;
}
// 4
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[4],(Ipp8u*) default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[4]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[4],(Ipp8u*) pps->ScalingLists4x4[3].ScalingListCoeffs);
pps->type_of_scaling_list_used[4] = SCLDEFAULT;
}
// 5
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[5],(Ipp8u*) default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[5]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[5],(Ipp8u*) pps->ScalingLists4x4[4].ScalingListCoeffs);
pps->type_of_scaling_list_used[5] = SCLDEFAULT;
}
if (pps->transform_8x8_mode_flag)
{
// 0
if(Get1Bit())
{
GetScalingList8x8(&pps->ScalingLists8x8[0],(Ipp8u*)default_intra_scaling_list8x8,&pps->type_of_scaling_list_used[6]);
}
else
{
FillScalingList8x8(&pps->ScalingLists8x8[0],(Ipp8u*) sps->ScalingLists8x8[0].ScalingListCoeffs);
pps->type_of_scaling_list_used[6] = SCLDEFAULT;
}
// 1
if(Get1Bit())
{
GetScalingList8x8(&pps->ScalingLists8x8[1],(Ipp8u*) default_inter_scaling_list8x8,&pps->type_of_scaling_list_used[7]);
}
else
{
FillScalingList8x8(&pps->ScalingLists8x8[1],(Ipp8u*) sps->ScalingLists8x8[1].ScalingListCoeffs);
pps->type_of_scaling_list_used[7] = SCLDEFAULT;
}
}
}
else
{
Ipp32s i;
for(i=0; i<6; i++)
{
FillScalingList4x4(&pps->ScalingLists4x4[i],(Ipp8u *)sps->ScalingLists4x4[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
if (pps->transform_8x8_mode_flag)
{
for(i=0; i<2; i++)
{
FillScalingList8x8(&pps->ScalingLists8x8[i],(Ipp8u *)sps->ScalingLists8x8[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
}
}
}
else
{
//fall-back set rule A
if(Get1Bit())
{
// 0
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[0],(Ipp8u*)default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[0]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[0],(Ipp8u*) default_intra_scaling_list4x4);
pps->type_of_scaling_list_used[0] = SCLDEFAULT;
}
// 1
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[1],(Ipp8u*) default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[1]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[1],(Ipp8u*) pps->ScalingLists4x4[0].ScalingListCoeffs);
pps->type_of_scaling_list_used[1] = SCLDEFAULT;
}
// 2
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[2],(Ipp8u*) default_intra_scaling_list4x4,&pps->type_of_scaling_list_used[2]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[2],(Ipp8u*) pps->ScalingLists4x4[1].ScalingListCoeffs);
pps->type_of_scaling_list_used[2] = SCLDEFAULT;
}
// 3
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[3],(Ipp8u*)default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[3]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[3],(Ipp8u*) default_inter_scaling_list4x4);
pps->type_of_scaling_list_used[3] = SCLDEFAULT;
}
// 4
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[4],(Ipp8u*) default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[4]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[4],(Ipp8u*) pps->ScalingLists4x4[3].ScalingListCoeffs);
pps->type_of_scaling_list_used[4] = SCLDEFAULT;
}
// 5
if(Get1Bit())
{
GetScalingList4x4(&pps->ScalingLists4x4[5],(Ipp8u*) default_inter_scaling_list4x4,&pps->type_of_scaling_list_used[5]);
}
else
{
FillScalingList4x4(&pps->ScalingLists4x4[5],(Ipp8u*) pps->ScalingLists4x4[4].ScalingListCoeffs);
pps->type_of_scaling_list_used[5] = SCLDEFAULT;
}
if (pps->transform_8x8_mode_flag)
{
// 0
if(Get1Bit())
{
GetScalingList8x8(&pps->ScalingLists8x8[0],(Ipp8u*)default_intra_scaling_list8x8,&pps->type_of_scaling_list_used[6]);
}
else
{
FillScalingList8x8(&pps->ScalingLists8x8[0],(Ipp8u*) default_intra_scaling_list8x8);
pps->type_of_scaling_list_used[6] = SCLDEFAULT;
}
// 1
if(Get1Bit())
{
GetScalingList8x8(&pps->ScalingLists8x8[1],(Ipp8u*) default_inter_scaling_list8x8,&pps->type_of_scaling_list_used[7]);
}
else
{
FillScalingList8x8(&pps->ScalingLists8x8[1],(Ipp8u*) default_inter_scaling_list8x8);
pps->type_of_scaling_list_used[7] = SCLDEFAULT;
}
}
}
else
{
Ipp32s i;
for(i=0; i<6; i++)
{
FillScalingList4x4(&pps->ScalingLists4x4[i],(Ipp8u *)sps->ScalingLists4x4[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
if (pps->transform_8x8_mode_flag)
{
for(i=0; i<2; i++)
{
FillScalingList8x8(&pps->ScalingLists8x8[i],(Ipp8u *)sps->ScalingLists8x8[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
}
}
}
pps->chroma_qp_index_offset[1] = (Ipp8s)GetVLCElement(true);
}
else
{
pps->chroma_qp_index_offset[1] = pps->chroma_qp_index_offset[0];
Ipp32s i;
for(i=0; i<6; i++)
{
FillScalingList4x4(&pps->ScalingLists4x4[i],(Ipp8u *)sps->ScalingLists4x4[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
if (pps->transform_8x8_mode_flag)
{
for(i=0; i<2; i++)
{
FillScalingList8x8(&pps->ScalingLists8x8[i],(Ipp8u *)sps->ScalingLists8x8[i].ScalingListCoeffs);
pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i];
}
}
}
// calculate level scale matrices
//start DC first
//to do: reduce th anumber of matrices (in fact 1 is enough)
Ipp32s i;
// now process other 4x4 matrices
for (i = 0; i < 6; i++)
{
for (Ipp32s j = 0; j < 88; j++)
for (Ipp32s k = 0; k < 16; k++)
{
Ipp32u level_scale = pps->ScalingLists4x4[i].ScalingListCoeffs[k]*pre_norm_adjust4x4[j%6][pre_norm_adjust_index4x4[k]];
pps->m_LevelScale4x4[i].LevelScaleCoeffs[j][k] = (Ipp16s) level_scale;
}
}
// process remaining 8x8 matrices
for (i = 0; i < 2; i++)
{
for (Ipp32s j = 0; j < 88; j++)
for (Ipp32s k = 0; k < 64; k++)
{
Ipp32u level_scale = pps->ScalingLists8x8[i].ScalingListCoeffs[k]*pre_norm_adjust8x8[j%6][pre_norm_adjust_index8x8[k]];
pps->m_LevelScale8x8[i].LevelScaleCoeffs[j][k] = (Ipp16s) level_scale;
}
}
return UMC_OK;
} // GetPictureParamSet
// ---------------------------------------------------------------------------
// H264Bitstream::GetPictureDelimiter()
// Read optional picture delimiter from bitstream.
// ---------------------------------------------------------------------------
Status H264Bitstream::GetPictureDelimiter(Ipp32u &PicCodType)
{
PicCodType = GetBits(3);
return UMC_OK;
} // GetPictureDelimiter
// ---------------------------------------------------------------------------
// H264Bitstream::ReadFillerData()
// Filler data RBSP, read and discard all bytes == 0xff
// ---------------------------------------------------------------------------
Status H264Bitstream::ReadFillerData()
{
while (SearchBits(8, 0xff, 0));
return UMC_OK;
} // SkipFillerData
// ---------------------------------------------------------------------------
// H264Bitstream::GetSliceHeaderPart1()
// Read H.264 first part of slice header
//
// Reading the rest of the header requires info in the picture and sequence
// parameter sets referred to by this slice header.
//
// Do not print debug messages when IsSearch is true. In that case the function
// is being used to find the next compressed frame, errors may occur and should
// not be reported.
//
// ---------------------------------------------------------------------------
Status H264Bitstream::GetSliceHeaderPart1(H264SliceHeader *hdr)
{
Ipp32u val;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -