github.com/cnotch/ipchub@v1.1.0/av/codec/hevc/vps.go (about)

     1  // Copyright (c) 2019,CAOHONGJU All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE file.
     4  //
     5  // Translate from FFmpeg cbs_h265.h cbs_h265_syntax_template.c
     6  //
     7  package hevc
     8  
     9  import (
    10  	"encoding/base64"
    11  	"errors"
    12  	"fmt"
    13  	"runtime/debug"
    14  
    15  	"github.com/cnotch/ipchub/utils"
    16  	"github.com/cnotch/ipchub/utils/bits"
    17  )
    18  
    19  type H265RawNALUnitHeader struct {
    20  	Nal_unit_type         uint8
    21  	Nuh_layer_id          uint8
    22  	Nuh_temporal_id_plus1 uint8
    23  }
    24  
    25  func (h *H265RawNALUnitHeader) decode(r *bits.Reader) (err error) {
    26  	r.Skip(1) //forbidden_zero_bit
    27  	h.Nal_unit_type = r.ReadUint8(6)
    28  	h.Nuh_layer_id = r.ReadUint8(6)
    29  	h.Nuh_temporal_id_plus1 = r.ReadUint8(3)
    30  	return
    31  }
    32  
    33  type H265RawProfileTierLevel struct {
    34  	General_profile_space uint8
    35  	General_tier_flag     uint8
    36  	General_profile_idc   uint8
    37  
    38  	General_profile_compatibility_flag [32]uint8
    39  	GeneralProfileCompatibilityFlags   uint32 // shortcut flags 32bits
    40  
    41  	General_progressive_source_flag    uint8
    42  	General_interlaced_source_flag     uint8
    43  	General_non_packed_constraint_flag uint8
    44  	General_frame_only_constraint_flag uint8
    45  
    46  	General_max_12bit_constraint_flag        uint8
    47  	General_max_10bit_constraint_flag        uint8
    48  	General_max_8bit_constraint_flag         uint8
    49  	General_max_422chroma_constraint_flag    uint8
    50  	General_max_420chroma_constraint_flag    uint8
    51  	General_max_monochrome_constraint_flag   uint8
    52  	General_intra_constraint_flag            uint8
    53  	General_one_picture_only_constraint_flag uint8
    54  	General_lower_bit_rate_constraint_flag   uint8
    55  	General_max_14bit_constraint_flag        uint8
    56  
    57  	General_inbld_flag              uint8
    58  	GeneralConstraintIndicatorFlags uint64 // shortcut flags 48bits
    59  
    60  	General_level_idc uint8
    61  
    62  	Sub_layer_profile_present_flag [HEVC_MAX_SUB_LAYERS]uint8
    63  	Sub_layer_level_present_flag   [HEVC_MAX_SUB_LAYERS]uint8
    64  
    65  	Sub_layer_profile_space [HEVC_MAX_SUB_LAYERS]uint8
    66  	Sub_layer_tier_flag     [HEVC_MAX_SUB_LAYERS]uint8
    67  	Sub_layer_profile_idc   [HEVC_MAX_SUB_LAYERS]uint8
    68  
    69  	Sub_layer_profile_compatibility_flag [HEVC_MAX_SUB_LAYERS][32]uint8
    70  
    71  	Sub_layer_progressive_source_flag    [HEVC_MAX_SUB_LAYERS]uint8
    72  	Sub_layer_interlaced_source_flag     [HEVC_MAX_SUB_LAYERS]uint8
    73  	Sub_layer_non_packed_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
    74  	Sub_layer_frame_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
    75  
    76  	Sub_layer_max_12bit_constraint_flag        [HEVC_MAX_SUB_LAYERS]uint8
    77  	Sub_layer_max_10bit_constraint_flag        [HEVC_MAX_SUB_LAYERS]uint8
    78  	Sub_layer_max_8bit_constraint_flag         [HEVC_MAX_SUB_LAYERS]uint8
    79  	Sub_layer_max_422chroma_constraint_flag    [HEVC_MAX_SUB_LAYERS]uint8
    80  	Sub_layer_max_420chroma_constraint_flag    [HEVC_MAX_SUB_LAYERS]uint8
    81  	Sub_layer_max_monochrome_constraint_flag   [HEVC_MAX_SUB_LAYERS]uint8
    82  	Sub_layer_intra_constraint_flag            [HEVC_MAX_SUB_LAYERS]uint8
    83  	Sub_layer_one_picture_only_constraint_flag [HEVC_MAX_SUB_LAYERS]uint8
    84  	Sub_layer_lower_bit_rate_constraint_flag   [HEVC_MAX_SUB_LAYERS]uint8
    85  	Sub_layer_max_14bit_constraint_flag        [HEVC_MAX_SUB_LAYERS]uint8
    86  
    87  	Sub_layer_inbld_flag [HEVC_MAX_SUB_LAYERS]uint8
    88  
    89  	Sub_layer_level_idc [HEVC_MAX_SUB_LAYERS]uint8
    90  }
    91  type profile_compatible struct {
    92  	profile_idc                uint8
    93  	profile_compatibility_flag [32]uint8
    94  }
    95  
    96  func (pc profile_compatible) compatible(idc uint8) bool {
    97  	return pc.profile_idc == idc || pc.profile_compatibility_flag[idc] == 1
    98  }
    99  
   100  func (ptl *H265RawProfileTierLevel) decode(r *bits.Reader,
   101  	profile_present_flag bool, max_num_sub_layers_minus1 int) (err error) {
   102  
   103  	if profile_present_flag {
   104  		ptl.General_profile_space = r.ReadUint8(2)
   105  		ptl.General_tier_flag = r.ReadBit()
   106  		ptl.General_profile_idc = r.ReadUint8(5)
   107  
   108  		ptl.GeneralProfileCompatibilityFlags = uint32(r.Peek(32))
   109  		for j := 0; j < 32; j++ {
   110  			ptl.General_profile_compatibility_flag[j] = r.ReadBit()
   111  		}
   112  
   113  		ptl.GeneralConstraintIndicatorFlags = r.Peek(48)
   114  		ptl.General_progressive_source_flag = r.ReadBit()
   115  		ptl.General_interlaced_source_flag = r.ReadBit()
   116  		ptl.General_non_packed_constraint_flag = r.ReadBit()
   117  		ptl.General_frame_only_constraint_flag = r.ReadBit()
   118  
   119  		pc := profile_compatible{ptl.General_profile_idc, ptl.General_profile_compatibility_flag}
   120  		if pc.compatible(4) || pc.compatible(5) ||
   121  			pc.compatible(6) || pc.compatible(7) ||
   122  			pc.compatible(8) || pc.compatible(9) ||
   123  			pc.compatible(10) {
   124  			ptl.General_max_12bit_constraint_flag = r.ReadBit()
   125  			ptl.General_max_10bit_constraint_flag = r.ReadBit()
   126  			ptl.General_max_8bit_constraint_flag = r.ReadBit()
   127  			ptl.General_max_422chroma_constraint_flag = r.ReadBit()
   128  			ptl.General_max_420chroma_constraint_flag = r.ReadBit()
   129  			ptl.General_max_monochrome_constraint_flag = r.ReadBit()
   130  			ptl.General_intra_constraint_flag = r.ReadBit()
   131  			ptl.General_one_picture_only_constraint_flag = r.ReadBit()
   132  			ptl.General_lower_bit_rate_constraint_flag = r.ReadBit()
   133  
   134  			if pc.compatible(5) || pc.compatible(9) || pc.compatible(10) {
   135  				ptl.General_max_14bit_constraint_flag = r.ReadBit()
   136  				r.Skip(33) // general_reserved_zero_33bits
   137  
   138  			} else {
   139  				r.Skip(34) //general_reserved_zero_34bits
   140  			}
   141  		} else if pc.compatible(2) {
   142  			r.Skip(7) // general_reserved_zero_7bits
   143  			ptl.General_one_picture_only_constraint_flag = r.ReadBit()
   144  			r.Skip(35) // general_reserved_zero_35bits
   145  		} else {
   146  			r.Skip(43) // general_reserved_zero_43bits
   147  		}
   148  
   149  		if pc.compatible(1) || pc.compatible(2) ||
   150  			pc.compatible(3) || pc.compatible(4) ||
   151  			pc.compatible(5) || pc.compatible(9) {
   152  			ptl.General_inbld_flag = r.ReadBit()
   153  		} else {
   154  			r.Skip(1) // general_reserved_zero_bit
   155  		}
   156  	}
   157  
   158  	ptl.General_level_idc = r.ReadUint8(8)
   159  
   160  	for i := 0; i < max_num_sub_layers_minus1; i++ {
   161  		ptl.Sub_layer_profile_present_flag[i] = r.ReadBit()
   162  		ptl.Sub_layer_level_present_flag[i] = r.ReadBit()
   163  	}
   164  
   165  	if max_num_sub_layers_minus1 > 0 {
   166  		for i := max_num_sub_layers_minus1; i < 8; i++ {
   167  			r.Skip(2) // reserved_zero_2bits
   168  		}
   169  	}
   170  
   171  	for i := 0; i < max_num_sub_layers_minus1; i++ {
   172  		if ptl.Sub_layer_profile_present_flag[i] == 1 {
   173  			ptl.Sub_layer_profile_space[i] = r.ReadUint8(2)
   174  			ptl.Sub_layer_tier_flag[i] = r.ReadBit()
   175  			ptl.Sub_layer_profile_idc[i] = r.ReadUint8(5)
   176  
   177  			for j := 0; j < 32; j++ {
   178  				ptl.Sub_layer_profile_compatibility_flag[i][j] = r.ReadBit()
   179  			}
   180  
   181  			ptl.Sub_layer_progressive_source_flag[i] = r.ReadBit()
   182  			ptl.Sub_layer_interlaced_source_flag[i] = r.ReadBit()
   183  			ptl.Sub_layer_non_packed_constraint_flag[i] = r.ReadBit()
   184  			ptl.Sub_layer_frame_only_constraint_flag[i] = r.ReadBit()
   185  
   186  			pc := profile_compatible{ptl.Sub_layer_profile_idc[i], ptl.Sub_layer_profile_compatibility_flag[i]}
   187  			if pc.compatible(4) || pc.compatible(5) ||
   188  				pc.compatible(6) || pc.compatible(7) ||
   189  				pc.compatible(8) || pc.compatible(9) ||
   190  				pc.compatible(10) {
   191  				ptl.Sub_layer_max_12bit_constraint_flag[i] = r.ReadBit()
   192  				ptl.Sub_layer_max_10bit_constraint_flag[i] = r.ReadBit()
   193  				ptl.Sub_layer_max_8bit_constraint_flag[i] = r.ReadBit()
   194  				ptl.Sub_layer_max_422chroma_constraint_flag[i] = r.ReadBit()
   195  				ptl.Sub_layer_max_420chroma_constraint_flag[i] = r.ReadBit()
   196  				ptl.Sub_layer_max_monochrome_constraint_flag[i] = r.ReadBit()
   197  				ptl.Sub_layer_intra_constraint_flag[i] = r.ReadBit()
   198  				ptl.Sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit()
   199  				ptl.Sub_layer_lower_bit_rate_constraint_flag[i] = r.ReadBit()
   200  
   201  				if pc.compatible(5) {
   202  					ptl.Sub_layer_max_14bit_constraint_flag[i] = r.ReadBit()
   203  					r.Skip(33) // sub_layer_reserved_zero_33bits
   204  				} else {
   205  					r.Skip(34) // sub_layer_reserved_zero_34bits
   206  				}
   207  			} else if pc.compatible(2) {
   208  				r.Skip(7) // sub_layer_reserved_zero_7bits
   209  				ptl.Sub_layer_one_picture_only_constraint_flag[i] = r.ReadBit()
   210  				r.Skip(35) // sub_layer_reserved_zero_35bits
   211  			} else {
   212  				r.Skip(43) // sub_layer_reserved_zero_43bits
   213  			}
   214  
   215  			if pc.compatible(1) || pc.compatible(2) ||
   216  				pc.compatible(3) || pc.compatible(4) ||
   217  				pc.compatible(5) || pc.compatible(9) {
   218  				ptl.Sub_layer_inbld_flag[i] = r.ReadBit()
   219  			} else {
   220  				r.Skip(1) // sub_layer_reserved_zero_bit
   221  			}
   222  		}
   223  		if ptl.Sub_layer_level_present_flag[i] == 1 {
   224  			ptl.Sub_layer_level_idc[i] = r.ReadUint8(8)
   225  		}
   226  	}
   227  	return
   228  }
   229  
   230  type H265RawSubLayerHRDParameters struct {
   231  	Bit_rate_value_minus1    [HEVC_MAX_CPB_CNT]uint32
   232  	Cpb_size_value_minus1    [HEVC_MAX_CPB_CNT]uint32
   233  	Cpb_size_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32
   234  	Bit_rate_du_value_minus1 [HEVC_MAX_CPB_CNT]uint32
   235  	Cbr_flag                 [HEVC_MAX_CPB_CNT]uint8
   236  }
   237  
   238  func (shrd *H265RawSubLayerHRDParameters) decode(r *bits.Reader,
   239  	sub_pic_hrd_params_present_flag bool, cpb_cnt_minus1 int) (err error) {
   240  	for i := 0; i <= cpb_cnt_minus1; i++ {
   241  		shrd.Bit_rate_value_minus1[i] = r.ReadUe()
   242  		shrd.Cpb_size_value_minus1[i] = r.ReadUe()
   243  		if sub_pic_hrd_params_present_flag {
   244  			shrd.Cpb_size_du_value_minus1[i] = r.ReadUe()
   245  			shrd.Bit_rate_du_value_minus1[i] = r.ReadUe()
   246  		}
   247  		shrd.Cbr_flag[i] = r.ReadBit()
   248  	}
   249  	return
   250  }
   251  
   252  type H265RawHRDParameters struct {
   253  	Nal_hrd_parameters_present_flag uint8
   254  	Vcl_hrd_parameters_present_flag uint8
   255  
   256  	Sub_pic_hrd_params_present_flag              uint8
   257  	Tick_divisor_minus2                          uint8
   258  	Du_cpb_removal_delay_increment_length_minus1 uint8
   259  	Sub_pic_cpb_params_in_pic_timing_sei_flag    uint8
   260  	Dpb_output_delay_du_length_minus1            uint8
   261  
   262  	Bit_rate_scale    uint8
   263  	Cpb_size_scale    uint8
   264  	Cpb_size_du_scale uint8
   265  
   266  	Initial_cpb_removal_delay_length_minus1 uint8
   267  	Au_cpb_removal_delay_length_minus1      uint8
   268  	Dpb_output_delay_length_minus1          uint8
   269  
   270  	Fixed_pic_rate_general_flag     [HEVC_MAX_SUB_LAYERS]uint8
   271  	Fixed_pic_rate_within_cvs_flag  [HEVC_MAX_SUB_LAYERS]uint8
   272  	Elemental_duration_in_tc_minus1 [HEVC_MAX_SUB_LAYERS]uint16
   273  	Low_delay_hrd_flag              [HEVC_MAX_SUB_LAYERS]uint8
   274  	Cpb_cnt_minus1                  [HEVC_MAX_SUB_LAYERS]uint8
   275  	Nal_sub_layer_hrd_parameters    [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters
   276  	Vcl_sub_layer_hrd_parameters    [HEVC_MAX_SUB_LAYERS]H265RawSubLayerHRDParameters
   277  }
   278  
   279  func (hrd *H265RawHRDParameters) decode(r *bits.Reader,
   280  	common_inf_present_flag bool, max_num_sub_layers_minus1 int) (err error) {
   281  	if common_inf_present_flag {
   282  		hrd.Nal_hrd_parameters_present_flag = r.ReadBit()
   283  		hrd.Vcl_hrd_parameters_present_flag = r.ReadBit()
   284  
   285  		if hrd.Nal_hrd_parameters_present_flag == 1 ||
   286  			hrd.Vcl_hrd_parameters_present_flag == 1 {
   287  			hrd.Sub_pic_hrd_params_present_flag = r.ReadBit()
   288  			if hrd.Sub_pic_hrd_params_present_flag == 1 {
   289  				hrd.Tick_divisor_minus2 = r.ReadUint8(8)
   290  				hrd.Du_cpb_removal_delay_increment_length_minus1 = r.ReadUint8(5)
   291  				hrd.Sub_pic_cpb_params_in_pic_timing_sei_flag = r.ReadBit()
   292  				hrd.Dpb_output_delay_du_length_minus1 = r.ReadUint8(5)
   293  			}
   294  
   295  			hrd.Bit_rate_scale = r.ReadUint8(4)
   296  			hrd.Cpb_size_scale = r.ReadUint8(4)
   297  			if hrd.Sub_pic_hrd_params_present_flag == 1 {
   298  				hrd.Cpb_size_du_scale = r.ReadUint8(4)
   299  
   300  			}
   301  
   302  			hrd.Initial_cpb_removal_delay_length_minus1 = r.ReadUint8(5)
   303  			hrd.Au_cpb_removal_delay_length_minus1 = r.ReadUint8(5)
   304  			hrd.Dpb_output_delay_length_minus1 = r.ReadUint8(5)
   305  		} else {
   306  			hrd.Sub_pic_hrd_params_present_flag = 0
   307  
   308  			hrd.Initial_cpb_removal_delay_length_minus1 = 23
   309  			hrd.Au_cpb_removal_delay_length_minus1 = 23
   310  			hrd.Dpb_output_delay_length_minus1 = 23
   311  		}
   312  	}
   313  
   314  	for i := 0; i <= max_num_sub_layers_minus1; i++ {
   315  		hrd.Fixed_pic_rate_general_flag[i] = r.ReadBit()
   316  
   317  		hrd.Fixed_pic_rate_within_cvs_flag[i] = 1
   318  		if hrd.Fixed_pic_rate_general_flag[i] == 0 {
   319  			hrd.Fixed_pic_rate_within_cvs_flag[i] = r.ReadBit()
   320  		}
   321  
   322  		if hrd.Fixed_pic_rate_within_cvs_flag[i] == 1 {
   323  			hrd.Elemental_duration_in_tc_minus1[i] = r.ReadUe16()
   324  			hrd.Low_delay_hrd_flag[i] = 0
   325  		} else {
   326  			hrd.Low_delay_hrd_flag[i] = r.ReadBit()
   327  		}
   328  
   329  		hrd.Cpb_cnt_minus1[i] = 0
   330  		if hrd.Low_delay_hrd_flag[i] == 0 {
   331  			hrd.Cpb_cnt_minus1[i] = r.ReadUe8()
   332  		}
   333  
   334  		if hrd.Nal_hrd_parameters_present_flag == 1 {
   335  			hrd.Nal_sub_layer_hrd_parameters[i].decode(r, hrd.Sub_pic_hrd_params_present_flag == 1, int(hrd.Cpb_cnt_minus1[i]))
   336  		}
   337  		if hrd.Vcl_hrd_parameters_present_flag == 1 {
   338  			hrd.Vcl_sub_layer_hrd_parameters[i].decode(r, hrd.Sub_pic_hrd_params_present_flag == 1, int(hrd.Cpb_cnt_minus1[i]))
   339  		}
   340  	}
   341  
   342  	return
   343  }
   344  
   345  type H265RawVPS struct {
   346  	Nal_unit_header H265RawNALUnitHeader
   347  
   348  	Vps_video_parameter_set_id uint8
   349  
   350  	Vps_base_layer_internal_flag  uint8
   351  	Vps_base_layer_available_flag uint8
   352  	Vps_max_layers_minus1         uint8
   353  	Vps_max_sub_layers_minus1     uint8
   354  	Vps_temporal_id_nesting_flag  uint8
   355  
   356  	Profile_tier_level H265RawProfileTierLevel
   357  
   358  	Vps_sub_layer_ordering_info_present_flag uint8
   359  	Vps_max_dec_pic_buffering_minus1         [HEVC_MAX_SUB_LAYERS]uint8
   360  	Vps_max_num_reorder_pics                 [HEVC_MAX_SUB_LAYERS]uint8
   361  	Vps_max_latency_increase_plus1           [HEVC_MAX_SUB_LAYERS]uint32
   362  
   363  	Vps_max_layer_id          uint8
   364  	Vps_num_layer_sets_minus1 uint16
   365  	Layer_id_included_flag    [][HEVC_MAX_LAYERS]uint8 //[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]uint8
   366  
   367  	Vps_timing_info_present_flag        uint8
   368  	Vps_num_units_in_tick               uint32
   369  	Vps_time_scale                      uint32
   370  	Vps_poc_proportional_to_timing_flag uint8
   371  	Vps_num_ticks_poc_diff_one_minus1   uint32
   372  	Vps_num_hrd_parameters              uint16
   373  	Hrd_layer_set_idx                   []uint16               //[HEVC_MAX_LAYER_SETS]uint16
   374  	Cprms_present_flag                  []uint8                //[HEVC_MAX_LAYER_SETS]uint8
   375  	Hrd_parameters                      []H265RawHRDParameters //[HEVC_MAX_LAYER_SETS]H265RawHRDParameters
   376  
   377  	Vps_extension_flag uint8
   378  	// extension_data     H265RawExtensionData
   379  }
   380  
   381  // DecodeString 从 base64 字串解码 vps NAL
   382  func (vps *H265RawVPS) DecodeString(b64 string) error {
   383  	data, err := base64.StdEncoding.DecodeString(b64)
   384  	if err != nil {
   385  		return err
   386  	}
   387  	return vps.Decode(data)
   388  }
   389  
   390  // Decode 从字节序列中解码 vps NAL
   391  func (vps *H265RawVPS) Decode(data []byte) (err error) {
   392  	defer func() {
   393  		if r := recover(); r != nil {
   394  			err = fmt.Errorf("RawVPS decode panic;r = %v \n %s", r, debug.Stack())
   395  		}
   396  	}()
   397  
   398  	vpsWEB := utils.RemoveH264or5EmulationBytes(data)
   399  	if len(vpsWEB) < 4 {
   400  		return errors.New("The data is not enough")
   401  	}
   402  
   403  	r := bits.NewReader(vpsWEB)
   404  	if err = vps.Nal_unit_header.decode(r); err != nil {
   405  		return
   406  	}
   407  
   408  	if vps.Nal_unit_header.Nal_unit_type != NalVps {
   409  		return errors.New("not is vps NAL UNIT")
   410  	}
   411  
   412  	vps.Vps_video_parameter_set_id = r.ReadUint8(4)
   413  
   414  	vps.Vps_base_layer_internal_flag = r.ReadBit()
   415  	vps.Vps_base_layer_available_flag = r.ReadBit()
   416  	vps.Vps_max_layers_minus1 = r.ReadUint8(6)
   417  	vps.Vps_max_sub_layers_minus1 = r.ReadUint8(3)
   418  	vps.Vps_temporal_id_nesting_flag = r.ReadBit()
   419  
   420  	if vps.Vps_max_sub_layers_minus1 == 0 &&
   421  		vps.Vps_temporal_id_nesting_flag != 1 {
   422  		return errors.New("Invalid stream: vps_temporal_id_nesting_flag must be 1 if vps_max_sub_layers_minus1 is 0.\n")
   423  	}
   424  
   425  	r.Skip(16) // vps_reserved_0xffff_16bits
   426  	if err = vps.Profile_tier_level.decode(r, true, int(vps.Vps_max_sub_layers_minus1)); err != nil {
   427  		return
   428  	}
   429  
   430  	vps.Vps_sub_layer_ordering_info_present_flag = r.ReadBit()
   431  	i := vps.Vps_max_sub_layers_minus1
   432  	if vps.Vps_sub_layer_ordering_info_present_flag == 1 {
   433  		i = 0
   434  	}
   435  	for ; i <= vps.Vps_max_sub_layers_minus1; i++ {
   436  		vps.Vps_max_dec_pic_buffering_minus1[i] = r.ReadUe8()
   437  		vps.Vps_max_num_reorder_pics[i] = r.ReadUe8()
   438  		vps.Vps_max_latency_increase_plus1[i] = r.ReadUe()
   439  	}
   440  	if vps.Vps_sub_layer_ordering_info_present_flag == 0 {
   441  		for i := uint8(0); i < vps.Vps_max_sub_layers_minus1; i++ {
   442  			vps.Vps_max_dec_pic_buffering_minus1[i] =
   443  				vps.Vps_max_dec_pic_buffering_minus1[vps.Vps_max_sub_layers_minus1]
   444  			vps.Vps_max_num_reorder_pics[i] =
   445  				vps.Vps_max_num_reorder_pics[vps.Vps_max_sub_layers_minus1]
   446  			vps.Vps_max_latency_increase_plus1[i] =
   447  				vps.Vps_max_latency_increase_plus1[vps.Vps_max_sub_layers_minus1]
   448  		}
   449  	}
   450  
   451  	vps.Vps_max_layer_id = r.ReadUint8(6)
   452  	vps.Vps_num_layer_sets_minus1 = r.ReadUe16()
   453  	vps.Layer_id_included_flag = make([][HEVC_MAX_LAYERS]uint8, vps.Vps_num_layer_sets_minus1+1)
   454  	for i := uint16(1); i <= vps.Vps_num_layer_sets_minus1; i++ {
   455  		for j := uint8(0); j <= vps.Vps_max_layer_id; j++ {
   456  			vps.Layer_id_included_flag[i][j] = r.ReadBit()
   457  		}
   458  	}
   459  	for j := uint8(0); j <= vps.Vps_max_layer_id; j++ {
   460  		vps.Layer_id_included_flag[0][j] = 1
   461  		if j == 0 {
   462  			vps.Layer_id_included_flag[0][j] = 0
   463  		}
   464  	}
   465  	vps.Vps_timing_info_present_flag = r.ReadBit()
   466  	if vps.Vps_timing_info_present_flag == 1 {
   467  		vps.Vps_num_units_in_tick = r.ReadUint32(32)
   468  		vps.Vps_time_scale = r.ReadUint32(32)
   469  		vps.Vps_poc_proportional_to_timing_flag = r.ReadBit()
   470  		if vps.Vps_poc_proportional_to_timing_flag == 1 {
   471  			vps.Vps_num_ticks_poc_diff_one_minus1 = r.ReadUe()
   472  		}
   473  
   474  		vps.Vps_num_hrd_parameters = r.ReadUe16()
   475  		if vps.Vps_num_hrd_parameters > 0 {
   476  			vps.Hrd_layer_set_idx = make([]uint16, vps.Vps_num_hrd_parameters)
   477  			vps.Cprms_present_flag = make([]uint8, vps.Vps_num_hrd_parameters)
   478  			vps.Hrd_parameters = make([]H265RawHRDParameters, vps.Vps_num_hrd_parameters)
   479  		}
   480  		for i := uint16(0); i < vps.Vps_num_hrd_parameters; i++ {
   481  			vps.Hrd_layer_set_idx[i] = r.ReadUe16()
   482  			if i > 0 {
   483  				vps.Cprms_present_flag[i] = r.ReadBit()
   484  			} else {
   485  				vps.Cprms_present_flag[0] = 1
   486  			}
   487  			if err = vps.Hrd_parameters[i].decode(r,
   488  				vps.Cprms_present_flag[i] == 1,
   489  				int(vps.Vps_max_sub_layers_minus1)); err != nil {
   490  				return
   491  			}
   492  		}
   493  	}
   494  
   495  	vps.Vps_extension_flag = r.ReadBit()
   496  	return
   497  }