7 #include "packager/media/codecs/h265_parser.h"
12 #include "packager/base/logging.h"
13 #include "packager/media/base/macros.h"
14 #include "packager/media/codecs/nalu_reader.h"
16 #define TRUE_OR_RETURN(a) \
19 DVLOG(1) << "Failure while processing " << #a; \
20 return kInvalidStream; \
24 #define OK_OR_RETURN(a) \
26 Result status = (a); \
35 int GetNumPicTotalCurr(
const H265SliceHeader& slice_header,
37 int num_pic_total_curr = 0;
38 const H265ReferencePictureSet& ref_pic_set =
39 slice_header.short_term_ref_pic_set_sps_flag
40 ? sps.st_ref_pic_sets[slice_header.short_term_ref_pic_set_idx]
41 : slice_header.st_ref_pic_set;
43 for (
int i = 0; i < ref_pic_set.num_negative_pics; i++) {
44 if (ref_pic_set.used_by_curr_pic_s0[i])
47 for (
int i = 0; i < ref_pic_set.num_positive_pics; i++) {
48 if (ref_pic_set.used_by_curr_pic_s1[i])
52 return num_pic_total_curr + slice_header.used_by_curr_pic_lt;
55 void GetAspectRatioInfo(
const H265Sps& sps,
56 uint32_t* pixel_width,
57 uint32_t* pixel_height) {
60 int aspect_ratio_idc = sps.vui_parameters.aspect_ratio_idc;
63 switch (aspect_ratio_idc) {
64 case 1: *pixel_width = 1; *pixel_height = 1;
break;
65 case 2: *pixel_width = 12; *pixel_height = 11;
break;
66 case 3: *pixel_width = 10; *pixel_height = 11;
break;
67 case 4: *pixel_width = 16; *pixel_height = 11;
break;
68 case 5: *pixel_width = 40; *pixel_height = 33;
break;
69 case 6: *pixel_width = 24; *pixel_height = 11;
break;
70 case 7: *pixel_width = 20; *pixel_height = 11;
break;
71 case 8: *pixel_width = 32; *pixel_height = 11;
break;
72 case 9: *pixel_width = 80; *pixel_height = 33;
break;
73 case 10: *pixel_width = 18; *pixel_height = 11;
break;
74 case 11: *pixel_width = 15; *pixel_height = 11;
break;
75 case 12: *pixel_width = 64; *pixel_height = 33;
break;
76 case 13: *pixel_width = 160; *pixel_height = 99;
break;
77 case 14: *pixel_width = 4; *pixel_height = 3;
break;
78 case 15: *pixel_width = 3; *pixel_height = 2;
break;
79 case 16: *pixel_width = 2; *pixel_height = 1;
break;
82 *pixel_width = sps.vui_parameters.sar_width;
83 *pixel_height = sps.vui_parameters.sar_height;
88 LOG(WARNING) <<
"Unknown aspect_ratio_idc " << aspect_ratio_idc;
99 bool ExtractResolutionFromSps(
const H265Sps& sps,
100 uint32_t* coded_width,
101 uint32_t* coded_height,
102 uint32_t* pixel_width,
103 uint32_t* pixel_height) {
106 if (sps.conformance_window_flag) {
108 int sub_height_c = 0;
111 switch (sps.chroma_format_idc) {
129 LOG(ERROR) <<
"Unexpected chroma_format_idc " << sps.chroma_format_idc;
135 sub_width_c * (sps.conf_win_right_offset + sps.conf_win_left_offset);
137 sub_height_c * (sps.conf_win_bottom_offset + sps.conf_win_top_offset);
141 *coded_width = sps.pic_width_in_luma_samples - crop_x;
142 *coded_height = sps.pic_height_in_luma_samples - crop_y;
143 GetAspectRatioInfo(sps, pixel_width, pixel_height);
147 H265Pps::H265Pps() {}
148 H265Pps::~H265Pps() {}
150 H265Sps::H265Sps() {}
151 H265Sps::~H265Sps() {}
153 int H265Sps::GetPicSizeInCtbsY()
const {
154 int min_cb_log2_size_y = log2_min_luma_coding_block_size_minus3 + 3;
155 int ctb_log2_size_y =
156 min_cb_log2_size_y + log2_diff_max_min_luma_coding_block_size;
157 int ctb_size_y = 1 << ctb_log2_size_y;
160 int pic_width_in_ctbs_y = (pic_width_in_luma_samples - 1) / ctb_size_y + 1;
161 int pic_height_in_ctbs_y = (pic_height_in_luma_samples - 1) / ctb_size_y + 1;
162 return pic_width_in_ctbs_y * pic_height_in_ctbs_y;
165 int H265Sps::GetChromaArrayType()
const {
166 if (!separate_colour_plane_flag)
167 return chroma_format_idc;
172 H265ReferencePictureListModifications::H265ReferencePictureListModifications() {
174 H265ReferencePictureListModifications::
175 ~H265ReferencePictureListModifications() {}
177 H265SliceHeader::H265SliceHeader() {}
178 H265SliceHeader::~H265SliceHeader() {}
180 H265Parser::H265Parser() {}
181 H265Parser::~H265Parser() {}
193 TRUE_OR_RETURN(br->ReadBool(&slice_header->first_slice_segment_in_pic_flag));
194 if (nalu.
type() >= Nalu::H265_BLA_W_LP &&
195 nalu.
type() <= Nalu::H265_RSV_IRAP_VCL23) {
196 TRUE_OR_RETURN(br->ReadBool(&slice_header->no_output_of_prior_pics_flag));
199 TRUE_OR_RETURN(br->ReadUE(&slice_header->pic_parameter_set_id));
200 const H265Pps* pps =
GetPps(slice_header->pic_parameter_set_id);
206 if (!slice_header->first_slice_segment_in_pic_flag) {
207 if (pps->dependent_slice_segments_enabled_flag) {
208 TRUE_OR_RETURN(br->ReadBool(&slice_header->dependent_slice_segment_flag));
210 const int bit_length = ceil(log2(sps->GetPicSizeInCtbsY()));
211 TRUE_OR_RETURN(br->ReadBits(bit_length, &slice_header->segment_address));
214 if (!slice_header->dependent_slice_segment_flag) {
215 TRUE_OR_RETURN(br->SkipBits(pps->num_extra_slice_header_bits));
216 TRUE_OR_RETURN(br->ReadUE(&slice_header->slice_type));
217 if (pps->output_flag_present_flag) {
218 TRUE_OR_RETURN(br->ReadBool(&slice_header->pic_output_flag));
220 if (sps->separate_colour_plane_flag) {
221 TRUE_OR_RETURN(br->ReadBits(2, &slice_header->colour_plane_id));
224 if (nalu.
type() != Nalu::H265_IDR_W_RADL &&
225 nalu.
type() != Nalu::H265_IDR_N_LP) {
226 TRUE_OR_RETURN(br->ReadBits(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
227 &slice_header->slice_pic_order_cnt_lsb));
230 br->ReadBool(&slice_header->short_term_ref_pic_set_sps_flag));
231 if (!slice_header->short_term_ref_pic_set_sps_flag) {
232 OK_OR_RETURN(ParseReferencePictureSet(
233 sps->num_short_term_ref_pic_sets, sps->num_short_term_ref_pic_sets,
234 sps->st_ref_pic_sets, br, &slice_header->st_ref_pic_set));
235 }
else if (sps->num_short_term_ref_pic_sets > 1) {
237 br->ReadBits(ceil(log2(sps->num_short_term_ref_pic_sets)),
238 &slice_header->short_term_ref_pic_set_idx));
239 TRUE_OR_RETURN(slice_header->short_term_ref_pic_set_idx <
240 sps->num_short_term_ref_pic_sets);
243 if (sps->long_term_ref_pic_present_flag) {
244 if (sps->num_long_term_ref_pics > 0) {
245 TRUE_OR_RETURN(br->ReadUE(&slice_header->num_long_term_sps));
247 TRUE_OR_RETURN(br->ReadUE(&slice_header->num_long_term_pics));
249 const int pic_count =
250 slice_header->num_long_term_sps + slice_header->num_long_term_pics;
251 slice_header->long_term_pics_info.resize(pic_count);
252 for (
int i = 0; i < pic_count; i++) {
253 if (i < slice_header->num_long_term_sps) {
255 if (sps->num_long_term_ref_pics > 1) {
256 TRUE_OR_RETURN(br->ReadBits(
257 ceil(log2(sps->num_long_term_ref_pics)), <_idx_sps));
259 if (sps->used_by_curr_pic_lt_flag[lt_idx_sps])
260 slice_header->used_by_curr_pic_lt++;
262 TRUE_OR_RETURN(br->SkipBits(sps->log2_max_pic_order_cnt_lsb_minus4 +
264 bool used_by_curr_pic_lt_flag;
265 TRUE_OR_RETURN(br->ReadBool(&used_by_curr_pic_lt_flag));
266 if (used_by_curr_pic_lt_flag)
267 slice_header->used_by_curr_pic_lt++;
269 TRUE_OR_RETURN(br->ReadBool(&slice_header->long_term_pics_info[i]
270 .delta_poc_msb_present_flag));
271 if (slice_header->long_term_pics_info[i].delta_poc_msb_present_flag) {
272 TRUE_OR_RETURN(br->ReadUE(
273 &slice_header->long_term_pics_info[i].delta_poc_msb_cycle_lt));
278 if (sps->temporal_mvp_enabled_flag) {
280 br->ReadBool(&slice_header->slice_temporal_mvp_enabled_flag));
284 if (nalu.nuh_layer_id() != 0) {
285 NOTIMPLEMENTED() <<
"Multi-layer streams are not supported.";
286 return kUnsupportedStream;
289 if (sps->sample_adaptive_offset_enabled_flag) {
290 TRUE_OR_RETURN(br->ReadBool(&slice_header->slice_sao_luma_flag));
291 if (sps->GetChromaArrayType() != 0) {
292 TRUE_OR_RETURN(br->ReadBool(&slice_header->slice_sao_chroma_flag));
296 slice_header->num_ref_idx_l0_active_minus1 =
297 pps->num_ref_idx_l0_default_active_minus1;
298 slice_header->num_ref_idx_l1_active_minus1 =
299 pps->num_ref_idx_l1_default_active_minus1;
300 if (slice_header->slice_type == kPSlice ||
301 slice_header->slice_type == kBSlice) {
303 br->ReadBool(&slice_header->num_ref_idx_active_override_flag));
304 if (slice_header->num_ref_idx_active_override_flag) {
305 TRUE_OR_RETURN(br->ReadUE(&slice_header->num_ref_idx_l0_active_minus1));
306 if (slice_header->slice_type == kBSlice) {
308 br->ReadUE(&slice_header->num_ref_idx_l1_active_minus1));
312 const int num_pic_total_curr = GetNumPicTotalCurr(*slice_header, *sps);
313 if (pps->lists_modification_present_flag && num_pic_total_curr > 1) {
314 OK_OR_RETURN(SkipReferencePictureListModification(
315 *slice_header, *pps, num_pic_total_curr, br));
318 if (slice_header->slice_type == kBSlice) {
319 TRUE_OR_RETURN(br->ReadBool(&slice_header->mvd_l1_zero_flag));
321 if (pps->cabac_init_present_flag) {
322 TRUE_OR_RETURN(br->ReadBool(&slice_header->cabac_init_flag));
324 if (slice_header->slice_temporal_mvp_enabled_flag) {
325 if (slice_header->slice_type == kBSlice) {
326 TRUE_OR_RETURN(br->ReadBool(&slice_header->collocated_from_l0));
328 bool l0_greater_than_0 = slice_header->num_ref_idx_l0_active_minus1 > 0;
329 bool l1_greater_than_0 = slice_header->num_ref_idx_l1_active_minus1 > 0;
330 if (slice_header->collocated_from_l0 ? l0_greater_than_0
331 : l1_greater_than_0) {
332 TRUE_OR_RETURN(br->ReadUE(&slice_header->collocated_ref_idx));
336 if ((pps->weighted_pred_flag && slice_header->slice_type == kPSlice) ||
337 (pps->weighted_bipred_flag && slice_header->slice_type == kBSlice)) {
338 OK_OR_RETURN(SkipPredictionWeightTable(
339 slice_header->slice_type == kBSlice, *sps, *slice_header, br));
341 TRUE_OR_RETURN(br->ReadUE(&slice_header->five_minus_max_num_merge_cand));
344 TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_qp_delta));
345 if (pps->slice_chroma_qp_offsets_present_flag) {
346 TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_cb_qp_offset));
347 TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_cr_qp_offset));
350 if (pps->chroma_qp_offset_list_enabled_flag) {
352 br->ReadBool(&slice_header->cu_chroma_qp_offset_enabled_flag));
354 if (pps->deblocking_filter_override_enabled_flag) {
356 br->ReadBool(&slice_header->deblocking_filter_override_flag));
358 if (slice_header->deblocking_filter_override_flag) {
360 br->ReadBool(&slice_header->slice_deblocking_filter_disabled_flag));
361 if (!slice_header->slice_deblocking_filter_disabled_flag) {
362 TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_beta_offset_div2));
363 TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_tc_offset_div2));
366 if (pps->loop_filter_across_slices_enabled_flag &&
367 (slice_header->slice_sao_luma_flag ||
368 slice_header->slice_sao_chroma_flag ||
369 !slice_header->slice_deblocking_filter_disabled_flag)) {
370 TRUE_OR_RETURN(br->ReadBool(
371 &slice_header->slice_loop_filter_across_slices_enabled_flag));
375 if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
376 TRUE_OR_RETURN(br->ReadUE(&slice_header->num_entry_point_offsets));
377 if (slice_header->num_entry_point_offsets > 0) {
378 TRUE_OR_RETURN(br->ReadUE(&slice_header->offset_len_minus1));
379 slice_header->entry_point_offset_minus1.resize(
380 slice_header->num_entry_point_offsets);
381 for (
int i = 0; i < slice_header->num_entry_point_offsets; i++) {
383 br->ReadBits(slice_header->offset_len_minus1 + 1,
384 &slice_header->entry_point_offset_minus1[i]));
389 if (pps->slice_segment_header_extension_present_flag) {
390 int extension_length;
391 TRUE_OR_RETURN(br->ReadUE(&extension_length));
392 TRUE_OR_RETURN(br->SkipBits(extension_length * 8));
395 OK_OR_RETURN(ByteAlignment(br));
397 slice_header->header_bit_size = nalu.
payload_size() * 8 - br->NumBitsLeft();
402 DCHECK_EQ(Nalu::H265_PPS, nalu.
type());
410 std::unique_ptr<H265Pps> pps(
new H265Pps);
412 TRUE_OR_RETURN(br->ReadUE(&pps->pic_parameter_set_id));
413 TRUE_OR_RETURN(br->ReadUE(&pps->seq_parameter_set_id));
415 TRUE_OR_RETURN(br->ReadBool(&pps->dependent_slice_segments_enabled_flag));
416 TRUE_OR_RETURN(br->ReadBool(&pps->output_flag_present_flag));
417 TRUE_OR_RETURN(br->ReadBits(3, &pps->num_extra_slice_header_bits));
418 TRUE_OR_RETURN(br->ReadBool(&pps->sign_data_hiding_enabled_flag));
419 TRUE_OR_RETURN(br->ReadBool(&pps->cabac_init_present_flag));
421 TRUE_OR_RETURN(br->ReadUE(&pps->num_ref_idx_l0_default_active_minus1));
422 TRUE_OR_RETURN(br->ReadUE(&pps->num_ref_idx_l1_default_active_minus1));
423 TRUE_OR_RETURN(br->ReadSE(&pps->init_qp_minus26));
424 TRUE_OR_RETURN(br->ReadBool(&pps->constrained_intra_pred_flag));
425 TRUE_OR_RETURN(br->ReadBool(&pps->transform_skip_enabled_flag));
427 TRUE_OR_RETURN(br->ReadBool(&pps->cu_qp_delta_enabled_flag));
428 if (pps->cu_qp_delta_enabled_flag)
429 TRUE_OR_RETURN(br->ReadUE(&pps->diff_cu_qp_delta_depth));
430 TRUE_OR_RETURN(br->ReadSE(&pps->cb_qp_offset));
431 TRUE_OR_RETURN(br->ReadSE(&pps->cr_qp_offset));
433 TRUE_OR_RETURN(br->ReadBool(&pps->slice_chroma_qp_offsets_present_flag));
434 TRUE_OR_RETURN(br->ReadBool(&pps->weighted_pred_flag));
435 TRUE_OR_RETURN(br->ReadBool(&pps->weighted_bipred_flag));
436 TRUE_OR_RETURN(br->ReadBool(&pps->transquant_bypass_enabled_flag));
437 TRUE_OR_RETURN(br->ReadBool(&pps->tiles_enabled_flag));
438 TRUE_OR_RETURN(br->ReadBool(&pps->entropy_coding_sync_enabled_flag));
440 if (pps->tiles_enabled_flag) {
441 TRUE_OR_RETURN(br->ReadUE(&pps->num_tile_columns_minus1));
442 TRUE_OR_RETURN(br->ReadUE(&pps->num_tile_rows_minus1));
443 TRUE_OR_RETURN(br->ReadBool(&pps->uniform_spacing_flag));
444 if (!pps->uniform_spacing_flag) {
445 pps->column_width_minus1.resize(pps->num_tile_columns_minus1);
446 for (
int i = 0; i < pps->num_tile_columns_minus1; i++) {
447 TRUE_OR_RETURN(br->ReadUE(&pps->column_width_minus1[i]));
449 pps->row_height_minus1.resize(pps->num_tile_rows_minus1);
450 for (
int i = 0; i < pps->num_tile_rows_minus1; i++) {
451 TRUE_OR_RETURN(br->ReadUE(&pps->row_height_minus1[i]));
454 TRUE_OR_RETURN(br->ReadBool(&pps->loop_filter_across_tiles_enabled_flag));
457 TRUE_OR_RETURN(br->ReadBool(&pps->loop_filter_across_slices_enabled_flag));
458 TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_control_present_flag));
459 if (pps->deblocking_filter_control_present_flag) {
460 TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_override_enabled_flag));
461 TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_disabled_flag));
462 if (!pps->deblocking_filter_disabled_flag) {
463 TRUE_OR_RETURN(br->ReadSE(&pps->beta_offset_div2));
464 TRUE_OR_RETURN(br->ReadSE(&pps->tc_offset_div2));
468 TRUE_OR_RETURN(br->ReadBool(&pps->scaling_list_data_present_flag));
469 if (pps->scaling_list_data_present_flag) {
470 OK_OR_RETURN(SkipScalingListData(br));
473 TRUE_OR_RETURN(br->ReadBool(&pps->lists_modification_present_flag));
474 TRUE_OR_RETURN(br->ReadUE(&pps->log2_parallel_merge_level_minus2));
477 br->ReadBool(&pps->slice_segment_header_extension_present_flag));
479 bool pps_extension_present_flag;
480 bool pps_range_extension_flag =
false;
481 TRUE_OR_RETURN(br->ReadBool(&pps_extension_present_flag));
482 if (pps_extension_present_flag) {
483 TRUE_OR_RETURN(br->ReadBool(&pps_range_extension_flag));
485 TRUE_OR_RETURN(br->SkipBits(1 + 1 + 5));
488 if (pps_range_extension_flag) {
489 if (pps->transform_skip_enabled_flag) {
492 TRUE_OR_RETURN(br->ReadUE(&ignored));
495 TRUE_OR_RETURN(br->SkipBits(1));
496 TRUE_OR_RETURN(br->ReadBool(&pps->chroma_qp_offset_list_enabled_flag));
503 *pps_id = pps->pic_parameter_set_id;
504 active_ppses_[*pps_id] = std::move(pps);
510 DCHECK_EQ(Nalu::H265_SPS, nalu.
type());
519 std::unique_ptr<H265Sps> sps(
new H265Sps);
521 TRUE_OR_RETURN(br->ReadBits(4, &sps->video_parameter_set_id));
522 TRUE_OR_RETURN(br->ReadBits(3, &sps->max_sub_layers_minus1));
523 TRUE_OR_RETURN(br->ReadBool(&sps->temporal_id_nesting_flag));
526 ReadProfileTierLevel(
true, sps->max_sub_layers_minus1, br, sps.get()));
528 TRUE_OR_RETURN(br->ReadUE(&sps->seq_parameter_set_id));
529 TRUE_OR_RETURN(br->ReadUE(&sps->chroma_format_idc));
530 if (sps->chroma_format_idc == 3) {
531 TRUE_OR_RETURN(br->ReadBool(&sps->separate_colour_plane_flag));
533 TRUE_OR_RETURN(br->ReadUE(&sps->pic_width_in_luma_samples));
534 TRUE_OR_RETURN(br->ReadUE(&sps->pic_height_in_luma_samples));
536 TRUE_OR_RETURN(br->ReadBool(&sps->conformance_window_flag));
537 if (sps->conformance_window_flag) {
538 TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_left_offset));
539 TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_right_offset));
540 TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_top_offset));
541 TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_bottom_offset));
544 TRUE_OR_RETURN(br->ReadUE(&sps->bit_depth_luma_minus8));
545 TRUE_OR_RETURN(br->ReadUE(&sps->bit_depth_chroma_minus8));
546 TRUE_OR_RETURN(br->ReadUE(&sps->log2_max_pic_order_cnt_lsb_minus4));
548 TRUE_OR_RETURN(br->ReadBool(&sps->sub_layer_ordering_info_present_flag));
549 int start = sps->sub_layer_ordering_info_present_flag
551 : sps->max_sub_layers_minus1;
552 for (
int i = start; i <= sps->max_sub_layers_minus1; i++) {
553 TRUE_OR_RETURN(br->ReadUE(&sps->max_dec_pic_buffering_minus1[i]));
554 TRUE_OR_RETURN(br->ReadUE(&sps->max_num_reorder_pics[i]));
555 TRUE_OR_RETURN(br->ReadUE(&sps->max_latency_increase_plus1[i]));
558 TRUE_OR_RETURN(br->ReadUE(&sps->log2_min_luma_coding_block_size_minus3));
559 TRUE_OR_RETURN(br->ReadUE(&sps->log2_diff_max_min_luma_coding_block_size));
560 TRUE_OR_RETURN(br->ReadUE(&sps->log2_min_luma_transform_block_size_minus2));
561 TRUE_OR_RETURN(br->ReadUE(&sps->log2_diff_max_min_luma_transform_block_size));
562 TRUE_OR_RETURN(br->ReadUE(&sps->max_transform_hierarchy_depth_inter));
563 TRUE_OR_RETURN(br->ReadUE(&sps->max_transform_hierarchy_depth_intra));
565 TRUE_OR_RETURN(br->ReadBool(&sps->scaling_list_enabled_flag));
566 if (sps->scaling_list_enabled_flag) {
567 TRUE_OR_RETURN(br->ReadBool(&sps->scaling_list_data_present_flag));
568 if (sps->scaling_list_data_present_flag) {
569 OK_OR_RETURN(SkipScalingListData(br));
573 TRUE_OR_RETURN(br->ReadBool(&sps->amp_enabled_flag));
574 TRUE_OR_RETURN(br->ReadBool(&sps->sample_adaptive_offset_enabled_flag));
575 TRUE_OR_RETURN(br->ReadBool(&sps->pcm_enabled_flag));
576 if (sps->pcm_enabled_flag) {
577 TRUE_OR_RETURN(br->ReadBits(4, &sps->pcm_sample_bit_depth_luma_minus1));
578 TRUE_OR_RETURN(br->ReadBits(4, &sps->pcm_sample_bit_depth_chroma_minus1));
580 br->ReadUE(&sps->log2_min_pcm_luma_coding_block_size_minus3));
582 br->ReadUE(&sps->log2_diff_max_min_pcm_luma_coding_block_size));
583 TRUE_OR_RETURN(br->ReadBool(&sps->pcm_loop_filter_disabled_flag));
586 TRUE_OR_RETURN(br->ReadUE(&sps->num_short_term_ref_pic_sets));
587 sps->st_ref_pic_sets.resize(sps->num_short_term_ref_pic_sets);
588 for (
int i = 0; i < sps->num_short_term_ref_pic_sets; i++) {
589 OK_OR_RETURN(ParseReferencePictureSet(sps->num_short_term_ref_pic_sets, i,
590 sps->st_ref_pic_sets, br,
591 &sps->st_ref_pic_sets[i]));
594 TRUE_OR_RETURN(br->ReadBool(&sps->long_term_ref_pic_present_flag));
595 if (sps->long_term_ref_pic_present_flag) {
596 TRUE_OR_RETURN(br->ReadUE(&sps->num_long_term_ref_pics));
597 sps->lt_ref_pic_poc_lsb.resize(sps->num_long_term_ref_pics);
598 sps->used_by_curr_pic_lt_flag.resize(sps->num_long_term_ref_pics);
599 for (
int i = 0; i < sps->num_long_term_ref_pics; i++) {
600 TRUE_OR_RETURN(br->ReadBits(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
601 &sps->lt_ref_pic_poc_lsb[i]));
603 TRUE_OR_RETURN(br->ReadBool(&temp));
604 sps->used_by_curr_pic_lt_flag[i] = temp;
608 TRUE_OR_RETURN(br->ReadBool(&sps->temporal_mvp_enabled_flag));
609 TRUE_OR_RETURN(br->ReadBool(&sps->strong_intra_smoothing_enabled_flag));
611 TRUE_OR_RETURN(br->ReadBool(&sps->vui_parameters_present));
612 if (sps->vui_parameters_present) {
613 OK_OR_RETURN(ParseVuiParameters(sps->max_sub_layers_minus1, br,
614 &sps->vui_parameters));
620 *sps_id = sps->seq_parameter_set_id;
621 active_spses_[*sps_id] = std::move(sps);
627 return active_ppses_[pps_id].get();
631 return active_spses_[sps_id].get();
634 H265Parser::Result H265Parser::ParseVuiParameters(
int max_num_sub_layers_minus1,
640 TRUE_OR_RETURN(br->ReadBool(&vui->aspect_ratio_info_present_flag));
641 if (vui->aspect_ratio_info_present_flag) {
642 TRUE_OR_RETURN(br->ReadBits(8, &vui->aspect_ratio_idc));
643 if (vui->aspect_ratio_idc == H265VuiParameters::kExtendedSar) {
644 TRUE_OR_RETURN(br->ReadBits(16, &vui->sar_width));
645 TRUE_OR_RETURN(br->ReadBits(16, &vui->sar_height));
649 bool overscan_info_present_flag;
650 TRUE_OR_RETURN(br->ReadBool(&overscan_info_present_flag));
651 if (overscan_info_present_flag) {
652 TRUE_OR_RETURN(br->SkipBits(1));
655 bool video_signal_type_present_flag;
656 TRUE_OR_RETURN(br->ReadBool(&video_signal_type_present_flag));
657 if (video_signal_type_present_flag) {
658 TRUE_OR_RETURN(br->SkipBits(3));
659 TRUE_OR_RETURN(br->SkipBits(1));
661 bool colour_description_present_flag;
662 TRUE_OR_RETURN(br->ReadBool(&colour_description_present_flag));
663 if (colour_description_present_flag) {
664 TRUE_OR_RETURN(br->SkipBits(8));
665 TRUE_OR_RETURN(br->ReadBits(8, &vui->transfer_characteristics));
666 TRUE_OR_RETURN(br->SkipBits(8));
670 bool chroma_loc_info_present_flag;
671 TRUE_OR_RETURN(br->ReadBool(&chroma_loc_info_present_flag));
672 if (chroma_loc_info_present_flag) {
674 TRUE_OR_RETURN(br->ReadUE(&ignored));
675 TRUE_OR_RETURN(br->ReadUE(&ignored));
680 TRUE_OR_RETURN(br->SkipBits(3));
682 bool default_display_window_flag;
683 TRUE_OR_RETURN(br->ReadBool(&default_display_window_flag));
684 if (default_display_window_flag) {
685 TRUE_OR_RETURN(br->ReadUE(&ignored));
686 TRUE_OR_RETURN(br->ReadUE(&ignored));
687 TRUE_OR_RETURN(br->ReadUE(&ignored));
688 TRUE_OR_RETURN(br->ReadUE(&ignored));
691 bool vui_timing_info_present_flag;
692 TRUE_OR_RETURN(br->ReadBool(&vui_timing_info_present_flag));
693 if (vui_timing_info_present_flag) {
695 TRUE_OR_RETURN(br->SkipBits(32 + 32));
697 bool vui_poc_proportional_to_timing_flag;
698 TRUE_OR_RETURN(br->ReadBool(&vui_poc_proportional_to_timing_flag));
699 if (vui_poc_proportional_to_timing_flag) {
701 TRUE_OR_RETURN(br->ReadUE(&ignored));
704 bool vui_hdr_parameters_present_flag;
705 TRUE_OR_RETURN(br->ReadBool(&vui_hdr_parameters_present_flag));
706 if (vui_hdr_parameters_present_flag) {
707 OK_OR_RETURN(SkipHrdParameters(max_num_sub_layers_minus1, br));
711 TRUE_OR_RETURN(br->ReadBool(&vui->bitstream_restriction_flag));
712 if (vui->bitstream_restriction_flag) {
715 TRUE_OR_RETURN(br->SkipBits(3));
717 TRUE_OR_RETURN(br->ReadUE(&vui->min_spatial_segmentation_idc));
718 TRUE_OR_RETURN(br->ReadUE(&ignored));
719 TRUE_OR_RETURN(br->ReadUE(&ignored));
720 TRUE_OR_RETURN(br->ReadUE(&ignored));
721 TRUE_OR_RETURN(br->ReadUE(&ignored));
727 H265Parser::Result H265Parser::ParseReferencePictureSet(
728 int num_short_term_ref_pic_sets,
730 const std::vector<H265ReferencePictureSet>& ref_pic_sets,
732 H265ReferencePictureSet* out_ref_pic_set) {
737 bool inter_ref_pic_set_prediction =
false;
738 if (st_rps_idx != 0) {
739 TRUE_OR_RETURN(br->ReadBool(&inter_ref_pic_set_prediction));
742 if (inter_ref_pic_set_prediction) {
744 if (st_rps_idx == num_short_term_ref_pic_sets) {
745 TRUE_OR_RETURN(br->ReadUE(&delta_idx));
747 TRUE_OR_RETURN(delta_idx <= st_rps_idx);
750 int ref_rps_idx = st_rps_idx - delta_idx;
751 DCHECK_LE(0, ref_rps_idx);
752 DCHECK_LT(ref_rps_idx, st_rps_idx);
755 int abs_delta_rps_minus1;
756 TRUE_OR_RETURN(br->ReadBool(&delta_rps_sign));
757 TRUE_OR_RETURN(br->ReadUE(&abs_delta_rps_minus1));
759 delta_rps_sign ? -(abs_delta_rps_minus1 + 1) : abs_delta_rps_minus1 + 1;
761 int ref_num_delta_pocs = ref_pic_sets[ref_rps_idx].num_delta_pocs;
762 std::vector<bool> used_by_curr_pic(ref_num_delta_pocs + 1);
763 std::vector<bool> use_delta(ref_num_delta_pocs + 1);
764 for (
int j = 0; j <= ref_num_delta_pocs; j++) {
766 TRUE_OR_RETURN(br->ReadBool(&temp));
767 used_by_curr_pic[j] = temp;
769 if (!used_by_curr_pic[j]) {
770 TRUE_OR_RETURN(br->ReadBool(&temp));
777 int ref_num_positive_pics = ref_pic_sets[ref_rps_idx].num_positive_pics;
778 int ref_num_negative_pics = ref_pic_sets[ref_rps_idx].num_negative_pics;
784 for (
int j = ref_num_positive_pics - 1; j >= 0; j--) {
785 int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s1[j] + delta_rps;
786 if (d_poc < 0 && use_delta[ref_num_negative_pics + j]) {
787 out_ref_pic_set->delta_poc_s0[i] = d_poc;
788 out_ref_pic_set->used_by_curr_pic_s0[i] =
789 used_by_curr_pic[ref_num_negative_pics + j];
793 if (delta_rps < 0 && use_delta[ref_num_delta_pocs]) {
794 out_ref_pic_set->delta_poc_s0[i] = delta_rps;
795 out_ref_pic_set->used_by_curr_pic_s0[i] =
796 used_by_curr_pic[ref_num_delta_pocs];
799 for (
int j = 0; j < ref_num_negative_pics; j++) {
800 int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s0[j] + delta_rps;
801 if (d_poc < 0 && use_delta[j]) {
802 out_ref_pic_set->delta_poc_s0[i] = d_poc;
803 out_ref_pic_set->used_by_curr_pic_s0[i] = used_by_curr_pic[j];
807 out_ref_pic_set->num_negative_pics = i;
813 for (
int j = ref_num_negative_pics - 1; j >= 0; j--) {
814 int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s0[j] + delta_rps;
815 if (d_poc > 0 && use_delta[j]) {
816 out_ref_pic_set->delta_poc_s1[i] = d_poc;
817 out_ref_pic_set->used_by_curr_pic_s1[i] = used_by_curr_pic[j];
821 if (delta_rps > 0 && use_delta[ref_num_delta_pocs]) {
822 out_ref_pic_set->delta_poc_s1[i] = delta_rps;
823 out_ref_pic_set->used_by_curr_pic_s1[i] =
824 used_by_curr_pic[ref_num_delta_pocs];
827 for (
int j = 0; j < ref_num_positive_pics; j++) {
828 int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s1[j] + delta_rps;
829 if (d_poc > 0 && use_delta[ref_num_negative_pics + j]) {
830 out_ref_pic_set->delta_poc_s1[i] = d_poc;
831 out_ref_pic_set->used_by_curr_pic_s1[i] =
832 used_by_curr_pic[ref_num_negative_pics + j];
836 out_ref_pic_set->num_positive_pics = i;
839 TRUE_OR_RETURN(br->ReadUE(&out_ref_pic_set->num_negative_pics));
840 TRUE_OR_RETURN(out_ref_pic_set->num_negative_pics <= kMaxRefPicSetCount);
841 TRUE_OR_RETURN(br->ReadUE(&out_ref_pic_set->num_positive_pics));
842 TRUE_OR_RETURN(out_ref_pic_set->num_positive_pics <= kMaxRefPicSetCount);
845 for (
int i = 0; i < out_ref_pic_set->num_negative_pics; i++) {
846 int delta_poc_s0_minus1;
847 TRUE_OR_RETURN(br->ReadUE(&delta_poc_s0_minus1));
848 out_ref_pic_set->delta_poc_s0[i] = prev_poc - (delta_poc_s0_minus1 + 1);
849 prev_poc = out_ref_pic_set->delta_poc_s0[i];
851 TRUE_OR_RETURN(br->ReadBool(&out_ref_pic_set->used_by_curr_pic_s0[i]));
855 for (
int i = 0; i < out_ref_pic_set->num_positive_pics; i++) {
856 int delta_poc_s1_minus1;
857 TRUE_OR_RETURN(br->ReadUE(&delta_poc_s1_minus1));
858 out_ref_pic_set->delta_poc_s1[i] = prev_poc + delta_poc_s1_minus1 + 1;
859 prev_poc = out_ref_pic_set->delta_poc_s1[i];
861 TRUE_OR_RETURN(br->ReadBool(&out_ref_pic_set->used_by_curr_pic_s1[i]));
865 out_ref_pic_set->num_delta_pocs =
866 out_ref_pic_set->num_positive_pics + out_ref_pic_set->num_negative_pics;
870 H265Parser::Result H265Parser::SkipReferencePictureListModification(
871 const H265SliceHeader& slice_header,
873 int num_pic_total_curr,
877 bool ref_pic_list_modification_flag_l0;
878 TRUE_OR_RETURN(br->ReadBool(&ref_pic_list_modification_flag_l0));
879 if (ref_pic_list_modification_flag_l0) {
880 for (
int i = 0; i <= slice_header.num_ref_idx_l0_active_minus1; i++) {
881 TRUE_OR_RETURN(br->SkipBits(ceil(log2(num_pic_total_curr))));
885 if (slice_header.slice_type == kBSlice) {
886 bool ref_pic_list_modification_flag_l1;
887 TRUE_OR_RETURN(br->ReadBool(&ref_pic_list_modification_flag_l1));
888 if (ref_pic_list_modification_flag_l1) {
889 for (
int i = 0; i <= slice_header.num_ref_idx_l1_active_minus1; i++) {
890 TRUE_OR_RETURN(br->SkipBits(ceil(log2(num_pic_total_curr))));
898 H265Parser::Result H265Parser::SkipPredictionWeightTablePart(
899 int num_ref_idx_minus1,
900 int chroma_array_type,
904 std::vector<bool> luma_weight_flag(num_ref_idx_minus1 + 1);
905 std::vector<bool> chroma_weight_flag(num_ref_idx_minus1 + 1);
907 for (
int i = 0; i <= num_ref_idx_minus1; i++) {
909 TRUE_OR_RETURN(br->ReadBool(&temp));
910 luma_weight_flag[i] = temp;
912 if (chroma_array_type != 0) {
913 for (
int i = 0; i <= num_ref_idx_minus1; i++) {
915 TRUE_OR_RETURN(br->ReadBool(&temp));
916 chroma_weight_flag[i] = temp;
919 for (
int i = 0; i <= num_ref_idx_minus1; i++) {
920 if (luma_weight_flag[i]) {
921 TRUE_OR_RETURN(br->ReadSE(&ignored));
922 TRUE_OR_RETURN(br->ReadSE(&ignored));
924 if (chroma_weight_flag[i]) {
925 for (
int j = 0; j < 2; j++) {
926 TRUE_OR_RETURN(br->ReadSE(&ignored));
927 TRUE_OR_RETURN(br->ReadSE(&ignored));
935 H265Parser::Result H265Parser::SkipPredictionWeightTable(
938 const H265SliceHeader& slice_header,
942 int chroma_array_type = sps.GetChromaArrayType();
944 TRUE_OR_RETURN(br->ReadUE(&ignored));
945 if (chroma_array_type != 0) {
946 TRUE_OR_RETURN(br->ReadSE(&ignored));
948 OK_OR_RETURN(SkipPredictionWeightTablePart(
949 slice_header.num_ref_idx_l0_active_minus1, chroma_array_type, br));
951 OK_OR_RETURN(SkipPredictionWeightTablePart(
952 slice_header.num_ref_idx_l1_active_minus1, chroma_array_type, br));
958 H265Parser::Result H265Parser::ReadProfileTierLevel(
959 bool profile_present,
960 int max_num_sub_layers_minus1,
965 if (profile_present) {
974 for (
int i = 0; i < 11; i++)
975 TRUE_OR_RETURN(br->ReadBits(8, &sps->general_profile_tier_level_data[i]));
978 TRUE_OR_RETURN(br->ReadBits(8, &sps->general_profile_tier_level_data[11]));
980 std::vector<bool> sub_layer_profile_present(max_num_sub_layers_minus1);
981 std::vector<bool> sub_layer_level_present(max_num_sub_layers_minus1);
982 for (
int i = 0; i < max_num_sub_layers_minus1; i++) {
984 TRUE_OR_RETURN(br->ReadBool(&profile));
985 TRUE_OR_RETURN(br->ReadBool(&level));
986 sub_layer_profile_present[i] = profile;
987 sub_layer_level_present[i] = level;
990 if (max_num_sub_layers_minus1 > 0) {
991 for (
int i = max_num_sub_layers_minus1; i < 8; i++)
992 TRUE_OR_RETURN(br->SkipBits(2));
995 for (
int i = 0; i < max_num_sub_layers_minus1; i++) {
996 if (sub_layer_profile_present[i]) {
1001 TRUE_OR_RETURN(br->SkipBits(2 + 1 + 5 + 32 + 4 + 43 + 1));
1003 if (sub_layer_level_present[i]) {
1004 TRUE_OR_RETURN(br->SkipBits(8));
1011 H265Parser::Result H265Parser::SkipScalingListData(H26xBitReader* br) {
1014 for (
int size_id = 0; size_id < 4; size_id++) {
1015 for (
int matrix_id = 0; matrix_id < 6;
1016 matrix_id += ((size_id == 3) ? 3 : 1)) {
1017 bool scaling_list_pred_mode;
1018 TRUE_OR_RETURN(br->ReadBool(&scaling_list_pred_mode));
1019 if (!scaling_list_pred_mode) {
1021 TRUE_OR_RETURN(br->ReadUE(&ignored));
1023 int coefNum = std::min(64, (1 << (4 + (size_id << 1))));
1025 TRUE_OR_RETURN(br->ReadSE(&ignored));
1028 for (
int i = 0; i < coefNum; i++) {
1029 TRUE_OR_RETURN(br->ReadSE(&ignored));
1038 H265Parser::Result H265Parser::SkipHrdParameters(
int max_num_sub_layers_minus1,
1039 H26xBitReader* br) {
1041 const bool common_inf_present_flag =
true;
1044 bool nal_hdr_parameters_present_flag;
1045 bool vcl_hdr_parameters_present_flag;
1046 bool sub_pic_hdr_params_present_flag =
false;
1047 if (common_inf_present_flag) {
1048 TRUE_OR_RETURN(br->ReadBool(&nal_hdr_parameters_present_flag));
1049 TRUE_OR_RETURN(br->ReadBool(&vcl_hdr_parameters_present_flag));
1050 if (nal_hdr_parameters_present_flag || vcl_hdr_parameters_present_flag) {
1051 TRUE_OR_RETURN(br->ReadBool(&sub_pic_hdr_params_present_flag));
1052 if (sub_pic_hdr_params_present_flag) {
1056 TRUE_OR_RETURN(br->SkipBits(8 + 5 + 1 + 5));
1060 TRUE_OR_RETURN(br->SkipBits(4 + 4));
1061 if (sub_pic_hdr_params_present_flag)
1062 TRUE_OR_RETURN(br->SkipBits(4));
1066 TRUE_OR_RETURN(br->SkipBits(5 + 5 + 5));
1070 for (
int i = 0; i <= max_num_sub_layers_minus1; i++) {
1071 bool fixed_pic_rate_general_flag;
1072 bool fixed_pic_rate_within_cvs_flag =
true;
1073 bool low_delay_hdr_flag =
false;
1074 int cpb_cnt_minus1 = 0;
1075 TRUE_OR_RETURN(br->ReadBool(&fixed_pic_rate_general_flag));
1076 if (!fixed_pic_rate_general_flag)
1077 TRUE_OR_RETURN(br->ReadBool(&fixed_pic_rate_within_cvs_flag));
1078 if (fixed_pic_rate_within_cvs_flag)
1079 TRUE_OR_RETURN(br->ReadUE(&ignored));
1081 TRUE_OR_RETURN(br->ReadBool(&low_delay_hdr_flag));
1082 if (!low_delay_hdr_flag)
1083 TRUE_OR_RETURN(br->ReadUE(&cpb_cnt_minus1));
1085 if (nal_hdr_parameters_present_flag) {
1086 OK_OR_RETURN(SkipSubLayerHrdParameters(
1087 cpb_cnt_minus1, sub_pic_hdr_params_present_flag, br));
1089 if (vcl_hdr_parameters_present_flag) {
1090 OK_OR_RETURN(SkipSubLayerHrdParameters(
1091 cpb_cnt_minus1, sub_pic_hdr_params_present_flag, br));
1098 H265Parser::Result H265Parser::SkipSubLayerHrdParameters(
1100 bool sub_pic_hdr_params_present_flag,
1101 H26xBitReader* br) {
1103 for (
int i = 0; i <= cpb_cnt_minus1; i++) {
1104 TRUE_OR_RETURN(br->ReadUE(&ignored));
1105 TRUE_OR_RETURN(br->ReadUE(&ignored));
1106 if (sub_pic_hdr_params_present_flag) {
1107 TRUE_OR_RETURN(br->ReadUE(&ignored));
1108 TRUE_OR_RETURN(br->ReadUE(&ignored));
1111 TRUE_OR_RETURN(br->SkipBits(1));
1117 H265Parser::Result H265Parser::ByteAlignment(H26xBitReader* br) {
1118 TRUE_OR_RETURN(br->SkipBits(1));
1119 TRUE_OR_RETURN(br->SkipBits(br->NumBitsLeft() % 8));