11static std::string parse_st(
const uint8_t * ,
size_t &bit)
18static void byte_aligned()
22static void more_data_in_byte_stream()
26static void more_data_in_payload()
30static void more_rbsp_trailing_data()
34static void payload_extension_present()
38static void ppic_layer_id()
43static void rbsp_trailing_bits(
const uint8_t *data,
size_t &bit)
45 uint32_t rbsp_stop_one_bit = parse_u(1, data, bit);
46 assert(rbsp_stop_one_bit == 0x1);
48 uint32_t rbsp_alignment_zero_bit = parse_u(1, data, bit);
49 assert(rbsp_alignment_zero_bit == 0x0);
53void profile_tier_level(H265ProfileTierLevel &tier,
const uint8_t *data,
size_t &bit, uint32_t profilePresentFlag, uint32_t maxNumSubLayersMinus1)
56 tier.profilePresentFlag = profilePresentFlag;
57 tier.maxNumSubLayersMinus1 = maxNumSubLayersMinus1;
59 if(profilePresentFlag){
60 tier.general_profile_space = parse_u(2, data, bit);
61 tier.general_tier_flag = parse_u(1, data, bit);
62 tier.general_profile_idc = parse_u(5, data, bit);
64 for(uint32_t i=0; i<32; i++)
65 tier.general_profile_compatibility_flags =
66 (tier.general_profile_compatibility_flags<<1) | parse_u(1, data, bit);
69 tier.general_progressive_source_flag = parse_u(1, data, bit);
70 tier.general_interlaced_source_glag = parse_u(1, data, bit);
71 tier.general_non_packed_constraint_flag = parse_u(1, data, bit);
72 tier.general_frame_only_constraint_flag = parse_u(1, data, bit);
74 if(tier.general_profile_idc == 4 || tier.general_profile_compatibility_flags&(0x80000000>>4) ||
75 tier.general_profile_idc == 5 || tier.general_profile_compatibility_flags&(0x80000000>>5) ||
76 tier.general_profile_idc == 6 || tier.general_profile_compatibility_flags&(0x80000000>>6) ||
77 tier.general_profile_idc == 7 || tier.general_profile_compatibility_flags&(0x80000000>>7) ||
78 tier.general_profile_idc == 8 || tier.general_profile_compatibility_flags&(0x80000000>>8) ||
79 tier.general_profile_idc == 9 || tier.general_profile_compatibility_flags&(0x80000000>>9) ||
80 tier.general_profile_idc == 10 || tier.general_profile_compatibility_flags&(0x80000000>>10) ||
81 tier.general_profile_idc == 11 || tier.general_profile_compatibility_flags&(0x80000000>>11)){
82 tier.general_max_12bit_constraint_flag = parse_u(1, data, bit);
83 tier.general_max_10bit_constraint_flag = parse_u(1, data, bit);
84 tier.general_max_8bit_constraint_flag = parse_u(1, data, bit);
85 tier.general_max_422chroma_constraint_flag = parse_u(1, data, bit);
86 tier.general_max_420chroma_constraint_flag = parse_u(1, data, bit);
87 tier.general_max_monochrome_constraint_flag = parse_u(1, data, bit);
88 tier.general_intra_constraint_flag = parse_u(1, data, bit);
89 tier.general_on_picture_only_constraint_flag = parse_u(1, data, bit);
90 tier.general_lower_bit_rate_constraint_flag = parse_u(1, data, bit);
91 if(tier.general_profile_idc == 5 || tier.general_profile_compatibility_flags&(0x80000000>>5) ||
92 tier.general_profile_idc == 9 || tier.general_profile_compatibility_flags&(0x80000000>>9) ||
93 tier.general_profile_idc == 10 || tier.general_profile_compatibility_flags&(0x80000000>>10) ||
94 tier.general_profile_idc == 11 || tier.general_profile_compatibility_flags&(0x80000000>>11)){
95 tier.general_max_14bit_constraint_flag = parse_u(1, data, bit);
96 uint32_t zero = parse_u(32, data, bit);
98 zero = parse_u(1, data, bit);
102 uint32_t zero = parse_u(32, data, bit);
104 zero = parse_u(2, data, bit);
108 else if(tier.general_profile_idc == 2 || tier.general_profile_compatibility_flags&(0x80000000>>2)){
109 uint32_t zero = parse_u(7, data, bit);
111 tier.general_one_picture_only_constraint_flag = parse_u(1, data, bit);
112 zero = parse_u(32, data, bit);
114 zero = parse_u(3, data, bit);
118 uint32_t zero = parse_u(32, data, bit);
120 zero = parse_u(11, data, bit);
123 if(tier.general_profile_idc == 1 || tier.general_profile_compatibility_flags&(0x80000000>>1) ||
124 tier.general_profile_idc == 2 || tier.general_profile_compatibility_flags&(0x80000000>>2) ||
125 tier.general_profile_idc == 3 || tier.general_profile_compatibility_flags&(0x80000000>>3) ||
126 tier.general_profile_idc == 4 || tier.general_profile_compatibility_flags&(0x80000000>>4) ||
127 tier.general_profile_idc == 5 || tier.general_profile_compatibility_flags&(0x80000000>>5) ||
128 tier.general_profile_idc == 9 || tier.general_profile_compatibility_flags&(0x80000000>>9) ||
129 tier.general_profile_idc == 11 || tier.general_profile_compatibility_flags&(0x80000000>>11)){
130 tier.general_inbld_flag = parse_u(1, data, bit);
133 uint32_t zero = parse_u(1, data, bit);
138 tier.general_level_idc = parse_u(8, data, bit);
141 for(uint32_t i=0; i<maxNumSubLayersMinus1; i++){
142 tier.sub_layer_profile_present_flag[i] = parse_u(1, data, bit);
143 tier.sub_layer_level_present_flag[i] = parse_u(1, data, bit);
145 if(maxNumSubLayersMinus1>0){
146 for(uint32_t i=maxNumSubLayersMinus1; i<8; i++){
152 for(uint32_t i=0; i<maxNumSubLayersMinus1; i++){
153 if(tier.sub_layer_profile_present_flag[i]){
154 tier.sub_layer_profile_space[i] = parse_u(2, data, bit);
155 tier.sub_layer_tier_flag[i] = parse_u(1, data, bit);
156 tier.sub_layer_profile_idc[i] = parse_u(5, data, bit);
158 for(uint32_t j=0; j<32; j++)
159 tier.sub_layer_profile_compatibility_flags[i] =
160 (tier.sub_layer_profile_compatibility_flags[i]<<1) | parse_u(1, data, bit);
162 tier.sub_layer_progressive_source_flag[i] = parse_u(1, data, bit);
163 tier.sub_layer_interlaced_source_flag[i] = parse_u(1, data, bit);
164 tier.sub_layer_non_packed_constraint_flag[i] = parse_u(1, data, bit);
165 tier.sub_layer_frame_only_constraint_flag[i] = parse_u(1, data, bit);
166 if(tier.sub_layer_profile_idc[i] == 4 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>4) ||
167 tier.sub_layer_profile_idc[i] == 5 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>5) ||
168 tier.sub_layer_profile_idc[i] == 6 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>6) ||
169 tier.sub_layer_profile_idc[i] == 7 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>7) ||
170 tier.sub_layer_profile_idc[i] == 8 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>8) ||
171 tier.sub_layer_profile_idc[i] == 9 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>9) ||
172 tier.sub_layer_profile_idc[i] == 10 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>10) ||
173 tier.sub_layer_profile_idc[i] == 11 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>11)){
174 tier.sub_layer_max_12bit_constraint_flag[i] = parse_u(1, data, bit);
175 tier.sub_layer_max_10bit_constraint_flag[i] = parse_u(1, data, bit);
176 tier.sub_layer_max_8bit_constraint_flag[i] = parse_u(1, data, bit);
177 tier.sub_layer_max_422chroma_constraint_flag[i] = parse_u(1, data, bit);
178 tier.sub_layer_max_420chroma_constraint_flag[i] = parse_u(1, data, bit);
179 tier.sub_layer_max_monochrome_constraint_flag[i] = parse_u(1, data, bit);
180 tier.sub_layer_intra_constraint_flag[i] = parse_u(1, data, bit);
181 tier.sub_layer_one_picture_only_constraint_flag[i] = parse_u(1, data, bit);
182 tier.sub_layer_lower_bit_rate_constraint_flag[i] = parse_u(1, data, bit);
183 if(tier.sub_layer_profile_idc[i] == 5 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>5) ||
184 tier.sub_layer_profile_idc[i] == 9 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>9) ||
185 tier.sub_layer_profile_idc[i] == 10 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>10) ||
186 tier.sub_layer_profile_idc[i] == 11 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>11)){
187 tier.sub_layer_max_14bit_constraint_flag[i] = parse_u(1, data, bit);
188 uint32_t zero = parse_u(32, data, bit);
190 zero = parse_u(1, data, bit);
194 uint32_t zero = parse_u(32, data, bit);
196 zero = parse_u(2, data, bit);
200 else if(tier.sub_layer_profile_idc[i] == 2 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>2)){
201 uint32_t zero = parse_u(7, data, bit);
203 tier.sub_layer_inbld_flag[i] = parse_u(1, data, bit);
204 zero = parse_u(32, data, bit);
206 zero = parse_u(3, data, bit);
210 uint32_t zero = parse_u(32, data, bit);
212 zero = parse_u(11, data, bit);
215 if(tier.sub_layer_profile_idc[i] == 1 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>1) ||
216 tier.sub_layer_profile_idc[i] == 2 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>2) ||
217 tier.sub_layer_profile_idc[i] == 3 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>3) ||
218 tier.sub_layer_profile_idc[i] == 4 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>4) ||
219 tier.sub_layer_profile_idc[i] == 5 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>5) ||
220 tier.sub_layer_profile_idc[i] == 9 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>9) ||
221 tier.sub_layer_profile_idc[i] == 11 || tier.sub_layer_profile_compatibility_flags[i]&(0x80000000>>11)){
222 tier.sub_layer_inbld_flag[i] = parse_u(1, data, bit);
225 uint32_t zero = parse_u(1, data, bit);
229 if(tier.sub_layer_level_present_flag[i]){
230 tier.sub_layer_level_idc[i] = parse_u(8, data, bit);
235void hrd_parameters(
const uint8_t * ,
size_t ,
236 uint32_t commonInfPresentFlag, uint32_t maxNumbSubLayersMinus1)
238 if(commonInfPresentFlag){
241 for(uint32_t i=0; i<maxNumbSubLayersMinus1; i++){
246void video_parameter_set_rbsp(H265ParseData &parse,
const uint8_t *data,
size_t size)
249 printf(
"video_data:");
250 for(uint32_t i=0; i<size; i++){
251 if(i%8 == 0) printf(
"\n");
252 printf(
"0x%02x ", data[i]);
257 H265VideoParameterSet &set(parse.video_set);
261 set.vps_video_parameter_set_id = parse_u(4, data, bit);
262 set.vps_base_layer_internal_flag = parse_u(1, data, bit);
263 set.vps_base_layer_available_flag = parse_u(1, data, bit);
264 set.vps_max_layers_minus1 = parse_u(6, data, bit);
265 set.vps_max_sub_layers_minus1 = parse_u(3, data, bit);
266 set.vps_temporal_id_nesting_flag = parse_u(1, data, bit);
267 uint32_t vps_reserved_0xffff_16_bits = parse_u(16, data, bit);
268 assert(vps_reserved_0xffff_16_bits == 0xffff);
270 profile_tier_level(set.tier, data, bit, 1, set.vps_max_sub_layers_minus1);
272 set.vps_sub_layer_ordering_info_present_flag = parse_u(1, data, bit);
273 for(uint32_t i=(set.vps_sub_layer_ordering_info_present_flag?0:set.vps_max_sub_layers_minus1);
274 i<=set.vps_max_sub_layers_minus1; i++){
275 set.vps_max_dec_pic_buffering_minus1[i] = parse_ue(data, bit);
276 set.vps_max_num_reorder_pics[i] = parse_ue(data, bit);
277 set.vps_max_latency_increase_plus1[i] = parse_ue(data, bit);
280 set.vps_max_layer_id = parse_u(6, data, bit);
281 set.vps_num_layer_sets_minus1 = parse_ue(data, bit);
282 for(uint32_t i=1; i<= set.vps_num_layer_sets_minus1; i++){
283 for(uint32_t j=0; j<set.vps_max_layer_id; j++){
285 parse_u(1, data, bit);
290 set.vps_timing_info_present_flag = parse_u(1, data, bit);
291 if(set.vps_timing_info_present_flag){
292 set.vps_num_units_in_tick = parse_u(32, data, bit);
293 set.vps_time_scale = parse_u(32, data, bit);
294 set.vps_poc_proportional_to_timing_flag = parse_u(1, data, bit);
295 if(set.vps_poc_proportional_to_timing_flag){
296 set.vps_num_ticks_poc_diff_one_minus1 = parse_ue(data, bit);
298 set.vps_num_hrd_parameters = parse_ue(data, bit);
299 for(uint32_t i=0; i<set.vps_num_hrd_parameters; i++){
300 set.hrd_layer_set_idx[i] = parse_ue(data, bit);
302 set.cprms_present_flag[i] = parse_u(1, data, bit);
304 hrd_parameters(data, size, set.cprms_present_flag[i], set.vps_max_sub_layers_minus1);
309 uint32_t vps_extension_flag = parse_u(1, data, bit);
310 if(vps_extension_flag){
311 while(more_rbsp_data(data, size, bit)){
313 parse_u(1, data, bit);
317 rbsp_trailing_bits(data, bit);
320void seq_parameter_set_rbsp(H265ParseData &parse,
const uint8_t *data,
size_t size)
324 for(uint32_t i=0; i<size; i++){
325 if(i%8 == 0) printf(
"\n");
326 printf(
"0x%02x ", data[i]);
331 H265SeqParameterSet &set(parse.seq_set);
335 set.sps_video_parameter_set_id = parse_u(4, data, bit);
336 set.sps_max_sub_layers_minus1 = parse_u(3, data, bit);
337 set.sps_temporal_id_nesting_flag = parse_u(1, data, bit);
339 profile_tier_level(set.tier, data, bit, 1, set.sps_max_sub_layers_minus1);
341 set.sps_seq_parameter_set_id = parse_ue(data, bit);
342 set.chroma_format_idc = parse_ue(data, bit);
343 if(set.chroma_format_idc == 3)
344 set.separate_colour_plane_flag = parse_u(1, data, bit);
345 set.pic_width_in_luma_samples = parse_ue(data, bit);
346 set.pic_height_in_luma_samples = parse_ue(data, bit);
347 set.conformance_window_flag = parse_u(1, data, bit);
349 if(set.conformance_window_flag){
350 set.conf_win_left_offset = parse_ue(data, bit);
351 set.conf_win_right_offset = parse_ue(data, bit);
352 set.conf_win_top_offset = parse_ue(data, bit);
353 set.conf_win_bottom_offset = parse_ue(data, bit);
356 set.bit_depth_luma_minus8 = parse_ue(data, bit);
357 set.bit_depth_chroma_minus8 = parse_ue(data, bit);
358 set.log2_max_pic_order_cnt_lsb_minus4 = parse_ue(data, bit);
359 set.sps_sub_layer_ordering_info_present_flag = parse_u(1, data, bit);
361 assert(set.sps_max_sub_layers_minus1 <
sizeof(set.sps_max_dec_pic_buffering_minus1)/
sizeof(set.sps_max_dec_pic_buffering_minus1[0]));
362 for(uint32_t i = (set.sps_sub_layer_ordering_info_present_flag?0:set.sps_max_sub_layers_minus1);
363 i<=set.sps_max_sub_layers_minus1; i++){
364 set.sps_max_dec_pic_buffering_minus1[i] = parse_ue(data, bit);
365 set.sps_max_num_reorder_pics[i] = parse_ue(data, bit);
366 set.sps_max_latency_increase_plus1[i] = parse_ue(data, bit);
369 set.log2_min_luma_coding_block_size_minus3 = parse_ue(data, bit);
370 set.log2_diff_max_min_luma_coding_block_size = parse_ue(data, bit);
371 set.log2_min_luma_transform_block_size_minus2 = parse_ue(data, bit);
372 set.log2_diff_max_min_luma_transform_block_size = parse_ue(data, bit);
374 set.max_tranform_hierarchy_depth_inter = parse_ue(data, bit);
375 set.max_tranform_hierarchy_depth_intra = parse_ue(data, bit);
376 set.scaling_list_enabled_flag = parse_u(1, data, bit);
377 if(set.scaling_list_enabled_flag){
378 set.sps_scaling_list_data_present_flag = parse_u(1, data, bit);
379 if(set.sps_scaling_list_data_present_flag){
385 set.amp_enabled_flag = parse_u(1, data, bit);
386 set.sample_adaptive_offset_enabled_flag = parse_u(1, data, bit);
387 set.pcm_enabled_flag = parse_u(1, data, bit);
388 if(set.pcm_enabled_flag){
389 set.pcm_sample_bit_depth_luma_minus1 = parse_u(4, data, bit);
390 set.pcm_sample_bit_depth_chroma_minus1 = parse_u(4, data, bit);
391 set.log2_min_pcm_luma_coding_block_size_minus3 = parse_ue(data, bit);
392 set.log2_idff_max_min_pcm_luma_coding_block_size = parse_ue(data, bit);
393 set.pcm_loop_filter_disabled_flag = parse_u(1, data, bit);
396 set.num_short_term_ref_pic_sets = parse_ue(data, bit);
397 if(set.num_short_term_ref_pic_sets)
403 set.long_term_ref_pic_present_flag = parse_u(1, data, bit);
404 if(set.long_term_ref_pic_present_flag){
405 set.num_long_term_ref_pics_sps = parse_ue(data, bit);
406 for(uint32_t i=0; i<set.num_long_term_ref_pics_sps; i++){
408 set.used_by_cuff_pic_lt_sps_flag[i] = parse_u(1, data, bit);
412 set.sps_temporarl_mvp_enabled_flag = parse_u(1, data, bit);
413 set.string_intra_smoothing_enabled_flag = parse_u(1, data, bit);
415 set.vui_parameters_present_flag = parse_u(1, data, bit);
416 if(set.vui_parameters_present_flag){
417 H265VuiParameters &vui(parse.vui);
419 vui.aspect_ratio_info_present = parse_u(1, data, bit);
420 if(vui.aspect_ratio_info_present){
421 uint32_t aspect_ratio_idc = parse_u(8, data, bit);
422 uint32_t aspect_ratio_width[255] = {
423 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2
425 uint32_t aspect_ratio_height[255] = {
426 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1
428 if(aspect_ratio_idc == 255){
429 vui.sar_width = parse_u(16, data, bit);
430 vui.sar_height = parse_u(16, data, bit);
433 assert(aspect_ratio_idc<=16);
434 vui.sar_width = aspect_ratio_width[aspect_ratio_idc];
435 vui.sar_height = aspect_ratio_height[aspect_ratio_idc];
439 vui.overscan_info_present_flag = parse_u(1, data, bit);
440 if(vui.overscan_info_present_flag){
441 vui.overscan_appropriate_flag = parse_u(1, data, bit);
444 vui.video_signal_type_present_flag = parse_u(1, data, bit);
445 if(vui.video_signal_type_present_flag){
446 vui.video_format = parse_u(3, data, bit);
447 vui.video_full_range_flag = parse_u(1, data, bit);
448 vui.colour_description_present_flag = parse_u(1, data, bit);
449 if(vui.colour_description_present_flag){
450 vui.colour_primaries = parse_u(8, data, bit);
451 vui.transfer_characteristics = parse_u(8, data, bit);
452 vui.matrix_coefficients = parse_u(8, data, bit);
456 vui.chroma_loc_info_present_flag = parse_u(1, data, bit);
457 if(vui.chroma_loc_info_present_flag){
458 vui.chroma_sample_loc_type_top_field = parse_ue(data, bit);
459 vui.chroma_sample_loc_type_bottom_field = parse_ue(data, bit);
462 vui.neutral_chroma_indication_flag = parse_u(1, data, bit);
463 vui.field_seq_flag = parse_u(1, data, bit);
464 vui.frame_field_info_present_flag = parse_u(1, data, bit);
467 vui.default_display_window_flag = parse_u(1, data, bit);
468 if(vui.default_display_window_flag){
469 vui.def_disp_win_left_offset = parse_ue(data, bit);
470 vui.def_disp_win_right_offset = parse_ue(data, bit);
471 vui.def_disp_win_top_offset = parse_ue(data, bit);
472 vui.def_disp_win_bottom_offset = parse_ue(data, bit);
476 vui.vui_timing_info_present_flag = parse_u(1, data, bit);
477 if(vui.vui_timing_info_present_flag){
478 vui.vui_num_units_in_tick = parse_u(32, data, bit);
479 vui.vui_time_scale = parse_u(32, data, bit);
480 vui.vui_poc_proportional_to_timing_flag = parse_u(1, data, bit);
481 if(vui.vui_poc_proportional_to_timing_flag)
482 vui.vui_num_ticks_poc_diff_one_minus1 = parse_ue(data, bit);
483 vui.vui_hrd_parameters_present_flag = parse_u(1, data, bit);
484 if(vui.vui_hrd_parameters_present_flag)
489 vui.bitstream_restriction_flag = parse_u(1, data, bit);
490 if(vui.bitstream_restriction_flag){
491 vui.tiles_fixed_structure_flag = parse_u(1, data, bit);
492 vui.motion_vectors_over_pic_boundaries_flag = parse_u(1, data, bit);
493 vui.restricted_ref_pic_lists_flag = parse_u(1, data, bit);
494 vui.min_spatial_segmentation_idc = parse_ue(data, bit);
495 vui.max_bytes_per_pic_denom = parse_ue(data, bit);
496 vui.max_bits_per_min_cu_denom = parse_ue(data, bit);
497 vui.log2_max_mv_length_horizontal = parse_ue(data, bit);
498 vui.log2_max_mv_length_vertical = parse_ue(data, bit);
502 set.sps_extension_present_flag = parse_u(1, data, bit);
503 if(set.sps_extension_present_flag){
504 set.sps_range_extension_flag = parse_u(1, data, bit);
505 set.sps_multilayer_extension_flag = parse_u(1, data, bit);
506 set.sps_3d_extension_flag = parse_u(1, data, bit);
507 set.sps_scc_extenion_flag = parse_u(1, data, bit);
508 set.sps_extension_4bits = parse_u(4, data, bit);
511 if(set.sps_extension_present_flag){
514 if(set.sps_multilayer_extension_flag){
517 if(set.sps_3d_extension_flag){
520 if(set.sps_scc_extenion_flag){
523 if(set.sps_extension_4bits){
524 while(more_rbsp_data(data, size, bit)){
525 parse_u(1, data, bit);
529 rbsp_trailing_bits(data, bit);
532void pic_parameter_set_rbsp(H265ParseData &parse, uint8_t *data,
size_t size)
536 for(uint32_t i=0; i<size; i++){
537 if(i%8 == 0) printf(
"\n");
538 printf(
"0x%02x ", data[i]);
546 H265PicParameterSet &set(parse.pic_set);
551void video_parameter_set_nalu(H265ParseData &parse,
const uint8_t *data,
size_t size)
555 for(uint32_t i=0; i<size; i++){
556 if(i%8 == 0) printf(
"\n");
557 printf(
"0x%02x ", data[i]);
566 H265NALheader header = {};
567 header.forbidden_zero_bit = parse_f(1, data, bit);
568 assert(header.forbidden_zero_bit == 0);
569 header.type = parse_u(6, data, bit);
570 header.layerId0 = parse_u(1, data, bit);
571 header.layerId1 = parse_u(5, data, bit);
572 header.TID = parse_u(3, data, bit);
573 assert(header.type == 32);
575 size_t rbsp_size = size-2;
576 uint32_t NumBytesInRBSP = 0;
577 uint8_t *rbsp =
new uint8_t[rbsp_size];
581 if(i+2 < j && data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x03){
582 rbsp[NumBytesInRBSP++] = data[i++];
583 rbsp[NumBytesInRBSP++] = data[i++];
587 rbsp[NumBytesInRBSP++] = data[i++];
589 assert(NumBytesInRBSP <= rbsp_size);
592 video_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
597void seq_parameter_set_nalu(H265ParseData &parse,
const uint8_t *data,
size_t size)
601 for(uint32_t i=0; i<size; i++){
602 if(i%8 == 0) printf(
"\n");
603 printf(
"0x%02x ", data[i]);
612 H265NALheader header = {};
613 header.forbidden_zero_bit = parse_f(1, data, bit);
614 assert(header.forbidden_zero_bit == 0);
615 header.type = parse_u(6, data, bit);
616 header.layerId0 = parse_u(1, data, bit);
617 header.layerId1 = parse_u(5, data, bit);
618 header.TID = parse_u(3, data, bit);
619 assert(header.type == 33);
621 size_t rbsp_size = size-2;
622 uint32_t NumBytesInRBSP = 0;
623 uint8_t *rbsp =
new uint8_t[rbsp_size];
627 if(i+2 < j && data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x03){
628 rbsp[NumBytesInRBSP++] = data[i++];
629 rbsp[NumBytesInRBSP++] = data[i++];
633 rbsp[NumBytesInRBSP++] = data[i++];
635 assert(NumBytesInRBSP <= rbsp_size);
638 seq_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
643void pic_parameter_set_nalu(H265ParseData &parse,
const uint8_t *data,
size_t size)
647 for(uint32_t i=0; i<size; i++){
648 if(i%8 == 0) printf(
"\n");
649 printf(
"0x%02x ", data[i]);
658 H265NALheader header = {};
659 header.forbidden_zero_bit = parse_f(1, data, bit);
660 assert(header.forbidden_zero_bit == 0);
661 header.type = parse_u(6, data, bit);
662 header.layerId0 = parse_u(1, data, bit);
663 header.layerId1 = parse_u(5, data, bit);
664 header.TID = parse_u(3, data, bit);
665 assert(header.type == 34);
667 size_t rbsp_size = size-2;
668 uint32_t NumBytesInRBSP = 0;
669 uint8_t *rbsp =
new uint8_t[rbsp_size];
673 if(i+2 < j && data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x03){
674 rbsp[NumBytesInRBSP++] = data[i++];
675 rbsp[NumBytesInRBSP++] = data[i++];
679 rbsp[NumBytesInRBSP++] = data[i++];
681 assert(NumBytesInRBSP <= rbsp_size);
684 pic_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
689void byte_stream_nal_unit(H265ParseData &parse,
const uint8_t *data,
size_t size)
693 for(uint32_t i=0; i<size; i++){
694 if(i%8 == 0) printf(
"\n");
695 printf(
"0x%02x ", data[i]);
702 while(!(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01) &&
703 !(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01)){
704 assert(data[i] == 0x00);
710 if(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01){
714 assert(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01);
721 H265NALheader header = {};
722 header.forbidden_zero_bit = parse_f(1, data, bit);
723 assert(header.forbidden_zero_bit == 0);
724 header.type = parse_u(6, data, bit);
725 header.layerId0 = parse_u(1, data, bit);
726 header.layerId1 = parse_u(5, data, bit);
727 header.TID = parse_u(3, data, bit);
731 while(!(data[j+0] == 0x00 && data[j+1] == 0x00 && data[j+2] == 0x00 && data[j+3] == 0x01) &&
732 !(data[j+0] == 0x00 && data[j+1] == 0x00 && data[j+2] == 0x01) &&
736 size_t rbsp_size = j-i;
738 uint32_t NumBytesInRBSP = 0;
739 if(header.type >= 32 && header.type <= 34){
740 uint8_t *rbsp =
new uint8_t[rbsp_size];
742 if(i+2 < j && data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x03){
743 rbsp[NumBytesInRBSP++] = data[i++];
744 rbsp[NumBytesInRBSP++] = data[i++];
748 rbsp[NumBytesInRBSP++] = data[i++];
750 assert(NumBytesInRBSP <= rbsp_size);
755 video_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
758 seq_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
761 pic_parameter_set_rbsp(parse, rbsp, NumBytesInRBSP);
784void extract_spspps(
const uint8_t *data,
size_t size, std::string &vps, std::string &sps, std::string &pps)
788 while(!(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01) &&
789 !(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01)){
790 assert(data[i] == 0x00);
796 if(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01){
800 assert(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01);
807 H265NALheader header = {};
808 header.forbidden_zero_bit = parse_f(1, data, bit);
809 assert(header.forbidden_zero_bit == 0);
810 header.type = parse_u(6, data, bit);
811 header.layerId0 = parse_u(1, data, bit);
812 header.layerId1 = parse_u(5, data, bit);
813 header.TID = parse_u(3, data, bit);
817 while(!(data[j+0] == 0x00 && data[j+1] == 0x00 && data[j+2] == 0x00 && data[j+3] == 0x01) &&
818 !(data[j+0] == 0x00 && data[j+1] == 0x00 && data[j+2] == 0x01) &&
822 size_t rbsp_size = j-i;
826 vps = std::string((
char*)&data[i], rbsp_size);
827 if (!sps.empty() && !pps.empty()) {
832 sps = std::string((
char*)&data[i], rbsp_size);
833 if (!vps.empty() && !pps.empty()) {
838 pps = std::string((
char*)&data[i], rbsp_size);
839 if (!vps.empty() && !sps.empty()) {
848bool COGSCORE_DLL_API extract_nalu_header(H265NALheader &header,
const uint8_t *data,
size_t size)
851 if(i+3 >= size)
return false;
853 while(!(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01) &&
854 !(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01)){
855 if(data[i] != 0x00)
return false;
857 if(i+3 >= size)
return false;
861 if(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x00 && data[i+3] == 0x01){
864 else if(data[i+0] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01){
873 header.forbidden_zero_bit = parse_f(1, data, bit);
874 if(header.forbidden_zero_bit != 0)
return false;
875 header.type = parse_u(6, data, bit);
876 header.layerId0 = parse_u(1, data, bit);
877 header.layerId1 = parse_u(5, data, bit);
878 header.TID = parse_u(3, data, bit);
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....