/*----------------------------------------------------------------------
| AP4_HevcVuiParameterSet::AP4_HevcVuiParameterSet
+---------------------------------------------------------------------*/
AP4_Result
AP4_HevcVuiParameterSet::Parse(AP4_BitReader& bits)
{
aspect_ratio_info_present_flag = bits.ReadBit();
if (aspect_ratio_info_present_flag) {
aspect_ratio_idc = bits.ReadBits(8);
// Appendix E. Table E-1 Meaning of sample aspect ratio indicator
if (aspect_ratio_idc == 255/*Extended_SAR*/) {
sar_width = bits.ReadBits(16);
sar_height = bits.ReadBits(16);
}
}
overscan_info_present_flag = bits.ReadBit();
if (overscan_info_present_flag) {
overscan_appropriate_flag = bits.ReadBit();
}
video_signal_type_present_flag = bits.ReadBit();
if (video_signal_type_present_flag) {
video_format = bits.ReadBits(3);
video_full_range_flag = bits.ReadBit();
colour_description_present_flag = bits.ReadBit();
if (colour_description_present_flag) {
colour_primaries = bits.ReadBits(8);
transfer_characteristics = bits.ReadBits(8);
matrix_coefficients = bits.ReadBits(8);
}
}
chroma_loc_info_present_flag = bits.ReadBit();
if (chroma_loc_info_present_flag)
{
chroma_sample_loc_type_top_field = ReadGolomb(bits);
chroma_sample_loc_type_bottom_field = ReadGolomb(bits);
}
neutral_chroma_indication_flag = bits.ReadBit();
field_seq_flag = bits.ReadBit();
frame_field_info_present_flag = bits.ReadBit();
default_display_window_flag = bits.ReadBit();
if (default_display_window_flag) {
def_disp_win_left_offset = ReadGolomb(bits);
def_disp_win_right_offset = ReadGolomb(bits);
def_disp_win_top_offset = ReadGolomb(bits);
def_disp_win_bottom_offset = ReadGolomb(bits);
}
timing_info_present_flag = bits.ReadBit();
if (timing_info_present_flag) {
num_units_in_tick = bits.ReadBits(32);
time_scale = bits.ReadBits(32);
vui_poc_proportional_to_timing_flag = bits.ReadBit();
if (vui_poc_proportional_to_timing_flag) {
vui_num_ticks_poc_diff_one_minus1 = ReadGolomb(bits);
}
}
return AP4_SUCCESS;
}
/*----------------------------------------------------------------------
| AP4_HevcPictureParameterSet::AP4_HevcPictureParameterSet
+---------------------------------------------------------------------*/
AP4_HevcPictureParameterSet::AP4_HevcPictureParameterSet() :
pps_pic_parameter_set_id(0),
pps_seq_parameter_set_id(0),
dependent_slice_segments_enabled_flag(0),
output_flag_present_flag(0),
num_extra_slice_header_bits(0),
sign_data_hiding_enabled_flag(0),
cabac_init_present_flag(0),
num_ref_idx_l0_default_active_minus1(0),
num_ref_idx_l1_default_active_minus1(0),
init_qp_minus26(0),
constrained_intra_pred_flag(0),
transform_skip_enabled_flag(0),
cu_qp_delta_enabled_flag(0),
diff_cu_qp_delta_depth(0),
pps_cb_qp_offset(0),
pps_cr_qp_offset(0),
pps_slice_chroma_qp_offsets_present_flag(0),
weighted_pred_flag(0),
weighted_bipred_flag(0),
transquant_bypass_enabled_flag(0),
tiles_enabled_flag(0),
entropy_coding_sync_enabled_flag(0),
num_tile_columns_minus1(0),
num_tile_rows_minus1(0),
uniform_spacing_flag(1),
loop_filter_across_tiles_enabled_flag(0),
pps_loop_filter_across_slices_enabled_flag(0),
deblocking_filter_control_present_flag(0),
deblocking_filter_override_enabled_flag(0),
pps_deblocking_filter_disabled_flag(0),
pps_beta_offset_div2(0),
pps_tc_offset_div2(0),
pps_scaling_list_data_present_flag(0),
lists_modification_present_flag(0),
log2_parallel_merge_level_minus2(0),
slice_segment_header_extension_present_flag(0)
{
}
/*----------------------------------------------------------------------
| AP4_HevcPictureParameterSet::Parse
+---------------------------------------------------------------------*/
AP4_Result
AP4_HevcPictureParameterSet::Parse(const unsigned char* data, unsigned int data_size)
{
raw_bytes.SetData(data, data_size);
AP4_DataBuffer unescaped(data, data_size);
AP4_NalParser::Unescape(unescaped);
AP4_BitReader bits(unescaped.GetData(), unescaped.GetDataSize());
bits.SkipBits(16); // NAL Unit Header
pps_pic_parameter_set_id = ReadGolomb(bits);
if (pps_pic_parameter_set_id > AP4_HEVC_PPS_MAX_ID) {
DBG_PRINTF_2("pps_pic_parameter_set_id[%d] > AP4_HEVC_PPS_MAX_ID[%d]\n",
pps_pic_parameter_set_id, AP4_HEVC_PPS_MAX_ID);
return AP4_ERROR_INVALID_FORMAT;
}
pps_seq_parameter_set_id = ReadGolomb(bits);
if (pps_seq_parameter_set_id > AP4_HEVC_SPS_MAX_ID) {
DBG_PRINTF_2("pps_seq_parameter_set_id[%d] > AP4_HEVC_SPS_MAX_ID[%d]\n",
pps_seq_parameter_set_id, AP4_HEVC_SPS_MAX_ID);
return AP4_ERROR_INVALID_FORMAT;
}
dependent_slice_segments_enabled_flag = bits.ReadBit();
output_flag_present_flag = bits.ReadBit();
num_extra_slice_header_bits = bits.ReadBits(3);
sign_data_hiding_enabled_flag = bits.ReadBit();
cabac_init_present_flag = bits.ReadBit();
num_ref_idx_l0_default_active_minus1 = ReadGolomb(bits);
num_ref_idx_l1_default_active_minus1 = ReadGolomb(bits);
init_qp_minus26 = SignedGolomb(ReadGolomb(bits));
constrained_intra_pred_flag = bits.ReadBit();
transform_skip_enabled_flag = bits.ReadBit();
cu_qp_delta_enabled_flag = bits.ReadBit();
if (cu_qp_delta_enabled_flag) {
diff_cu_qp_delta_depth = ReadGolomb(bits);
}
pps_cb_qp_offset = SignedGolomb(ReadGolomb(bits));
pps_cr_qp_offset = SignedGolomb(ReadGolomb(bits));
pps_slice_chroma_qp_offsets_present_flag = bits.ReadBit();
weighted_pred_flag = bits.ReadBit();
weighted_bipred_flag = bits.ReadBit();
transquant_bypass_enabled_flag = bits.ReadBit();
tiles_enabled_flag = bits.ReadBit();
entropy_coding_sync_enabled_flag = bits.ReadBit();
if (tiles_enabled_flag) {
num_tile_columns_minus1 = ReadGolomb(bits);
num_tile_rows_minus1 = ReadGolomb(bits);
uniform_spacing_flag = bits.ReadBit();
if (!uniform_spacing_flag) {
for (unsigned int i=0; i<num_tile_columns_minus1; i++) {
ReadGolomb(bits); // column_width_minus1[i]
}
for (unsigned int i = 0; i < num_tile_rows_minus1; i++) {
ReadGolomb(bits); // row_height_minus1[i]
}
}
loop_filter_across_tiles_enabled_flag = bits.ReadBit();
}
pps_loop_filter_across_slices_enabled_flag = bits.ReadBit();
deblocking_filter_control_present_flag = bits.ReadBit();
if (deblocking_filter_control_present_flag) {
deblocking_filter_override_enabled_flag = bits.ReadBit();
pps_deblocking_filter_disabled_flag = bits.ReadBit();
if (!pps_deblocking_filter_disabled_flag) {
pps_beta_offset_div2 = SignedGolomb(ReadGolomb(bits));
pps_tc_offset_div2 = SignedGolomb(ReadGolomb(bits));
}
}
pps_scaling_list_data_present_flag = bits.ReadBit();
if (pps_scaling_list_data_present_flag) {
scaling_list_data(bits);
}
lists_modification_present_flag = bits.ReadBit();
log2_parallel_merge_level_minus2 = ReadGolomb(bits);
slice_segment_header_extension_present_flag = bits.ReadBit();
return AP4_SUCCESS;
}
详细注释上述代码