5 #include "packager/media/codecs/h264_parser.h" 8 #include "packager/base/logging.h" 9 #include "packager/media/base/buffer_reader.h" 11 #define LOG_ERROR_ONCE(msg) \ 13 static bool logged_once = false; \ 14 LOG_IF(ERROR, !logged_once) << msg; \ 23 bool ExtractResolutionFromSps(
const H264Sps& sps,
24 uint32_t* coded_width,
25 uint32_t* coded_height,
26 uint32_t* pixel_width,
27 uint32_t* pixel_height) {
30 if (sps.frame_cropping_flag) {
34 switch (sps.chroma_format_idc) {
54 LOG(ERROR) <<
"Unexpected chroma_format_idc " << sps.chroma_format_idc;
59 int crop_unit_x = sub_width_c;
60 int crop_unit_y = sub_height_c * (2 - (sps.frame_mbs_only_flag ? 1 : 0));
61 crop_x = crop_unit_x *
62 (sps.frame_crop_left_offset + sps.frame_crop_right_offset);
63 crop_y = crop_unit_y *
64 (sps.frame_crop_top_offset + sps.frame_crop_bottom_offset);
68 int pic_width_in_mbs = sps.pic_width_in_mbs_minus1 + 1;
69 *coded_width = pic_width_in_mbs * 16 - crop_x;
72 int pic_height_in_mbs = (2 - (sps.frame_mbs_only_flag ? 1 : 0)) *
73 (sps.pic_height_in_map_units_minus1 + 1);
74 *coded_height = pic_height_in_mbs * 16 - crop_y;
77 *pixel_width = sps.sar_width == 0 ? 1 : sps.sar_width;
78 *pixel_height = sps.sar_height == 0 ? 1 : sps.sar_height;
79 DVLOG(2) <<
"Found coded_width: " << *coded_width
80 <<
" coded_height: " << *coded_height
81 <<
" pixel_width: " << *pixel_width
82 <<
" pixel_height: " << *pixel_height;
86 bool H264SliceHeader::IsPSlice()
const {
87 return (slice_type % 5 == kPSlice);
90 bool H264SliceHeader::IsBSlice()
const {
91 return (slice_type % 5 == kBSlice);
94 bool H264SliceHeader::IsISlice()
const {
95 return (slice_type % 5 == kISlice);
98 bool H264SliceHeader::IsSPSlice()
const {
99 return (slice_type % 5 == kSPSlice);
102 bool H264SliceHeader::IsSISlice()
const {
103 return (slice_type % 5 == kSISlice);
107 memset(
this, 0,
sizeof(*
this));
111 memset(
this, 0,
sizeof(*
this));
114 H264SliceHeader::H264SliceHeader() {
115 memset(
this, 0,
sizeof(*
this));
118 H264SEIMessage::H264SEIMessage() {
119 memset(
this, 0,
sizeof(*
this));
122 #define READ_BITS_OR_RETURN(num_bits, out) \ 124 if (!br->ReadBits(num_bits, (out))) { \ 126 << "Error in stream: unexpected EOS while trying to read " #out; \ 127 return kInvalidStream; \ 131 #define READ_BOOL_OR_RETURN(out) \ 134 if (!br->ReadBits(1, &_out)) { \ 136 << "Error in stream: unexpected EOS while trying to read " #out; \ 137 return kInvalidStream; \ 139 *(out) = _out != 0; \ 142 #define READ_UE_OR_RETURN(out) \ 144 if (!br->ReadUE(out)) { \ 145 DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \ 146 return kInvalidStream; \ 150 #define READ_SE_OR_RETURN(out) \ 152 if (!br->ReadSE(out)) { \ 153 DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \ 154 return kInvalidStream; \ 158 #define IN_RANGE_OR_RETURN(val, min, max) \ 160 if ((val) < (min) || (val) > (max)) { \ 161 DVLOG(1) << "Error in stream: invalid value, expected " #val " to be" \ 162 << " in range [" << (min) << ":" << (max) << "]" \ 163 << " found " << (val) << " instead"; \ 164 return kInvalidStream; \ 168 #define TRUE_OR_RETURN(a) \ 171 DVLOG(1) << "Error in stream: invalid value, expected " << #a; \ 172 return kInvalidStream; \ 176 enum AspectRatioIdc {
182 static const int kTableSarWidth[] = {
183 0, 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2
185 static const int kTableSarHeight[] = {
186 0, 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1
188 static_assert(arraysize(kTableSarWidth) == arraysize(kTableSarHeight),
189 "sar_tables_must_have_same_size");
191 H264Parser::H264Parser() {}
193 H264Parser::~H264Parser() {}
195 const H264Pps* H264Parser::GetPps(
int pps_id) {
196 return active_PPSes_[pps_id].get();
199 const H264Sps* H264Parser::GetSps(
int sps_id) {
200 return active_SPSes_[sps_id].get();
204 static const int kDefault4x4Intra[kH264ScalingList4x4Length] = {
205 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42, };
207 static const int kDefault4x4Inter[kH264ScalingList4x4Length] = {
208 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34, };
210 static const int kDefault8x8Intra[kH264ScalingList8x8Length] = {
211 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23,
212 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
213 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
214 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42, };
216 static const int kDefault8x8Inter[kH264ScalingList8x8Length] = {
217 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
218 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
219 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
220 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35, };
222 static inline void DefaultScalingList4x4(
224 int scaling_list4x4[][kH264ScalingList4x4Length]) {
228 memcpy(scaling_list4x4[i], kDefault4x4Intra,
sizeof(kDefault4x4Intra));
230 memcpy(scaling_list4x4[i], kDefault4x4Inter,
sizeof(kDefault4x4Inter));
233 static inline void DefaultScalingList8x8(
235 int scaling_list8x8[][kH264ScalingList8x8Length]) {
239 memcpy(scaling_list8x8[i], kDefault8x8Intra,
sizeof(kDefault8x8Intra));
241 memcpy(scaling_list8x8[i], kDefault8x8Inter,
sizeof(kDefault8x8Inter));
244 static void FallbackScalingList4x4(
246 const int default_scaling_list_intra[],
247 const int default_scaling_list_inter[],
248 int scaling_list4x4[][kH264ScalingList4x4Length]) {
249 static const int kScalingList4x4ByteSize =
250 sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length;
254 memcpy(scaling_list4x4[i], default_scaling_list_intra,
255 kScalingList4x4ByteSize);
259 memcpy(scaling_list4x4[i], scaling_list4x4[0], kScalingList4x4ByteSize);
263 memcpy(scaling_list4x4[i], scaling_list4x4[1], kScalingList4x4ByteSize);
267 memcpy(scaling_list4x4[i], default_scaling_list_inter,
268 kScalingList4x4ByteSize);
272 memcpy(scaling_list4x4[i], scaling_list4x4[3], kScalingList4x4ByteSize);
276 memcpy(scaling_list4x4[i], scaling_list4x4[4], kScalingList4x4ByteSize);
285 static void FallbackScalingList8x8(
287 const int default_scaling_list_intra[],
288 const int default_scaling_list_inter[],
289 int scaling_list8x8[][kH264ScalingList8x8Length]) {
290 static const int kScalingList8x8ByteSize =
291 sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length;
295 memcpy(scaling_list8x8[i], default_scaling_list_intra,
296 kScalingList8x8ByteSize);
300 memcpy(scaling_list8x8[i], default_scaling_list_inter,
301 kScalingList8x8ByteSize);
305 memcpy(scaling_list8x8[i], scaling_list8x8[0], kScalingList8x8ByteSize);
309 memcpy(scaling_list8x8[i], scaling_list8x8[1], kScalingList8x8ByteSize);
313 memcpy(scaling_list8x8[i], scaling_list8x8[2], kScalingList8x8ByteSize);
317 memcpy(scaling_list8x8[i], scaling_list8x8[3], kScalingList8x8ByteSize);
326 H264Parser::Result H264Parser::ParseScalingList(H26xBitReader* br,
335 *use_default =
false;
337 for (
int j = 0; j < size; ++j) {
338 if (next_scale != 0) {
339 READ_SE_OR_RETURN(&delta_scale);
340 IN_RANGE_OR_RETURN(delta_scale, -128, 127);
341 next_scale = (last_scale + delta_scale + 256) & 0xff;
343 if (j == 0 && next_scale == 0) {
349 scaling_list[j] = (next_scale == 0) ? last_scale : next_scale;
350 last_scale = scaling_list[j];
356 H264Parser::Result H264Parser::ParseSpsScalingLists(H26xBitReader* br,
359 bool seq_scaling_list_present_flag;
364 for (
int i = 0; i < 6; ++i) {
365 READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
367 if (seq_scaling_list_present_flag) {
368 res = ParseScalingList(br,
369 arraysize(sps->scaling_list4x4[i]),
370 sps->scaling_list4x4[i],
376 DefaultScalingList4x4(i, sps->scaling_list4x4);
379 FallbackScalingList4x4(
380 i, kDefault4x4Intra, kDefault4x4Inter, sps->scaling_list4x4);
385 for (
int i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) {
386 READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
388 if (seq_scaling_list_present_flag) {
389 res = ParseScalingList(br,
390 arraysize(sps->scaling_list8x8[i]),
391 sps->scaling_list8x8[i],
397 DefaultScalingList8x8(i, sps->scaling_list8x8);
400 FallbackScalingList8x8(
401 i, kDefault8x8Intra, kDefault8x8Inter, sps->scaling_list8x8);
408 H264Parser::Result H264Parser::ParsePpsScalingLists(H26xBitReader* br,
412 bool pic_scaling_list_present_flag;
416 for (
int i = 0; i < 6; ++i) {
417 READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
419 if (pic_scaling_list_present_flag) {
420 res = ParseScalingList(br,
421 arraysize(pps->scaling_list4x4[i]),
422 pps->scaling_list4x4[i],
428 DefaultScalingList4x4(i, pps->scaling_list4x4);
431 if (sps.seq_scaling_matrix_present_flag) {
433 FallbackScalingList4x4(
434 i, kDefault4x4Intra, kDefault4x4Inter, pps->scaling_list4x4);
437 FallbackScalingList4x4(i,
438 sps.scaling_list4x4[0],
439 sps.scaling_list4x4[3],
440 pps->scaling_list4x4);
445 if (pps->transform_8x8_mode_flag) {
446 for (
int i = 0; i < ((sps.chroma_format_idc != 3) ? 2 : 6); ++i) {
447 READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
449 if (pic_scaling_list_present_flag) {
450 res = ParseScalingList(br,
451 arraysize(pps->scaling_list8x8[i]),
452 pps->scaling_list8x8[i],
458 DefaultScalingList8x8(i, pps->scaling_list8x8);
461 if (sps.seq_scaling_matrix_present_flag) {
463 FallbackScalingList8x8(
464 i, kDefault8x8Intra, kDefault8x8Inter, pps->scaling_list8x8);
467 FallbackScalingList8x8(i,
468 sps.scaling_list8x8[0],
469 sps.scaling_list8x8[1],
470 pps->scaling_list8x8);
478 H264Parser::Result H264Parser::ParseAndIgnoreHRDParameters(
479 H26xBitReader* br,
bool* hrd_parameters_present) {
481 READ_BOOL_OR_RETURN(&data);
485 *hrd_parameters_present =
true;
488 READ_UE_OR_RETURN(&cpb_cnt_minus1);
489 IN_RANGE_OR_RETURN(cpb_cnt_minus1, 0, 31);
490 READ_BITS_OR_RETURN(8, &data);
491 for (
int i = 0; i <= cpb_cnt_minus1; ++i) {
492 READ_UE_OR_RETURN(&data);
493 READ_UE_OR_RETURN(&data);
494 READ_BOOL_OR_RETURN(&data);
496 READ_BITS_OR_RETURN(20, &data);
501 H264Parser::Result H264Parser::ParseVUIParameters(H26xBitReader* br,
503 bool aspect_ratio_info_present_flag;
504 READ_BOOL_OR_RETURN(&aspect_ratio_info_present_flag);
505 if (aspect_ratio_info_present_flag) {
506 int aspect_ratio_idc;
507 READ_BITS_OR_RETURN(8, &aspect_ratio_idc);
508 if (aspect_ratio_idc == kExtendedSar) {
509 READ_BITS_OR_RETURN(16, &sps->sar_width);
510 READ_BITS_OR_RETURN(16, &sps->sar_height);
512 const int max_aspect_ratio_idc = arraysize(kTableSarWidth) - 1;
513 IN_RANGE_OR_RETURN(aspect_ratio_idc, 0, max_aspect_ratio_idc);
514 sps->sar_width = kTableSarWidth[aspect_ratio_idc];
515 sps->sar_height = kTableSarHeight[aspect_ratio_idc];
521 READ_BOOL_OR_RETURN(&data);
523 READ_BOOL_OR_RETURN(&data);
525 READ_BOOL_OR_RETURN(&data);
527 READ_BITS_OR_RETURN(3, &data);
528 READ_BOOL_OR_RETURN(&data);
529 READ_BOOL_OR_RETURN(&data);
531 READ_BITS_OR_RETURN(8, &data);
532 READ_BITS_OR_RETURN(8, &sps->transfer_characteristics);
533 READ_BITS_OR_RETURN(8, &data);
537 READ_BOOL_OR_RETURN(&data);
539 READ_UE_OR_RETURN(&data);
540 READ_UE_OR_RETURN(&data);
544 READ_BOOL_OR_RETURN(&data);
546 READ_BITS_OR_RETURN(16, &data);
547 READ_BITS_OR_RETURN(16, &data);
548 READ_BITS_OR_RETURN(16, &data);
549 READ_BITS_OR_RETURN(16, &data);
550 READ_BOOL_OR_RETURN(&data);
554 bool hrd_parameters_present =
false;
555 Result res = ParseAndIgnoreHRDParameters(br, &hrd_parameters_present);
560 res = ParseAndIgnoreHRDParameters(br, &hrd_parameters_present);
564 if (hrd_parameters_present)
565 READ_BOOL_OR_RETURN(&data);
567 READ_BOOL_OR_RETURN(&data);
568 READ_BOOL_OR_RETURN(&sps->bitstream_restriction_flag);
569 if (sps->bitstream_restriction_flag) {
570 READ_BOOL_OR_RETURN(&data);
571 READ_UE_OR_RETURN(&data);
572 READ_UE_OR_RETURN(&data);
573 READ_UE_OR_RETURN(&data);
574 READ_UE_OR_RETURN(&data);
575 READ_UE_OR_RETURN(&sps->max_num_reorder_frames);
576 READ_UE_OR_RETURN(&sps->max_dec_frame_buffering);
577 TRUE_OR_RETURN(sps->max_dec_frame_buffering >= sps->max_num_ref_frames);
579 sps->max_num_reorder_frames, 0, sps->max_dec_frame_buffering);
585 static void FillDefaultSeqScalingLists(H264Sps* sps) {
586 for (
int i = 0; i < 6; ++i)
587 for (
int j = 0; j < kH264ScalingList4x4Length; ++j)
588 sps->scaling_list4x4[i][j] = 16;
590 for (
int i = 0; i < 6; ++i)
591 for (
int j = 0; j < kH264ScalingList8x8Length; ++j)
592 sps->scaling_list8x8[i][j] = 16;
595 H264Parser::Result H264Parser::ParseSps(
const Nalu& nalu,
int* sps_id) {
599 H26xBitReader reader;
600 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
601 H26xBitReader* br = &reader;
605 std::unique_ptr<H264Sps> sps(
new H264Sps());
607 READ_BITS_OR_RETURN(8, &sps->profile_idc);
608 READ_BOOL_OR_RETURN(&sps->constraint_set0_flag);
609 READ_BOOL_OR_RETURN(&sps->constraint_set1_flag);
610 READ_BOOL_OR_RETURN(&sps->constraint_set2_flag);
611 READ_BOOL_OR_RETURN(&sps->constraint_set3_flag);
612 READ_BOOL_OR_RETURN(&sps->constraint_set4_flag);
613 READ_BOOL_OR_RETURN(&sps->constraint_set5_flag);
614 READ_BITS_OR_RETURN(2, &data);
615 READ_BITS_OR_RETURN(8, &sps->level_idc);
616 READ_UE_OR_RETURN(&sps->seq_parameter_set_id);
617 TRUE_OR_RETURN(sps->seq_parameter_set_id < 32);
619 if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
620 sps->profile_idc == 122 || sps->profile_idc == 244 ||
621 sps->profile_idc == 44 || sps->profile_idc == 83 ||
622 sps->profile_idc == 86 || sps->profile_idc == 118 ||
623 sps->profile_idc == 128) {
624 READ_UE_OR_RETURN(&sps->chroma_format_idc);
625 TRUE_OR_RETURN(sps->chroma_format_idc < 4);
627 if (sps->chroma_format_idc == 3)
628 READ_BOOL_OR_RETURN(&sps->separate_colour_plane_flag);
630 READ_UE_OR_RETURN(&sps->bit_depth_luma_minus8);
631 TRUE_OR_RETURN(sps->bit_depth_luma_minus8 < 7);
633 READ_UE_OR_RETURN(&sps->bit_depth_chroma_minus8);
634 TRUE_OR_RETURN(sps->bit_depth_chroma_minus8 < 7);
636 READ_BOOL_OR_RETURN(&sps->qpprime_y_zero_transform_bypass_flag);
637 READ_BOOL_OR_RETURN(&sps->seq_scaling_matrix_present_flag);
639 if (sps->seq_scaling_matrix_present_flag) {
640 DVLOG(4) <<
"Scaling matrix present";
641 res = ParseSpsScalingLists(br, sps.get());
645 FillDefaultSeqScalingLists(sps.get());
648 sps->chroma_format_idc = 1;
649 FillDefaultSeqScalingLists(sps.get());
652 if (sps->separate_colour_plane_flag)
653 sps->chroma_array_type = 0;
655 sps->chroma_array_type = sps->chroma_format_idc;
657 READ_UE_OR_RETURN(&sps->log2_max_frame_num_minus4);
658 TRUE_OR_RETURN(sps->log2_max_frame_num_minus4 < 13);
660 READ_UE_OR_RETURN(&sps->pic_order_cnt_type);
661 TRUE_OR_RETURN(sps->pic_order_cnt_type < 3);
663 sps->expected_delta_per_pic_order_cnt_cycle = 0;
664 if (sps->pic_order_cnt_type == 0) {
665 READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4);
666 TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
667 }
else if (sps->pic_order_cnt_type == 1) {
668 READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag);
669 READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic);
670 READ_SE_OR_RETURN(&sps->offset_for_top_to_bottom_field);
671 READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle);
672 TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255);
674 for (
int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
675 READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]);
676 sps->expected_delta_per_pic_order_cnt_cycle +=
677 sps->offset_for_ref_frame[i];
681 READ_UE_OR_RETURN(&sps->max_num_ref_frames);
682 READ_BOOL_OR_RETURN(&sps->gaps_in_frame_num_value_allowed_flag);
684 READ_UE_OR_RETURN(&sps->pic_width_in_mbs_minus1);
685 READ_UE_OR_RETURN(&sps->pic_height_in_map_units_minus1);
687 READ_BOOL_OR_RETURN(&sps->frame_mbs_only_flag);
688 if (!sps->frame_mbs_only_flag)
689 READ_BOOL_OR_RETURN(&sps->mb_adaptive_frame_field_flag);
691 READ_BOOL_OR_RETURN(&sps->direct_8x8_inference_flag);
693 READ_BOOL_OR_RETURN(&sps->frame_cropping_flag);
694 if (sps->frame_cropping_flag) {
695 READ_UE_OR_RETURN(&sps->frame_crop_left_offset);
696 READ_UE_OR_RETURN(&sps->frame_crop_right_offset);
697 READ_UE_OR_RETURN(&sps->frame_crop_top_offset);
698 READ_UE_OR_RETURN(&sps->frame_crop_bottom_offset);
701 READ_BOOL_OR_RETURN(&sps->vui_parameters_present_flag);
702 if (sps->vui_parameters_present_flag) {
703 DVLOG(4) <<
"VUI parameters present";
704 res = ParseVUIParameters(br, sps.get());
710 *sps_id = sps->seq_parameter_set_id;
711 active_SPSes_[*sps_id] = std::move(sps);
716 H264Parser::Result H264Parser::ParsePps(
const Nalu& nalu,
int* pps_id) {
720 H26xBitReader reader;
721 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
722 H26xBitReader* br = &reader;
726 std::unique_ptr<H264Pps> pps(
new H264Pps());
728 READ_UE_OR_RETURN(&pps->pic_parameter_set_id);
729 READ_UE_OR_RETURN(&pps->seq_parameter_set_id);
730 TRUE_OR_RETURN(pps->seq_parameter_set_id < 32);
732 sps = GetSps(pps->seq_parameter_set_id);
735 READ_BOOL_OR_RETURN(&pps->entropy_coding_mode_flag);
736 READ_BOOL_OR_RETURN(&pps->bottom_field_pic_order_in_frame_present_flag);
738 READ_UE_OR_RETURN(&pps->num_slice_groups_minus1);
739 if (pps->num_slice_groups_minus1 > 1) {
740 LOG_ERROR_ONCE(
"Slice groups not supported");
741 return kUnsupportedStream;
744 READ_UE_OR_RETURN(&pps->num_ref_idx_l0_default_active_minus1);
745 TRUE_OR_RETURN(pps->num_ref_idx_l0_default_active_minus1 < 32);
747 READ_UE_OR_RETURN(&pps->num_ref_idx_l1_default_active_minus1);
748 TRUE_OR_RETURN(pps->num_ref_idx_l1_default_active_minus1 < 32);
750 READ_BOOL_OR_RETURN(&pps->weighted_pred_flag);
751 READ_BITS_OR_RETURN(2, &pps->weighted_bipred_idc);
752 TRUE_OR_RETURN(pps->weighted_bipred_idc < 3);
754 READ_SE_OR_RETURN(&pps->pic_init_qp_minus26);
755 IN_RANGE_OR_RETURN(pps->pic_init_qp_minus26, -26, 25);
757 READ_SE_OR_RETURN(&pps->pic_init_qs_minus26);
758 IN_RANGE_OR_RETURN(pps->pic_init_qs_minus26, -26, 25);
760 READ_SE_OR_RETURN(&pps->chroma_qp_index_offset);
761 IN_RANGE_OR_RETURN(pps->chroma_qp_index_offset, -12, 12);
762 pps->second_chroma_qp_index_offset = pps->chroma_qp_index_offset;
764 READ_BOOL_OR_RETURN(&pps->deblocking_filter_control_present_flag);
765 READ_BOOL_OR_RETURN(&pps->constrained_intra_pred_flag);
766 READ_BOOL_OR_RETURN(&pps->redundant_pic_cnt_present_flag);
768 if (br->HasMoreRBSPData()) {
769 READ_BOOL_OR_RETURN(&pps->transform_8x8_mode_flag);
770 READ_BOOL_OR_RETURN(&pps->pic_scaling_matrix_present_flag);
772 if (pps->pic_scaling_matrix_present_flag) {
773 DVLOG(4) <<
"Picture scaling matrix present";
774 res = ParsePpsScalingLists(br, *sps, pps.get());
779 READ_SE_OR_RETURN(&pps->second_chroma_qp_index_offset);
783 *pps_id = pps->pic_parameter_set_id;
784 active_PPSes_[*pps_id] = std::move(pps);
789 H264Parser::Result H264Parser::ParseRefPicListModification(
791 int num_ref_idx_active_minus1,
792 H264ModificationOfPicNum* ref_list_mods) {
793 H264ModificationOfPicNum* pic_num_mod;
795 if (num_ref_idx_active_minus1 >= 32)
796 return kInvalidStream;
798 for (
int i = 0; i < 32; ++i) {
799 pic_num_mod = &ref_list_mods[i];
800 READ_UE_OR_RETURN(&pic_num_mod->modification_of_pic_nums_idc);
801 TRUE_OR_RETURN(pic_num_mod->modification_of_pic_nums_idc < 4);
803 switch (pic_num_mod->modification_of_pic_nums_idc) {
806 READ_UE_OR_RETURN(&pic_num_mod->abs_diff_pic_num_minus1);
810 READ_UE_OR_RETURN(&pic_num_mod->long_term_pic_num);
816 return kInvalidStream;
820 return kInvalidStream;
826 int modification_of_pic_nums_idc;
827 READ_UE_OR_RETURN(&modification_of_pic_nums_idc);
828 TRUE_OR_RETURN(modification_of_pic_nums_idc == 3);
833 H264Parser::Result H264Parser::ParseRefPicListModifications(
834 H26xBitReader* br, H264SliceHeader* shdr) {
837 if (!shdr->IsISlice() && !shdr->IsSISlice()) {
838 READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l0);
839 if (shdr->ref_pic_list_modification_flag_l0) {
840 res = ParseRefPicListModification(br, shdr->num_ref_idx_l0_active_minus1,
841 shdr->ref_list_l0_modifications);
847 if (shdr->IsBSlice()) {
848 READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l1);
849 if (shdr->ref_pic_list_modification_flag_l1) {
850 res = ParseRefPicListModification(br, shdr->num_ref_idx_l1_active_minus1,
851 shdr->ref_list_l1_modifications);
860 H264Parser::Result H264Parser::ParseWeightingFactors(
862 int num_ref_idx_active_minus1,
863 int chroma_array_type,
864 int luma_log2_weight_denom,
865 int chroma_log2_weight_denom,
866 H264WeightingFactors* w_facts) {
867 int def_luma_weight = 1 << luma_log2_weight_denom;
868 int def_chroma_weight = 1 << chroma_log2_weight_denom;
870 for (
int i = 0; i < num_ref_idx_active_minus1 + 1; ++i) {
871 READ_BOOL_OR_RETURN(&w_facts->luma_weight_flag[i]);
872 if (w_facts->luma_weight_flag[i]) {
873 READ_SE_OR_RETURN(&w_facts->luma_weight[i]);
874 IN_RANGE_OR_RETURN(w_facts->luma_weight[i], -128, 127);
876 READ_SE_OR_RETURN(&w_facts->luma_offset[i]);
877 IN_RANGE_OR_RETURN(w_facts->luma_offset[i], -128, 127);
879 w_facts->luma_weight[i] = def_luma_weight;
880 w_facts->luma_offset[i] = 0;
883 if (chroma_array_type != 0) {
884 READ_BOOL_OR_RETURN(&w_facts->chroma_weight_flag[i]);
885 if (w_facts->chroma_weight_flag[i]) {
886 for (
int j = 0; j < 2; ++j) {
887 READ_SE_OR_RETURN(&w_facts->chroma_weight[i][j]);
888 IN_RANGE_OR_RETURN(w_facts->chroma_weight[i][j], -128, 127);
890 READ_SE_OR_RETURN(&w_facts->chroma_offset[i][j]);
891 IN_RANGE_OR_RETURN(w_facts->chroma_offset[i][j], -128, 127);
894 for (
int j = 0; j < 2; ++j) {
895 w_facts->chroma_weight[i][j] = def_chroma_weight;
896 w_facts->chroma_offset[i][j] = 0;
905 H264Parser::Result H264Parser::ParsePredWeightTable(H26xBitReader* br,
907 H264SliceHeader* shdr) {
908 READ_UE_OR_RETURN(&shdr->luma_log2_weight_denom);
909 TRUE_OR_RETURN(shdr->luma_log2_weight_denom < 8);
911 if (sps.chroma_array_type != 0)
912 READ_UE_OR_RETURN(&shdr->chroma_log2_weight_denom);
913 TRUE_OR_RETURN(shdr->chroma_log2_weight_denom < 8);
915 Result res = ParseWeightingFactors(br,
916 shdr->num_ref_idx_l0_active_minus1,
917 sps.chroma_array_type,
918 shdr->luma_log2_weight_denom,
919 shdr->chroma_log2_weight_denom,
920 &shdr->pred_weight_table_l0);
924 if (shdr->IsBSlice()) {
925 res = ParseWeightingFactors(br,
926 shdr->num_ref_idx_l1_active_minus1,
927 sps.chroma_array_type,
928 shdr->luma_log2_weight_denom,
929 shdr->chroma_log2_weight_denom,
930 &shdr->pred_weight_table_l1);
938 H264Parser::Result H264Parser::ParseDecRefPicMarking(H26xBitReader* br,
939 H264SliceHeader* shdr) {
940 if (shdr->idr_pic_flag) {
941 READ_BOOL_OR_RETURN(&shdr->no_output_of_prior_pics_flag);
942 READ_BOOL_OR_RETURN(&shdr->long_term_reference_flag);
944 READ_BOOL_OR_RETURN(&shdr->adaptive_ref_pic_marking_mode_flag);
946 H264DecRefPicMarking* marking;
947 if (shdr->adaptive_ref_pic_marking_mode_flag) {
949 for (i = 0; i < arraysize(shdr->ref_pic_marking); ++i) {
950 marking = &shdr->ref_pic_marking[i];
952 READ_UE_OR_RETURN(&marking->memory_mgmnt_control_operation);
953 if (marking->memory_mgmnt_control_operation == 0)
956 if (marking->memory_mgmnt_control_operation == 1 ||
957 marking->memory_mgmnt_control_operation == 3)
958 READ_UE_OR_RETURN(&marking->difference_of_pic_nums_minus1);
960 if (marking->memory_mgmnt_control_operation == 2)
961 READ_UE_OR_RETURN(&marking->long_term_pic_num);
963 if (marking->memory_mgmnt_control_operation == 3 ||
964 marking->memory_mgmnt_control_operation == 6)
965 READ_UE_OR_RETURN(&marking->long_term_frame_idx);
967 if (marking->memory_mgmnt_control_operation == 4)
968 READ_UE_OR_RETURN(&marking->max_long_term_frame_idx_plus1);
970 if (marking->memory_mgmnt_control_operation > 6)
971 return kInvalidStream;
974 if (i == arraysize(shdr->ref_pic_marking)) {
975 LOG_ERROR_ONCE(
"Ran out of dec ref pic marking fields");
976 return kUnsupportedStream;
984 H264Parser::Result H264Parser::ParseSliceHeader(
const Nalu& nalu,
985 H264SliceHeader* shdr) {
990 H26xBitReader reader;
991 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
992 H26xBitReader* br = &reader;
994 memset(reinterpret_cast<void*>(shdr), 0,
sizeof(*shdr));
996 shdr->idr_pic_flag = (nalu.type() == 5);
997 shdr->nal_ref_idc = nalu.ref_idc();
998 shdr->nalu_data = nalu.data();
999 shdr->nalu_size = nalu.header_size() + nalu.payload_size();
1001 READ_UE_OR_RETURN(&shdr->first_mb_in_slice);
1002 READ_UE_OR_RETURN(&shdr->slice_type);
1003 TRUE_OR_RETURN(shdr->slice_type < 10);
1005 READ_UE_OR_RETURN(&shdr->pic_parameter_set_id);
1007 pps = GetPps(shdr->pic_parameter_set_id);
1008 TRUE_OR_RETURN(pps);
1010 sps = GetSps(pps->seq_parameter_set_id);
1011 TRUE_OR_RETURN(sps);
1013 if (sps->separate_colour_plane_flag) {
1014 LOG_ERROR_ONCE(
"Interlaced streams not supported");
1015 return kUnsupportedStream;
1018 READ_BITS_OR_RETURN(sps->log2_max_frame_num_minus4 + 4, &shdr->frame_num);
1019 if (!sps->frame_mbs_only_flag) {
1020 READ_BOOL_OR_RETURN(&shdr->field_pic_flag);
1021 if (shdr->field_pic_flag) {
1022 LOG_ERROR_ONCE(
"Interlaced streams not supported");
1023 return kUnsupportedStream;
1027 if (shdr->idr_pic_flag)
1028 READ_UE_OR_RETURN(&shdr->idr_pic_id);
1030 if (sps->pic_order_cnt_type == 0) {
1031 READ_BITS_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
1032 &shdr->pic_order_cnt_lsb);
1033 if (pps->bottom_field_pic_order_in_frame_present_flag &&
1034 !shdr->field_pic_flag)
1035 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt_bottom);
1038 if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) {
1039 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[0]);
1040 if (pps->bottom_field_pic_order_in_frame_present_flag &&
1041 !shdr->field_pic_flag)
1042 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[1]);
1045 if (pps->redundant_pic_cnt_present_flag) {
1046 READ_UE_OR_RETURN(&shdr->redundant_pic_cnt);
1047 TRUE_OR_RETURN(shdr->redundant_pic_cnt < 128);
1050 if (shdr->IsBSlice())
1051 READ_BOOL_OR_RETURN(&shdr->direct_spatial_mv_pred_flag);
1053 if (shdr->IsPSlice() || shdr->IsSPSlice() || shdr->IsBSlice()) {
1054 READ_BOOL_OR_RETURN(&shdr->num_ref_idx_active_override_flag);
1055 if (shdr->num_ref_idx_active_override_flag) {
1056 READ_UE_OR_RETURN(&shdr->num_ref_idx_l0_active_minus1);
1057 if (shdr->IsBSlice())
1058 READ_UE_OR_RETURN(&shdr->num_ref_idx_l1_active_minus1);
1060 shdr->num_ref_idx_l0_active_minus1 =
1061 pps->num_ref_idx_l0_default_active_minus1;
1062 if (shdr->IsBSlice()) {
1063 shdr->num_ref_idx_l1_active_minus1 =
1064 pps->num_ref_idx_l1_default_active_minus1;
1068 if (shdr->field_pic_flag) {
1069 TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 32);
1070 TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 32);
1072 TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 16);
1073 TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 16);
1076 if (nalu.type() == Nalu::H264_CodedSliceExtension) {
1077 return kUnsupportedStream;
1079 res = ParseRefPicListModifications(br, shdr);
1084 if ((pps->weighted_pred_flag && (shdr->IsPSlice() || shdr->IsSPSlice())) ||
1085 (pps->weighted_bipred_idc == 1 && shdr->IsBSlice())) {
1086 res = ParsePredWeightTable(br, *sps, shdr);
1091 if (nalu.ref_idc() != 0) {
1092 res = ParseDecRefPicMarking(br, shdr);
1097 if (pps->entropy_coding_mode_flag && !shdr->IsISlice() &&
1098 !shdr->IsSISlice()) {
1099 READ_UE_OR_RETURN(&shdr->cabac_init_idc);
1100 TRUE_OR_RETURN(shdr->cabac_init_idc < 3);
1103 READ_SE_OR_RETURN(&shdr->slice_qp_delta);
1105 if (shdr->IsSPSlice() || shdr->IsSISlice()) {
1106 if (shdr->IsSPSlice())
1107 READ_BOOL_OR_RETURN(&shdr->sp_for_switch_flag);
1108 READ_SE_OR_RETURN(&shdr->slice_qs_delta);
1111 if (pps->deblocking_filter_control_present_flag) {
1112 READ_UE_OR_RETURN(&shdr->disable_deblocking_filter_idc);
1113 TRUE_OR_RETURN(shdr->disable_deblocking_filter_idc < 3);
1115 if (shdr->disable_deblocking_filter_idc != 1) {
1116 READ_SE_OR_RETURN(&shdr->slice_alpha_c0_offset_div2);
1117 IN_RANGE_OR_RETURN(shdr->slice_alpha_c0_offset_div2, -6, 6);
1119 READ_SE_OR_RETURN(&shdr->slice_beta_offset_div2);
1120 IN_RANGE_OR_RETURN(shdr->slice_beta_offset_div2, -6, 6);
1124 if (pps->num_slice_groups_minus1 > 0) {
1125 LOG_ERROR_ONCE(
"Slice groups not supported");
1126 return kUnsupportedStream;
1129 shdr->header_bit_size = nalu.payload_size() * 8 - br->NumBitsLeft();
1133 H264Parser::Result H264Parser::ParseSEI(
const Nalu& nalu,
1134 H264SEIMessage* sei_msg) {
1136 H26xBitReader reader;
1137 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
1138 H26xBitReader* br = &reader;
1140 memset(reinterpret_cast<void*>(sei_msg), 0,
sizeof(*sei_msg));
1142 READ_BITS_OR_RETURN(8, &byte);
1143 while (byte == 0xff) {
1144 sei_msg->type += 255;
1145 READ_BITS_OR_RETURN(8, &byte);
1147 sei_msg->type += byte;
1149 READ_BITS_OR_RETURN(8, &byte);
1150 while (byte == 0xff) {
1151 sei_msg->payload_size += 255;
1152 READ_BITS_OR_RETURN(8, &byte);
1154 sei_msg->payload_size += byte;
1156 DVLOG(4) <<
"Found SEI message type: " << sei_msg->type
1157 <<
" payload size: " << sei_msg->payload_size;
1159 switch (sei_msg->type) {
1160 case H264SEIMessage::kSEIRecoveryPoint:
1161 READ_UE_OR_RETURN(&sei_msg->recovery_point.recovery_frame_cnt);
1162 READ_BOOL_OR_RETURN(&sei_msg->recovery_point.exact_match_flag);
1163 READ_BOOL_OR_RETURN(&sei_msg->recovery_point.broken_link_flag);
1164 READ_BITS_OR_RETURN(2, &sei_msg->recovery_point.changing_slice_group_idc);
1168 DVLOG(4) <<
"Unsupported SEI message";
All the methods that are virtual are virtual for mocking.