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);
106 #define READ_BITS_OR_RETURN(num_bits, out) \
108 if (!br->ReadBits(num_bits, (out))) { \
110 << "Error in stream: unexpected EOS while trying to read " #out; \
111 return kInvalidStream; \
115 #define READ_BOOL_OR_RETURN(out) \
118 if (!br->ReadBits(1, &_out)) { \
120 << "Error in stream: unexpected EOS while trying to read " #out; \
121 return kInvalidStream; \
123 *(out) = _out != 0; \
126 #define READ_UE_OR_RETURN(out) \
128 if (!br->ReadUE(out)) { \
129 DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
130 return kInvalidStream; \
134 #define READ_SE_OR_RETURN(out) \
136 if (!br->ReadSE(out)) { \
137 DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
138 return kInvalidStream; \
142 #define IN_RANGE_OR_RETURN(val, min, max) \
144 if ((val) < (min) || (val) > (max)) { \
145 DVLOG(1) << "Error in stream: invalid value, expected " #val " to be" \
146 << " in range [" << (min) << ":" << (max) << "]" \
147 << " found " << (val) << " instead"; \
148 return kInvalidStream; \
152 #define TRUE_OR_RETURN(a) \
155 DVLOG(1) << "Error in stream: invalid value, expected " << #a; \
156 return kInvalidStream; \
160 enum AspectRatioIdc {
166 static const int kTableSarWidth[] = {
167 0, 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2
169 static const int kTableSarHeight[] = {
170 0, 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1
172 static_assert(arraysize(kTableSarWidth) == arraysize(kTableSarHeight),
173 "sar_tables_must_have_same_size");
175 H264Parser::H264Parser() {}
177 H264Parser::~H264Parser() {}
179 const H264Pps* H264Parser::GetPps(
int pps_id) {
180 return active_PPSes_[pps_id].get();
183 const H264Sps* H264Parser::GetSps(
int sps_id) {
184 return active_SPSes_[sps_id].get();
188 static const int kDefault4x4Intra[kH264ScalingList4x4Length] = {
189 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42, };
191 static const int kDefault4x4Inter[kH264ScalingList4x4Length] = {
192 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34, };
194 static const int kDefault8x8Intra[kH264ScalingList8x8Length] = {
195 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23,
196 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
197 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
198 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42, };
200 static const int kDefault8x8Inter[kH264ScalingList8x8Length] = {
201 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
202 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
203 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
204 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35, };
206 static inline void DefaultScalingList4x4(
208 int scaling_list4x4[][kH264ScalingList4x4Length]) {
212 memcpy(scaling_list4x4[i], kDefault4x4Intra,
sizeof(kDefault4x4Intra));
214 memcpy(scaling_list4x4[i], kDefault4x4Inter,
sizeof(kDefault4x4Inter));
217 static inline void DefaultScalingList8x8(
219 int scaling_list8x8[][kH264ScalingList8x8Length]) {
223 memcpy(scaling_list8x8[i], kDefault8x8Intra,
sizeof(kDefault8x8Intra));
225 memcpy(scaling_list8x8[i], kDefault8x8Inter,
sizeof(kDefault8x8Inter));
228 static void FallbackScalingList4x4(
230 const int default_scaling_list_intra[],
231 const int default_scaling_list_inter[],
232 int scaling_list4x4[][kH264ScalingList4x4Length]) {
233 static const int kScalingList4x4ByteSize =
234 sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length;
238 memcpy(scaling_list4x4[i], default_scaling_list_intra,
239 kScalingList4x4ByteSize);
243 memcpy(scaling_list4x4[i], scaling_list4x4[0], kScalingList4x4ByteSize);
247 memcpy(scaling_list4x4[i], scaling_list4x4[1], kScalingList4x4ByteSize);
251 memcpy(scaling_list4x4[i], default_scaling_list_inter,
252 kScalingList4x4ByteSize);
256 memcpy(scaling_list4x4[i], scaling_list4x4[3], kScalingList4x4ByteSize);
260 memcpy(scaling_list4x4[i], scaling_list4x4[4], kScalingList4x4ByteSize);
269 static void FallbackScalingList8x8(
271 const int default_scaling_list_intra[],
272 const int default_scaling_list_inter[],
273 int scaling_list8x8[][kH264ScalingList8x8Length]) {
274 static const int kScalingList8x8ByteSize =
275 sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length;
279 memcpy(scaling_list8x8[i], default_scaling_list_intra,
280 kScalingList8x8ByteSize);
284 memcpy(scaling_list8x8[i], default_scaling_list_inter,
285 kScalingList8x8ByteSize);
289 memcpy(scaling_list8x8[i], scaling_list8x8[0], kScalingList8x8ByteSize);
293 memcpy(scaling_list8x8[i], scaling_list8x8[1], kScalingList8x8ByteSize);
297 memcpy(scaling_list8x8[i], scaling_list8x8[2], kScalingList8x8ByteSize);
301 memcpy(scaling_list8x8[i], scaling_list8x8[3], kScalingList8x8ByteSize);
310 H264Parser::Result H264Parser::ParseScalingList(H26xBitReader* br,
319 *use_default =
false;
321 for (
int j = 0; j < size; ++j) {
322 if (next_scale != 0) {
323 READ_SE_OR_RETURN(&delta_scale);
324 IN_RANGE_OR_RETURN(delta_scale, -128, 127);
325 next_scale = (last_scale + delta_scale + 256) & 0xff;
327 if (j == 0 && next_scale == 0) {
333 scaling_list[j] = (next_scale == 0) ? last_scale : next_scale;
334 last_scale = scaling_list[j];
340 H264Parser::Result H264Parser::ParseSpsScalingLists(H26xBitReader* br,
343 bool seq_scaling_list_present_flag;
348 for (
int i = 0; i < 6; ++i) {
349 READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
351 if (seq_scaling_list_present_flag) {
352 res = ParseScalingList(br,
353 arraysize(sps->scaling_list4x4[i]),
354 sps->scaling_list4x4[i],
360 DefaultScalingList4x4(i, sps->scaling_list4x4);
363 FallbackScalingList4x4(
364 i, kDefault4x4Intra, kDefault4x4Inter, sps->scaling_list4x4);
369 for (
int i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) {
370 READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
372 if (seq_scaling_list_present_flag) {
373 res = ParseScalingList(br,
374 arraysize(sps->scaling_list8x8[i]),
375 sps->scaling_list8x8[i],
381 DefaultScalingList8x8(i, sps->scaling_list8x8);
384 FallbackScalingList8x8(
385 i, kDefault8x8Intra, kDefault8x8Inter, sps->scaling_list8x8);
392 H264Parser::Result H264Parser::ParsePpsScalingLists(H26xBitReader* br,
396 bool pic_scaling_list_present_flag;
400 for (
int i = 0; i < 6; ++i) {
401 READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
403 if (pic_scaling_list_present_flag) {
404 res = ParseScalingList(br,
405 arraysize(pps->scaling_list4x4[i]),
406 pps->scaling_list4x4[i],
412 DefaultScalingList4x4(i, pps->scaling_list4x4);
415 if (sps.seq_scaling_matrix_present_flag) {
417 FallbackScalingList4x4(
418 i, kDefault4x4Intra, kDefault4x4Inter, pps->scaling_list4x4);
421 FallbackScalingList4x4(i,
422 sps.scaling_list4x4[0],
423 sps.scaling_list4x4[3],
424 pps->scaling_list4x4);
429 if (pps->transform_8x8_mode_flag) {
430 for (
int i = 0; i < ((sps.chroma_format_idc != 3) ? 2 : 6); ++i) {
431 READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
433 if (pic_scaling_list_present_flag) {
434 res = ParseScalingList(br,
435 arraysize(pps->scaling_list8x8[i]),
436 pps->scaling_list8x8[i],
442 DefaultScalingList8x8(i, pps->scaling_list8x8);
445 if (sps.seq_scaling_matrix_present_flag) {
447 FallbackScalingList8x8(
448 i, kDefault8x8Intra, kDefault8x8Inter, pps->scaling_list8x8);
451 FallbackScalingList8x8(i,
452 sps.scaling_list8x8[0],
453 sps.scaling_list8x8[1],
454 pps->scaling_list8x8);
462 H264Parser::Result H264Parser::ParseAndIgnoreHRDParameters(
463 H26xBitReader* br,
bool* hrd_parameters_present) {
465 READ_BOOL_OR_RETURN(&data);
469 *hrd_parameters_present =
true;
472 READ_UE_OR_RETURN(&cpb_cnt_minus1);
473 IN_RANGE_OR_RETURN(cpb_cnt_minus1, 0, 31);
474 READ_BITS_OR_RETURN(8, &data);
475 for (
int i = 0; i <= cpb_cnt_minus1; ++i) {
476 READ_UE_OR_RETURN(&data);
477 READ_UE_OR_RETURN(&data);
478 READ_BOOL_OR_RETURN(&data);
480 READ_BITS_OR_RETURN(20, &data);
485 H264Parser::Result H264Parser::ParseVUIParameters(H26xBitReader* br,
487 bool aspect_ratio_info_present_flag;
488 READ_BOOL_OR_RETURN(&aspect_ratio_info_present_flag);
489 if (aspect_ratio_info_present_flag) {
490 int aspect_ratio_idc;
491 READ_BITS_OR_RETURN(8, &aspect_ratio_idc);
492 if (aspect_ratio_idc == kExtendedSar) {
493 READ_BITS_OR_RETURN(16, &sps->sar_width);
494 READ_BITS_OR_RETURN(16, &sps->sar_height);
496 const int max_aspect_ratio_idc = arraysize(kTableSarWidth) - 1;
497 IN_RANGE_OR_RETURN(aspect_ratio_idc, 0, max_aspect_ratio_idc);
498 sps->sar_width = kTableSarWidth[aspect_ratio_idc];
499 sps->sar_height = kTableSarHeight[aspect_ratio_idc];
505 READ_BOOL_OR_RETURN(&data);
507 READ_BOOL_OR_RETURN(&data);
509 READ_BOOL_OR_RETURN(&data);
511 READ_BITS_OR_RETURN(3, &data);
512 READ_BOOL_OR_RETURN(&data);
513 READ_BOOL_OR_RETURN(&data);
515 READ_BITS_OR_RETURN(8, &data);
516 READ_BITS_OR_RETURN(8, &sps->transfer_characteristics);
517 READ_BITS_OR_RETURN(8, &data);
521 READ_BOOL_OR_RETURN(&data);
523 READ_UE_OR_RETURN(&data);
524 READ_UE_OR_RETURN(&data);
528 READ_BOOL_OR_RETURN(&data);
530 READ_BITS_OR_RETURN(16, &data);
531 READ_BITS_OR_RETURN(16, &data);
532 READ_BITS_OR_RETURN(16, &data);
533 READ_BITS_OR_RETURN(16, &data);
534 READ_BOOL_OR_RETURN(&data);
538 bool hrd_parameters_present =
false;
539 Result res = ParseAndIgnoreHRDParameters(br, &hrd_parameters_present);
544 res = ParseAndIgnoreHRDParameters(br, &hrd_parameters_present);
548 if (hrd_parameters_present)
549 READ_BOOL_OR_RETURN(&data);
551 READ_BOOL_OR_RETURN(&data);
552 READ_BOOL_OR_RETURN(&sps->bitstream_restriction_flag);
553 if (sps->bitstream_restriction_flag) {
554 READ_BOOL_OR_RETURN(&data);
555 READ_UE_OR_RETURN(&data);
556 READ_UE_OR_RETURN(&data);
557 READ_UE_OR_RETURN(&data);
558 READ_UE_OR_RETURN(&data);
559 READ_UE_OR_RETURN(&sps->max_num_reorder_frames);
560 READ_UE_OR_RETURN(&sps->max_dec_frame_buffering);
561 TRUE_OR_RETURN(sps->max_dec_frame_buffering >= sps->max_num_ref_frames);
563 sps->max_num_reorder_frames, 0, sps->max_dec_frame_buffering);
569 static void FillDefaultSeqScalingLists(H264Sps* sps) {
570 for (
int i = 0; i < 6; ++i)
571 for (
int j = 0; j < kH264ScalingList4x4Length; ++j)
572 sps->scaling_list4x4[i][j] = 16;
574 for (
int i = 0; i < 6; ++i)
575 for (
int j = 0; j < kH264ScalingList8x8Length; ++j)
576 sps->scaling_list8x8[i][j] = 16;
579 H264Parser::Result H264Parser::ParseSps(
const Nalu& nalu,
int* sps_id) {
583 H26xBitReader reader;
584 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
585 H26xBitReader* br = &reader;
589 std::unique_ptr<H264Sps> sps(
new H264Sps());
591 READ_BITS_OR_RETURN(8, &sps->profile_idc);
592 READ_BOOL_OR_RETURN(&sps->constraint_set0_flag);
593 READ_BOOL_OR_RETURN(&sps->constraint_set1_flag);
594 READ_BOOL_OR_RETURN(&sps->constraint_set2_flag);
595 READ_BOOL_OR_RETURN(&sps->constraint_set3_flag);
596 READ_BOOL_OR_RETURN(&sps->constraint_set4_flag);
597 READ_BOOL_OR_RETURN(&sps->constraint_set5_flag);
598 READ_BITS_OR_RETURN(2, &data);
599 READ_BITS_OR_RETURN(8, &sps->level_idc);
600 READ_UE_OR_RETURN(&sps->seq_parameter_set_id);
601 TRUE_OR_RETURN(sps->seq_parameter_set_id < 32);
603 if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
604 sps->profile_idc == 122 || sps->profile_idc == 244 ||
605 sps->profile_idc == 44 || sps->profile_idc == 83 ||
606 sps->profile_idc == 86 || sps->profile_idc == 118 ||
607 sps->profile_idc == 128) {
608 READ_UE_OR_RETURN(&sps->chroma_format_idc);
609 TRUE_OR_RETURN(sps->chroma_format_idc < 4);
611 if (sps->chroma_format_idc == 3)
612 READ_BOOL_OR_RETURN(&sps->separate_colour_plane_flag);
614 READ_UE_OR_RETURN(&sps->bit_depth_luma_minus8);
615 TRUE_OR_RETURN(sps->bit_depth_luma_minus8 < 7);
617 READ_UE_OR_RETURN(&sps->bit_depth_chroma_minus8);
618 TRUE_OR_RETURN(sps->bit_depth_chroma_minus8 < 7);
620 READ_BOOL_OR_RETURN(&sps->qpprime_y_zero_transform_bypass_flag);
621 READ_BOOL_OR_RETURN(&sps->seq_scaling_matrix_present_flag);
623 if (sps->seq_scaling_matrix_present_flag) {
624 DVLOG(4) <<
"Scaling matrix present";
625 res = ParseSpsScalingLists(br, sps.get());
629 FillDefaultSeqScalingLists(sps.get());
632 sps->chroma_format_idc = 1;
633 FillDefaultSeqScalingLists(sps.get());
636 if (sps->separate_colour_plane_flag)
637 sps->chroma_array_type = 0;
639 sps->chroma_array_type = sps->chroma_format_idc;
641 READ_UE_OR_RETURN(&sps->log2_max_frame_num_minus4);
642 TRUE_OR_RETURN(sps->log2_max_frame_num_minus4 < 13);
644 READ_UE_OR_RETURN(&sps->pic_order_cnt_type);
645 TRUE_OR_RETURN(sps->pic_order_cnt_type < 3);
647 sps->expected_delta_per_pic_order_cnt_cycle = 0;
648 if (sps->pic_order_cnt_type == 0) {
649 READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4);
650 TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
651 }
else if (sps->pic_order_cnt_type == 1) {
652 READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag);
653 READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic);
654 READ_SE_OR_RETURN(&sps->offset_for_top_to_bottom_field);
655 READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle);
656 TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255);
658 for (
int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
659 READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]);
660 sps->expected_delta_per_pic_order_cnt_cycle +=
661 sps->offset_for_ref_frame[i];
665 READ_UE_OR_RETURN(&sps->max_num_ref_frames);
666 READ_BOOL_OR_RETURN(&sps->gaps_in_frame_num_value_allowed_flag);
668 READ_UE_OR_RETURN(&sps->pic_width_in_mbs_minus1);
669 READ_UE_OR_RETURN(&sps->pic_height_in_map_units_minus1);
671 READ_BOOL_OR_RETURN(&sps->frame_mbs_only_flag);
672 if (!sps->frame_mbs_only_flag)
673 READ_BOOL_OR_RETURN(&sps->mb_adaptive_frame_field_flag);
675 READ_BOOL_OR_RETURN(&sps->direct_8x8_inference_flag);
677 READ_BOOL_OR_RETURN(&sps->frame_cropping_flag);
678 if (sps->frame_cropping_flag) {
679 READ_UE_OR_RETURN(&sps->frame_crop_left_offset);
680 READ_UE_OR_RETURN(&sps->frame_crop_right_offset);
681 READ_UE_OR_RETURN(&sps->frame_crop_top_offset);
682 READ_UE_OR_RETURN(&sps->frame_crop_bottom_offset);
685 READ_BOOL_OR_RETURN(&sps->vui_parameters_present_flag);
686 if (sps->vui_parameters_present_flag) {
687 DVLOG(4) <<
"VUI parameters present";
688 res = ParseVUIParameters(br, sps.get());
694 *sps_id = sps->seq_parameter_set_id;
695 active_SPSes_[*sps_id] = std::move(sps);
700 H264Parser::Result H264Parser::ParsePps(
const Nalu& nalu,
int* pps_id) {
704 H26xBitReader reader;
705 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
706 H26xBitReader* br = &reader;
710 std::unique_ptr<H264Pps> pps(
new H264Pps());
712 READ_UE_OR_RETURN(&pps->pic_parameter_set_id);
713 READ_UE_OR_RETURN(&pps->seq_parameter_set_id);
714 TRUE_OR_RETURN(pps->seq_parameter_set_id < 32);
716 sps = GetSps(pps->seq_parameter_set_id);
719 READ_BOOL_OR_RETURN(&pps->entropy_coding_mode_flag);
720 READ_BOOL_OR_RETURN(&pps->bottom_field_pic_order_in_frame_present_flag);
722 READ_UE_OR_RETURN(&pps->num_slice_groups_minus1);
723 if (pps->num_slice_groups_minus1 > 1) {
724 LOG_ERROR_ONCE(
"Slice groups not supported");
725 return kUnsupportedStream;
728 READ_UE_OR_RETURN(&pps->num_ref_idx_l0_default_active_minus1);
729 TRUE_OR_RETURN(pps->num_ref_idx_l0_default_active_minus1 < 32);
731 READ_UE_OR_RETURN(&pps->num_ref_idx_l1_default_active_minus1);
732 TRUE_OR_RETURN(pps->num_ref_idx_l1_default_active_minus1 < 32);
734 READ_BOOL_OR_RETURN(&pps->weighted_pred_flag);
735 READ_BITS_OR_RETURN(2, &pps->weighted_bipred_idc);
736 TRUE_OR_RETURN(pps->weighted_bipred_idc < 3);
738 READ_SE_OR_RETURN(&pps->pic_init_qp_minus26);
739 IN_RANGE_OR_RETURN(pps->pic_init_qp_minus26, -26, 25);
741 READ_SE_OR_RETURN(&pps->pic_init_qs_minus26);
742 IN_RANGE_OR_RETURN(pps->pic_init_qs_minus26, -26, 25);
744 READ_SE_OR_RETURN(&pps->chroma_qp_index_offset);
745 IN_RANGE_OR_RETURN(pps->chroma_qp_index_offset, -12, 12);
746 pps->second_chroma_qp_index_offset = pps->chroma_qp_index_offset;
748 READ_BOOL_OR_RETURN(&pps->deblocking_filter_control_present_flag);
749 READ_BOOL_OR_RETURN(&pps->constrained_intra_pred_flag);
750 READ_BOOL_OR_RETURN(&pps->redundant_pic_cnt_present_flag);
752 if (br->HasMoreRBSPData()) {
753 READ_BOOL_OR_RETURN(&pps->transform_8x8_mode_flag);
754 READ_BOOL_OR_RETURN(&pps->pic_scaling_matrix_present_flag);
756 if (pps->pic_scaling_matrix_present_flag) {
757 DVLOG(4) <<
"Picture scaling matrix present";
758 res = ParsePpsScalingLists(br, *sps, pps.get());
763 READ_SE_OR_RETURN(&pps->second_chroma_qp_index_offset);
767 *pps_id = pps->pic_parameter_set_id;
768 active_PPSes_[*pps_id] = std::move(pps);
773 H264Parser::Result H264Parser::ParseRefPicListModification(
775 int num_ref_idx_active_minus1,
776 H264ModificationOfPicNum* ref_list_mods) {
777 H264ModificationOfPicNum* pic_num_mod;
779 if (num_ref_idx_active_minus1 >= 32)
780 return kInvalidStream;
782 for (
int i = 0; i < 32; ++i) {
783 pic_num_mod = &ref_list_mods[i];
784 READ_UE_OR_RETURN(&pic_num_mod->modification_of_pic_nums_idc);
785 TRUE_OR_RETURN(pic_num_mod->modification_of_pic_nums_idc < 4);
787 switch (pic_num_mod->modification_of_pic_nums_idc) {
790 READ_UE_OR_RETURN(&pic_num_mod->abs_diff_pic_num_minus1);
794 READ_UE_OR_RETURN(&pic_num_mod->long_term_pic_num);
800 return kInvalidStream;
804 return kInvalidStream;
810 int modification_of_pic_nums_idc;
811 READ_UE_OR_RETURN(&modification_of_pic_nums_idc);
812 TRUE_OR_RETURN(modification_of_pic_nums_idc == 3);
817 H264Parser::Result H264Parser::ParseRefPicListModifications(
818 H26xBitReader* br, H264SliceHeader* shdr) {
821 if (!shdr->IsISlice() && !shdr->IsSISlice()) {
822 READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l0);
823 if (shdr->ref_pic_list_modification_flag_l0) {
824 res = ParseRefPicListModification(br, shdr->num_ref_idx_l0_active_minus1,
825 shdr->ref_list_l0_modifications);
831 if (shdr->IsBSlice()) {
832 READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l1);
833 if (shdr->ref_pic_list_modification_flag_l1) {
834 res = ParseRefPicListModification(br, shdr->num_ref_idx_l1_active_minus1,
835 shdr->ref_list_l1_modifications);
844 H264Parser::Result H264Parser::ParseWeightingFactors(
846 int num_ref_idx_active_minus1,
847 int chroma_array_type,
848 int luma_log2_weight_denom,
849 int chroma_log2_weight_denom,
850 H264WeightingFactors* w_facts) {
851 int def_luma_weight = 1 << luma_log2_weight_denom;
852 int def_chroma_weight = 1 << chroma_log2_weight_denom;
854 for (
int i = 0; i < num_ref_idx_active_minus1 + 1; ++i) {
855 READ_BOOL_OR_RETURN(&w_facts->luma_weight_flag[i]);
856 if (w_facts->luma_weight_flag[i]) {
857 READ_SE_OR_RETURN(&w_facts->luma_weight[i]);
858 IN_RANGE_OR_RETURN(w_facts->luma_weight[i], -128, 127);
860 READ_SE_OR_RETURN(&w_facts->luma_offset[i]);
861 IN_RANGE_OR_RETURN(w_facts->luma_offset[i], -128, 127);
863 w_facts->luma_weight[i] = def_luma_weight;
864 w_facts->luma_offset[i] = 0;
867 if (chroma_array_type != 0) {
868 READ_BOOL_OR_RETURN(&w_facts->chroma_weight_flag[i]);
869 if (w_facts->chroma_weight_flag[i]) {
870 for (
int j = 0; j < 2; ++j) {
871 READ_SE_OR_RETURN(&w_facts->chroma_weight[i][j]);
872 IN_RANGE_OR_RETURN(w_facts->chroma_weight[i][j], -128, 127);
874 READ_SE_OR_RETURN(&w_facts->chroma_offset[i][j]);
875 IN_RANGE_OR_RETURN(w_facts->chroma_offset[i][j], -128, 127);
878 for (
int j = 0; j < 2; ++j) {
879 w_facts->chroma_weight[i][j] = def_chroma_weight;
880 w_facts->chroma_offset[i][j] = 0;
889 H264Parser::Result H264Parser::ParsePredWeightTable(H26xBitReader* br,
891 H264SliceHeader* shdr) {
892 READ_UE_OR_RETURN(&shdr->luma_log2_weight_denom);
893 TRUE_OR_RETURN(shdr->luma_log2_weight_denom < 8);
895 if (sps.chroma_array_type != 0)
896 READ_UE_OR_RETURN(&shdr->chroma_log2_weight_denom);
897 TRUE_OR_RETURN(shdr->chroma_log2_weight_denom < 8);
899 Result res = ParseWeightingFactors(br,
900 shdr->num_ref_idx_l0_active_minus1,
901 sps.chroma_array_type,
902 shdr->luma_log2_weight_denom,
903 shdr->chroma_log2_weight_denom,
904 &shdr->pred_weight_table_l0);
908 if (shdr->IsBSlice()) {
909 res = ParseWeightingFactors(br,
910 shdr->num_ref_idx_l1_active_minus1,
911 sps.chroma_array_type,
912 shdr->luma_log2_weight_denom,
913 shdr->chroma_log2_weight_denom,
914 &shdr->pred_weight_table_l1);
922 H264Parser::Result H264Parser::ParseDecRefPicMarking(H26xBitReader* br,
923 H264SliceHeader* shdr) {
924 if (shdr->idr_pic_flag) {
925 READ_BOOL_OR_RETURN(&shdr->no_output_of_prior_pics_flag);
926 READ_BOOL_OR_RETURN(&shdr->long_term_reference_flag);
928 READ_BOOL_OR_RETURN(&shdr->adaptive_ref_pic_marking_mode_flag);
930 H264DecRefPicMarking* marking;
931 if (shdr->adaptive_ref_pic_marking_mode_flag) {
933 for (i = 0; i < arraysize(shdr->ref_pic_marking); ++i) {
934 marking = &shdr->ref_pic_marking[i];
936 READ_UE_OR_RETURN(&marking->memory_mgmnt_control_operation);
937 if (marking->memory_mgmnt_control_operation == 0)
940 if (marking->memory_mgmnt_control_operation == 1 ||
941 marking->memory_mgmnt_control_operation == 3)
942 READ_UE_OR_RETURN(&marking->difference_of_pic_nums_minus1);
944 if (marking->memory_mgmnt_control_operation == 2)
945 READ_UE_OR_RETURN(&marking->long_term_pic_num);
947 if (marking->memory_mgmnt_control_operation == 3 ||
948 marking->memory_mgmnt_control_operation == 6)
949 READ_UE_OR_RETURN(&marking->long_term_frame_idx);
951 if (marking->memory_mgmnt_control_operation == 4)
952 READ_UE_OR_RETURN(&marking->max_long_term_frame_idx_plus1);
954 if (marking->memory_mgmnt_control_operation > 6)
955 return kInvalidStream;
958 if (i == arraysize(shdr->ref_pic_marking)) {
959 LOG_ERROR_ONCE(
"Ran out of dec ref pic marking fields");
960 return kUnsupportedStream;
968 H264Parser::Result H264Parser::ParseSliceHeader(
const Nalu& nalu,
969 H264SliceHeader* shdr) {
974 H26xBitReader reader;
975 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
976 H26xBitReader* br = &reader;
980 shdr->idr_pic_flag = (nalu.type() == 5);
981 shdr->nal_ref_idc = nalu.ref_idc();
982 shdr->nalu_data = nalu.data();
983 shdr->nalu_size = nalu.header_size() + nalu.payload_size();
985 READ_UE_OR_RETURN(&shdr->first_mb_in_slice);
986 READ_UE_OR_RETURN(&shdr->slice_type);
987 TRUE_OR_RETURN(shdr->slice_type < 10);
989 READ_UE_OR_RETURN(&shdr->pic_parameter_set_id);
991 pps = GetPps(shdr->pic_parameter_set_id);
994 sps = GetSps(pps->seq_parameter_set_id);
997 if (sps->separate_colour_plane_flag) {
998 LOG_ERROR_ONCE(
"Interlaced streams not supported");
999 return kUnsupportedStream;
1002 READ_BITS_OR_RETURN(sps->log2_max_frame_num_minus4 + 4, &shdr->frame_num);
1003 if (!sps->frame_mbs_only_flag) {
1004 READ_BOOL_OR_RETURN(&shdr->field_pic_flag);
1005 if (shdr->field_pic_flag) {
1006 LOG_ERROR_ONCE(
"Interlaced streams not supported");
1007 return kUnsupportedStream;
1011 if (shdr->idr_pic_flag)
1012 READ_UE_OR_RETURN(&shdr->idr_pic_id);
1014 if (sps->pic_order_cnt_type == 0) {
1015 READ_BITS_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
1016 &shdr->pic_order_cnt_lsb);
1017 if (pps->bottom_field_pic_order_in_frame_present_flag &&
1018 !shdr->field_pic_flag)
1019 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt_bottom);
1022 if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) {
1023 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[0]);
1024 if (pps->bottom_field_pic_order_in_frame_present_flag &&
1025 !shdr->field_pic_flag)
1026 READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[1]);
1029 if (pps->redundant_pic_cnt_present_flag) {
1030 READ_UE_OR_RETURN(&shdr->redundant_pic_cnt);
1031 TRUE_OR_RETURN(shdr->redundant_pic_cnt < 128);
1034 if (shdr->IsBSlice())
1035 READ_BOOL_OR_RETURN(&shdr->direct_spatial_mv_pred_flag);
1037 if (shdr->IsPSlice() || shdr->IsSPSlice() || shdr->IsBSlice()) {
1038 READ_BOOL_OR_RETURN(&shdr->num_ref_idx_active_override_flag);
1039 if (shdr->num_ref_idx_active_override_flag) {
1040 READ_UE_OR_RETURN(&shdr->num_ref_idx_l0_active_minus1);
1041 if (shdr->IsBSlice())
1042 READ_UE_OR_RETURN(&shdr->num_ref_idx_l1_active_minus1);
1044 shdr->num_ref_idx_l0_active_minus1 =
1045 pps->num_ref_idx_l0_default_active_minus1;
1046 if (shdr->IsBSlice()) {
1047 shdr->num_ref_idx_l1_active_minus1 =
1048 pps->num_ref_idx_l1_default_active_minus1;
1052 if (shdr->field_pic_flag) {
1053 TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 32);
1054 TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 32);
1056 TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 16);
1057 TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 16);
1060 if (nalu.type() == Nalu::H264_CodedSliceExtension) {
1061 return kUnsupportedStream;
1063 res = ParseRefPicListModifications(br, shdr);
1068 if ((pps->weighted_pred_flag && (shdr->IsPSlice() || shdr->IsSPSlice())) ||
1069 (pps->weighted_bipred_idc == 1 && shdr->IsBSlice())) {
1070 res = ParsePredWeightTable(br, *sps, shdr);
1075 if (nalu.ref_idc() != 0) {
1076 res = ParseDecRefPicMarking(br, shdr);
1081 if (pps->entropy_coding_mode_flag && !shdr->IsISlice() &&
1082 !shdr->IsSISlice()) {
1083 READ_UE_OR_RETURN(&shdr->cabac_init_idc);
1084 TRUE_OR_RETURN(shdr->cabac_init_idc < 3);
1087 READ_SE_OR_RETURN(&shdr->slice_qp_delta);
1089 if (shdr->IsSPSlice() || shdr->IsSISlice()) {
1090 if (shdr->IsSPSlice())
1091 READ_BOOL_OR_RETURN(&shdr->sp_for_switch_flag);
1092 READ_SE_OR_RETURN(&shdr->slice_qs_delta);
1095 if (pps->deblocking_filter_control_present_flag) {
1096 READ_UE_OR_RETURN(&shdr->disable_deblocking_filter_idc);
1097 TRUE_OR_RETURN(shdr->disable_deblocking_filter_idc < 3);
1099 if (shdr->disable_deblocking_filter_idc != 1) {
1100 READ_SE_OR_RETURN(&shdr->slice_alpha_c0_offset_div2);
1101 IN_RANGE_OR_RETURN(shdr->slice_alpha_c0_offset_div2, -6, 6);
1103 READ_SE_OR_RETURN(&shdr->slice_beta_offset_div2);
1104 IN_RANGE_OR_RETURN(shdr->slice_beta_offset_div2, -6, 6);
1108 if (pps->num_slice_groups_minus1 > 0) {
1109 LOG_ERROR_ONCE(
"Slice groups not supported");
1110 return kUnsupportedStream;
1113 shdr->header_bit_size = nalu.payload_size() * 8 - br->NumBitsLeft();
1117 H264Parser::Result H264Parser::ParseSEI(
const Nalu& nalu,
1118 H264SEIMessage* sei_msg) {
1120 H26xBitReader reader;
1121 reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size());
1122 H26xBitReader* br = &reader;
1126 READ_BITS_OR_RETURN(8, &
byte);
1127 while (
byte == 0xff) {
1128 sei_msg->type += 255;
1129 READ_BITS_OR_RETURN(8, &
byte);
1131 sei_msg->type += byte;
1133 READ_BITS_OR_RETURN(8, &
byte);
1134 while (
byte == 0xff) {
1135 sei_msg->payload_size += 255;
1136 READ_BITS_OR_RETURN(8, &
byte);
1138 sei_msg->payload_size += byte;
1140 DVLOG(4) <<
"Found SEI message type: " << sei_msg->type
1141 <<
" payload size: " << sei_msg->payload_size;
1143 switch (sei_msg->type) {
1144 case H264SEIMessage::kSEIRecoveryPoint:
1145 READ_UE_OR_RETURN(&sei_msg->recovery_point.recovery_frame_cnt);
1146 READ_BOOL_OR_RETURN(&sei_msg->recovery_point.exact_match_flag);
1147 READ_BOOL_OR_RETURN(&sei_msg->recovery_point.broken_link_flag);
1148 READ_BITS_OR_RETURN(2, &sei_msg->recovery_point.changing_slice_group_idc);
1152 DVLOG(4) <<
"Unsupported SEI message";