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 }