From 0e3b400911747bc20a20b027320a61d474252450 Mon Sep 17 00:00:00 2001 From: notch Date: Fri, 15 Jan 2021 08:12:26 +0800 Subject: [PATCH] exports vps/sps fields --- av/codec/hevc/shortcut.go | 5 + av/codec/hevc/sps.go | 692 +++++++++++++++++++------------------- av/codec/hevc/vps.go | 484 +++++++++++++------------- 3 files changed, 593 insertions(+), 588 deletions(-) diff --git a/av/codec/hevc/shortcut.go b/av/codec/hevc/shortcut.go index 2f6a46b..2f211b5 100644 --- a/av/codec/hevc/shortcut.go +++ b/av/codec/hevc/shortcut.go @@ -28,3 +28,8 @@ func MetadataIsReady(vm *codec.VideoMeta) bool { } return true } + +// NulType . +func NulType(nt byte) byte { + return (nt >> 1) & 0x3f +} diff --git a/av/codec/hevc/sps.go b/av/codec/hevc/sps.go index 45b210d..c514dc1 100644 --- a/av/codec/hevc/sps.go +++ b/av/codec/hevc/sps.go @@ -15,10 +15,10 @@ import ( ) type H265RawScalingList struct { - scaling_list_pred_mode_flag [4][6]uint8 - scaling_list_pred_matrix_id_delta [4][6]uint8 - scaling_list_dc_coef_minus8 [4][6]int16 - scaling_list_delta_coeff [4][6][64]int8 + Scaling_list_pred_mode_flag [4][6]uint8 + Scaling_list_pred_matrix_id_delta [4][6]uint8 + Scaling_list_dc_coef_minus8 [4][6]int16 + Scaling_list_delta_coeff [4][6][64]int8 } func (sl *H265RawScalingList) decode(r *bits.Reader) error { @@ -28,19 +28,19 @@ func (sl *H265RawScalingList) decode(r *bits.Reader) error { step = 3 } for matrixId := 0; matrixId < 6; matrixId += step { - sl.scaling_list_pred_mode_flag[sizeId][matrixId] = r.ReadBit() - if sl.scaling_list_pred_mode_flag[sizeId][matrixId] == 0 { - sl.scaling_list_pred_matrix_id_delta[sizeId][matrixId] = r.ReadUe8() + sl.Scaling_list_pred_mode_flag[sizeId][matrixId] = r.ReadBit() + if sl.Scaling_list_pred_mode_flag[sizeId][matrixId] == 0 { + sl.Scaling_list_pred_matrix_id_delta[sizeId][matrixId] = r.ReadUe8() } else { n := 1 << (4 + (sizeId << 1)) if n > 64 { n = 64 } if sizeId > 1 { - sl.scaling_list_dc_coef_minus8[sizeId-2][matrixId] = r.ReadSe16() + sl.Scaling_list_dc_coef_minus8[sizeId-2][matrixId] = r.ReadSe16() } for i := 0; i < n; i++ { - sl.scaling_list_delta_coeff[sizeId][matrixId][i] = r.ReadSe8() + sl.Scaling_list_delta_coeff[sizeId][matrixId][i] = r.ReadSe8() } } } @@ -49,232 +49,232 @@ func (sl *H265RawScalingList) decode(r *bits.Reader) error { } type H265RawVUI struct { - aspect_ratio_info_present_flag uint8 - aspect_ratio_idc uint8 - sar_width uint16 - sar_height uint16 + Aspect_ratio_info_present_flag uint8 + Aspect_ratio_idc uint8 + Sar_width uint16 + Sar_height uint16 - overscan_info_present_flag uint8 - overscan_appropriate_flag uint8 + Overscan_info_present_flag uint8 + Overscan_appropriate_flag uint8 - video_signal_type_present_flag uint8 - video_format uint8 - video_full_range_flag uint8 - colour_description_present_flag uint8 - colour_primaries uint8 - transfer_characteristics uint8 - matrix_coefficients uint8 + Video_signal_type_present_flag uint8 + Video_format uint8 + Video_full_range_flag uint8 + Colour_description_present_flag uint8 + Colour_primaries uint8 + Transfer_characteristics uint8 + Matrix_coefficients uint8 - chroma_loc_info_present_flag uint8 - chroma_sample_loc_type_top_field uint8 - chroma_sample_loc_type_bottom_field uint8 + Chroma_loc_info_present_flag uint8 + Chroma_sample_loc_type_top_field uint8 + Chroma_sample_loc_type_bottom_field uint8 - neutral_chroma_indication_flag uint8 - field_seq_flag uint8 - frame_field_info_present_flag uint8 + Neutral_chroma_indication_flag uint8 + Field_seq_flag uint8 + Frame_field_info_present_flag uint8 - default_display_window_flag uint8 - def_disp_win_left_offset uint16 - def_disp_win_right_offset uint16 - def_disp_win_top_offset uint16 - def_disp_win_bottom_offset uint16 + Default_display_window_flag uint8 + Def_disp_win_left_offset uint16 + Def_disp_win_right_offset uint16 + Def_disp_win_top_offset uint16 + Def_disp_win_bottom_offset uint16 - vui_timing_info_present_flag uint8 - vui_num_units_in_tick uint32 - vui_time_scale uint32 - vui_poc_proportional_to_timing_flag uint8 - vui_num_ticks_poc_diff_one_minus1 uint32 - vui_hrd_parameters_present_flag uint8 - hrd_parameters H265RawHRDParameters + Vui_timing_info_present_flag uint8 + Vui_num_units_in_tick uint32 + Vui_time_scale uint32 + Vui_poc_proportional_to_timing_flag uint8 + Vui_num_ticks_poc_diff_one_minus1 uint32 + Vui_hrd_parameters_present_flag uint8 + Hrd_parameters H265RawHRDParameters - bitstream_restriction_flag uint8 - tiles_fixed_structure_flag uint8 - motion_vectors_over_pic_boundaries_flag uint8 - restricted_ref_pic_lists_flag uint8 - min_spatial_segmentation_idc uint16 - max_bytes_per_pic_denom uint8 - max_bits_per_min_cu_denom uint8 - log2_max_mv_length_horizontal uint8 - log2_max_mv_length_vertical uint8 + Bitstream_restriction_flag uint8 + Tiles_fixed_structure_flag uint8 + Motion_vectors_over_pic_boundaries_flag uint8 + Restricted_ref_pic_lists_flag uint8 + Min_spatial_segmentation_idc uint16 + Max_bytes_per_pic_denom uint8 + Max_bits_per_min_cu_denom uint8 + Log2_max_mv_length_horizontal uint8 + Log2_max_mv_length_vertical uint8 } func (vui *H265RawVUI) setDefault(sps *H265RawSPS) { - vui.aspect_ratio_idc = 0 + vui.Aspect_ratio_idc = 0 - vui.video_format = 5 - vui.video_full_range_flag = 0 - vui.colour_primaries = 2 - vui.transfer_characteristics = 2 - vui.matrix_coefficients = 2 + vui.Video_format = 5 + vui.Video_full_range_flag = 0 + vui.Colour_primaries = 2 + vui.Transfer_characteristics = 2 + vui.Matrix_coefficients = 2 - vui.chroma_sample_loc_type_top_field = 0 - vui.chroma_sample_loc_type_bottom_field = 0 + vui.Chroma_sample_loc_type_top_field = 0 + vui.Chroma_sample_loc_type_bottom_field = 0 - vui.tiles_fixed_structure_flag = 0 - vui.motion_vectors_over_pic_boundaries_flag = 1 - vui.min_spatial_segmentation_idc = 0 - vui.max_bytes_per_pic_denom = 2 - vui.max_bits_per_min_cu_denom = 1 - vui.log2_max_mv_length_horizontal = 15 - vui.log2_max_mv_length_vertical = 15 + vui.Tiles_fixed_structure_flag = 0 + vui.Motion_vectors_over_pic_boundaries_flag = 1 + vui.Min_spatial_segmentation_idc = 0 + vui.Max_bytes_per_pic_denom = 2 + vui.Max_bits_per_min_cu_denom = 1 + vui.Log2_max_mv_length_horizontal = 15 + vui.Log2_max_mv_length_vertical = 15 } func (vui *H265RawVUI) decode(r *bits.Reader, sps *H265RawSPS) error { - vui.aspect_ratio_info_present_flag = r.ReadBit() - if vui.aspect_ratio_info_present_flag == 1 { - vui.aspect_ratio_idc = r.ReadUint8(8) - if vui.aspect_ratio_idc == 255 { - vui.sar_width = r.ReadUint16(16) - vui.sar_height = r.ReadUint16(16) + vui.Aspect_ratio_info_present_flag = r.ReadBit() + if vui.Aspect_ratio_info_present_flag == 1 { + vui.Aspect_ratio_idc = r.ReadUint8(8) + if vui.Aspect_ratio_idc == 255 { + vui.Sar_width = r.ReadUint16(16) + vui.Sar_height = r.ReadUint16(16) } } else { - vui.aspect_ratio_idc = 0 + vui.Aspect_ratio_idc = 0 } - vui.overscan_info_present_flag = r.ReadBit() - if vui.overscan_info_present_flag == 1 { - vui.overscan_appropriate_flag = r.ReadBit() + vui.Overscan_info_present_flag = r.ReadBit() + if vui.Overscan_info_present_flag == 1 { + vui.Overscan_appropriate_flag = r.ReadBit() } - vui.video_signal_type_present_flag = r.ReadBit() - if vui.video_signal_type_present_flag == 1 { - vui.video_format = r.ReadUint8(3) - vui.video_full_range_flag = r.ReadBit() - vui.colour_description_present_flag = r.ReadBit() - if vui.colour_description_present_flag == 1 { - vui.colour_primaries = r.ReadUint8(8) - vui.transfer_characteristics = r.ReadUint8(8) - vui.matrix_coefficients = r.ReadUint8(8) + vui.Video_signal_type_present_flag = r.ReadBit() + if vui.Video_signal_type_present_flag == 1 { + vui.Video_format = r.ReadUint8(3) + vui.Video_full_range_flag = r.ReadBit() + vui.Colour_description_present_flag = r.ReadBit() + if vui.Colour_description_present_flag == 1 { + vui.Colour_primaries = r.ReadUint8(8) + vui.Transfer_characteristics = r.ReadUint8(8) + vui.Matrix_coefficients = r.ReadUint8(8) } else { - vui.colour_primaries = 2 - vui.transfer_characteristics = 2 - vui.matrix_coefficients = 2 + vui.Colour_primaries = 2 + vui.Transfer_characteristics = 2 + vui.Matrix_coefficients = 2 } } else { - vui.video_format = 5 - vui.video_full_range_flag = 0 - vui.colour_primaries = 2 - vui.transfer_characteristics = 2 - vui.matrix_coefficients = 2 + vui.Video_format = 5 + vui.Video_full_range_flag = 0 + vui.Colour_primaries = 2 + vui.Transfer_characteristics = 2 + vui.Matrix_coefficients = 2 } - vui.chroma_loc_info_present_flag = r.ReadBit() - if vui.chroma_loc_info_present_flag == 1 { - vui.chroma_sample_loc_type_top_field = r.ReadUe8() - vui.chroma_sample_loc_type_bottom_field = r.ReadUe8() + vui.Chroma_loc_info_present_flag = r.ReadBit() + if vui.Chroma_loc_info_present_flag == 1 { + vui.Chroma_sample_loc_type_top_field = r.ReadUe8() + vui.Chroma_sample_loc_type_bottom_field = r.ReadUe8() } else { - vui.chroma_sample_loc_type_top_field = 0 - vui.chroma_sample_loc_type_bottom_field = 0 + vui.Chroma_sample_loc_type_top_field = 0 + vui.Chroma_sample_loc_type_bottom_field = 0 } - vui.neutral_chroma_indication_flag = r.ReadBit() - vui.field_seq_flag = r.ReadBit() - vui.frame_field_info_present_flag = r.ReadBit() + vui.Neutral_chroma_indication_flag = r.ReadBit() + vui.Field_seq_flag = r.ReadBit() + vui.Frame_field_info_present_flag = r.ReadBit() - vui.default_display_window_flag = r.ReadBit() - if vui.default_display_window_flag == 1 { - vui.def_disp_win_left_offset = r.ReadUe16() - vui.def_disp_win_right_offset = r.ReadUe16() - vui.def_disp_win_top_offset = r.ReadUe16() - vui.def_disp_win_bottom_offset = r.ReadUe16() + vui.Default_display_window_flag = r.ReadBit() + if vui.Default_display_window_flag == 1 { + vui.Def_disp_win_left_offset = r.ReadUe16() + vui.Def_disp_win_right_offset = r.ReadUe16() + vui.Def_disp_win_top_offset = r.ReadUe16() + vui.Def_disp_win_bottom_offset = r.ReadUe16() } - vui.vui_timing_info_present_flag = r.ReadBit() - if vui.vui_timing_info_present_flag == 1 { - vui.vui_num_units_in_tick = r.ReadUint32(32) - vui.vui_time_scale = r.ReadUint32(32) - vui.vui_poc_proportional_to_timing_flag = r.ReadBit() - if vui.vui_poc_proportional_to_timing_flag == 1 { - vui.vui_num_ticks_poc_diff_one_minus1 = r.ReadUe() + vui.Vui_timing_info_present_flag = r.ReadBit() + if vui.Vui_timing_info_present_flag == 1 { + vui.Vui_num_units_in_tick = r.ReadUint32(32) + vui.Vui_time_scale = r.ReadUint32(32) + vui.Vui_poc_proportional_to_timing_flag = r.ReadBit() + if vui.Vui_poc_proportional_to_timing_flag == 1 { + vui.Vui_num_ticks_poc_diff_one_minus1 = r.ReadUe() } - vui.vui_hrd_parameters_present_flag = r.ReadBit() - if vui.vui_hrd_parameters_present_flag == 1 { - if err := vui.hrd_parameters.decode(r, true, int(sps.sps_max_sub_layers_minus1)); err != nil { + vui.Vui_hrd_parameters_present_flag = r.ReadBit() + if vui.Vui_hrd_parameters_present_flag == 1 { + if err := vui.Hrd_parameters.decode(r, true, int(sps.Sps_max_sub_layers_minus1)); err != nil { return err } } } - vui.bitstream_restriction_flag = r.ReadBit() - if vui.bitstream_restriction_flag == 1 { - vui.tiles_fixed_structure_flag = r.ReadBit() - vui.motion_vectors_over_pic_boundaries_flag = r.ReadBit() - vui.restricted_ref_pic_lists_flag = r.ReadBit() - vui.min_spatial_segmentation_idc = r.ReadUe16() - vui.max_bytes_per_pic_denom = r.ReadUe8() - vui.max_bits_per_min_cu_denom = r.ReadUe8() - vui.log2_max_mv_length_horizontal = r.ReadUe8() - vui.log2_max_mv_length_vertical = r.ReadUe8() + vui.Bitstream_restriction_flag = r.ReadBit() + if vui.Bitstream_restriction_flag == 1 { + vui.Tiles_fixed_structure_flag = r.ReadBit() + vui.Motion_vectors_over_pic_boundaries_flag = r.ReadBit() + vui.Restricted_ref_pic_lists_flag = r.ReadBit() + vui.Min_spatial_segmentation_idc = r.ReadUe16() + vui.Max_bytes_per_pic_denom = r.ReadUe8() + vui.Max_bits_per_min_cu_denom = r.ReadUe8() + vui.Log2_max_mv_length_horizontal = r.ReadUe8() + vui.Log2_max_mv_length_vertical = r.ReadUe8() } else { - vui.tiles_fixed_structure_flag = 0 - vui.motion_vectors_over_pic_boundaries_flag = 1 - vui.min_spatial_segmentation_idc = 0 - vui.max_bytes_per_pic_denom = 2 - vui.max_bits_per_min_cu_denom = 1 - vui.log2_max_mv_length_horizontal = 15 - vui.log2_max_mv_length_vertical = 15 + vui.Tiles_fixed_structure_flag = 0 + vui.Motion_vectors_over_pic_boundaries_flag = 1 + vui.Min_spatial_segmentation_idc = 0 + vui.Max_bytes_per_pic_denom = 2 + vui.Max_bits_per_min_cu_denom = 1 + vui.Log2_max_mv_length_horizontal = 15 + vui.Log2_max_mv_length_vertical = 15 } return nil } type H265RawSTRefPicSet struct { - inter_ref_pic_set_prediction_flag uint8 + Inter_ref_pic_set_prediction_flag uint8 - delta_idx_minus1 uint8 - delta_rps_sign uint8 - abs_delta_rps_minus1 uint16 + Delta_idx_minus1 uint8 + Delta_rps_sign uint8 + Abs_delta_rps_minus1 uint16 - used_by_curr_pic_flag [HEVC_MAX_REFS]uint8 - use_delta_flag [HEVC_MAX_REFS]uint8 + Used_by_curr_pic_flag [HEVC_MAX_REFS]uint8 + Use_delta_flag [HEVC_MAX_REFS]uint8 - num_negative_pics uint8 - num_positive_pics uint8 - delta_poc_s0_minus1 [HEVC_MAX_REFS]uint16 - used_by_curr_pic_s0_flag [HEVC_MAX_REFS]uint8 - delta_poc_s1_minus1 [HEVC_MAX_REFS]uint16 - used_by_curr_pic_s1_flag [HEVC_MAX_REFS]uint8 + Num_negative_pics uint8 + Num_positive_pics uint8 + Delta_poc_s0_minus1 [HEVC_MAX_REFS]uint16 + Used_by_curr_pic_s0_flag [HEVC_MAX_REFS]uint8 + Delta_poc_s1_minus1 [HEVC_MAX_REFS]uint16 + Used_by_curr_pic_s1_flag [HEVC_MAX_REFS]uint8 } func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265RawSPS) error { if st_rps_idx != 0 { - ps.inter_ref_pic_set_prediction_flag = r.ReadBit() + ps.Inter_ref_pic_set_prediction_flag = r.ReadBit() } else { - ps.inter_ref_pic_set_prediction_flag = 0 + ps.Inter_ref_pic_set_prediction_flag = 0 } - if ps.inter_ref_pic_set_prediction_flag == 1 { + if ps.Inter_ref_pic_set_prediction_flag == 1 { var ref_rps_idx, num_delta_pocs, num_ref_pics uint8 var ref *H265RawSTRefPicSet var delta_rps, d_poc int var ref_delta_poc_s0, ref_delta_poc_s1, delta_poc_s0, delta_poc_s1 [HEVC_MAX_REFS]int var used_by_curr_pic_s0, used_by_curr_pic_s1 [HEVC_MAX_REFS]uint8 - if st_rps_idx == sps.num_short_term_ref_pic_sets { - ps.delta_idx_minus1 = r.ReadUe8() + if st_rps_idx == sps.Num_short_term_ref_pic_sets { + ps.Delta_idx_minus1 = r.ReadUe8() } else { - ps.delta_idx_minus1 = 0 + ps.Delta_idx_minus1 = 0 } - ref_rps_idx = st_rps_idx - (ps.delta_idx_minus1 + 1) - ref = &sps.st_ref_pic_set[ref_rps_idx] - num_delta_pocs = ref.num_negative_pics + ref.num_positive_pics + ref_rps_idx = st_rps_idx - (ps.Delta_idx_minus1 + 1) + ref = &sps.St_ref_pic_set[ref_rps_idx] + num_delta_pocs = ref.Num_negative_pics + ref.Num_positive_pics // av_assert0(num_delta_pocs < HEVC_MAX_DPB_SIZE); - ps.delta_rps_sign = r.ReadBit() - ps.abs_delta_rps_minus1 = r.ReadUe16() - delta_rps = int((1 - 2*ps.delta_rps_sign)) * int(ps.abs_delta_rps_minus1+1) + ps.Delta_rps_sign = r.ReadBit() + ps.Abs_delta_rps_minus1 = r.ReadUe16() + delta_rps = int((1 - 2*ps.Delta_rps_sign)) * int(ps.Abs_delta_rps_minus1+1) num_ref_pics = 0 for j := 0; j <= int(num_delta_pocs); j++ { - ps.used_by_curr_pic_flag[j] = r.ReadBit() - if ps.used_by_curr_pic_flag[j] == 0 { - ps.use_delta_flag[j] = r.ReadBit() + ps.Used_by_curr_pic_flag[j] = r.ReadBit() + if ps.Used_by_curr_pic_flag[j] == 0 { + ps.Use_delta_flag[j] = r.ReadBit() } else { - ps.use_delta_flag[j] = 1 + ps.Use_delta_flag[j] = 1 } - if ps.use_delta_flag[j] == 1 { + if ps.Use_delta_flag[j] == 1 { num_ref_pics++ } } @@ -299,103 +299,103 @@ func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265 // an onerous additional requirement. d_poc = 0 - for i := 0; i < int(ref.num_negative_pics); i++ { - d_poc -= int(ref.delta_poc_s0_minus1[i] + 1) + for i := 0; i < int(ref.Num_negative_pics); i++ { + d_poc -= int(ref.Delta_poc_s0_minus1[i] + 1) ref_delta_poc_s0[i] = d_poc } d_poc = 0 - for i := 0; i < int(ref.num_positive_pics); i++ { - d_poc += int(ref.delta_poc_s1_minus1[i] + 1) + for i := 0; i < int(ref.Num_positive_pics); i++ { + d_poc += int(ref.Delta_poc_s1_minus1[i] + 1) ref_delta_poc_s1[i] = d_poc } i := 0 - for j := ref.num_positive_pics - 1; j >= 0; j-- { + for j := ref.Num_positive_pics - 1; j >= 0; j-- { d_poc = ref_delta_poc_s1[j] + delta_rps - if d_poc < 0 && ps.use_delta_flag[ref.num_negative_pics+j] == 1 { + if d_poc < 0 && ps.Use_delta_flag[ref.Num_negative_pics+j] == 1 { delta_poc_s0[i] = d_poc i++ used_by_curr_pic_s0[i] = - ps.used_by_curr_pic_flag[ref.num_negative_pics+j] + ps.Used_by_curr_pic_flag[ref.Num_negative_pics+j] } } - if delta_rps < 0 && ps.use_delta_flag[num_delta_pocs] == 1 { + if delta_rps < 0 && ps.Use_delta_flag[num_delta_pocs] == 1 { delta_poc_s0[i] = delta_rps i++ used_by_curr_pic_s0[i] = - ps.used_by_curr_pic_flag[num_delta_pocs] + ps.Used_by_curr_pic_flag[num_delta_pocs] } - for j := 0; j < int(ref.num_negative_pics); j++ { + for j := 0; j < int(ref.Num_negative_pics); j++ { d_poc = ref_delta_poc_s0[j] + delta_rps - if d_poc < 0 && ps.use_delta_flag[j] == 1 { + if d_poc < 0 && ps.Use_delta_flag[j] == 1 { delta_poc_s0[i] = d_poc i++ - used_by_curr_pic_s0[i] = ps.used_by_curr_pic_flag[j] + used_by_curr_pic_s0[i] = ps.Used_by_curr_pic_flag[j] } } - ps.num_negative_pics = uint8(i) - for i := 0; i < int(ps.num_negative_pics); i++ { + ps.Num_negative_pics = uint8(i) + for i := 0; i < int(ps.Num_negative_pics); i++ { if i == 0 { - ps.delta_poc_s0_minus1[i] = + ps.Delta_poc_s0_minus1[i] = uint16(-delta_poc_s0[i] - 1) } else { - ps.delta_poc_s0_minus1[i] = + ps.Delta_poc_s0_minus1[i] = uint16(-(delta_poc_s0[i] - delta_poc_s0[i-1]) - 1) } - ps.used_by_curr_pic_s0_flag[i] = used_by_curr_pic_s0[i] + ps.Used_by_curr_pic_s0_flag[i] = used_by_curr_pic_s0[i] } i = 0 - for j := ref.num_negative_pics - 1; j >= 0; j-- { + for j := ref.Num_negative_pics - 1; j >= 0; j-- { d_poc = ref_delta_poc_s0[j] + delta_rps - if d_poc > 0 && ps.use_delta_flag[j] == 1 { + if d_poc > 0 && ps.Use_delta_flag[j] == 1 { delta_poc_s1[i] = d_poc i++ - used_by_curr_pic_s1[i] = ps.used_by_curr_pic_flag[j] + used_by_curr_pic_s1[i] = ps.Used_by_curr_pic_flag[j] } } - if delta_rps > 0 && ps.use_delta_flag[num_delta_pocs] == 1 { + if delta_rps > 0 && ps.Use_delta_flag[num_delta_pocs] == 1 { delta_poc_s1[i] = delta_rps i++ used_by_curr_pic_s1[i] = - ps.used_by_curr_pic_flag[num_delta_pocs] + ps.Used_by_curr_pic_flag[num_delta_pocs] } - for j := 0; j < int(ref.num_positive_pics); j++ { + for j := 0; j < int(ref.Num_positive_pics); j++ { d_poc = ref_delta_poc_s1[j] + delta_rps - if d_poc > 0 && ps.use_delta_flag[int(ref.num_negative_pics)+j] == 1 { + if d_poc > 0 && ps.Use_delta_flag[int(ref.Num_negative_pics)+j] == 1 { delta_poc_s1[i] = d_poc i++ used_by_curr_pic_s1[i] = - ps.used_by_curr_pic_flag[int(ref.num_negative_pics)+j] + ps.Used_by_curr_pic_flag[int(ref.Num_negative_pics)+j] } } - ps.num_positive_pics = 1 - for i := 0; i < int(ps.num_positive_pics); i++ { + ps.Num_positive_pics = 1 + for i := 0; i < int(ps.Num_positive_pics); i++ { if i == 0 { - ps.delta_poc_s1_minus1[i] = + ps.Delta_poc_s1_minus1[i] = uint16(delta_poc_s1[i] - 1) } else { - ps.delta_poc_s1_minus1[i] = + ps.Delta_poc_s1_minus1[i] = uint16(delta_poc_s1[i] - delta_poc_s1[i-1] - 1) } - ps.used_by_curr_pic_s1_flag[i] = used_by_curr_pic_s1[i] + ps.Used_by_curr_pic_s1_flag[i] = used_by_curr_pic_s1[i] } } else { - ps.num_negative_pics = r.ReadUe8() - ps.num_positive_pics = r.ReadUe8() + ps.Num_negative_pics = r.ReadUe8() + ps.Num_positive_pics = r.ReadUe8() - for i := 0; i < int(ps.num_negative_pics); i++ { - ps.delta_poc_s0_minus1[i] = r.ReadUe16() - ps.used_by_curr_pic_s0_flag[i] = r.ReadBit() + for i := 0; i < int(ps.Num_negative_pics); i++ { + ps.Delta_poc_s0_minus1[i] = r.ReadUe16() + ps.Used_by_curr_pic_s0_flag[i] = r.ReadBit() } - for i := 0; i < int(ps.num_positive_pics); i++ { - ps.delta_poc_s1_minus1[i] = r.ReadUe16() - ps.used_by_curr_pic_s1_flag[i] = r.ReadBit() + for i := 0; i < int(ps.Num_positive_pics); i++ { + ps.Delta_poc_s1_minus1[i] = r.ReadUe16() + ps.Used_by_curr_pic_s1_flag[i] = r.ReadBit() } } @@ -403,80 +403,80 @@ func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265 } type H265RawSPS struct { - nal_unit_header H265RawNALUnitHeader + Nal_unit_header H265RawNALUnitHeader - sps_video_parameter_set_id uint8 + Sps_video_parameter_set_id uint8 - sps_max_sub_layers_minus1 uint8 - sps_temporal_id_nesting_flag uint8 + Sps_max_sub_layers_minus1 uint8 + Sps_temporal_id_nesting_flag uint8 - profile_tier_level H265RawProfileTierLevel + Profile_tier_level H265RawProfileTierLevel - sps_seq_parameter_set_id uint8 + Sps_seq_parameter_set_id uint8 - chroma_format_idc uint8 - separate_colour_plane_flag uint8 + Chroma_format_idc uint8 + Separate_colour_plane_flag uint8 - pic_width_in_luma_samples uint16 - pic_height_in_luma_samples uint16 + Pic_width_in_luma_samples uint16 + Pic_height_in_luma_samples uint16 - conformance_window_flag uint8 - conf_win_left_offset uint16 - conf_win_right_offset uint16 - conf_win_top_offset uint16 - conf_win_bottom_offset uint16 + Conformance_window_flag uint8 + Conf_win_left_offset uint16 + Conf_win_right_offset uint16 + Conf_win_top_offset uint16 + Conf_win_bottom_offset uint16 - bit_depth_luma_minus8 uint8 - bit_depth_chroma_minus8 uint8 + Bit_depth_luma_minus8 uint8 + Bit_depth_chroma_minus8 uint8 - log2_max_pic_order_cnt_lsb_minus4 uint8 + Log2_max_pic_order_cnt_lsb_minus4 uint8 - sps_sub_layer_ordering_info_present_flag uint8 - sps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8 - sps_max_num_reorder_pics [HEVC_MAX_SUB_LAYERS]uint8 - sps_max_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32 + Sps_sub_layer_ordering_info_present_flag uint8 + Sps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8 + Sps_max_num_reorder_pics [HEVC_MAX_SUB_LAYERS]uint8 + Sps_max_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32 - log2_min_luma_coding_block_size_minus3 uint8 - log2_diff_max_min_luma_coding_block_size uint8 - log2_min_luma_transform_block_size_minus2 uint8 - log2_diff_max_min_luma_transform_block_size uint8 - max_transform_hierarchy_depth_inter uint8 - max_transform_hierarchy_depth_intra uint8 + Log2_min_luma_coding_block_size_minus3 uint8 + Log2_diff_max_min_luma_coding_block_size uint8 + Log2_min_luma_transform_block_size_minus2 uint8 + Log2_diff_max_min_luma_transform_block_size uint8 + Max_transform_hierarchy_depth_inter uint8 + Max_transform_hierarchy_depth_intra uint8 - scaling_list_enabled_flag uint8 - sps_scaling_list_data_present_flag uint8 - scaling_list *H265RawScalingList + Scaling_list_enabled_flag uint8 + Sps_scaling_list_data_present_flag uint8 + Scaling_list *H265RawScalingList - amp_enabled_flag uint8 - sample_adaptive_offset_enabled_flag uint8 + Amp_enabled_flag uint8 + Sample_adaptive_offset_enabled_flag uint8 - pcm_enabled_flag uint8 - pcm_sample_bit_depth_luma_minus1 uint8 - pcm_sample_bit_depth_chroma_minus1 uint8 - log2_min_pcm_luma_coding_block_size_minus3 uint8 - log2_diff_max_min_pcm_luma_coding_block_size uint8 - pcm_loop_filter_disabled_flag uint8 + Pcm_enabled_flag uint8 + Pcm_sample_bit_depth_luma_minus1 uint8 + Pcm_sample_bit_depth_chroma_minus1 uint8 + Log2_min_pcm_luma_coding_block_size_minus3 uint8 + Log2_diff_max_min_pcm_luma_coding_block_size uint8 + Pcm_loop_filter_disabled_flag uint8 - num_short_term_ref_pic_sets uint8 - st_ref_pic_set []H265RawSTRefPicSet //[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]H265RawSTRefPicSet + Num_short_term_ref_pic_sets uint8 + St_ref_pic_set []H265RawSTRefPicSet //[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]H265RawSTRefPicSet - long_term_ref_pics_present_flag uint8 - num_long_term_ref_pics_sps uint8 - lt_ref_pic_poc_lsb_sps [HEVC_MAX_LONG_TERM_REF_PICS]uint16 - used_by_curr_pic_lt_sps_flag [HEVC_MAX_LONG_TERM_REF_PICS]uint8 + Long_term_ref_pics_present_flag uint8 + Num_long_term_ref_pics_sps uint8 + Lt_ref_pic_poc_lsb_sps [HEVC_MAX_LONG_TERM_REF_PICS]uint16 + Used_by_curr_pic_lt_sps_flag [HEVC_MAX_LONG_TERM_REF_PICS]uint8 - sps_temporal_mvp_enabled_flag uint8 - strong_intra_smoothing_enabled_flag uint8 + Sps_temporal_mvp_enabled_flag uint8 + Strong_intra_smoothing_enabled_flag uint8 - vui_parameters_present_flag uint8 - vui H265RawVUI + Vui_parameters_present_flag uint8 + Vui H265RawVUI - sps_extension_present_flag uint8 - sps_range_extension_flag uint8 - sps_multilayer_extension_flag uint8 - sps_3d_extension_flag uint8 - sps_scc_extension_flag uint8 - sps_extension_4bits uint8 + Sps_extension_present_flag uint8 + Sps_range_extension_flag uint8 + Sps_multilayer_extension_flag uint8 + Sps_3d_extension_flag uint8 + Sps_scc_extension_flag uint8 + Sps_extension_4bits uint8 // extension_data H265RawExtensionData @@ -506,26 +506,26 @@ type H265RawSPS struct { // Width 视频宽度(像素) func (sps *H265RawSPS) Width() int { - return int(sps.pic_width_in_luma_samples) + return int(sps.Pic_width_in_luma_samples) } // Height 视频高度(像素) func (sps *H265RawSPS) Height() int { - return int(sps.pic_height_in_luma_samples) + return int(sps.Pic_height_in_luma_samples) } // FrameRate Video frame rate func (sps *H265RawSPS) FrameRate() float64 { - if sps.vui.vui_num_units_in_tick == 0 { + if sps.Vui.Vui_num_units_in_tick == 0 { return 0.0 } - return float64(sps.vui.vui_time_scale) / float64(sps.vui.vui_num_units_in_tick) + return float64(sps.Vui.Vui_time_scale) / float64(sps.Vui.Vui_num_units_in_tick) } // IsFixedFrameRate 是否固定帧率 func (sps *H265RawSPS) IsFixedFrameRate() bool { // TODO: - return true + return sps.FrameRate() > 0 } // DecodeString 从 base64 字串解码 sps NAL @@ -551,150 +551,150 @@ func (sps *H265RawSPS) Decode(data []byte) (err error) { } r := bits.NewReader(spsWEB) - if err = sps.nal_unit_header.decode(r); err != nil { + if err = sps.Nal_unit_header.decode(r); err != nil { return } - if sps.nal_unit_header.nal_unit_type != NalSps { + if sps.Nal_unit_header.Nal_unit_type != NalSps { return errors.New("not is sps NAL UNIT") } - sps.sps_video_parameter_set_id = r.ReadUint8(4) + sps.Sps_video_parameter_set_id = r.ReadUint8(4) - sps.sps_max_sub_layers_minus1 = r.ReadUint8(3) - sps.sps_temporal_id_nesting_flag = r.ReadBit() - if err = sps.profile_tier_level.decode(r, true, int(sps.sps_max_sub_layers_minus1)); err != nil { + sps.Sps_max_sub_layers_minus1 = r.ReadUint8(3) + sps.Sps_temporal_id_nesting_flag = r.ReadBit() + if err = sps.Profile_tier_level.decode(r, true, int(sps.Sps_max_sub_layers_minus1)); err != nil { return } - sps.sps_seq_parameter_set_id = r.ReadUe8() + sps.Sps_seq_parameter_set_id = r.ReadUe8() - sps.chroma_format_idc = r.ReadUe8() - if sps.chroma_format_idc == 3 { - sps.separate_colour_plane_flag = r.ReadBit() + sps.Chroma_format_idc = r.ReadUe8() + if sps.Chroma_format_idc == 3 { + sps.Separate_colour_plane_flag = r.ReadBit() } - sps.pic_width_in_luma_samples = r.ReadUe16() - sps.pic_height_in_luma_samples = r.ReadUe16() + sps.Pic_width_in_luma_samples = r.ReadUe16() + sps.Pic_height_in_luma_samples = r.ReadUe16() - sps.conformance_window_flag = r.ReadBit() - if sps.conformance_window_flag == 1 { - sps.conf_win_left_offset = r.ReadUe16() - sps.conf_win_right_offset = r.ReadUe16() - sps.conf_win_top_offset = r.ReadUe16() - sps.conf_win_bottom_offset = r.ReadUe16() + sps.Conformance_window_flag = r.ReadBit() + if sps.Conformance_window_flag == 1 { + sps.Conf_win_left_offset = r.ReadUe16() + sps.Conf_win_right_offset = r.ReadUe16() + sps.Conf_win_top_offset = r.ReadUe16() + sps.Conf_win_bottom_offset = r.ReadUe16() } - sps.bit_depth_luma_minus8 = r.ReadUe8() - sps.bit_depth_chroma_minus8 = r.ReadUe8() + sps.Bit_depth_luma_minus8 = r.ReadUe8() + sps.Bit_depth_chroma_minus8 = r.ReadUe8() - sps.log2_max_pic_order_cnt_lsb_minus4 = r.ReadUe8() + sps.Log2_max_pic_order_cnt_lsb_minus4 = r.ReadUe8() - sps.sps_sub_layer_ordering_info_present_flag = r.ReadBit() + sps.Sps_sub_layer_ordering_info_present_flag = r.ReadBit() loopStart := uint8(0) - if sps.sps_sub_layer_ordering_info_present_flag == 1 { - loopStart = sps.sps_max_sub_layers_minus1 + if sps.Sps_sub_layer_ordering_info_present_flag == 1 { + loopStart = sps.Sps_max_sub_layers_minus1 } - for i := loopStart; i <= sps.sps_max_sub_layers_minus1; i++ { - sps.sps_max_dec_pic_buffering_minus1[i] = r.ReadUe8() - sps.sps_max_num_reorder_pics[i] = r.ReadUe8() - sps.sps_max_latency_increase_plus1[i] = r.ReadUe() + for i := loopStart; i <= sps.Sps_max_sub_layers_minus1; i++ { + sps.Sps_max_dec_pic_buffering_minus1[i] = r.ReadUe8() + sps.Sps_max_num_reorder_pics[i] = r.ReadUe8() + sps.Sps_max_latency_increase_plus1[i] = r.ReadUe() } - if sps.sps_sub_layer_ordering_info_present_flag == 0 { - for i := uint8(0); i < sps.sps_max_sub_layers_minus1; i++ { + if sps.Sps_sub_layer_ordering_info_present_flag == 0 { + for i := uint8(0); i < sps.Sps_max_sub_layers_minus1; i++ { - sps.sps_max_dec_pic_buffering_minus1[i] = - sps.sps_max_dec_pic_buffering_minus1[sps.sps_max_sub_layers_minus1] - sps.sps_max_num_reorder_pics[i] = - sps.sps_max_num_reorder_pics[sps.sps_max_sub_layers_minus1] - sps.sps_max_latency_increase_plus1[i] = - sps.sps_max_latency_increase_plus1[sps.sps_max_sub_layers_minus1] + sps.Sps_max_dec_pic_buffering_minus1[i] = + sps.Sps_max_dec_pic_buffering_minus1[sps.Sps_max_sub_layers_minus1] + sps.Sps_max_num_reorder_pics[i] = + sps.Sps_max_num_reorder_pics[sps.Sps_max_sub_layers_minus1] + sps.Sps_max_latency_increase_plus1[i] = + sps.Sps_max_latency_increase_plus1[sps.Sps_max_sub_layers_minus1] } } - sps.log2_min_luma_coding_block_size_minus3 = r.ReadUe8() - min_cb_log2_size_y := sps.log2_min_luma_coding_block_size_minus3 + 3 + sps.Log2_min_luma_coding_block_size_minus3 = r.ReadUe8() + min_cb_log2_size_y := sps.Log2_min_luma_coding_block_size_minus3 + 3 - sps.log2_diff_max_min_luma_coding_block_size = r.ReadUe8() + sps.Log2_diff_max_min_luma_coding_block_size = r.ReadUe8() // ctb_log2_size_y := min_cb_log2_size_y + // sps.log2_diff_max_min_luma_coding_block_size min_cb_size_y := uint16(1) << min_cb_log2_size_y - if (sps.pic_width_in_luma_samples%min_cb_size_y) > 0 || - (sps.pic_height_in_luma_samples%min_cb_size_y) > 0 { + if (sps.Pic_width_in_luma_samples%min_cb_size_y) > 0 || + (sps.Pic_height_in_luma_samples%min_cb_size_y) > 0 { return fmt.Errorf("Invalid dimensions: %v%v not divisible by MinCbSizeY = %v.\n", - sps.pic_width_in_luma_samples, - sps.pic_height_in_luma_samples, + sps.Pic_width_in_luma_samples, + sps.Pic_height_in_luma_samples, min_cb_size_y) } - sps.log2_min_luma_transform_block_size_minus2 = r.ReadUe8() + sps.Log2_min_luma_transform_block_size_minus2 = r.ReadUe8() // min_tb_log2_size_y := sps.log2_min_luma_transform_block_size_minus2 + 2 - sps.log2_diff_max_min_luma_transform_block_size = r.ReadUe8() + sps.Log2_diff_max_min_luma_transform_block_size = r.ReadUe8() - sps.max_transform_hierarchy_depth_inter = r.ReadUe8() - sps.max_transform_hierarchy_depth_intra = r.ReadUe8() + sps.Max_transform_hierarchy_depth_inter = r.ReadUe8() + sps.Max_transform_hierarchy_depth_intra = r.ReadUe8() - sps.scaling_list_enabled_flag = r.ReadBit() - if sps.scaling_list_enabled_flag == 1 { - sps.sps_scaling_list_data_present_flag = r.ReadBit() - if sps.sps_scaling_list_data_present_flag == 1 { - sps.scaling_list = new(H265RawScalingList) - sps.scaling_list.decode(r) + sps.Scaling_list_enabled_flag = r.ReadBit() + if sps.Scaling_list_enabled_flag == 1 { + sps.Sps_scaling_list_data_present_flag = r.ReadBit() + if sps.Sps_scaling_list_data_present_flag == 1 { + sps.Scaling_list = new(H265RawScalingList) + sps.Scaling_list.decode(r) } } - sps.amp_enabled_flag = r.ReadBit() - sps.sample_adaptive_offset_enabled_flag = r.ReadBit() + sps.Amp_enabled_flag = r.ReadBit() + sps.Sample_adaptive_offset_enabled_flag = r.ReadBit() - sps.pcm_enabled_flag = r.ReadBit() - if sps.pcm_enabled_flag == 1 { - sps.pcm_sample_bit_depth_luma_minus1 = r.ReadUint8(4) - sps.pcm_sample_bit_depth_chroma_minus1 = r.ReadUint8(4) + sps.Pcm_enabled_flag = r.ReadBit() + if sps.Pcm_enabled_flag == 1 { + sps.Pcm_sample_bit_depth_luma_minus1 = r.ReadUint8(4) + sps.Pcm_sample_bit_depth_chroma_minus1 = r.ReadUint8(4) - sps.log2_min_pcm_luma_coding_block_size_minus3 = r.ReadUe8() - sps.log2_diff_max_min_pcm_luma_coding_block_size = r.ReadUe8() + sps.Log2_min_pcm_luma_coding_block_size_minus3 = r.ReadUe8() + sps.Log2_diff_max_min_pcm_luma_coding_block_size = r.ReadUe8() - sps.pcm_loop_filter_disabled_flag = r.ReadBit() + sps.Pcm_loop_filter_disabled_flag = r.ReadBit() } - sps.num_short_term_ref_pic_sets = r.ReadUe8() - if sps.num_short_term_ref_pic_sets > 0 { - sps.st_ref_pic_set = make([]H265RawSTRefPicSet, sps.num_short_term_ref_pic_sets) - for i := uint8(0); i < sps.num_short_term_ref_pic_sets; i++ { - sps.st_ref_pic_set[i].decode(r, i, sps) + sps.Num_short_term_ref_pic_sets = r.ReadUe8() + if sps.Num_short_term_ref_pic_sets > 0 { + sps.St_ref_pic_set = make([]H265RawSTRefPicSet, sps.Num_short_term_ref_pic_sets) + for i := uint8(0); i < sps.Num_short_term_ref_pic_sets; i++ { + sps.St_ref_pic_set[i].decode(r, i, sps) } } - sps.long_term_ref_pics_present_flag = r.ReadBit() - if sps.long_term_ref_pics_present_flag == 1 { - sps.num_long_term_ref_pics_sps = r.ReadUe8() - for i := uint8(0); i < sps.num_long_term_ref_pics_sps; i++ { - sps.lt_ref_pic_poc_lsb_sps[i] = r.ReadUint16(int(sps.log2_max_pic_order_cnt_lsb_minus4 + 4)) - sps.used_by_curr_pic_lt_sps_flag[i] = r.ReadBit() + sps.Long_term_ref_pics_present_flag = r.ReadBit() + if sps.Long_term_ref_pics_present_flag == 1 { + sps.Num_long_term_ref_pics_sps = r.ReadUe8() + for i := uint8(0); i < sps.Num_long_term_ref_pics_sps; i++ { + sps.Lt_ref_pic_poc_lsb_sps[i] = r.ReadUint16(int(sps.Log2_max_pic_order_cnt_lsb_minus4 + 4)) + sps.Used_by_curr_pic_lt_sps_flag[i] = r.ReadBit() } } - sps.sps_temporal_mvp_enabled_flag = r.ReadBit() - sps.strong_intra_smoothing_enabled_flag = r.ReadBit() + sps.Sps_temporal_mvp_enabled_flag = r.ReadBit() + sps.Strong_intra_smoothing_enabled_flag = r.ReadBit() - sps.vui_parameters_present_flag = r.ReadBit() - if sps.vui_parameters_present_flag == 1 { - sps.vui.decode(r, sps) + sps.Vui_parameters_present_flag = r.ReadBit() + if sps.Vui_parameters_present_flag == 1 { + sps.Vui.decode(r, sps) } else { - sps.vui.setDefault(sps) + sps.Vui.setDefault(sps) } - sps.sps_extension_present_flag = r.ReadBit() + sps.Sps_extension_present_flag = r.ReadBit() - if sps.sps_extension_present_flag == 1 { - sps.sps_range_extension_flag = r.ReadBit() - sps.sps_multilayer_extension_flag = r.ReadBit() - sps.sps_3d_extension_flag = r.ReadBit() - sps.sps_scc_extension_flag = r.ReadBit() - sps.sps_extension_4bits = r.ReadUint8(4) + if sps.Sps_extension_present_flag == 1 { + sps.Sps_range_extension_flag = r.ReadBit() + sps.Sps_multilayer_extension_flag = r.ReadBit() + sps.Sps_3d_extension_flag = r.ReadBit() + sps.Sps_scc_extension_flag = r.ReadBit() + sps.Sps_extension_4bits = r.ReadUint8(4) } // if (sps.sps_range_extension_flag) diff --git a/av/codec/hevc/vps.go b/av/codec/hevc/vps.go index 67cf358..fd55311 100644 --- a/av/codec/hevc/vps.go +++ b/av/codec/hevc/vps.go @@ -17,74 +17,74 @@ import ( ) type H265RawNALUnitHeader struct { - nal_unit_type uint8 - nuh_layer_id uint8 - nuh_temporal_id_plus1 uint8 + Nal_unit_type uint8 + Nuh_layer_id uint8 + Nuh_temporal_id_plus1 uint8 } func (h *H265RawNALUnitHeader) decode(r *bits.Reader) (err error) { r.Skip(1) //forbidden_zero_bit - h.nal_unit_type = r.ReadUint8(6) - h.nuh_layer_id = r.ReadUint8(6) - h.nuh_temporal_id_plus1 = r.ReadUint8(3) + h.Nal_unit_type = r.ReadUint8(6) + h.Nuh_layer_id = r.ReadUint8(6) + h.Nuh_temporal_id_plus1 = r.ReadUint8(3) return } type H265RawProfileTierLevel struct { - general_profile_space uint8 - general_tier_flag uint8 - general_profile_idc uint8 + General_profile_space uint8 + General_tier_flag uint8 + General_profile_idc uint8 - general_profile_compatibility_flag [32]uint8 + General_profile_compatibility_flag [32]uint8 - general_progressive_source_flag uint8 - general_interlaced_source_flag uint8 - general_non_packed_constraint_flag uint8 - general_frame_only_constraint_flag uint8 + General_progressive_source_flag uint8 + General_interlaced_source_flag uint8 + General_non_packed_constraint_flag uint8 + General_frame_only_constraint_flag uint8 - general_max_12bit_constraint_flag uint8 - general_max_10bit_constraint_flag uint8 - general_max_8bit_constraint_flag uint8 - general_max_422chroma_constraint_flag uint8 - general_max_420chroma_constraint_flag uint8 - general_max_monochrome_constraint_flag uint8 - general_intra_constraint_flag uint8 - general_one_picture_only_constraint_flag uint8 - general_lower_bit_rate_constraint_flag uint8 - general_max_14bit_constraint_flag uint8 + General_max_12bit_constraint_flag uint8 + General_max_10bit_constraint_flag uint8 + General_max_8bit_constraint_flag uint8 + General_max_422chroma_constraint_flag uint8 + General_max_420chroma_constraint_flag uint8 + General_max_monochrome_constraint_flag uint8 + General_intra_constraint_flag uint8 + General_one_picture_only_constraint_flag uint8 + General_lower_bit_rate_constraint_flag uint8 + General_max_14bit_constraint_flag uint8 - general_inbld_flag uint8 + General_inbld_flag uint8 - general_level_idc uint8 + General_level_idc uint8 - sub_layer_profile_present_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_level_present_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_profile_present_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_level_present_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_profile_space [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_tier_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_profile_idc [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_profile_space [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_tier_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_profile_idc [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_profile_compatibility_flag [HEVC_MAX_SUB_LAYERS][32]uint8 + Sub_layer_profile_compatibility_flag [HEVC_MAX_SUB_LAYERS][32]uint8 - sub_layer_progressive_source_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_interlaced_source_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_non_packed_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_frame_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_progressive_source_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_interlaced_source_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_non_packed_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_frame_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_12bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_10bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_8bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_422chroma_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_420chroma_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_monochrome_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_intra_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_one_picture_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_lower_bit_rate_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_max_14bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_12bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_10bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_8bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_422chroma_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_420chroma_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_monochrome_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_intra_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_one_picture_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_lower_bit_rate_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_max_14bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_inbld_flag [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_inbld_flag [HEVC_MAX_SUB_LAYERS]uint8 - sub_layer_level_idc [HEVC_MAX_SUB_LAYERS]uint8 + Sub_layer_level_idc [HEVC_MAX_SUB_LAYERS]uint8 } type profile_compatible struct { profile_idc uint8 @@ -99,36 +99,36 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader, profile_present_flag bool, max_num_sub_layers_minus1 int) (err error) { if profile_present_flag { - ptl.general_profile_space = r.ReadUint8(2) - ptl.general_tier_flag = r.ReadBit() - ptl.general_profile_idc = r.ReadUint8(5) + ptl.General_profile_space = r.ReadUint8(2) + ptl.General_tier_flag = r.ReadBit() + ptl.General_profile_idc = r.ReadUint8(5) for j := 0; j < 32; j++ { - ptl.general_profile_compatibility_flag[j] = r.ReadBit() + ptl.General_profile_compatibility_flag[j] = r.ReadBit() } - ptl.general_progressive_source_flag = r.ReadBit() - ptl.general_interlaced_source_flag = r.ReadBit() - ptl.general_non_packed_constraint_flag = r.ReadBit() - ptl.general_frame_only_constraint_flag = r.ReadBit() + ptl.General_progressive_source_flag = r.ReadBit() + ptl.General_interlaced_source_flag = r.ReadBit() + ptl.General_non_packed_constraint_flag = r.ReadBit() + ptl.General_frame_only_constraint_flag = r.ReadBit() - pc := profile_compatible{ptl.general_profile_idc, ptl.general_profile_compatibility_flag} + pc := profile_compatible{ptl.General_profile_idc, ptl.General_profile_compatibility_flag} if pc.compatible(4) || pc.compatible(5) || pc.compatible(6) || pc.compatible(7) || pc.compatible(8) || pc.compatible(9) || pc.compatible(10) { - ptl.general_max_12bit_constraint_flag = r.ReadBit() - ptl.general_max_10bit_constraint_flag = r.ReadBit() - ptl.general_max_8bit_constraint_flag = r.ReadBit() - ptl.general_max_422chroma_constraint_flag = r.ReadBit() - ptl.general_max_420chroma_constraint_flag = r.ReadBit() - ptl.general_max_monochrome_constraint_flag = r.ReadBit() - ptl.general_intra_constraint_flag = r.ReadBit() - ptl.general_one_picture_only_constraint_flag = r.ReadBit() - ptl.general_lower_bit_rate_constraint_flag = r.ReadBit() + ptl.General_max_12bit_constraint_flag = r.ReadBit() + ptl.General_max_10bit_constraint_flag = r.ReadBit() + ptl.General_max_8bit_constraint_flag = r.ReadBit() + ptl.General_max_422chroma_constraint_flag = r.ReadBit() + ptl.General_max_420chroma_constraint_flag = r.ReadBit() + ptl.General_max_monochrome_constraint_flag = r.ReadBit() + ptl.General_intra_constraint_flag = r.ReadBit() + ptl.General_one_picture_only_constraint_flag = r.ReadBit() + ptl.General_lower_bit_rate_constraint_flag = r.ReadBit() if pc.compatible(5) || pc.compatible(9) || pc.compatible(10) { - ptl.general_max_14bit_constraint_flag = r.ReadBit() + ptl.General_max_14bit_constraint_flag = r.ReadBit() r.Skip(33) // general_reserved_zero_33bits } else { @@ -136,7 +136,7 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader, } } else if pc.compatible(2) { r.Skip(7) // general_reserved_zero_7bits - ptl.general_one_picture_only_constraint_flag = r.ReadBit() + ptl.General_one_picture_only_constraint_flag = r.ReadBit() r.Skip(35) // general_reserved_zero_35bits } else { r.Skip(43) // general_reserved_zero_43bits @@ -145,17 +145,17 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader, if pc.compatible(1) || pc.compatible(2) || pc.compatible(3) || pc.compatible(4) || pc.compatible(5) || pc.compatible(9) { - ptl.general_inbld_flag = r.ReadBit() + ptl.General_inbld_flag = r.ReadBit() } else { r.Skip(1) // general_reserved_zero_bit } } - ptl.general_level_idc = r.ReadUint8(8) + ptl.General_level_idc = r.ReadUint8(8) for i := 0; i < max_num_sub_layers_minus1; i++ { - ptl.sub_layer_profile_present_flag[i] = r.ReadBit() - ptl.sub_layer_level_present_flag[i] = r.ReadBit() + ptl.Sub_layer_profile_present_flag[i] = r.ReadBit() + ptl.Sub_layer_level_present_flag[i] = r.ReadBit() } if max_num_sub_layers_minus1 > 0 { @@ -165,44 +165,44 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader, } for i := 0; i < max_num_sub_layers_minus1; i++ { - if ptl.sub_layer_profile_present_flag[i] == 1 { - ptl.sub_layer_profile_space[i] = r.ReadUint8(2) - ptl.sub_layer_tier_flag[i] = r.ReadBit() - ptl.sub_layer_profile_idc[i] = r.ReadUint8(5) + if ptl.Sub_layer_profile_present_flag[i] == 1 { + ptl.Sub_layer_profile_space[i] = r.ReadUint8(2) + ptl.Sub_layer_tier_flag[i] = r.ReadBit() + ptl.Sub_layer_profile_idc[i] = r.ReadUint8(5) for j := 0; j < 32; j++ { - ptl.sub_layer_profile_compatibility_flag[i][j] = r.ReadBit() + ptl.Sub_layer_profile_compatibility_flag[i][j] = r.ReadBit() } - ptl.sub_layer_progressive_source_flag[i] = r.ReadBit() - ptl.sub_layer_interlaced_source_flag[i] = r.ReadBit() - ptl.sub_layer_non_packed_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_frame_only_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_progressive_source_flag[i] = r.ReadBit() + ptl.Sub_layer_interlaced_source_flag[i] = r.ReadBit() + ptl.Sub_layer_non_packed_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_frame_only_constraint_flag[i] = r.ReadBit() - pc := profile_compatible{ptl.sub_layer_profile_idc[i], ptl.sub_layer_profile_compatibility_flag[i]} + pc := profile_compatible{ptl.Sub_layer_profile_idc[i], ptl.Sub_layer_profile_compatibility_flag[i]} if pc.compatible(4) || pc.compatible(5) || pc.compatible(6) || pc.compatible(7) || pc.compatible(8) || pc.compatible(9) || pc.compatible(10) { - ptl.sub_layer_max_12bit_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_max_10bit_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_max_8bit_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_max_422chroma_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_max_420chroma_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_max_monochrome_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_intra_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit() - ptl.sub_layer_lower_bit_rate_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_12bit_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_10bit_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_8bit_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_422chroma_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_420chroma_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_monochrome_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_intra_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_lower_bit_rate_constraint_flag[i] = r.ReadBit() if pc.compatible(5) { - ptl.sub_layer_max_14bit_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_max_14bit_constraint_flag[i] = r.ReadBit() r.Skip(33) // sub_layer_reserved_zero_33bits } else { r.Skip(34) // sub_layer_reserved_zero_34bits } } else if pc.compatible(2) { r.Skip(7) // sub_layer_reserved_zero_7bits - ptl.sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit() + ptl.Sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit() r.Skip(35) // sub_layer_reserved_zero_35bits } else { r.Skip(43) // sub_layer_reserved_zero_43bits @@ -211,127 +211,127 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader, if pc.compatible(1) || pc.compatible(2) || pc.compatible(3) || pc.compatible(4) || pc.compatible(5) || pc.compatible(9) { - ptl.sub_layer_inbld_flag[i] = r.ReadBit() + ptl.Sub_layer_inbld_flag[i] = r.ReadBit() } else { r.Skip(1) // sub_layer_reserved_zero_bit } } - if ptl.sub_layer_level_present_flag[i] == 1 { - ptl.sub_layer_level_idc[i] = r.ReadUint8(8) + if ptl.Sub_layer_level_present_flag[i] == 1 { + ptl.Sub_layer_level_idc[i] = r.ReadUint8(8) } } return } type H265RawSubLayerHRDParameters struct { - bit_rate_value_minus1 [HEVC_MAX_CPB_CNT]uint32 - cpb_size_value_minus1 [HEVC_MAX_CPB_CNT]uint32 - cpb_size_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32 - bit_rate_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32 - cbr_flag [HEVC_MAX_CPB_CNT]uint8 + Bit_rate_value_minus1 [HEVC_MAX_CPB_CNT]uint32 + Cpb_size_value_minus1 [HEVC_MAX_CPB_CNT]uint32 + Cpb_size_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32 + Bit_rate_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32 + Cbr_flag [HEVC_MAX_CPB_CNT]uint8 } func (shrd *H265RawSubLayerHRDParameters) decode(r *bits.Reader, sub_pic_hrd_params_present_flag bool, cpb_cnt_minus1 int) (err error) { for i := 0; i <= cpb_cnt_minus1; i++ { - shrd.bit_rate_value_minus1[i] = r.ReadUe() - shrd.cpb_size_value_minus1[i] = r.ReadUe() + shrd.Bit_rate_value_minus1[i] = r.ReadUe() + shrd.Cpb_size_value_minus1[i] = r.ReadUe() if sub_pic_hrd_params_present_flag { - shrd.cpb_size_du_value_minus1[i] = r.ReadUe() - shrd.bit_rate_du_value_minus1[i] = r.ReadUe() + shrd.Cpb_size_du_value_minus1[i] = r.ReadUe() + shrd.Bit_rate_du_value_minus1[i] = r.ReadUe() } - shrd.cbr_flag[i] = r.ReadBit() + shrd.Cbr_flag[i] = r.ReadBit() } return } type H265RawHRDParameters struct { - nal_hrd_parameters_present_flag uint8 - vcl_hrd_parameters_present_flag uint8 + Nal_hrd_parameters_present_flag uint8 + Vcl_hrd_parameters_present_flag uint8 - sub_pic_hrd_params_present_flag uint8 - tick_divisor_minus2 uint8 - du_cpb_removal_delay_increment_length_minus1 uint8 - sub_pic_cpb_params_in_pic_timing_sei_flag uint8 - dpb_output_delay_du_length_minus1 uint8 + Sub_pic_hrd_params_present_flag uint8 + Tick_divisor_minus2 uint8 + Du_cpb_removal_delay_increment_length_minus1 uint8 + Sub_pic_cpb_params_in_pic_timing_sei_flag uint8 + Dpb_output_delay_du_length_minus1 uint8 - bit_rate_scale uint8 - cpb_size_scale uint8 - cpb_size_du_scale uint8 + Bit_rate_scale uint8 + Cpb_size_scale uint8 + Cpb_size_du_scale uint8 - initial_cpb_removal_delay_length_minus1 uint8 - au_cpb_removal_delay_length_minus1 uint8 - dpb_output_delay_length_minus1 uint8 + Initial_cpb_removal_delay_length_minus1 uint8 + Au_cpb_removal_delay_length_minus1 uint8 + Dpb_output_delay_length_minus1 uint8 - fixed_pic_rate_general_flag [HEVC_MAX_SUB_LAYERS]uint8 - fixed_pic_rate_within_cvs_flag [HEVC_MAX_SUB_LAYERS]uint8 - elemental_duration_in_tc_minus1 [HEVC_MAX_SUB_LAYERS]uint16 - low_delay_hrd_flag [HEVC_MAX_SUB_LAYERS]uint8 - cpb_cnt_minus1 [HEVC_MAX_SUB_LAYERS]uint8 - nal_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters - vcl_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters + Fixed_pic_rate_general_flag [HEVC_MAX_SUB_LAYERS]uint8 + Fixed_pic_rate_within_cvs_flag [HEVC_MAX_SUB_LAYERS]uint8 + Elemental_duration_in_tc_minus1 [HEVC_MAX_SUB_LAYERS]uint16 + Low_delay_hrd_flag [HEVC_MAX_SUB_LAYERS]uint8 + Cpb_cnt_minus1 [HEVC_MAX_SUB_LAYERS]uint8 + Nal_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters + Vcl_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters } func (hrd *H265RawHRDParameters) decode(r *bits.Reader, common_inf_present_flag bool, max_num_sub_layers_minus1 int) (err error) { if common_inf_present_flag { - hrd.nal_hrd_parameters_present_flag = r.ReadBit() - hrd.vcl_hrd_parameters_present_flag = r.ReadBit() + hrd.Nal_hrd_parameters_present_flag = r.ReadBit() + hrd.Vcl_hrd_parameters_present_flag = r.ReadBit() - if hrd.nal_hrd_parameters_present_flag == 1 || - hrd.vcl_hrd_parameters_present_flag == 1 { - hrd.sub_pic_hrd_params_present_flag = r.ReadBit() - if hrd.sub_pic_hrd_params_present_flag == 1 { - hrd.tick_divisor_minus2 = r.ReadUint8(8) - hrd.du_cpb_removal_delay_increment_length_minus1 = r.ReadUint8(5) - hrd.sub_pic_cpb_params_in_pic_timing_sei_flag = r.ReadBit() - hrd.dpb_output_delay_du_length_minus1 = r.ReadUint8(5) + if hrd.Nal_hrd_parameters_present_flag == 1 || + hrd.Vcl_hrd_parameters_present_flag == 1 { + hrd.Sub_pic_hrd_params_present_flag = r.ReadBit() + if hrd.Sub_pic_hrd_params_present_flag == 1 { + hrd.Tick_divisor_minus2 = r.ReadUint8(8) + hrd.Du_cpb_removal_delay_increment_length_minus1 = r.ReadUint8(5) + hrd.Sub_pic_cpb_params_in_pic_timing_sei_flag = r.ReadBit() + hrd.Dpb_output_delay_du_length_minus1 = r.ReadUint8(5) } - hrd.bit_rate_scale = r.ReadUint8(4) - hrd.cpb_size_scale = r.ReadUint8(4) - if hrd.sub_pic_hrd_params_present_flag == 1 { - hrd.cpb_size_du_scale = r.ReadUint8(4) + hrd.Bit_rate_scale = r.ReadUint8(4) + hrd.Cpb_size_scale = r.ReadUint8(4) + if hrd.Sub_pic_hrd_params_present_flag == 1 { + hrd.Cpb_size_du_scale = r.ReadUint8(4) } - hrd.initial_cpb_removal_delay_length_minus1 = r.ReadUint8(5) - hrd.au_cpb_removal_delay_length_minus1 = r.ReadUint8(5) - hrd.dpb_output_delay_length_minus1 = r.ReadUint8(5) + hrd.Initial_cpb_removal_delay_length_minus1 = r.ReadUint8(5) + hrd.Au_cpb_removal_delay_length_minus1 = r.ReadUint8(5) + hrd.Dpb_output_delay_length_minus1 = r.ReadUint8(5) } else { - hrd.sub_pic_hrd_params_present_flag = 0 + hrd.Sub_pic_hrd_params_present_flag = 0 - hrd.initial_cpb_removal_delay_length_minus1 = 23 - hrd.au_cpb_removal_delay_length_minus1 = 23 - hrd.dpb_output_delay_length_minus1 = 23 + hrd.Initial_cpb_removal_delay_length_minus1 = 23 + hrd.Au_cpb_removal_delay_length_minus1 = 23 + hrd.Dpb_output_delay_length_minus1 = 23 } } for i := 0; i <= max_num_sub_layers_minus1; i++ { - hrd.fixed_pic_rate_general_flag[i] = r.ReadBit() + hrd.Fixed_pic_rate_general_flag[i] = r.ReadBit() - hrd.fixed_pic_rate_within_cvs_flag[i] = 1 - if hrd.fixed_pic_rate_general_flag[i] == 0 { - hrd.fixed_pic_rate_within_cvs_flag[i] = r.ReadBit() + hrd.Fixed_pic_rate_within_cvs_flag[i] = 1 + if hrd.Fixed_pic_rate_general_flag[i] == 0 { + hrd.Fixed_pic_rate_within_cvs_flag[i] = r.ReadBit() } - if hrd.fixed_pic_rate_within_cvs_flag[i] == 1 { - hrd.elemental_duration_in_tc_minus1[i] = r.ReadUe16() - hrd.low_delay_hrd_flag[i] = 0 + if hrd.Fixed_pic_rate_within_cvs_flag[i] == 1 { + hrd.Elemental_duration_in_tc_minus1[i] = r.ReadUe16() + hrd.Low_delay_hrd_flag[i] = 0 } else { - hrd.low_delay_hrd_flag[i] = r.ReadBit() + hrd.Low_delay_hrd_flag[i] = r.ReadBit() } - hrd.cpb_cnt_minus1[i] = 0 - if hrd.low_delay_hrd_flag[i] == 0 { - hrd.cpb_cnt_minus1[i] = r.ReadUe8() + hrd.Cpb_cnt_minus1[i] = 0 + if hrd.Low_delay_hrd_flag[i] == 0 { + hrd.Cpb_cnt_minus1[i] = r.ReadUe8() } - if hrd.nal_hrd_parameters_present_flag == 1 { - hrd.nal_sub_layer_hrd_parameters[i].decode(r, hrd.sub_pic_hrd_params_present_flag == 1, int(hrd.cpb_cnt_minus1[i])) + if hrd.Nal_hrd_parameters_present_flag == 1 { + hrd.Nal_sub_layer_hrd_parameters[i].decode(r, hrd.Sub_pic_hrd_params_present_flag == 1, int(hrd.Cpb_cnt_minus1[i])) } - if hrd.vcl_hrd_parameters_present_flag == 1 { - hrd.vcl_sub_layer_hrd_parameters[i].decode(r, hrd.sub_pic_hrd_params_present_flag == 1, int(hrd.cpb_cnt_minus1[i])) + if hrd.Vcl_hrd_parameters_present_flag == 1 { + hrd.Vcl_sub_layer_hrd_parameters[i].decode(r, hrd.Sub_pic_hrd_params_present_flag == 1, int(hrd.Cpb_cnt_minus1[i])) } } @@ -339,38 +339,38 @@ func (hrd *H265RawHRDParameters) decode(r *bits.Reader, } type H265RawVPS struct { - nal_unit_header H265RawNALUnitHeader + Nal_unit_header H265RawNALUnitHeader - vps_video_parameter_set_id uint8 + Vps_video_parameter_set_id uint8 - vps_base_layer_internal_flag uint8 - vps_base_layer_available_flag uint8 - vps_max_layers_minus1 uint8 - vps_max_sub_layers_minus1 uint8 - vps_temporal_id_nesting_flag uint8 + Vps_base_layer_internal_flag uint8 + Vps_base_layer_available_flag uint8 + Vps_max_layers_minus1 uint8 + Vps_max_sub_layers_minus1 uint8 + Vps_temporal_id_nesting_flag uint8 - profile_tier_level H265RawProfileTierLevel + Profile_tier_level H265RawProfileTierLevel - vps_sub_layer_ordering_info_present_flag uint8 - vps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8 - vps_max_num_reorder_pics [HEVC_MAX_SUB_LAYERS]uint8 - vps_max_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32 + Vps_sub_layer_ordering_info_present_flag uint8 + Vps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8 + Vps_max_num_reorder_pics [HEVC_MAX_SUB_LAYERS]uint8 + Vps_max_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32 - vps_max_layer_id uint8 - vps_num_layer_sets_minus1 uint16 - layer_id_included_flag [][HEVC_MAX_LAYERS]uint8 //[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]uint8 + Vps_max_layer_id uint8 + Vps_num_layer_sets_minus1 uint16 + Layer_id_included_flag [][HEVC_MAX_LAYERS]uint8 //[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]uint8 - vps_timing_info_present_flag uint8 - vps_num_units_in_tick uint32 - vps_time_scale uint32 - vps_poc_proportional_to_timing_flag uint8 - vps_num_ticks_poc_diff_one_minus1 uint32 - vps_num_hrd_parameters uint16 - hrd_layer_set_idx []uint16 //[HEVC_MAX_LAYER_SETS]uint16 - cprms_present_flag []uint8 //[HEVC_MAX_LAYER_SETS]uint8 - hrd_parameters []H265RawHRDParameters //[HEVC_MAX_LAYER_SETS]H265RawHRDParameters + Vps_timing_info_present_flag uint8 + Vps_num_units_in_tick uint32 + Vps_time_scale uint32 + Vps_poc_proportional_to_timing_flag uint8 + Vps_num_ticks_poc_diff_one_minus1 uint32 + Vps_num_hrd_parameters uint16 + Hrd_layer_set_idx []uint16 //[HEVC_MAX_LAYER_SETS]uint16 + Cprms_present_flag []uint8 //[HEVC_MAX_LAYER_SETS]uint8 + Hrd_parameters []H265RawHRDParameters //[HEVC_MAX_LAYER_SETS]H265RawHRDParameters - vps_extension_flag uint8 + Vps_extension_flag uint8 // extension_data H265RawExtensionData } @@ -397,97 +397,97 @@ func (vps *H265RawVPS) Decode(data []byte) (err error) { } r := bits.NewReader(vpsWEB) - if err = vps.nal_unit_header.decode(r); err != nil { + if err = vps.Nal_unit_header.decode(r); err != nil { return } - if vps.nal_unit_header.nal_unit_type != NalVps { + if vps.Nal_unit_header.Nal_unit_type != NalVps { return errors.New("not is vps NAL UNIT") } - vps.vps_video_parameter_set_id = r.ReadUint8(4) + vps.Vps_video_parameter_set_id = r.ReadUint8(4) - vps.vps_base_layer_internal_flag = r.ReadBit() - vps.vps_base_layer_available_flag = r.ReadBit() - vps.vps_max_layers_minus1 = r.ReadUint8(6) - vps.vps_max_sub_layers_minus1 = r.ReadUint8(3) - vps.vps_temporal_id_nesting_flag = r.ReadBit() + vps.Vps_base_layer_internal_flag = r.ReadBit() + vps.Vps_base_layer_available_flag = r.ReadBit() + vps.Vps_max_layers_minus1 = r.ReadUint8(6) + vps.Vps_max_sub_layers_minus1 = r.ReadUint8(3) + vps.Vps_temporal_id_nesting_flag = r.ReadBit() - if vps.vps_max_sub_layers_minus1 == 0 && - vps.vps_temporal_id_nesting_flag != 1 { + if vps.Vps_max_sub_layers_minus1 == 0 && + vps.Vps_temporal_id_nesting_flag != 1 { return errors.New("Invalid stream: vps_temporal_id_nesting_flag must be 1 if vps_max_sub_layers_minus1 is 0.\n") } r.Skip(16) // vps_reserved_0xffff_16bits - if err = vps.profile_tier_level.decode(r, true, int(vps.vps_max_sub_layers_minus1)); err != nil { + if err = vps.Profile_tier_level.decode(r, true, int(vps.Vps_max_sub_layers_minus1)); err != nil { return } - vps.vps_sub_layer_ordering_info_present_flag = r.ReadBit() - i := vps.vps_max_sub_layers_minus1 - if vps.vps_sub_layer_ordering_info_present_flag == 1 { + vps.Vps_sub_layer_ordering_info_present_flag = r.ReadBit() + i := vps.Vps_max_sub_layers_minus1 + if vps.Vps_sub_layer_ordering_info_present_flag == 1 { i = 0 } - for ; i <= vps.vps_max_sub_layers_minus1; i++ { - vps.vps_max_dec_pic_buffering_minus1[i] = r.ReadUe8() - vps.vps_max_num_reorder_pics[i] = r.ReadUe8() - vps.vps_max_latency_increase_plus1[i] = r.ReadUe() + for ; i <= vps.Vps_max_sub_layers_minus1; i++ { + vps.Vps_max_dec_pic_buffering_minus1[i] = r.ReadUe8() + vps.Vps_max_num_reorder_pics[i] = r.ReadUe8() + vps.Vps_max_latency_increase_plus1[i] = r.ReadUe() } - if vps.vps_sub_layer_ordering_info_present_flag == 0 { - for i := uint8(0); i < vps.vps_max_sub_layers_minus1; i++ { - vps.vps_max_dec_pic_buffering_minus1[i] = - vps.vps_max_dec_pic_buffering_minus1[vps.vps_max_sub_layers_minus1] - vps.vps_max_num_reorder_pics[i] = - vps.vps_max_num_reorder_pics[vps.vps_max_sub_layers_minus1] - vps.vps_max_latency_increase_plus1[i] = - vps.vps_max_latency_increase_plus1[vps.vps_max_sub_layers_minus1] + if vps.Vps_sub_layer_ordering_info_present_flag == 0 { + for i := uint8(0); i < vps.Vps_max_sub_layers_minus1; i++ { + vps.Vps_max_dec_pic_buffering_minus1[i] = + vps.Vps_max_dec_pic_buffering_minus1[vps.Vps_max_sub_layers_minus1] + vps.Vps_max_num_reorder_pics[i] = + vps.Vps_max_num_reorder_pics[vps.Vps_max_sub_layers_minus1] + vps.Vps_max_latency_increase_plus1[i] = + vps.Vps_max_latency_increase_plus1[vps.Vps_max_sub_layers_minus1] } } - vps.vps_max_layer_id = r.ReadUint8(6) - vps.vps_num_layer_sets_minus1 = r.ReadUe16() - vps.layer_id_included_flag = make([][HEVC_MAX_LAYERS]uint8, vps.vps_num_layer_sets_minus1+1) - for i := uint16(1); i <= vps.vps_num_layer_sets_minus1; i++ { - for j := uint8(0); j <= vps.vps_max_layer_id; j++ { - vps.layer_id_included_flag[i][j] = r.ReadBit() + vps.Vps_max_layer_id = r.ReadUint8(6) + vps.Vps_num_layer_sets_minus1 = r.ReadUe16() + vps.Layer_id_included_flag = make([][HEVC_MAX_LAYERS]uint8, vps.Vps_num_layer_sets_minus1+1) + for i := uint16(1); i <= vps.Vps_num_layer_sets_minus1; i++ { + for j := uint8(0); j <= vps.Vps_max_layer_id; j++ { + vps.Layer_id_included_flag[i][j] = r.ReadBit() } } - for j := uint8(0); j <= vps.vps_max_layer_id; j++ { - vps.layer_id_included_flag[0][j] = 1 + for j := uint8(0); j <= vps.Vps_max_layer_id; j++ { + vps.Layer_id_included_flag[0][j] = 1 if j == 0 { - vps.layer_id_included_flag[0][j] = 0 + vps.Layer_id_included_flag[0][j] = 0 } } - vps.vps_timing_info_present_flag = r.ReadBit() - if vps.vps_timing_info_present_flag == 1 { - vps.vps_num_units_in_tick = r.ReadUint32(32) - vps.vps_time_scale = r.ReadUint32(32) - vps.vps_poc_proportional_to_timing_flag = r.ReadBit() - if vps.vps_poc_proportional_to_timing_flag == 1 { - vps.vps_num_ticks_poc_diff_one_minus1 = r.ReadUe() + vps.Vps_timing_info_present_flag = r.ReadBit() + if vps.Vps_timing_info_present_flag == 1 { + vps.Vps_num_units_in_tick = r.ReadUint32(32) + vps.Vps_time_scale = r.ReadUint32(32) + vps.Vps_poc_proportional_to_timing_flag = r.ReadBit() + if vps.Vps_poc_proportional_to_timing_flag == 1 { + vps.Vps_num_ticks_poc_diff_one_minus1 = r.ReadUe() } - vps.vps_num_hrd_parameters = r.ReadUe16() - if vps.vps_num_hrd_parameters > 0 { - vps.hrd_layer_set_idx = make([]uint16, vps.vps_num_hrd_parameters) - vps.cprms_present_flag = make([]uint8, vps.vps_num_hrd_parameters) - vps.hrd_parameters = make([]H265RawHRDParameters, vps.vps_num_hrd_parameters) + vps.Vps_num_hrd_parameters = r.ReadUe16() + if vps.Vps_num_hrd_parameters > 0 { + vps.Hrd_layer_set_idx = make([]uint16, vps.Vps_num_hrd_parameters) + vps.Cprms_present_flag = make([]uint8, vps.Vps_num_hrd_parameters) + vps.Hrd_parameters = make([]H265RawHRDParameters, vps.Vps_num_hrd_parameters) } - for i := uint16(0); i < vps.vps_num_hrd_parameters; i++ { - vps.hrd_layer_set_idx[i] = r.ReadUe16() + for i := uint16(0); i < vps.Vps_num_hrd_parameters; i++ { + vps.Hrd_layer_set_idx[i] = r.ReadUe16() if i > 0 { - vps.cprms_present_flag[i] = r.ReadBit() + vps.Cprms_present_flag[i] = r.ReadBit() } else { - vps.cprms_present_flag[0] = 1 + vps.Cprms_present_flag[0] = 1 } - if err = vps.hrd_parameters[i].decode(r, - vps.cprms_present_flag[i] == 1, - int(vps.vps_max_sub_layers_minus1)); err != nil { + if err = vps.Hrd_parameters[i].decode(r, + vps.Cprms_present_flag[i] == 1, + int(vps.Vps_max_sub_layers_minus1)); err != nil { return } } } - vps.vps_extension_flag = r.ReadBit() + vps.Vps_extension_flag = r.ReadBit() return }