mirror of
https://github.com/cnotch/ipchub.git
synced 2025-09-26 19:41:18 +08:00
exports vps/sps fields
This commit is contained in:
@@ -28,3 +28,8 @@ func MetadataIsReady(vm *codec.VideoMeta) bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NulType .
|
||||||
|
func NulType(nt byte) byte {
|
||||||
|
return (nt >> 1) & 0x3f
|
||||||
|
}
|
||||||
|
@@ -15,10 +15,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type H265RawScalingList struct {
|
type H265RawScalingList struct {
|
||||||
scaling_list_pred_mode_flag [4][6]uint8
|
Scaling_list_pred_mode_flag [4][6]uint8
|
||||||
scaling_list_pred_matrix_id_delta [4][6]uint8
|
Scaling_list_pred_matrix_id_delta [4][6]uint8
|
||||||
scaling_list_dc_coef_minus8 [4][6]int16
|
Scaling_list_dc_coef_minus8 [4][6]int16
|
||||||
scaling_list_delta_coeff [4][6][64]int8
|
Scaling_list_delta_coeff [4][6][64]int8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sl *H265RawScalingList) decode(r *bits.Reader) error {
|
func (sl *H265RawScalingList) decode(r *bits.Reader) error {
|
||||||
@@ -28,19 +28,19 @@ func (sl *H265RawScalingList) decode(r *bits.Reader) error {
|
|||||||
step = 3
|
step = 3
|
||||||
}
|
}
|
||||||
for matrixId := 0; matrixId < 6; matrixId += step {
|
for matrixId := 0; matrixId < 6; matrixId += step {
|
||||||
sl.scaling_list_pred_mode_flag[sizeId][matrixId] = r.ReadBit()
|
sl.Scaling_list_pred_mode_flag[sizeId][matrixId] = r.ReadBit()
|
||||||
if sl.scaling_list_pred_mode_flag[sizeId][matrixId] == 0 {
|
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_matrix_id_delta[sizeId][matrixId] = r.ReadUe8()
|
||||||
} else {
|
} else {
|
||||||
n := 1 << (4 + (sizeId << 1))
|
n := 1 << (4 + (sizeId << 1))
|
||||||
if n > 64 {
|
if n > 64 {
|
||||||
n = 64
|
n = 64
|
||||||
}
|
}
|
||||||
if sizeId > 1 {
|
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++ {
|
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 {
|
type H265RawVUI struct {
|
||||||
aspect_ratio_info_present_flag uint8
|
Aspect_ratio_info_present_flag uint8
|
||||||
aspect_ratio_idc uint8
|
Aspect_ratio_idc uint8
|
||||||
sar_width uint16
|
Sar_width uint16
|
||||||
sar_height uint16
|
Sar_height uint16
|
||||||
|
|
||||||
overscan_info_present_flag uint8
|
Overscan_info_present_flag uint8
|
||||||
overscan_appropriate_flag uint8
|
Overscan_appropriate_flag uint8
|
||||||
|
|
||||||
video_signal_type_present_flag uint8
|
Video_signal_type_present_flag uint8
|
||||||
video_format uint8
|
Video_format uint8
|
||||||
video_full_range_flag uint8
|
Video_full_range_flag uint8
|
||||||
colour_description_present_flag uint8
|
Colour_description_present_flag uint8
|
||||||
colour_primaries uint8
|
Colour_primaries uint8
|
||||||
transfer_characteristics uint8
|
Transfer_characteristics uint8
|
||||||
matrix_coefficients uint8
|
Matrix_coefficients uint8
|
||||||
|
|
||||||
chroma_loc_info_present_flag uint8
|
Chroma_loc_info_present_flag uint8
|
||||||
chroma_sample_loc_type_top_field uint8
|
Chroma_sample_loc_type_top_field uint8
|
||||||
chroma_sample_loc_type_bottom_field uint8
|
Chroma_sample_loc_type_bottom_field uint8
|
||||||
|
|
||||||
neutral_chroma_indication_flag uint8
|
Neutral_chroma_indication_flag uint8
|
||||||
field_seq_flag uint8
|
Field_seq_flag uint8
|
||||||
frame_field_info_present_flag uint8
|
Frame_field_info_present_flag uint8
|
||||||
|
|
||||||
default_display_window_flag uint8
|
Default_display_window_flag uint8
|
||||||
def_disp_win_left_offset uint16
|
Def_disp_win_left_offset uint16
|
||||||
def_disp_win_right_offset uint16
|
Def_disp_win_right_offset uint16
|
||||||
def_disp_win_top_offset uint16
|
Def_disp_win_top_offset uint16
|
||||||
def_disp_win_bottom_offset uint16
|
Def_disp_win_bottom_offset uint16
|
||||||
|
|
||||||
vui_timing_info_present_flag uint8
|
Vui_timing_info_present_flag uint8
|
||||||
vui_num_units_in_tick uint32
|
Vui_num_units_in_tick uint32
|
||||||
vui_time_scale uint32
|
Vui_time_scale uint32
|
||||||
vui_poc_proportional_to_timing_flag uint8
|
Vui_poc_proportional_to_timing_flag uint8
|
||||||
vui_num_ticks_poc_diff_one_minus1 uint32
|
Vui_num_ticks_poc_diff_one_minus1 uint32
|
||||||
vui_hrd_parameters_present_flag uint8
|
Vui_hrd_parameters_present_flag uint8
|
||||||
hrd_parameters H265RawHRDParameters
|
Hrd_parameters H265RawHRDParameters
|
||||||
|
|
||||||
bitstream_restriction_flag uint8
|
Bitstream_restriction_flag uint8
|
||||||
tiles_fixed_structure_flag uint8
|
Tiles_fixed_structure_flag uint8
|
||||||
motion_vectors_over_pic_boundaries_flag uint8
|
Motion_vectors_over_pic_boundaries_flag uint8
|
||||||
restricted_ref_pic_lists_flag uint8
|
Restricted_ref_pic_lists_flag uint8
|
||||||
min_spatial_segmentation_idc uint16
|
Min_spatial_segmentation_idc uint16
|
||||||
max_bytes_per_pic_denom uint8
|
Max_bytes_per_pic_denom uint8
|
||||||
max_bits_per_min_cu_denom uint8
|
Max_bits_per_min_cu_denom uint8
|
||||||
log2_max_mv_length_horizontal uint8
|
Log2_max_mv_length_horizontal uint8
|
||||||
log2_max_mv_length_vertical uint8
|
Log2_max_mv_length_vertical uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vui *H265RawVUI) setDefault(sps *H265RawSPS) {
|
func (vui *H265RawVUI) setDefault(sps *H265RawSPS) {
|
||||||
vui.aspect_ratio_idc = 0
|
vui.Aspect_ratio_idc = 0
|
||||||
|
|
||||||
vui.video_format = 5
|
vui.Video_format = 5
|
||||||
vui.video_full_range_flag = 0
|
vui.Video_full_range_flag = 0
|
||||||
vui.colour_primaries = 2
|
vui.Colour_primaries = 2
|
||||||
vui.transfer_characteristics = 2
|
vui.Transfer_characteristics = 2
|
||||||
vui.matrix_coefficients = 2
|
vui.Matrix_coefficients = 2
|
||||||
|
|
||||||
vui.chroma_sample_loc_type_top_field = 0
|
vui.Chroma_sample_loc_type_top_field = 0
|
||||||
vui.chroma_sample_loc_type_bottom_field = 0
|
vui.Chroma_sample_loc_type_bottom_field = 0
|
||||||
|
|
||||||
vui.tiles_fixed_structure_flag = 0
|
vui.Tiles_fixed_structure_flag = 0
|
||||||
vui.motion_vectors_over_pic_boundaries_flag = 1
|
vui.Motion_vectors_over_pic_boundaries_flag = 1
|
||||||
vui.min_spatial_segmentation_idc = 0
|
vui.Min_spatial_segmentation_idc = 0
|
||||||
vui.max_bytes_per_pic_denom = 2
|
vui.Max_bytes_per_pic_denom = 2
|
||||||
vui.max_bits_per_min_cu_denom = 1
|
vui.Max_bits_per_min_cu_denom = 1
|
||||||
vui.log2_max_mv_length_horizontal = 15
|
vui.Log2_max_mv_length_horizontal = 15
|
||||||
vui.log2_max_mv_length_vertical = 15
|
vui.Log2_max_mv_length_vertical = 15
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vui *H265RawVUI) decode(r *bits.Reader, sps *H265RawSPS) error {
|
func (vui *H265RawVUI) decode(r *bits.Reader, sps *H265RawSPS) error {
|
||||||
vui.aspect_ratio_info_present_flag = r.ReadBit()
|
vui.Aspect_ratio_info_present_flag = r.ReadBit()
|
||||||
if vui.aspect_ratio_info_present_flag == 1 {
|
if vui.Aspect_ratio_info_present_flag == 1 {
|
||||||
vui.aspect_ratio_idc = r.ReadUint8(8)
|
vui.Aspect_ratio_idc = r.ReadUint8(8)
|
||||||
if vui.aspect_ratio_idc == 255 {
|
if vui.Aspect_ratio_idc == 255 {
|
||||||
vui.sar_width = r.ReadUint16(16)
|
vui.Sar_width = r.ReadUint16(16)
|
||||||
vui.sar_height = r.ReadUint16(16)
|
vui.Sar_height = r.ReadUint16(16)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vui.aspect_ratio_idc = 0
|
vui.Aspect_ratio_idc = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.overscan_info_present_flag = r.ReadBit()
|
vui.Overscan_info_present_flag = r.ReadBit()
|
||||||
if vui.overscan_info_present_flag == 1 {
|
if vui.Overscan_info_present_flag == 1 {
|
||||||
vui.overscan_appropriate_flag = r.ReadBit()
|
vui.Overscan_appropriate_flag = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.video_signal_type_present_flag = r.ReadBit()
|
vui.Video_signal_type_present_flag = r.ReadBit()
|
||||||
if vui.video_signal_type_present_flag == 1 {
|
if vui.Video_signal_type_present_flag == 1 {
|
||||||
vui.video_format = r.ReadUint8(3)
|
vui.Video_format = r.ReadUint8(3)
|
||||||
vui.video_full_range_flag = r.ReadBit()
|
vui.Video_full_range_flag = r.ReadBit()
|
||||||
vui.colour_description_present_flag = r.ReadBit()
|
vui.Colour_description_present_flag = r.ReadBit()
|
||||||
if vui.colour_description_present_flag == 1 {
|
if vui.Colour_description_present_flag == 1 {
|
||||||
vui.colour_primaries = r.ReadUint8(8)
|
vui.Colour_primaries = r.ReadUint8(8)
|
||||||
vui.transfer_characteristics = r.ReadUint8(8)
|
vui.Transfer_characteristics = r.ReadUint8(8)
|
||||||
vui.matrix_coefficients = r.ReadUint8(8)
|
vui.Matrix_coefficients = r.ReadUint8(8)
|
||||||
} else {
|
} else {
|
||||||
vui.colour_primaries = 2
|
vui.Colour_primaries = 2
|
||||||
vui.transfer_characteristics = 2
|
vui.Transfer_characteristics = 2
|
||||||
vui.matrix_coefficients = 2
|
vui.Matrix_coefficients = 2
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vui.video_format = 5
|
vui.Video_format = 5
|
||||||
vui.video_full_range_flag = 0
|
vui.Video_full_range_flag = 0
|
||||||
vui.colour_primaries = 2
|
vui.Colour_primaries = 2
|
||||||
vui.transfer_characteristics = 2
|
vui.Transfer_characteristics = 2
|
||||||
vui.matrix_coefficients = 2
|
vui.Matrix_coefficients = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.chroma_loc_info_present_flag = r.ReadBit()
|
vui.Chroma_loc_info_present_flag = r.ReadBit()
|
||||||
if vui.chroma_loc_info_present_flag == 1 {
|
if vui.Chroma_loc_info_present_flag == 1 {
|
||||||
vui.chroma_sample_loc_type_top_field = r.ReadUe8()
|
vui.Chroma_sample_loc_type_top_field = r.ReadUe8()
|
||||||
vui.chroma_sample_loc_type_bottom_field = r.ReadUe8()
|
vui.Chroma_sample_loc_type_bottom_field = r.ReadUe8()
|
||||||
} else {
|
} else {
|
||||||
vui.chroma_sample_loc_type_top_field = 0
|
vui.Chroma_sample_loc_type_top_field = 0
|
||||||
vui.chroma_sample_loc_type_bottom_field = 0
|
vui.Chroma_sample_loc_type_bottom_field = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.neutral_chroma_indication_flag = r.ReadBit()
|
vui.Neutral_chroma_indication_flag = r.ReadBit()
|
||||||
vui.field_seq_flag = r.ReadBit()
|
vui.Field_seq_flag = r.ReadBit()
|
||||||
vui.frame_field_info_present_flag = r.ReadBit()
|
vui.Frame_field_info_present_flag = r.ReadBit()
|
||||||
|
|
||||||
vui.default_display_window_flag = r.ReadBit()
|
vui.Default_display_window_flag = r.ReadBit()
|
||||||
if vui.default_display_window_flag == 1 {
|
if vui.Default_display_window_flag == 1 {
|
||||||
vui.def_disp_win_left_offset = r.ReadUe16()
|
vui.Def_disp_win_left_offset = r.ReadUe16()
|
||||||
vui.def_disp_win_right_offset = r.ReadUe16()
|
vui.Def_disp_win_right_offset = r.ReadUe16()
|
||||||
vui.def_disp_win_top_offset = r.ReadUe16()
|
vui.Def_disp_win_top_offset = r.ReadUe16()
|
||||||
vui.def_disp_win_bottom_offset = r.ReadUe16()
|
vui.Def_disp_win_bottom_offset = r.ReadUe16()
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.vui_timing_info_present_flag = r.ReadBit()
|
vui.Vui_timing_info_present_flag = r.ReadBit()
|
||||||
if vui.vui_timing_info_present_flag == 1 {
|
if vui.Vui_timing_info_present_flag == 1 {
|
||||||
vui.vui_num_units_in_tick = r.ReadUint32(32)
|
vui.Vui_num_units_in_tick = r.ReadUint32(32)
|
||||||
vui.vui_time_scale = r.ReadUint32(32)
|
vui.Vui_time_scale = r.ReadUint32(32)
|
||||||
vui.vui_poc_proportional_to_timing_flag = r.ReadBit()
|
vui.Vui_poc_proportional_to_timing_flag = r.ReadBit()
|
||||||
if vui.vui_poc_proportional_to_timing_flag == 1 {
|
if vui.Vui_poc_proportional_to_timing_flag == 1 {
|
||||||
vui.vui_num_ticks_poc_diff_one_minus1 = r.ReadUe()
|
vui.Vui_num_ticks_poc_diff_one_minus1 = r.ReadUe()
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.vui_hrd_parameters_present_flag = r.ReadBit()
|
vui.Vui_hrd_parameters_present_flag = r.ReadBit()
|
||||||
if vui.vui_hrd_parameters_present_flag == 1 {
|
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 {
|
if err := vui.Hrd_parameters.decode(r, true, int(sps.Sps_max_sub_layers_minus1)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vui.bitstream_restriction_flag = r.ReadBit()
|
vui.Bitstream_restriction_flag = r.ReadBit()
|
||||||
if vui.bitstream_restriction_flag == 1 {
|
if vui.Bitstream_restriction_flag == 1 {
|
||||||
vui.tiles_fixed_structure_flag = r.ReadBit()
|
vui.Tiles_fixed_structure_flag = r.ReadBit()
|
||||||
vui.motion_vectors_over_pic_boundaries_flag = r.ReadBit()
|
vui.Motion_vectors_over_pic_boundaries_flag = r.ReadBit()
|
||||||
vui.restricted_ref_pic_lists_flag = r.ReadBit()
|
vui.Restricted_ref_pic_lists_flag = r.ReadBit()
|
||||||
vui.min_spatial_segmentation_idc = r.ReadUe16()
|
vui.Min_spatial_segmentation_idc = r.ReadUe16()
|
||||||
vui.max_bytes_per_pic_denom = r.ReadUe8()
|
vui.Max_bytes_per_pic_denom = r.ReadUe8()
|
||||||
vui.max_bits_per_min_cu_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_horizontal = r.ReadUe8()
|
||||||
vui.log2_max_mv_length_vertical = r.ReadUe8()
|
vui.Log2_max_mv_length_vertical = r.ReadUe8()
|
||||||
} else {
|
} else {
|
||||||
vui.tiles_fixed_structure_flag = 0
|
vui.Tiles_fixed_structure_flag = 0
|
||||||
vui.motion_vectors_over_pic_boundaries_flag = 1
|
vui.Motion_vectors_over_pic_boundaries_flag = 1
|
||||||
vui.min_spatial_segmentation_idc = 0
|
vui.Min_spatial_segmentation_idc = 0
|
||||||
vui.max_bytes_per_pic_denom = 2
|
vui.Max_bytes_per_pic_denom = 2
|
||||||
vui.max_bits_per_min_cu_denom = 1
|
vui.Max_bits_per_min_cu_denom = 1
|
||||||
vui.log2_max_mv_length_horizontal = 15
|
vui.Log2_max_mv_length_horizontal = 15
|
||||||
vui.log2_max_mv_length_vertical = 15
|
vui.Log2_max_mv_length_vertical = 15
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type H265RawSTRefPicSet struct {
|
type H265RawSTRefPicSet struct {
|
||||||
inter_ref_pic_set_prediction_flag uint8
|
Inter_ref_pic_set_prediction_flag uint8
|
||||||
|
|
||||||
delta_idx_minus1 uint8
|
Delta_idx_minus1 uint8
|
||||||
delta_rps_sign uint8
|
Delta_rps_sign uint8
|
||||||
abs_delta_rps_minus1 uint16
|
Abs_delta_rps_minus1 uint16
|
||||||
|
|
||||||
used_by_curr_pic_flag [HEVC_MAX_REFS]uint8
|
Used_by_curr_pic_flag [HEVC_MAX_REFS]uint8
|
||||||
use_delta_flag [HEVC_MAX_REFS]uint8
|
Use_delta_flag [HEVC_MAX_REFS]uint8
|
||||||
|
|
||||||
num_negative_pics uint8
|
Num_negative_pics uint8
|
||||||
num_positive_pics uint8
|
Num_positive_pics uint8
|
||||||
delta_poc_s0_minus1 [HEVC_MAX_REFS]uint16
|
Delta_poc_s0_minus1 [HEVC_MAX_REFS]uint16
|
||||||
used_by_curr_pic_s0_flag [HEVC_MAX_REFS]uint8
|
Used_by_curr_pic_s0_flag [HEVC_MAX_REFS]uint8
|
||||||
delta_poc_s1_minus1 [HEVC_MAX_REFS]uint16
|
Delta_poc_s1_minus1 [HEVC_MAX_REFS]uint16
|
||||||
used_by_curr_pic_s1_flag [HEVC_MAX_REFS]uint8
|
Used_by_curr_pic_s1_flag [HEVC_MAX_REFS]uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265RawSPS) error {
|
func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265RawSPS) error {
|
||||||
if st_rps_idx != 0 {
|
if st_rps_idx != 0 {
|
||||||
ps.inter_ref_pic_set_prediction_flag = r.ReadBit()
|
ps.Inter_ref_pic_set_prediction_flag = r.ReadBit()
|
||||||
} else {
|
} 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_rps_idx, num_delta_pocs, num_ref_pics uint8
|
||||||
var ref *H265RawSTRefPicSet
|
var ref *H265RawSTRefPicSet
|
||||||
var delta_rps, d_poc int
|
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 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
|
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 {
|
if st_rps_idx == sps.Num_short_term_ref_pic_sets {
|
||||||
ps.delta_idx_minus1 = r.ReadUe8()
|
ps.Delta_idx_minus1 = r.ReadUe8()
|
||||||
} else {
|
} else {
|
||||||
ps.delta_idx_minus1 = 0
|
ps.Delta_idx_minus1 = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
ref_rps_idx = st_rps_idx - (ps.delta_idx_minus1 + 1)
|
ref_rps_idx = st_rps_idx - (ps.Delta_idx_minus1 + 1)
|
||||||
ref = &sps.st_ref_pic_set[ref_rps_idx]
|
ref = &sps.St_ref_pic_set[ref_rps_idx]
|
||||||
num_delta_pocs = ref.num_negative_pics + ref.num_positive_pics
|
num_delta_pocs = ref.Num_negative_pics + ref.Num_positive_pics
|
||||||
// av_assert0(num_delta_pocs < HEVC_MAX_DPB_SIZE);
|
// av_assert0(num_delta_pocs < HEVC_MAX_DPB_SIZE);
|
||||||
|
|
||||||
ps.delta_rps_sign = r.ReadBit()
|
ps.Delta_rps_sign = r.ReadBit()
|
||||||
ps.abs_delta_rps_minus1 = r.ReadUe16()
|
ps.Abs_delta_rps_minus1 = r.ReadUe16()
|
||||||
delta_rps = int((1 - 2*ps.delta_rps_sign)) * int(ps.abs_delta_rps_minus1+1)
|
delta_rps = int((1 - 2*ps.Delta_rps_sign)) * int(ps.Abs_delta_rps_minus1+1)
|
||||||
|
|
||||||
num_ref_pics = 0
|
num_ref_pics = 0
|
||||||
for j := 0; j <= int(num_delta_pocs); j++ {
|
for j := 0; j <= int(num_delta_pocs); j++ {
|
||||||
ps.used_by_curr_pic_flag[j] = r.ReadBit()
|
ps.Used_by_curr_pic_flag[j] = r.ReadBit()
|
||||||
if ps.used_by_curr_pic_flag[j] == 0 {
|
if ps.Used_by_curr_pic_flag[j] == 0 {
|
||||||
ps.use_delta_flag[j] = r.ReadBit()
|
ps.Use_delta_flag[j] = r.ReadBit()
|
||||||
} else {
|
} 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++
|
num_ref_pics++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,103 +299,103 @@ func (ps *H265RawSTRefPicSet) decode(r *bits.Reader, st_rps_idx uint8, sps *H265
|
|||||||
// an onerous additional requirement.
|
// an onerous additional requirement.
|
||||||
|
|
||||||
d_poc = 0
|
d_poc = 0
|
||||||
for i := 0; i < int(ref.num_negative_pics); i++ {
|
for i := 0; i < int(ref.Num_negative_pics); i++ {
|
||||||
d_poc -= int(ref.delta_poc_s0_minus1[i] + 1)
|
d_poc -= int(ref.Delta_poc_s0_minus1[i] + 1)
|
||||||
ref_delta_poc_s0[i] = d_poc
|
ref_delta_poc_s0[i] = d_poc
|
||||||
}
|
}
|
||||||
d_poc = 0
|
d_poc = 0
|
||||||
for i := 0; i < int(ref.num_positive_pics); i++ {
|
for i := 0; i < int(ref.Num_positive_pics); i++ {
|
||||||
d_poc += int(ref.delta_poc_s1_minus1[i] + 1)
|
d_poc += int(ref.Delta_poc_s1_minus1[i] + 1)
|
||||||
ref_delta_poc_s1[i] = d_poc
|
ref_delta_poc_s1[i] = d_poc
|
||||||
}
|
}
|
||||||
|
|
||||||
i := 0
|
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
|
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
|
delta_poc_s0[i] = d_poc
|
||||||
i++
|
i++
|
||||||
used_by_curr_pic_s0[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
|
delta_poc_s0[i] = delta_rps
|
||||||
i++
|
i++
|
||||||
used_by_curr_pic_s0[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
|
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
|
delta_poc_s0[i] = d_poc
|
||||||
i++
|
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)
|
ps.Num_negative_pics = uint8(i)
|
||||||
for i := 0; i < int(ps.num_negative_pics); i++ {
|
for i := 0; i < int(ps.Num_negative_pics); i++ {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
ps.delta_poc_s0_minus1[i] =
|
ps.Delta_poc_s0_minus1[i] =
|
||||||
uint16(-delta_poc_s0[i] - 1)
|
uint16(-delta_poc_s0[i] - 1)
|
||||||
} else {
|
} else {
|
||||||
ps.delta_poc_s0_minus1[i] =
|
ps.Delta_poc_s0_minus1[i] =
|
||||||
uint16(-(delta_poc_s0[i] - delta_poc_s0[i-1]) - 1)
|
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
|
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
|
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
|
delta_poc_s1[i] = d_poc
|
||||||
i++
|
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
|
delta_poc_s1[i] = delta_rps
|
||||||
i++
|
i++
|
||||||
used_by_curr_pic_s1[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
|
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
|
delta_poc_s1[i] = d_poc
|
||||||
i++
|
i++
|
||||||
used_by_curr_pic_s1[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
|
ps.Num_positive_pics = 1
|
||||||
for i := 0; i < int(ps.num_positive_pics); i++ {
|
for i := 0; i < int(ps.Num_positive_pics); i++ {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
ps.delta_poc_s1_minus1[i] =
|
ps.Delta_poc_s1_minus1[i] =
|
||||||
uint16(delta_poc_s1[i] - 1)
|
uint16(delta_poc_s1[i] - 1)
|
||||||
} else {
|
} else {
|
||||||
ps.delta_poc_s1_minus1[i] =
|
ps.Delta_poc_s1_minus1[i] =
|
||||||
uint16(delta_poc_s1[i] - delta_poc_s1[i-1] - 1)
|
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 {
|
} else {
|
||||||
ps.num_negative_pics = r.ReadUe8()
|
ps.Num_negative_pics = r.ReadUe8()
|
||||||
ps.num_positive_pics = r.ReadUe8()
|
ps.Num_positive_pics = r.ReadUe8()
|
||||||
|
|
||||||
for i := 0; i < int(ps.num_negative_pics); i++ {
|
for i := 0; i < int(ps.Num_negative_pics); i++ {
|
||||||
ps.delta_poc_s0_minus1[i] = r.ReadUe16()
|
ps.Delta_poc_s0_minus1[i] = r.ReadUe16()
|
||||||
ps.used_by_curr_pic_s0_flag[i] = r.ReadBit()
|
ps.Used_by_curr_pic_s0_flag[i] = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < int(ps.num_positive_pics); i++ {
|
for i := 0; i < int(ps.Num_positive_pics); i++ {
|
||||||
ps.delta_poc_s1_minus1[i] = r.ReadUe16()
|
ps.Delta_poc_s1_minus1[i] = r.ReadUe16()
|
||||||
ps.used_by_curr_pic_s1_flag[i] = r.ReadBit()
|
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 {
|
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_max_sub_layers_minus1 uint8
|
||||||
sps_temporal_id_nesting_flag 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
|
Chroma_format_idc uint8
|
||||||
separate_colour_plane_flag uint8
|
Separate_colour_plane_flag uint8
|
||||||
|
|
||||||
pic_width_in_luma_samples uint16
|
Pic_width_in_luma_samples uint16
|
||||||
pic_height_in_luma_samples uint16
|
Pic_height_in_luma_samples uint16
|
||||||
|
|
||||||
conformance_window_flag uint8
|
Conformance_window_flag uint8
|
||||||
conf_win_left_offset uint16
|
Conf_win_left_offset uint16
|
||||||
conf_win_right_offset uint16
|
Conf_win_right_offset uint16
|
||||||
conf_win_top_offset uint16
|
Conf_win_top_offset uint16
|
||||||
conf_win_bottom_offset uint16
|
Conf_win_bottom_offset uint16
|
||||||
|
|
||||||
bit_depth_luma_minus8 uint8
|
Bit_depth_luma_minus8 uint8
|
||||||
bit_depth_chroma_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_sub_layer_ordering_info_present_flag uint8
|
||||||
sps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
Sps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sps_max_num_reorder_pics [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_max_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32
|
||||||
|
|
||||||
log2_min_luma_coding_block_size_minus3 uint8
|
Log2_min_luma_coding_block_size_minus3 uint8
|
||||||
log2_diff_max_min_luma_coding_block_size uint8
|
Log2_diff_max_min_luma_coding_block_size uint8
|
||||||
log2_min_luma_transform_block_size_minus2 uint8
|
Log2_min_luma_transform_block_size_minus2 uint8
|
||||||
log2_diff_max_min_luma_transform_block_size uint8
|
Log2_diff_max_min_luma_transform_block_size uint8
|
||||||
max_transform_hierarchy_depth_inter uint8
|
Max_transform_hierarchy_depth_inter uint8
|
||||||
max_transform_hierarchy_depth_intra uint8
|
Max_transform_hierarchy_depth_intra uint8
|
||||||
|
|
||||||
scaling_list_enabled_flag uint8
|
Scaling_list_enabled_flag uint8
|
||||||
sps_scaling_list_data_present_flag uint8
|
Sps_scaling_list_data_present_flag uint8
|
||||||
scaling_list *H265RawScalingList
|
Scaling_list *H265RawScalingList
|
||||||
|
|
||||||
amp_enabled_flag uint8
|
Amp_enabled_flag uint8
|
||||||
sample_adaptive_offset_enabled_flag uint8
|
Sample_adaptive_offset_enabled_flag uint8
|
||||||
|
|
||||||
pcm_enabled_flag uint8
|
Pcm_enabled_flag uint8
|
||||||
pcm_sample_bit_depth_luma_minus1 uint8
|
Pcm_sample_bit_depth_luma_minus1 uint8
|
||||||
pcm_sample_bit_depth_chroma_minus1 uint8
|
Pcm_sample_bit_depth_chroma_minus1 uint8
|
||||||
log2_min_pcm_luma_coding_block_size_minus3 uint8
|
Log2_min_pcm_luma_coding_block_size_minus3 uint8
|
||||||
log2_diff_max_min_pcm_luma_coding_block_size uint8
|
Log2_diff_max_min_pcm_luma_coding_block_size uint8
|
||||||
pcm_loop_filter_disabled_flag uint8
|
Pcm_loop_filter_disabled_flag uint8
|
||||||
|
|
||||||
num_short_term_ref_pic_sets uint8
|
Num_short_term_ref_pic_sets uint8
|
||||||
st_ref_pic_set []H265RawSTRefPicSet //[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]H265RawSTRefPicSet
|
St_ref_pic_set []H265RawSTRefPicSet //[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]H265RawSTRefPicSet
|
||||||
|
|
||||||
long_term_ref_pics_present_flag uint8
|
Long_term_ref_pics_present_flag uint8
|
||||||
num_long_term_ref_pics_sps uint8
|
Num_long_term_ref_pics_sps uint8
|
||||||
lt_ref_pic_poc_lsb_sps [HEVC_MAX_LONG_TERM_REF_PICS]uint16
|
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
|
Used_by_curr_pic_lt_sps_flag [HEVC_MAX_LONG_TERM_REF_PICS]uint8
|
||||||
|
|
||||||
sps_temporal_mvp_enabled_flag uint8
|
Sps_temporal_mvp_enabled_flag uint8
|
||||||
strong_intra_smoothing_enabled_flag uint8
|
Strong_intra_smoothing_enabled_flag uint8
|
||||||
|
|
||||||
vui_parameters_present_flag uint8
|
Vui_parameters_present_flag uint8
|
||||||
vui H265RawVUI
|
Vui H265RawVUI
|
||||||
|
|
||||||
sps_extension_present_flag uint8
|
Sps_extension_present_flag uint8
|
||||||
sps_range_extension_flag uint8
|
Sps_range_extension_flag uint8
|
||||||
sps_multilayer_extension_flag uint8
|
Sps_multilayer_extension_flag uint8
|
||||||
sps_3d_extension_flag uint8
|
Sps_3d_extension_flag uint8
|
||||||
sps_scc_extension_flag uint8
|
Sps_scc_extension_flag uint8
|
||||||
sps_extension_4bits uint8
|
Sps_extension_4bits uint8
|
||||||
|
|
||||||
// extension_data H265RawExtensionData
|
// extension_data H265RawExtensionData
|
||||||
|
|
||||||
@@ -506,26 +506,26 @@ type H265RawSPS struct {
|
|||||||
|
|
||||||
// Width 视频宽度(像素)
|
// Width 视频宽度(像素)
|
||||||
func (sps *H265RawSPS) Width() int {
|
func (sps *H265RawSPS) Width() int {
|
||||||
return int(sps.pic_width_in_luma_samples)
|
return int(sps.Pic_width_in_luma_samples)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Height 视频高度(像素)
|
// Height 视频高度(像素)
|
||||||
func (sps *H265RawSPS) Height() int {
|
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
|
// FrameRate Video frame rate
|
||||||
func (sps *H265RawSPS) FrameRate() float64 {
|
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 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 是否固定帧率
|
// IsFixedFrameRate 是否固定帧率
|
||||||
func (sps *H265RawSPS) IsFixedFrameRate() bool {
|
func (sps *H265RawSPS) IsFixedFrameRate() bool {
|
||||||
// TODO:
|
// TODO:
|
||||||
return true
|
return sps.FrameRate() > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecodeString 从 base64 字串解码 sps NAL
|
// DecodeString 从 base64 字串解码 sps NAL
|
||||||
@@ -551,150 +551,150 @@ func (sps *H265RawSPS) Decode(data []byte) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
r := bits.NewReader(spsWEB)
|
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
|
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")
|
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_max_sub_layers_minus1 = r.ReadUint8(3)
|
||||||
sps.sps_temporal_id_nesting_flag = r.ReadBit()
|
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 {
|
if err = sps.Profile_tier_level.decode(r, true, int(sps.Sps_max_sub_layers_minus1)); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.sps_seq_parameter_set_id = r.ReadUe8()
|
sps.Sps_seq_parameter_set_id = r.ReadUe8()
|
||||||
|
|
||||||
sps.chroma_format_idc = r.ReadUe8()
|
sps.Chroma_format_idc = r.ReadUe8()
|
||||||
if sps.chroma_format_idc == 3 {
|
if sps.Chroma_format_idc == 3 {
|
||||||
sps.separate_colour_plane_flag = r.ReadBit()
|
sps.Separate_colour_plane_flag = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.pic_width_in_luma_samples = r.ReadUe16()
|
sps.Pic_width_in_luma_samples = r.ReadUe16()
|
||||||
sps.pic_height_in_luma_samples = r.ReadUe16()
|
sps.Pic_height_in_luma_samples = r.ReadUe16()
|
||||||
|
|
||||||
sps.conformance_window_flag = r.ReadBit()
|
sps.Conformance_window_flag = r.ReadBit()
|
||||||
if sps.conformance_window_flag == 1 {
|
if sps.Conformance_window_flag == 1 {
|
||||||
sps.conf_win_left_offset = r.ReadUe16()
|
sps.Conf_win_left_offset = r.ReadUe16()
|
||||||
sps.conf_win_right_offset = r.ReadUe16()
|
sps.Conf_win_right_offset = r.ReadUe16()
|
||||||
sps.conf_win_top_offset = r.ReadUe16()
|
sps.Conf_win_top_offset = r.ReadUe16()
|
||||||
sps.conf_win_bottom_offset = r.ReadUe16()
|
sps.Conf_win_bottom_offset = r.ReadUe16()
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.bit_depth_luma_minus8 = r.ReadUe8()
|
sps.Bit_depth_luma_minus8 = r.ReadUe8()
|
||||||
sps.bit_depth_chroma_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)
|
loopStart := uint8(0)
|
||||||
if sps.sps_sub_layer_ordering_info_present_flag == 1 {
|
if sps.Sps_sub_layer_ordering_info_present_flag == 1 {
|
||||||
loopStart = sps.sps_max_sub_layers_minus1
|
loopStart = sps.Sps_max_sub_layers_minus1
|
||||||
}
|
}
|
||||||
for i := loopStart; i <= sps.sps_max_sub_layers_minus1; i++ {
|
for i := loopStart; i <= sps.Sps_max_sub_layers_minus1; i++ {
|
||||||
sps.sps_max_dec_pic_buffering_minus1[i] = r.ReadUe8()
|
sps.Sps_max_dec_pic_buffering_minus1[i] = r.ReadUe8()
|
||||||
sps.sps_max_num_reorder_pics[i] = r.ReadUe8()
|
sps.Sps_max_num_reorder_pics[i] = r.ReadUe8()
|
||||||
sps.sps_max_latency_increase_plus1[i] = r.ReadUe()
|
sps.Sps_max_latency_increase_plus1[i] = r.ReadUe()
|
||||||
}
|
}
|
||||||
|
|
||||||
if sps.sps_sub_layer_ordering_info_present_flag == 0 {
|
if sps.Sps_sub_layer_ordering_info_present_flag == 0 {
|
||||||
for i := uint8(0); i < sps.sps_max_sub_layers_minus1; i++ {
|
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[i] =
|
||||||
sps.sps_max_dec_pic_buffering_minus1[sps.sps_max_sub_layers_minus1]
|
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[i] =
|
||||||
sps.sps_max_num_reorder_pics[sps.sps_max_sub_layers_minus1]
|
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[i] =
|
||||||
sps.sps_max_latency_increase_plus1[sps.sps_max_sub_layers_minus1]
|
sps.Sps_max_latency_increase_plus1[sps.Sps_max_sub_layers_minus1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.log2_min_luma_coding_block_size_minus3 = r.ReadUe8()
|
sps.Log2_min_luma_coding_block_size_minus3 = r.ReadUe8()
|
||||||
min_cb_log2_size_y := sps.log2_min_luma_coding_block_size_minus3 + 3
|
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 +
|
// ctb_log2_size_y := min_cb_log2_size_y +
|
||||||
// sps.log2_diff_max_min_luma_coding_block_size
|
// sps.log2_diff_max_min_luma_coding_block_size
|
||||||
|
|
||||||
min_cb_size_y := uint16(1) << min_cb_log2_size_y
|
min_cb_size_y := uint16(1) << min_cb_log2_size_y
|
||||||
if (sps.pic_width_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 {
|
(sps.Pic_height_in_luma_samples%min_cb_size_y) > 0 {
|
||||||
return fmt.Errorf("Invalid dimensions: %v%v not divisible by MinCbSizeY = %v.\n",
|
return fmt.Errorf("Invalid dimensions: %v%v not divisible by MinCbSizeY = %v.\n",
|
||||||
sps.pic_width_in_luma_samples,
|
sps.Pic_width_in_luma_samples,
|
||||||
sps.pic_height_in_luma_samples,
|
sps.Pic_height_in_luma_samples,
|
||||||
min_cb_size_y)
|
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
|
// 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_inter = r.ReadUe8()
|
||||||
sps.max_transform_hierarchy_depth_intra = r.ReadUe8()
|
sps.Max_transform_hierarchy_depth_intra = r.ReadUe8()
|
||||||
|
|
||||||
sps.scaling_list_enabled_flag = r.ReadBit()
|
sps.Scaling_list_enabled_flag = r.ReadBit()
|
||||||
if sps.scaling_list_enabled_flag == 1 {
|
if sps.Scaling_list_enabled_flag == 1 {
|
||||||
sps.sps_scaling_list_data_present_flag = r.ReadBit()
|
sps.Sps_scaling_list_data_present_flag = r.ReadBit()
|
||||||
if sps.sps_scaling_list_data_present_flag == 1 {
|
if sps.Sps_scaling_list_data_present_flag == 1 {
|
||||||
sps.scaling_list = new(H265RawScalingList)
|
sps.Scaling_list = new(H265RawScalingList)
|
||||||
sps.scaling_list.decode(r)
|
sps.Scaling_list.decode(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.amp_enabled_flag = r.ReadBit()
|
sps.Amp_enabled_flag = r.ReadBit()
|
||||||
sps.sample_adaptive_offset_enabled_flag = r.ReadBit()
|
sps.Sample_adaptive_offset_enabled_flag = r.ReadBit()
|
||||||
|
|
||||||
sps.pcm_enabled_flag = r.ReadBit()
|
sps.Pcm_enabled_flag = r.ReadBit()
|
||||||
if sps.pcm_enabled_flag == 1 {
|
if sps.Pcm_enabled_flag == 1 {
|
||||||
sps.pcm_sample_bit_depth_luma_minus1 = r.ReadUint8(4)
|
sps.Pcm_sample_bit_depth_luma_minus1 = r.ReadUint8(4)
|
||||||
sps.pcm_sample_bit_depth_chroma_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_min_pcm_luma_coding_block_size_minus3 = r.ReadUe8()
|
||||||
sps.log2_diff_max_min_pcm_luma_coding_block_size = 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()
|
sps.Num_short_term_ref_pic_sets = r.ReadUe8()
|
||||||
if sps.num_short_term_ref_pic_sets > 0 {
|
if sps.Num_short_term_ref_pic_sets > 0 {
|
||||||
sps.st_ref_pic_set = make([]H265RawSTRefPicSet, sps.num_short_term_ref_pic_sets)
|
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++ {
|
for i := uint8(0); i < sps.Num_short_term_ref_pic_sets; i++ {
|
||||||
sps.st_ref_pic_set[i].decode(r, i, sps)
|
sps.St_ref_pic_set[i].decode(r, i, sps)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.long_term_ref_pics_present_flag = r.ReadBit()
|
sps.Long_term_ref_pics_present_flag = r.ReadBit()
|
||||||
if sps.long_term_ref_pics_present_flag == 1 {
|
if sps.Long_term_ref_pics_present_flag == 1 {
|
||||||
sps.num_long_term_ref_pics_sps = r.ReadUe8()
|
sps.Num_long_term_ref_pics_sps = r.ReadUe8()
|
||||||
for i := uint8(0); i < sps.num_long_term_ref_pics_sps; i++ {
|
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.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.Used_by_curr_pic_lt_sps_flag[i] = r.ReadBit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sps.sps_temporal_mvp_enabled_flag = r.ReadBit()
|
sps.Sps_temporal_mvp_enabled_flag = r.ReadBit()
|
||||||
sps.strong_intra_smoothing_enabled_flag = r.ReadBit()
|
sps.Strong_intra_smoothing_enabled_flag = r.ReadBit()
|
||||||
|
|
||||||
sps.vui_parameters_present_flag = r.ReadBit()
|
sps.Vui_parameters_present_flag = r.ReadBit()
|
||||||
if sps.vui_parameters_present_flag == 1 {
|
if sps.Vui_parameters_present_flag == 1 {
|
||||||
sps.vui.decode(r, sps)
|
sps.Vui.decode(r, sps)
|
||||||
} else {
|
} 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 {
|
if sps.Sps_extension_present_flag == 1 {
|
||||||
sps.sps_range_extension_flag = r.ReadBit()
|
sps.Sps_range_extension_flag = r.ReadBit()
|
||||||
sps.sps_multilayer_extension_flag = r.ReadBit()
|
sps.Sps_multilayer_extension_flag = r.ReadBit()
|
||||||
sps.sps_3d_extension_flag = r.ReadBit()
|
sps.Sps_3d_extension_flag = r.ReadBit()
|
||||||
sps.sps_scc_extension_flag = r.ReadBit()
|
sps.Sps_scc_extension_flag = r.ReadBit()
|
||||||
sps.sps_extension_4bits = r.ReadUint8(4)
|
sps.Sps_extension_4bits = r.ReadUint8(4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (sps.sps_range_extension_flag)
|
// if (sps.sps_range_extension_flag)
|
||||||
|
@@ -17,74 +17,74 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type H265RawNALUnitHeader struct {
|
type H265RawNALUnitHeader struct {
|
||||||
nal_unit_type uint8
|
Nal_unit_type uint8
|
||||||
nuh_layer_id uint8
|
Nuh_layer_id uint8
|
||||||
nuh_temporal_id_plus1 uint8
|
Nuh_temporal_id_plus1 uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *H265RawNALUnitHeader) decode(r *bits.Reader) (err error) {
|
func (h *H265RawNALUnitHeader) decode(r *bits.Reader) (err error) {
|
||||||
r.Skip(1) //forbidden_zero_bit
|
r.Skip(1) //forbidden_zero_bit
|
||||||
h.nal_unit_type = r.ReadUint8(6)
|
h.Nal_unit_type = r.ReadUint8(6)
|
||||||
h.nuh_layer_id = r.ReadUint8(6)
|
h.Nuh_layer_id = r.ReadUint8(6)
|
||||||
h.nuh_temporal_id_plus1 = r.ReadUint8(3)
|
h.Nuh_temporal_id_plus1 = r.ReadUint8(3)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type H265RawProfileTierLevel struct {
|
type H265RawProfileTierLevel struct {
|
||||||
general_profile_space uint8
|
General_profile_space uint8
|
||||||
general_tier_flag uint8
|
General_tier_flag uint8
|
||||||
general_profile_idc uint8
|
General_profile_idc uint8
|
||||||
|
|
||||||
general_profile_compatibility_flag [32]uint8
|
General_profile_compatibility_flag [32]uint8
|
||||||
|
|
||||||
general_progressive_source_flag uint8
|
General_progressive_source_flag uint8
|
||||||
general_interlaced_source_flag uint8
|
General_interlaced_source_flag uint8
|
||||||
general_non_packed_constraint_flag uint8
|
General_non_packed_constraint_flag uint8
|
||||||
general_frame_only_constraint_flag uint8
|
General_frame_only_constraint_flag uint8
|
||||||
|
|
||||||
general_max_12bit_constraint_flag uint8
|
General_max_12bit_constraint_flag uint8
|
||||||
general_max_10bit_constraint_flag uint8
|
General_max_10bit_constraint_flag uint8
|
||||||
general_max_8bit_constraint_flag uint8
|
General_max_8bit_constraint_flag uint8
|
||||||
general_max_422chroma_constraint_flag uint8
|
General_max_422chroma_constraint_flag uint8
|
||||||
general_max_420chroma_constraint_flag uint8
|
General_max_420chroma_constraint_flag uint8
|
||||||
general_max_monochrome_constraint_flag uint8
|
General_max_monochrome_constraint_flag uint8
|
||||||
general_intra_constraint_flag uint8
|
General_intra_constraint_flag uint8
|
||||||
general_one_picture_only_constraint_flag uint8
|
General_one_picture_only_constraint_flag uint8
|
||||||
general_lower_bit_rate_constraint_flag uint8
|
General_lower_bit_rate_constraint_flag uint8
|
||||||
general_max_14bit_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_profile_present_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_level_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_profile_space [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_tier_flag [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_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_progressive_source_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_interlaced_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_non_packed_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_frame_only_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_12bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_max_10bit_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_8bit_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_max_422chroma_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_420chroma_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_max_monochrome_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_intra_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_one_picture_only_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_lower_bit_rate_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
sub_layer_max_14bit_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 {
|
type profile_compatible struct {
|
||||||
profile_idc uint8
|
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) {
|
profile_present_flag bool, max_num_sub_layers_minus1 int) (err error) {
|
||||||
|
|
||||||
if profile_present_flag {
|
if profile_present_flag {
|
||||||
ptl.general_profile_space = r.ReadUint8(2)
|
ptl.General_profile_space = r.ReadUint8(2)
|
||||||
ptl.general_tier_flag = r.ReadBit()
|
ptl.General_tier_flag = r.ReadBit()
|
||||||
ptl.general_profile_idc = r.ReadUint8(5)
|
ptl.General_profile_idc = r.ReadUint8(5)
|
||||||
|
|
||||||
for j := 0; j < 32; j++ {
|
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_progressive_source_flag = r.ReadBit()
|
||||||
ptl.general_interlaced_source_flag = r.ReadBit()
|
ptl.General_interlaced_source_flag = r.ReadBit()
|
||||||
ptl.general_non_packed_constraint_flag = r.ReadBit()
|
ptl.General_non_packed_constraint_flag = r.ReadBit()
|
||||||
ptl.general_frame_only_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) ||
|
if pc.compatible(4) || pc.compatible(5) ||
|
||||||
pc.compatible(6) || pc.compatible(7) ||
|
pc.compatible(6) || pc.compatible(7) ||
|
||||||
pc.compatible(8) || pc.compatible(9) ||
|
pc.compatible(8) || pc.compatible(9) ||
|
||||||
pc.compatible(10) {
|
pc.compatible(10) {
|
||||||
ptl.general_max_12bit_constraint_flag = r.ReadBit()
|
ptl.General_max_12bit_constraint_flag = r.ReadBit()
|
||||||
ptl.general_max_10bit_constraint_flag = r.ReadBit()
|
ptl.General_max_10bit_constraint_flag = r.ReadBit()
|
||||||
ptl.general_max_8bit_constraint_flag = r.ReadBit()
|
ptl.General_max_8bit_constraint_flag = r.ReadBit()
|
||||||
ptl.general_max_422chroma_constraint_flag = r.ReadBit()
|
ptl.General_max_422chroma_constraint_flag = r.ReadBit()
|
||||||
ptl.general_max_420chroma_constraint_flag = r.ReadBit()
|
ptl.General_max_420chroma_constraint_flag = r.ReadBit()
|
||||||
ptl.general_max_monochrome_constraint_flag = r.ReadBit()
|
ptl.General_max_monochrome_constraint_flag = r.ReadBit()
|
||||||
ptl.general_intra_constraint_flag = r.ReadBit()
|
ptl.General_intra_constraint_flag = r.ReadBit()
|
||||||
ptl.general_one_picture_only_constraint_flag = r.ReadBit()
|
ptl.General_one_picture_only_constraint_flag = r.ReadBit()
|
||||||
ptl.general_lower_bit_rate_constraint_flag = r.ReadBit()
|
ptl.General_lower_bit_rate_constraint_flag = r.ReadBit()
|
||||||
|
|
||||||
if pc.compatible(5) || pc.compatible(9) || pc.compatible(10) {
|
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
|
r.Skip(33) // general_reserved_zero_33bits
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -136,7 +136,7 @@ func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader,
|
|||||||
}
|
}
|
||||||
} else if pc.compatible(2) {
|
} else if pc.compatible(2) {
|
||||||
r.Skip(7) // general_reserved_zero_7bits
|
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
|
r.Skip(35) // general_reserved_zero_35bits
|
||||||
} else {
|
} else {
|
||||||
r.Skip(43) // general_reserved_zero_43bits
|
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) ||
|
if pc.compatible(1) || pc.compatible(2) ||
|
||||||
pc.compatible(3) || pc.compatible(4) ||
|
pc.compatible(3) || pc.compatible(4) ||
|
||||||
pc.compatible(5) || pc.compatible(9) {
|
pc.compatible(5) || pc.compatible(9) {
|
||||||
ptl.general_inbld_flag = r.ReadBit()
|
ptl.General_inbld_flag = r.ReadBit()
|
||||||
} else {
|
} else {
|
||||||
r.Skip(1) // general_reserved_zero_bit
|
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++ {
|
for i := 0; i < max_num_sub_layers_minus1; i++ {
|
||||||
ptl.sub_layer_profile_present_flag[i] = r.ReadBit()
|
ptl.Sub_layer_profile_present_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_level_present_flag[i] = r.ReadBit()
|
ptl.Sub_layer_level_present_flag[i] = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
if max_num_sub_layers_minus1 > 0 {
|
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++ {
|
for i := 0; i < max_num_sub_layers_minus1; i++ {
|
||||||
if ptl.sub_layer_profile_present_flag[i] == 1 {
|
if ptl.Sub_layer_profile_present_flag[i] == 1 {
|
||||||
ptl.sub_layer_profile_space[i] = r.ReadUint8(2)
|
ptl.Sub_layer_profile_space[i] = r.ReadUint8(2)
|
||||||
ptl.sub_layer_tier_flag[i] = r.ReadBit()
|
ptl.Sub_layer_tier_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_profile_idc[i] = r.ReadUint8(5)
|
ptl.Sub_layer_profile_idc[i] = r.ReadUint8(5)
|
||||||
|
|
||||||
for j := 0; j < 32; j++ {
|
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_progressive_source_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_interlaced_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_non_packed_constraint_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_frame_only_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) ||
|
if pc.compatible(4) || pc.compatible(5) ||
|
||||||
pc.compatible(6) || pc.compatible(7) ||
|
pc.compatible(6) || pc.compatible(7) ||
|
||||||
pc.compatible(8) || pc.compatible(9) ||
|
pc.compatible(8) || pc.compatible(9) ||
|
||||||
pc.compatible(10) {
|
pc.compatible(10) {
|
||||||
ptl.sub_layer_max_12bit_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_10bit_constraint_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_max_8bit_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_422chroma_constraint_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_max_420chroma_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_max_monochrome_constraint_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_intra_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_one_picture_only_constraint_flag[i] = r.ReadBit()
|
||||||
ptl.sub_layer_lower_bit_rate_constraint_flag[i] = r.ReadBit()
|
ptl.Sub_layer_lower_bit_rate_constraint_flag[i] = r.ReadBit()
|
||||||
|
|
||||||
if pc.compatible(5) {
|
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
|
r.Skip(33) // sub_layer_reserved_zero_33bits
|
||||||
} else {
|
} else {
|
||||||
r.Skip(34) // sub_layer_reserved_zero_34bits
|
r.Skip(34) // sub_layer_reserved_zero_34bits
|
||||||
}
|
}
|
||||||
} else if pc.compatible(2) {
|
} else if pc.compatible(2) {
|
||||||
r.Skip(7) // sub_layer_reserved_zero_7bits
|
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
|
r.Skip(35) // sub_layer_reserved_zero_35bits
|
||||||
} else {
|
} else {
|
||||||
r.Skip(43) // sub_layer_reserved_zero_43bits
|
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) ||
|
if pc.compatible(1) || pc.compatible(2) ||
|
||||||
pc.compatible(3) || pc.compatible(4) ||
|
pc.compatible(3) || pc.compatible(4) ||
|
||||||
pc.compatible(5) || pc.compatible(9) {
|
pc.compatible(5) || pc.compatible(9) {
|
||||||
ptl.sub_layer_inbld_flag[i] = r.ReadBit()
|
ptl.Sub_layer_inbld_flag[i] = r.ReadBit()
|
||||||
} else {
|
} else {
|
||||||
r.Skip(1) // sub_layer_reserved_zero_bit
|
r.Skip(1) // sub_layer_reserved_zero_bit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ptl.sub_layer_level_present_flag[i] == 1 {
|
if ptl.Sub_layer_level_present_flag[i] == 1 {
|
||||||
ptl.sub_layer_level_idc[i] = r.ReadUint8(8)
|
ptl.Sub_layer_level_idc[i] = r.ReadUint8(8)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type H265RawSubLayerHRDParameters struct {
|
type H265RawSubLayerHRDParameters struct {
|
||||||
bit_rate_value_minus1 [HEVC_MAX_CPB_CNT]uint32
|
Bit_rate_value_minus1 [HEVC_MAX_CPB_CNT]uint32
|
||||||
cpb_size_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
|
Cpb_size_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32
|
||||||
bit_rate_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
|
Cbr_flag [HEVC_MAX_CPB_CNT]uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (shrd *H265RawSubLayerHRDParameters) decode(r *bits.Reader,
|
func (shrd *H265RawSubLayerHRDParameters) decode(r *bits.Reader,
|
||||||
sub_pic_hrd_params_present_flag bool, cpb_cnt_minus1 int) (err error) {
|
sub_pic_hrd_params_present_flag bool, cpb_cnt_minus1 int) (err error) {
|
||||||
for i := 0; i <= cpb_cnt_minus1; i++ {
|
for i := 0; i <= cpb_cnt_minus1; i++ {
|
||||||
shrd.bit_rate_value_minus1[i] = r.ReadUe()
|
shrd.Bit_rate_value_minus1[i] = r.ReadUe()
|
||||||
shrd.cpb_size_value_minus1[i] = r.ReadUe()
|
shrd.Cpb_size_value_minus1[i] = r.ReadUe()
|
||||||
if sub_pic_hrd_params_present_flag {
|
if sub_pic_hrd_params_present_flag {
|
||||||
shrd.cpb_size_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.Bit_rate_du_value_minus1[i] = r.ReadUe()
|
||||||
}
|
}
|
||||||
shrd.cbr_flag[i] = r.ReadBit()
|
shrd.Cbr_flag[i] = r.ReadBit()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type H265RawHRDParameters struct {
|
type H265RawHRDParameters struct {
|
||||||
nal_hrd_parameters_present_flag uint8
|
Nal_hrd_parameters_present_flag uint8
|
||||||
vcl_hrd_parameters_present_flag uint8
|
Vcl_hrd_parameters_present_flag uint8
|
||||||
|
|
||||||
sub_pic_hrd_params_present_flag uint8
|
Sub_pic_hrd_params_present_flag uint8
|
||||||
tick_divisor_minus2 uint8
|
Tick_divisor_minus2 uint8
|
||||||
du_cpb_removal_delay_increment_length_minus1 uint8
|
Du_cpb_removal_delay_increment_length_minus1 uint8
|
||||||
sub_pic_cpb_params_in_pic_timing_sei_flag uint8
|
Sub_pic_cpb_params_in_pic_timing_sei_flag uint8
|
||||||
dpb_output_delay_du_length_minus1 uint8
|
Dpb_output_delay_du_length_minus1 uint8
|
||||||
|
|
||||||
bit_rate_scale uint8
|
Bit_rate_scale uint8
|
||||||
cpb_size_scale uint8
|
Cpb_size_scale uint8
|
||||||
cpb_size_du_scale uint8
|
Cpb_size_du_scale uint8
|
||||||
|
|
||||||
initial_cpb_removal_delay_length_minus1 uint8
|
Initial_cpb_removal_delay_length_minus1 uint8
|
||||||
au_cpb_removal_delay_length_minus1 uint8
|
Au_cpb_removal_delay_length_minus1 uint8
|
||||||
dpb_output_delay_length_minus1 uint8
|
Dpb_output_delay_length_minus1 uint8
|
||||||
|
|
||||||
fixed_pic_rate_general_flag [HEVC_MAX_SUB_LAYERS]uint8
|
Fixed_pic_rate_general_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
fixed_pic_rate_within_cvs_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
|
Elemental_duration_in_tc_minus1 [HEVC_MAX_SUB_LAYERS]uint16
|
||||||
low_delay_hrd_flag [HEVC_MAX_SUB_LAYERS]uint8
|
Low_delay_hrd_flag [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
cpb_cnt_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
Cpb_cnt_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
nal_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters
|
Nal_sub_layer_hrd_parameters [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters
|
||||||
vcl_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,
|
func (hrd *H265RawHRDParameters) decode(r *bits.Reader,
|
||||||
common_inf_present_flag bool, max_num_sub_layers_minus1 int) (err error) {
|
common_inf_present_flag bool, max_num_sub_layers_minus1 int) (err error) {
|
||||||
if common_inf_present_flag {
|
if common_inf_present_flag {
|
||||||
hrd.nal_hrd_parameters_present_flag = r.ReadBit()
|
hrd.Nal_hrd_parameters_present_flag = r.ReadBit()
|
||||||
hrd.vcl_hrd_parameters_present_flag = r.ReadBit()
|
hrd.Vcl_hrd_parameters_present_flag = r.ReadBit()
|
||||||
|
|
||||||
if hrd.nal_hrd_parameters_present_flag == 1 ||
|
if hrd.Nal_hrd_parameters_present_flag == 1 ||
|
||||||
hrd.vcl_hrd_parameters_present_flag == 1 {
|
hrd.Vcl_hrd_parameters_present_flag == 1 {
|
||||||
hrd.sub_pic_hrd_params_present_flag = r.ReadBit()
|
hrd.Sub_pic_hrd_params_present_flag = r.ReadBit()
|
||||||
if hrd.sub_pic_hrd_params_present_flag == 1 {
|
if hrd.Sub_pic_hrd_params_present_flag == 1 {
|
||||||
hrd.tick_divisor_minus2 = r.ReadUint8(8)
|
hrd.Tick_divisor_minus2 = r.ReadUint8(8)
|
||||||
hrd.du_cpb_removal_delay_increment_length_minus1 = r.ReadUint8(5)
|
hrd.Du_cpb_removal_delay_increment_length_minus1 = r.ReadUint8(5)
|
||||||
hrd.sub_pic_cpb_params_in_pic_timing_sei_flag = r.ReadBit()
|
hrd.Sub_pic_cpb_params_in_pic_timing_sei_flag = r.ReadBit()
|
||||||
hrd.dpb_output_delay_du_length_minus1 = r.ReadUint8(5)
|
hrd.Dpb_output_delay_du_length_minus1 = r.ReadUint8(5)
|
||||||
}
|
}
|
||||||
|
|
||||||
hrd.bit_rate_scale = r.ReadUint8(4)
|
hrd.Bit_rate_scale = r.ReadUint8(4)
|
||||||
hrd.cpb_size_scale = r.ReadUint8(4)
|
hrd.Cpb_size_scale = r.ReadUint8(4)
|
||||||
if hrd.sub_pic_hrd_params_present_flag == 1 {
|
if hrd.Sub_pic_hrd_params_present_flag == 1 {
|
||||||
hrd.cpb_size_du_scale = r.ReadUint8(4)
|
hrd.Cpb_size_du_scale = r.ReadUint8(4)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hrd.initial_cpb_removal_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.Au_cpb_removal_delay_length_minus1 = r.ReadUint8(5)
|
||||||
hrd.dpb_output_delay_length_minus1 = r.ReadUint8(5)
|
hrd.Dpb_output_delay_length_minus1 = r.ReadUint8(5)
|
||||||
} else {
|
} 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.Initial_cpb_removal_delay_length_minus1 = 23
|
||||||
hrd.au_cpb_removal_delay_length_minus1 = 23
|
hrd.Au_cpb_removal_delay_length_minus1 = 23
|
||||||
hrd.dpb_output_delay_length_minus1 = 23
|
hrd.Dpb_output_delay_length_minus1 = 23
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i <= max_num_sub_layers_minus1; i++ {
|
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
|
hrd.Fixed_pic_rate_within_cvs_flag[i] = 1
|
||||||
if hrd.fixed_pic_rate_general_flag[i] == 0 {
|
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] = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
if hrd.fixed_pic_rate_within_cvs_flag[i] == 1 {
|
if hrd.Fixed_pic_rate_within_cvs_flag[i] == 1 {
|
||||||
hrd.elemental_duration_in_tc_minus1[i] = r.ReadUe16()
|
hrd.Elemental_duration_in_tc_minus1[i] = r.ReadUe16()
|
||||||
hrd.low_delay_hrd_flag[i] = 0
|
hrd.Low_delay_hrd_flag[i] = 0
|
||||||
} else {
|
} else {
|
||||||
hrd.low_delay_hrd_flag[i] = r.ReadBit()
|
hrd.Low_delay_hrd_flag[i] = r.ReadBit()
|
||||||
}
|
}
|
||||||
|
|
||||||
hrd.cpb_cnt_minus1[i] = 0
|
hrd.Cpb_cnt_minus1[i] = 0
|
||||||
if hrd.low_delay_hrd_flag[i] == 0 {
|
if hrd.Low_delay_hrd_flag[i] == 0 {
|
||||||
hrd.cpb_cnt_minus1[i] = r.ReadUe8()
|
hrd.Cpb_cnt_minus1[i] = r.ReadUe8()
|
||||||
}
|
}
|
||||||
|
|
||||||
if hrd.nal_hrd_parameters_present_flag == 1 {
|
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]))
|
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 {
|
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]))
|
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 {
|
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_internal_flag uint8
|
||||||
vps_base_layer_available_flag uint8
|
Vps_base_layer_available_flag uint8
|
||||||
vps_max_layers_minus1 uint8
|
Vps_max_layers_minus1 uint8
|
||||||
vps_max_sub_layers_minus1 uint8
|
Vps_max_sub_layers_minus1 uint8
|
||||||
vps_temporal_id_nesting_flag uint8
|
Vps_temporal_id_nesting_flag uint8
|
||||||
|
|
||||||
profile_tier_level H265RawProfileTierLevel
|
Profile_tier_level H265RawProfileTierLevel
|
||||||
|
|
||||||
vps_sub_layer_ordering_info_present_flag uint8
|
Vps_sub_layer_ordering_info_present_flag uint8
|
||||||
vps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
Vps_max_dec_pic_buffering_minus1 [HEVC_MAX_SUB_LAYERS]uint8
|
||||||
vps_max_num_reorder_pics [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_latency_increase_plus1 [HEVC_MAX_SUB_LAYERS]uint32
|
||||||
|
|
||||||
vps_max_layer_id uint8
|
Vps_max_layer_id uint8
|
||||||
vps_num_layer_sets_minus1 uint16
|
Vps_num_layer_sets_minus1 uint16
|
||||||
layer_id_included_flag [][HEVC_MAX_LAYERS]uint8 //[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]uint8
|
Layer_id_included_flag [][HEVC_MAX_LAYERS]uint8 //[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]uint8
|
||||||
|
|
||||||
vps_timing_info_present_flag uint8
|
Vps_timing_info_present_flag uint8
|
||||||
vps_num_units_in_tick uint32
|
Vps_num_units_in_tick uint32
|
||||||
vps_time_scale uint32
|
Vps_time_scale uint32
|
||||||
vps_poc_proportional_to_timing_flag uint8
|
Vps_poc_proportional_to_timing_flag uint8
|
||||||
vps_num_ticks_poc_diff_one_minus1 uint32
|
Vps_num_ticks_poc_diff_one_minus1 uint32
|
||||||
vps_num_hrd_parameters uint16
|
Vps_num_hrd_parameters uint16
|
||||||
hrd_layer_set_idx []uint16 //[HEVC_MAX_LAYER_SETS]uint16
|
Hrd_layer_set_idx []uint16 //[HEVC_MAX_LAYER_SETS]uint16
|
||||||
cprms_present_flag []uint8 //[HEVC_MAX_LAYER_SETS]uint8
|
Cprms_present_flag []uint8 //[HEVC_MAX_LAYER_SETS]uint8
|
||||||
hrd_parameters []H265RawHRDParameters //[HEVC_MAX_LAYER_SETS]H265RawHRDParameters
|
Hrd_parameters []H265RawHRDParameters //[HEVC_MAX_LAYER_SETS]H265RawHRDParameters
|
||||||
|
|
||||||
vps_extension_flag uint8
|
Vps_extension_flag uint8
|
||||||
// extension_data H265RawExtensionData
|
// extension_data H265RawExtensionData
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,97 +397,97 @@ func (vps *H265RawVPS) Decode(data []byte) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
r := bits.NewReader(vpsWEB)
|
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
|
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")
|
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_internal_flag = r.ReadBit()
|
||||||
vps.vps_base_layer_available_flag = r.ReadBit()
|
vps.Vps_base_layer_available_flag = r.ReadBit()
|
||||||
vps.vps_max_layers_minus1 = r.ReadUint8(6)
|
vps.Vps_max_layers_minus1 = r.ReadUint8(6)
|
||||||
vps.vps_max_sub_layers_minus1 = r.ReadUint8(3)
|
vps.Vps_max_sub_layers_minus1 = r.ReadUint8(3)
|
||||||
vps.vps_temporal_id_nesting_flag = r.ReadBit()
|
vps.Vps_temporal_id_nesting_flag = r.ReadBit()
|
||||||
|
|
||||||
if vps.vps_max_sub_layers_minus1 == 0 &&
|
if vps.Vps_max_sub_layers_minus1 == 0 &&
|
||||||
vps.vps_temporal_id_nesting_flag != 1 {
|
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")
|
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
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
vps.vps_sub_layer_ordering_info_present_flag = r.ReadBit()
|
vps.Vps_sub_layer_ordering_info_present_flag = r.ReadBit()
|
||||||
i := vps.vps_max_sub_layers_minus1
|
i := vps.Vps_max_sub_layers_minus1
|
||||||
if vps.vps_sub_layer_ordering_info_present_flag == 1 {
|
if vps.Vps_sub_layer_ordering_info_present_flag == 1 {
|
||||||
i = 0
|
i = 0
|
||||||
}
|
}
|
||||||
for ; i <= vps.vps_max_sub_layers_minus1; i++ {
|
for ; i <= vps.Vps_max_sub_layers_minus1; i++ {
|
||||||
vps.vps_max_dec_pic_buffering_minus1[i] = r.ReadUe8()
|
vps.Vps_max_dec_pic_buffering_minus1[i] = r.ReadUe8()
|
||||||
vps.vps_max_num_reorder_pics[i] = r.ReadUe8()
|
vps.Vps_max_num_reorder_pics[i] = r.ReadUe8()
|
||||||
vps.vps_max_latency_increase_plus1[i] = r.ReadUe()
|
vps.Vps_max_latency_increase_plus1[i] = r.ReadUe()
|
||||||
}
|
}
|
||||||
if vps.vps_sub_layer_ordering_info_present_flag == 0 {
|
if vps.Vps_sub_layer_ordering_info_present_flag == 0 {
|
||||||
for i := uint8(0); i < vps.vps_max_sub_layers_minus1; i++ {
|
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[i] =
|
||||||
vps.vps_max_dec_pic_buffering_minus1[vps.vps_max_sub_layers_minus1]
|
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[i] =
|
||||||
vps.vps_max_num_reorder_pics[vps.vps_max_sub_layers_minus1]
|
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[i] =
|
||||||
vps.vps_max_latency_increase_plus1[vps.vps_max_sub_layers_minus1]
|
vps.Vps_max_latency_increase_plus1[vps.Vps_max_sub_layers_minus1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vps.vps_max_layer_id = r.ReadUint8(6)
|
vps.Vps_max_layer_id = r.ReadUint8(6)
|
||||||
vps.vps_num_layer_sets_minus1 = r.ReadUe16()
|
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)
|
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 i := uint16(1); i <= vps.Vps_num_layer_sets_minus1; i++ {
|
||||||
for j := uint8(0); j <= vps.vps_max_layer_id; j++ {
|
for j := uint8(0); j <= vps.Vps_max_layer_id; j++ {
|
||||||
vps.layer_id_included_flag[i][j] = r.ReadBit()
|
vps.Layer_id_included_flag[i][j] = r.ReadBit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for j := uint8(0); j <= vps.vps_max_layer_id; j++ {
|
for j := uint8(0); j <= vps.Vps_max_layer_id; j++ {
|
||||||
vps.layer_id_included_flag[0][j] = 1
|
vps.Layer_id_included_flag[0][j] = 1
|
||||||
if j == 0 {
|
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()
|
vps.Vps_timing_info_present_flag = r.ReadBit()
|
||||||
if vps.vps_timing_info_present_flag == 1 {
|
if vps.Vps_timing_info_present_flag == 1 {
|
||||||
vps.vps_num_units_in_tick = r.ReadUint32(32)
|
vps.Vps_num_units_in_tick = r.ReadUint32(32)
|
||||||
vps.vps_time_scale = r.ReadUint32(32)
|
vps.Vps_time_scale = r.ReadUint32(32)
|
||||||
vps.vps_poc_proportional_to_timing_flag = r.ReadBit()
|
vps.Vps_poc_proportional_to_timing_flag = r.ReadBit()
|
||||||
if vps.vps_poc_proportional_to_timing_flag == 1 {
|
if vps.Vps_poc_proportional_to_timing_flag == 1 {
|
||||||
vps.vps_num_ticks_poc_diff_one_minus1 = r.ReadUe()
|
vps.Vps_num_ticks_poc_diff_one_minus1 = r.ReadUe()
|
||||||
}
|
}
|
||||||
|
|
||||||
vps.vps_num_hrd_parameters = r.ReadUe16()
|
vps.Vps_num_hrd_parameters = r.ReadUe16()
|
||||||
if vps.vps_num_hrd_parameters > 0 {
|
if vps.Vps_num_hrd_parameters > 0 {
|
||||||
vps.hrd_layer_set_idx = make([]uint16, vps.vps_num_hrd_parameters)
|
vps.Hrd_layer_set_idx = make([]uint16, vps.Vps_num_hrd_parameters)
|
||||||
vps.cprms_present_flag = make([]uint8, 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.Hrd_parameters = make([]H265RawHRDParameters, vps.Vps_num_hrd_parameters)
|
||||||
}
|
}
|
||||||
for i := uint16(0); i < vps.vps_num_hrd_parameters; i++ {
|
for i := uint16(0); i < vps.Vps_num_hrd_parameters; i++ {
|
||||||
vps.hrd_layer_set_idx[i] = r.ReadUe16()
|
vps.Hrd_layer_set_idx[i] = r.ReadUe16()
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
vps.cprms_present_flag[i] = r.ReadBit()
|
vps.Cprms_present_flag[i] = r.ReadBit()
|
||||||
} else {
|
} else {
|
||||||
vps.cprms_present_flag[0] = 1
|
vps.Cprms_present_flag[0] = 1
|
||||||
}
|
}
|
||||||
if err = vps.hrd_parameters[i].decode(r,
|
if err = vps.Hrd_parameters[i].decode(r,
|
||||||
vps.cprms_present_flag[i] == 1,
|
vps.Cprms_present_flag[i] == 1,
|
||||||
int(vps.vps_max_sub_layers_minus1)); err != nil {
|
int(vps.Vps_max_sub_layers_minus1)); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vps.vps_extension_flag = r.ReadBit()
|
vps.Vps_extension_flag = r.ReadBit()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user