7#include <packager/media/codecs/av1_parser.h>
15#include <absl/log/check.h>
16#include <absl/log/log.h>
18#include <packager/media/base/bit_reader.h>
19#include <packager/media/base/rcheck.h>
33const int kSelectScreenContentTools = 2;
34const int kSelectIntegerMv = 2;
35const int kPrimaryRefNone = 7;
36const int kNumRefFrames = 8;
37const int kAllFrames = (1 << kNumRefFrames) - 1;
41 OBU_SEQUENCE_HEADER = 1,
42 OBU_TEMPORAL_DELIMITER,
47 OBU_REDUNDENT_FRAME_HEADER,
59enum TransferCharacteristics {
64enum MatrixCoefficients {
69enum ChromaSamplePosition {
97int Clip3(
int min_value,
int max_value,
int value) {
98 if (value < min_value)
100 if (value > max_value)
107int FloorLog2(
int x) {
117bool ReadUvlc(BitReader* reader, uint32_t* val) {
119 int leading_zeros = 0;
122 RCHECK(reader->ReadBits(1, &done));
128 if (leading_zeros >= 32) {
129 *val = (1ull << 32) - 1;
134 if (leading_zeros > 0)
135 RCHECK(reader->ReadBits(leading_zeros, &value));
137 *val = value + (1 << leading_zeros) - 1;
143bool ReadLe(
int n, BitReader* reader,
size_t* val) {
145 for (
int i = 0; i < n; i++) {
147 RCHECK(reader->ReadBits(8, &
byte));
148 t += (
byte << (i * 8));
156bool ReadLeb128(BitReader* reader,
size_t* size) {
158 for (
int i = 0; i < 8; i++) {
159 size_t leb128_byte = 0;
160 RCHECK(reader->ReadBits(8, &leb128_byte));
161 value |= (leb128_byte & 0x7f) << (i * 7);
162 if (!(leb128_byte & 0x80))
167 RCHECK(value <= ((1ull << 32) - 1));
174bool ReadSu(
int n, BitReader* reader,
int* value) {
175 RCHECK(reader->ReadBits(n, value));
176 int sign_mask = 1 << (n - 1);
177 if (*value & sign_mask)
178 *value = *value - 2 * sign_mask;
184bool ReadNs(
int n, BitReader* reader,
int* value) {
185 const int w = FloorLog2(n) + 1;
186 const int m = (1 << w) - n;
187 RCHECK(reader->ReadBits(w - 1, value));
191 RCHECK(reader->ReadBits(1, &extra_bit));
192 *value = (*value << 1) - m + extra_bit;
198int TileLog2(
int blk_size,
int target) {
200 for (k = 0; (blk_size << k) < target; k++)
206int FindLatestBackward(
int shifted_order_hints[],
208 int cur_frame_hint) {
210 int latest_order_hint = 0;
211 for (
int i = 0; i < kNumRefFrames; i++) {
212 const int hint = shifted_order_hints[i];
213 if (!used_frame[i] && hint >= cur_frame_hint &&
214 (ref < 0 || hint >= latest_order_hint)) {
216 latest_order_hint = hint;
223int FindEarliestBackward(
int shifted_order_hints[],
225 int cur_frame_hint) {
227 int earliest_order_hint = 0;
228 for (
int i = 0; i < kNumRefFrames; i++) {
229 const int hint = shifted_order_hints[i];
230 if (!used_frame[i] && hint >= cur_frame_hint &&
231 (ref < 0 || hint < earliest_order_hint)) {
233 earliest_order_hint = hint;
240int FindLatestForward(
int shifted_order_hints[],
242 int cur_frame_hint) {
244 int latest_order_hint = 0;
245 for (
int i = 0; i < kNumRefFrames; i++) {
246 const int hint = shifted_order_hints[i];
247 if (!used_frame[i] && hint < cur_frame_hint &&
248 (ref < 0 || hint >= latest_order_hint)) {
250 latest_order_hint = hint;
258AV1Parser::AV1Parser() =
default;
259AV1Parser::~AV1Parser() =
default;
263 std::vector<Tile>* tiles) {
268 if (!ParseOpenBitstreamUnit(&reader, tiles))
275bool AV1Parser::ParseOpenBitstreamUnit(
BitReader* reader,
276 std::vector<Tile>* tiles) {
277 ObuHeader obu_header;
278 RCHECK(ParseObuHeader(reader, &obu_header));
281 if (obu_header.obu_has_size_field)
282 RCHECK(ReadLeb128(reader, &obu_size));
286 VLOG(4) <<
"OBU " << obu_header.obu_type <<
" size " << obu_size;
289 switch (obu_header.obu_type) {
290 case OBU_SEQUENCE_HEADER:
291 RCHECK(ParseSequenceHeaderObu(reader));
293 case OBU_FRAME_HEADER:
294 case OBU_REDUNDENT_FRAME_HEADER:
295 RCHECK(ParseFrameHeaderObu(obu_header, reader));
298 RCHECK(ParseTileGroupObu(obu_size, reader, tiles));
301 RCHECK(ParseFrameObu(obu_header, obu_size, reader, tiles));
306 RCHECK(reader->
SkipBits(obu_size * 8));
311 const size_t payload_bits = current_position - start_position;
312 if (obu_header.obu_type == OBU_TILE_GROUP ||
313 obu_header.obu_type == OBU_FRAME) {
314 RCHECK(payload_bits == obu_size * 8);
315 }
else if (obu_size > 0) {
316 RCHECK(payload_bits <= obu_size * 8);
317 RCHECK(ParseTrailingBits(obu_size * 8 - payload_bits, reader));
323bool AV1Parser::ParseObuHeader(BitReader* reader, ObuHeader* obu_header) {
324 int obu_forbidden_bit = 0;
325 RCHECK(reader->ReadBits(1, &obu_forbidden_bit));
326 RCHECK(obu_forbidden_bit == 0);
327 RCHECK(reader->ReadBits(4, &obu_header->obu_type));
328 bool obu_extension_flag =
false;
329 RCHECK(reader->ReadBits(1, &obu_extension_flag));
330 RCHECK(reader->ReadBits(1, &obu_header->obu_has_size_field));
331 RCHECK(reader->SkipBits(1));
333 if (obu_extension_flag)
334 RCHECK(ParseObuExtensionHeader(reader, &obu_header->extension_header));
340bool AV1Parser::ParseObuExtensionHeader(
342 ObuExtensionHeader* obu_extension_header) {
343 RCHECK(reader->ReadBits(3, &obu_extension_header->temporal_id));
344 RCHECK(reader->ReadBits(2, &obu_extension_header->spatial_id));
345 RCHECK(reader->SkipBits(3));
350bool AV1Parser::ParseTrailingBits(
size_t nb_bits, BitReader* reader) {
351 int trailing_one_bit = 0;
352 RCHECK(reader->ReadBits(1, &trailing_one_bit));
353 RCHECK(trailing_one_bit == 1);
355 while (nb_bits > 0) {
356 int trailing_zero_bit = 0;
357 RCHECK(reader->ReadBits(1, &trailing_zero_bit));
358 RCHECK(trailing_zero_bit == 0);
364bool AV1Parser::ByteAlignment(BitReader* reader) {
365 while (reader->bit_position() & 7) {
367 RCHECK(reader->ReadBits(1, &zero_bit));
368 RCHECK(zero_bit == 0);
374bool AV1Parser::ParseSequenceHeaderObu(BitReader* reader) {
375 RCHECK(reader->ReadBits(3, &sequence_header_.seq_profile));
377 RCHECK(reader->SkipBits(1));
379 RCHECK(reader->ReadBits(1, &sequence_header_.reduced_still_picture_header));
380 if (sequence_header_.reduced_still_picture_header) {
381 sequence_header_.decoder_model_info_present_flag =
false;
382 sequence_header_.operating_points_cnt_minus_1 = 0;
383 sequence_header_.operating_point_idc[0] = 0;
385 RCHECK(reader->SkipBits(5));
386 sequence_header_.decoder_model_present_for_this_op[0] =
false;
388 bool timing_info_present_flag =
false;
389 RCHECK(reader->ReadBits(1, &timing_info_present_flag));
391 bool decoder_model_info_present_flag =
false;
392 if (timing_info_present_flag) {
393 RCHECK(ParseTimingInfo(reader));
394 RCHECK(reader->ReadBits(1, &decoder_model_info_present_flag));
395 if (decoder_model_info_present_flag)
396 RCHECK(ParseDecoderModelInfo(reader));
398 sequence_header_.decoder_model_info_present_flag =
399 decoder_model_info_present_flag;
401 bool initial_display_delay_present_flag =
false;
402 RCHECK(reader->ReadBits(1, &initial_display_delay_present_flag));
404 RCHECK(reader->ReadBits(5, &sequence_header_.operating_points_cnt_minus_1));
405 for (
int i = 0; i <= sequence_header_.operating_points_cnt_minus_1; i++) {
406 RCHECK(reader->ReadBits(12, &sequence_header_.operating_point_idc[i]));
407 int seq_level_idx_i = 0;
408 RCHECK(reader->ReadBits(5, &seq_level_idx_i));
409 if (seq_level_idx_i > 7) {
411 RCHECK(reader->SkipBits(1));
414 if (sequence_header_.decoder_model_info_present_flag) {
415 RCHECK(reader->ReadBits(
416 1, &sequence_header_.decoder_model_present_for_this_op[i]));
417 if (sequence_header_.decoder_model_present_for_this_op[i]) {
418 RCHECK(SkipOperatingParametersInfo(reader));
421 sequence_header_.decoder_model_present_for_this_op[i] =
false;
424 if (initial_display_delay_present_flag) {
427 RCHECK(reader->SkipBitsConditional(
true, 4));
432 RCHECK(reader->ReadBits(4, &sequence_header_.frame_width_bits_minus_1));
433 RCHECK(reader->ReadBits(4, &sequence_header_.frame_height_bits_minus_1));
434 RCHECK(reader->ReadBits(sequence_header_.frame_width_bits_minus_1 + 1,
435 &sequence_header_.max_frame_width_minus_1));
436 RCHECK(reader->ReadBits(sequence_header_.frame_height_bits_minus_1 + 1,
437 &sequence_header_.max_frame_height_minus_1));
439 if (sequence_header_.reduced_still_picture_header) {
440 sequence_header_.frame_id_numbers_present_flag =
false;
443 reader->ReadBits(1, &sequence_header_.frame_id_numbers_present_flag));
445 if (sequence_header_.frame_id_numbers_present_flag) {
447 reader->ReadBits(4, &sequence_header_.delta_frame_id_length_minus_2));
448 RCHECK(reader->ReadBits(
449 3, &sequence_header_.additional_frame_id_length_minus_1));
452 RCHECK(reader->ReadBits(1, &sequence_header_.use_128x128_superblock));
454 RCHECK(reader->SkipBits(1 + 1));
456 if (sequence_header_.reduced_still_picture_header) {
457 sequence_header_.enable_warped_motion =
false;
458 sequence_header_.enable_order_hint =
false;
459 sequence_header_.enable_ref_frame_mvs =
false;
460 sequence_header_.order_hint_bits = 0;
461 sequence_header_.seq_force_screen_content_tools = kSelectScreenContentTools;
462 sequence_header_.seq_force_integer_mv = kSelectIntegerMv;
465 RCHECK(reader->SkipBits(1 + 1));
467 RCHECK(reader->ReadBits(1, &sequence_header_.enable_warped_motion));
468 RCHECK(reader->SkipBits(1));
469 RCHECK(reader->ReadBits(1, &sequence_header_.enable_order_hint));
470 if (sequence_header_.enable_order_hint) {
472 RCHECK(reader->SkipBits(1));
473 RCHECK(reader->ReadBits(1, &sequence_header_.enable_ref_frame_mvs));
475 sequence_header_.enable_ref_frame_mvs =
false;
478 bool seq_choose_screen_content_tools =
false;
479 RCHECK(reader->ReadBits(1, &seq_choose_screen_content_tools));
481 if (seq_choose_screen_content_tools) {
482 sequence_header_.seq_force_screen_content_tools =
483 kSelectScreenContentTools;
485 RCHECK(reader->ReadBits(
486 1, &sequence_header_.seq_force_screen_content_tools));
489 if (sequence_header_.seq_force_screen_content_tools > 0) {
490 bool seq_choose_integer_mv =
false;
491 RCHECK(reader->ReadBits(1, &seq_choose_integer_mv));
492 if (seq_choose_integer_mv)
493 sequence_header_.seq_force_integer_mv = kSelectIntegerMv;
495 RCHECK(reader->ReadBits(1, &sequence_header_.seq_force_integer_mv));
497 sequence_header_.seq_force_integer_mv = kSelectIntegerMv;
500 if (sequence_header_.enable_order_hint) {
501 int order_hint_bits_minus_1 = 0;
502 RCHECK(reader->ReadBits(3, &order_hint_bits_minus_1));
503 sequence_header_.order_hint_bits = order_hint_bits_minus_1 + 1;
505 sequence_header_.order_hint_bits = 0;
509 RCHECK(reader->ReadBits(1, &sequence_header_.enable_superres));
510 RCHECK(reader->ReadBits(1, &sequence_header_.enable_cdef));
511 RCHECK(reader->ReadBits(1, &sequence_header_.enable_restoration));
512 RCHECK(ParseColorConfig(reader));
513 RCHECK(reader->ReadBits(1, &sequence_header_.film_grain_params_present));
518bool AV1Parser::ParseColorConfig(BitReader* reader) {
519 ColorConfig& color_config = sequence_header_.color_config;
521 bool high_bitdepth =
false;
522 RCHECK(reader->ReadBits(1, &high_bitdepth));
523 if (sequence_header_.seq_profile == 2 && high_bitdepth) {
524 bool twelve_bit =
false;
525 RCHECK(reader->ReadBits(1, &twelve_bit));
526 color_config.bit_depth = twelve_bit ? 12 : 10;
527 }
else if (sequence_header_.seq_profile <= 2) {
528 color_config.bit_depth = high_bitdepth ? 10 : 8;
531 if (sequence_header_.seq_profile == 1)
532 color_config.mono_chrome = 0;
534 RCHECK(reader->ReadBits(1, &color_config.mono_chrome));
535 color_config.num_planes = color_config.mono_chrome ? 1 : 3;
537 bool color_description_present_flag =
false;
538 RCHECK(reader->ReadBits(1, &color_description_present_flag));
540 if (color_description_present_flag) {
541 RCHECK(reader->ReadBits(8, &color_config.color_primaries));
542 RCHECK(reader->ReadBits(8, &color_config.transfer_chracteristics));
543 RCHECK(reader->ReadBits(8, &color_config.matrix_coefficients));
545 color_config.color_primaries = CP_UNSPECIFIED;
546 color_config.transfer_chracteristics = TC_UNSPECIFIED;
547 color_config.matrix_coefficients = MC_UNSPECIFIED;
550 if (color_config.mono_chrome) {
551 RCHECK(reader->ReadBits(1, &color_config.color_range));
552 color_config.subsampling_x =
true;
553 color_config.subsampling_y =
true;
554 color_config.chroma_sampling_position = CSP_UNKNOWN;
555 color_config.separate_uv_delta_q =
false;
557 }
else if (color_config.color_primaries == CP_BT_709 &&
558 color_config.transfer_chracteristics == TC_SRGB &&
559 color_config.matrix_coefficients == MC_IDENTITY) {
560 color_config.color_range =
true;
561 color_config.subsampling_x =
false;
562 color_config.subsampling_y =
false;
564 RCHECK(reader->ReadBits(1, &color_config.color_range));
565 if (sequence_header_.seq_profile == 0) {
566 color_config.subsampling_x =
true;
567 color_config.subsampling_y =
true;
568 }
else if (sequence_header_.seq_profile == 1) {
569 color_config.subsampling_x =
false;
570 color_config.subsampling_y =
false;
572 if (color_config.bit_depth == 12) {
573 RCHECK(reader->ReadBits(1, &color_config.subsampling_x));
574 if (color_config.subsampling_x)
575 RCHECK(reader->ReadBits(1, &color_config.subsampling_y));
577 color_config.subsampling_y =
false;
579 color_config.subsampling_x =
true;
580 color_config.subsampling_y =
false;
584 if (color_config.subsampling_x && color_config.subsampling_y)
585 RCHECK(reader->ReadBits(2, &color_config.chroma_sampling_position));
588 RCHECK(reader->ReadBits(1, &color_config.separate_uv_delta_q));
593bool AV1Parser::ParseTimingInfo(BitReader* reader) {
595 RCHECK(reader->SkipBits(32 + 32));
596 bool equal_picture_interval =
false;
597 RCHECK(reader->ReadBits(1, &equal_picture_interval));
598 sequence_header_.timing_info.equal_picture_interval = equal_picture_interval;
599 if (equal_picture_interval) {
600 uint32_t num_ticks_per_picture_minus_1 = 0;
601 RCHECK(ReadUvlc(reader, &num_ticks_per_picture_minus_1));
607bool AV1Parser::ParseDecoderModelInfo(BitReader* reader) {
608 DecoderModelInfo& decoder_model_info = sequence_header_.decoder_model_info;
610 RCHECK(reader->ReadBits(5, &decoder_model_info.buffer_delay_length_minus_1));
612 RCHECK(reader->SkipBits(32));
613 RCHECK(reader->ReadBits(
614 5, &decoder_model_info.buffer_removal_time_length_minus_1));
615 RCHECK(reader->ReadBits(
616 5, &decoder_model_info.frame_presentation_time_length_minus_1));
621bool AV1Parser::SkipOperatingParametersInfo(BitReader* reader) {
623 sequence_header_.decoder_model_info.buffer_delay_length_minus_1 + 1;
626 RCHECK(reader->SkipBits(n + n + 1));
631bool AV1Parser::ParseFrameHeaderObu(
const ObuHeader& obu_header,
633 if (frame_header_.seen_frame_header)
636 frame_header_.seen_frame_header =
true;
637 RCHECK(ParseUncompressedHeader(obu_header, reader));
638 if (frame_header_.show_existing_frame) {
640 frame_header_.seen_frame_header =
false;
642 frame_header_.seen_frame_header =
true;
648bool AV1Parser::ParseUncompressedHeader(
const ObuHeader& obu_header,
651 if (sequence_header_.frame_id_numbers_present_flag) {
652 id_len = sequence_header_.additional_frame_id_length_minus_1 + 1 +
653 sequence_header_.delta_frame_id_length_minus_2 + 2;
656 bool frame_is_intra =
false;
657 bool show_frame =
false;
658 bool showable_frame =
false;
659 bool error_resilient_mode =
false;
661 if (sequence_header_.reduced_still_picture_header) {
662 frame_header_.show_existing_frame =
false;
663 frame_header_.frame_type = KEY_FRAME;
664 frame_is_intra =
true;
666 showable_frame =
false;
668 RCHECK(reader->ReadBits(1, &frame_header_.show_existing_frame));
669 if (frame_header_.show_existing_frame) {
670 RCHECK(reader->ReadBits(3, &frame_header_.frame_to_show_map_idx));
671 if (sequence_header_.decoder_model_info_present_flag &&
672 !sequence_header_.timing_info.equal_picture_interval) {
673 RCHECK(SkipTemporalPointInfo(reader));
675 frame_header_.refresh_frame_flags = 0;
676 if (sequence_header_.frame_id_numbers_present_flag) {
678 RCHECK(reader->SkipBits(id_len));
680 frame_header_.frame_type =
681 reference_frames_[frame_header_.frame_to_show_map_idx].frame_type;
682 if (frame_header_.frame_type == KEY_FRAME) {
683 frame_header_.refresh_frame_flags = kAllFrames;
688 RCHECK(reader->ReadBits(2, &frame_header_.frame_type));
689 frame_is_intra = frame_header_.frame_type == INTRA_ONLY_FRAME ||
690 frame_header_.frame_type == KEY_FRAME;
691 RCHECK(reader->ReadBits(1, &show_frame));
692 if (show_frame && sequence_header_.decoder_model_info_present_flag &&
693 !sequence_header_.timing_info.equal_picture_interval) {
694 RCHECK(SkipTemporalPointInfo(reader));
697 showable_frame = frame_header_.frame_type != KEY_FRAME;
699 RCHECK(reader->ReadBits(1, &showable_frame));
701 if (frame_header_.frame_type == SWITCH_FRAME ||
702 (frame_header_.frame_type == KEY_FRAME && show_frame)) {
703 error_resilient_mode =
true;
705 RCHECK(reader->ReadBits(1, &error_resilient_mode));
709 if (frame_header_.frame_type == KEY_FRAME && show_frame) {
710 for (
int i = 0; i < kNumRefFrames; i++) {
711 reference_frames_[i].order_hint = 0;
715 bool disable_cdf_update =
false;
716 RCHECK(reader->ReadBits(1, &disable_cdf_update));
718 bool allow_screen_content_tools =
false;
719 if (sequence_header_.seq_force_screen_content_tools ==
720 kSelectScreenContentTools) {
721 RCHECK(reader->ReadBits(1, &allow_screen_content_tools));
723 allow_screen_content_tools =
724 sequence_header_.seq_force_screen_content_tools != 0;
727 int force_integer_mv = 0;
728 if (allow_screen_content_tools) {
729 if (sequence_header_.seq_force_integer_mv == kSelectIntegerMv)
730 RCHECK(reader->ReadBits(1, &force_integer_mv));
732 force_integer_mv = sequence_header_.seq_force_integer_mv;
735 force_integer_mv = 1;
737 if (sequence_header_.frame_id_numbers_present_flag) {
739 RCHECK(reader->SkipBits(id_len));
742 bool frame_size_override_flag =
false;
743 if (frame_header_.frame_type == SWITCH_FRAME)
744 frame_size_override_flag =
true;
745 else if (sequence_header_.reduced_still_picture_header)
746 frame_size_override_flag =
false;
748 RCHECK(reader->ReadBits(1, &frame_size_override_flag));
750 RCHECK(reader->ReadBits(sequence_header_.order_hint_bits,
751 &frame_header_.order_hint));
752 int primary_ref_frame = 0;
753 if (frame_is_intra || error_resilient_mode) {
754 primary_ref_frame = kPrimaryRefNone;
756 RCHECK(reader->ReadBits(3, &primary_ref_frame));
758 if (sequence_header_.decoder_model_info_present_flag) {
759 bool buffer_removal_time_present_flag =
false;
760 RCHECK(reader->ReadBits(1, &buffer_removal_time_present_flag));
761 if (buffer_removal_time_present_flag) {
763 op_num <= sequence_header_.operating_points_cnt_minus_1; op_num++) {
764 if (sequence_header_.decoder_model_present_for_this_op[op_num]) {
765 const int op_pt_idc = sequence_header_.operating_point_idc[op_num];
766 const int in_temporal_layer =
767 (op_pt_idc >> obu_header.extension_header.temporal_id) & 1;
768 const int in_spatial_layer =
769 (op_pt_idc >> (obu_header.extension_header.spatial_id + 8)) & 1;
770 if (op_pt_idc == 0 || (in_temporal_layer && in_spatial_layer)) {
772 RCHECK(reader->SkipBits(sequence_header_.decoder_model_info
773 .buffer_removal_time_length_minus_1 +
781 bool allow_high_precision_mv =
false;
782 bool allow_intrabc =
false;
784 if (frame_header_.frame_type == SWITCH_FRAME ||
785 (frame_header_.frame_type == KEY_FRAME && show_frame)) {
786 frame_header_.refresh_frame_flags = kAllFrames;
788 RCHECK(reader->ReadBits(8, &frame_header_.refresh_frame_flags));
790 if (!frame_is_intra || frame_header_.refresh_frame_flags != kAllFrames) {
791 if (error_resilient_mode && sequence_header_.enable_order_hint) {
792 for (
int i = 0; i < kNumRefFrames; i++) {
794 RCHECK(reader->SkipBits(sequence_header_.order_hint_bits));
799 if (frame_is_intra) {
800 RCHECK(ParseFrameSize(frame_size_override_flag, reader));
801 RCHECK(ParseRenderSize(reader));
802 if (allow_screen_content_tools &&
803 frame_header_.upscaled_width == frame_header_.frame_width)
804 RCHECK(reader->ReadBits(1, &allow_intrabc));
806 bool frame_refs_short_signaling =
false;
807 if (sequence_header_.enable_order_hint) {
808 RCHECK(reader->ReadBits(1, &frame_refs_short_signaling));
809 if (frame_refs_short_signaling) {
810 int last_frame_idx = 0;
811 RCHECK(reader->ReadBits(3, &last_frame_idx));
812 int gold_frame_idx = 0;
813 RCHECK(reader->ReadBits(3, &gold_frame_idx));
814 RCHECK(SetFrameRefs(last_frame_idx, gold_frame_idx));
817 for (
int i = 0; i < kRefsPerFrame; i++) {
818 if (!frame_refs_short_signaling)
819 RCHECK(reader->ReadBits(3, &frame_header_.ref_frame_idx[i]));
820 if (sequence_header_.frame_id_numbers_present_flag) {
822 RCHECK(reader->SkipBits(sequence_header_.delta_frame_id_length_minus_2 +
826 if (frame_size_override_flag && !error_resilient_mode) {
827 RCHECK(ParseFrameSizeWithRefs(frame_size_override_flag, reader));
829 RCHECK(ParseFrameSize(frame_size_override_flag, reader));
830 RCHECK(ParseRenderSize(reader));
833 if (force_integer_mv)
834 allow_high_precision_mv =
false;
836 RCHECK(reader->ReadBits(1, &allow_high_precision_mv));
838 RCHECK(SkipInterpolationFilter(reader));
840 RCHECK(reader->SkipBits(1));
841 if (!error_resilient_mode && sequence_header_.enable_ref_frame_mvs) {
843 RCHECK(reader->SkipBits(1));
847 if (!sequence_header_.reduced_still_picture_header && !disable_cdf_update) {
849 RCHECK(reader->SkipBits(1));
852 RCHECK(ParseTileInfo(reader));
853 RCHECK(ParseQuantizationParams(reader));
854 RCHECK(ParseSegmentationParams(primary_ref_frame, reader));
856 bool delta_q_present =
false;
857 RCHECK(SkipDeltaQParams(reader, &delta_q_present));
858 RCHECK(SkipDeltaLfParams(delta_q_present, allow_intrabc, reader));
860 const auto& quantization_params = frame_header_.quantization_params;
861 bool coded_lossless =
true;
862 for (
int segment_id = 0; segment_id < kMaxSegments; segment_id++) {
863 const int qindex = GetQIndex(
true, segment_id);
864 const bool lossless = qindex == 0 && quantization_params.delta_qydc == 0 &&
865 quantization_params.delta_quac == 0 &&
866 quantization_params.delta_qudc == 0 &&
867 quantization_params.delta_qvac == 0 &&
868 quantization_params.delta_qvdc == 0;
870 coded_lossless =
false;
872 const bool all_lossless = coded_lossless && (frame_header_.frame_width ==
873 frame_header_.upscaled_width);
875 RCHECK(ParseLoopFilterParams(coded_lossless, allow_intrabc, reader));
876 RCHECK(ParseCdefParams(coded_lossless, allow_intrabc, reader));
877 RCHECK(ParseLrParams(all_lossless, allow_intrabc, reader));
878 RCHECK(SkipTxMode(coded_lossless, reader));
879 bool reference_select =
false;
880 RCHECK(ParseFrameReferenceMode(frame_is_intra, reader, &reference_select));
881 RCHECK(SkipSkipModeParams(frame_is_intra, reference_select, reader));
883 bool allow_warped_motion =
false;
884 if (frame_is_intra || error_resilient_mode ||
885 !sequence_header_.enable_warped_motion) {
886 allow_warped_motion =
false;
888 RCHECK(reader->ReadBits(1, &allow_warped_motion));
891 RCHECK(reader->SkipBits(1));
894 SkipGlobalMotionParams(frame_is_intra, allow_high_precision_mv, reader));
895 RCHECK(SkipFilmGrainParams(show_frame, showable_frame, reader));
900int AV1Parser::GetRelativeDist(
int a,
int b) {
901 if (!sequence_header_.enable_order_hint)
904 const int m = 1 << (sequence_header_.order_hint_bits - 1);
905 diff = (diff & (m - 1)) - (diff & m);
910bool AV1Parser::ParseFrameSize(
bool frame_size_override_flag,
912 if (frame_size_override_flag) {
913 int frame_width_minus_1 = 0;
914 RCHECK(reader->ReadBits(sequence_header_.frame_width_bits_minus_1 + 1,
915 &frame_width_minus_1));
916 int frame_height_minus_1 = 0;
917 RCHECK(reader->ReadBits(sequence_header_.frame_height_bits_minus_1 + 1,
918 &frame_height_minus_1));
919 frame_header_.frame_width = frame_width_minus_1 + 1;
920 frame_header_.frame_height = frame_height_minus_1 + 1;
922 frame_header_.frame_width = sequence_header_.max_frame_width_minus_1 + 1;
923 frame_header_.frame_height = sequence_header_.max_frame_height_minus_1 + 1;
925 RCHECK(ParseSuperresParams(reader));
931bool AV1Parser::ParseRenderSize(BitReader* reader) {
932 bool render_and_frame_size_different =
false;
933 RCHECK(reader->ReadBits(1, &render_and_frame_size_different));
934 if (render_and_frame_size_different) {
935 int render_width_minus_1 = 0;
936 RCHECK(reader->ReadBits(16, &render_width_minus_1));
937 int render_height_minus_1 = 0;
938 RCHECK(reader->ReadBits(16, &render_height_minus_1));
939 frame_header_.render_width = render_width_minus_1 + 1;
940 frame_header_.render_height = render_height_minus_1 + 1;
942 frame_header_.render_width = frame_header_.upscaled_width;
943 frame_header_.render_height = frame_header_.frame_height;
949bool AV1Parser::ParseFrameSizeWithRefs(
bool frame_size_override_flag,
951 bool found_ref =
false;
952 for (
int i = 0; i < kRefsPerFrame; i++) {
953 RCHECK(reader->ReadBits(1, &found_ref));
955 const ReferenceFrame& reference_frame =
956 reference_frames_[frame_header_.ref_frame_idx[i]];
957 frame_header_.upscaled_width = reference_frame.upscaled_width;
958 frame_header_.frame_width = frame_header_.upscaled_width;
959 frame_header_.frame_height = reference_frame.frame_height;
960 frame_header_.render_width = reference_frame.render_width;
961 frame_header_.render_height = reference_frame.render_height;
966 RCHECK(ParseFrameSize(frame_size_override_flag, reader));
967 RCHECK(ParseRenderSize(reader));
969 RCHECK(ParseSuperresParams(reader));
976bool AV1Parser::ParseSuperresParams(BitReader* reader) {
977 const int kSuperresNum = 8;
978 const int kSuperresDenomMin = 9;
979 const int kSuperresDenomBits = 3;
981 bool use_superres =
false;
982 if (sequence_header_.enable_superres)
983 RCHECK(reader->ReadBits(1, &use_superres));
985 int superres_denom = 0;
988 RCHECK(reader->ReadBits(kSuperresDenomBits, &coded_denom));
989 superres_denom = coded_denom + kSuperresDenomMin;
991 superres_denom = kSuperresNum;
994 const int upscaled_width = frame_header_.frame_width;
995 frame_header_.upscaled_width =
996 (upscaled_width * kSuperresNum + superres_denom / 2) / superres_denom;
1001void AV1Parser::ComputeImageSize() {
1002 frame_header_.mi_cols = 2 * ((frame_header_.frame_width + 7) >> 3);
1003 frame_header_.mi_rows = 2 * ((frame_header_.frame_height + 7) >> 3);
1007bool AV1Parser::SkipInterpolationFilter(BitReader* reader) {
1009 RCHECK(reader->SkipBitsConditional(
false, 2));
1014bool AV1Parser::ParseLoopFilterParams(
bool coded_lossless,
1016 BitReader* reader) {
1017 if (coded_lossless || allow_intrabc)
1020 int loop_filter_level[] = {0, 0};
1021 RCHECK(reader->ReadBits(6, &loop_filter_level[0]));
1022 RCHECK(reader->ReadBits(6, &loop_filter_level[1]));
1023 if (sequence_header_.color_config.num_planes > 1) {
1024 if (loop_filter_level[0] || loop_filter_level[1]) {
1026 RCHECK(reader->SkipBits(6 + 6));
1030 RCHECK(reader->SkipBits(3));
1031 bool loop_filter_delta_enabled =
false;
1032 RCHECK(reader->ReadBits(1, &loop_filter_delta_enabled));
1033 if (loop_filter_delta_enabled) {
1034 bool loop_filter_delta_update =
false;
1035 RCHECK(reader->ReadBits(1, &loop_filter_delta_update));
1036 if (loop_filter_delta_update) {
1037 const int kTotalRefsPerFrame = 8;
1038 for (
int i = 0; i < kTotalRefsPerFrame; i++) {
1040 RCHECK(reader->SkipBitsConditional(
true, 1 + 6));
1042 for (
int i = 0; i < 2; i++) {
1044 RCHECK(reader->SkipBitsConditional(
true, 1 + 6));
1052bool AV1Parser::ParseQuantizationParams(BitReader* reader) {
1053 QuantizationParams& quantization_params = frame_header_.quantization_params;
1055 RCHECK(reader->ReadBits(8, &quantization_params.base_q_idx));
1056 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_qydc));
1058 const ColorConfig& color_config = sequence_header_.color_config;
1059 if (color_config.num_planes > 1) {
1060 bool diff_uv_delta =
false;
1061 if (color_config.separate_uv_delta_q)
1062 RCHECK(reader->ReadBits(1, &diff_uv_delta));
1063 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_qudc));
1064 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_quac));
1065 if (diff_uv_delta) {
1066 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_qvdc));
1067 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_qvac));
1069 quantization_params.delta_qvdc = quantization_params.delta_qudc;
1070 quantization_params.delta_qvac = quantization_params.delta_quac;
1073 quantization_params.delta_qudc = 0;
1074 quantization_params.delta_quac = 0;
1075 quantization_params.delta_qvdc = 0;
1076 quantization_params.delta_qvac = 0;
1078 bool using_qmatrix =
false;
1079 RCHECK(reader->ReadBits(1, &using_qmatrix));
1080 if (using_qmatrix) {
1082 RCHECK(reader->SkipBits(4 + 4));
1083 if (color_config.separate_uv_delta_q) {
1085 RCHECK(reader->SkipBits(4));
1092bool AV1Parser::ReadDeltaQ(BitReader* reader,
int* delta_q) {
1093 bool delta_coded =
false;
1094 RCHECK(reader->ReadBits(1, &delta_coded));
1096 RCHECK(ReadSu(1 + 6, reader, delta_q));
1103bool AV1Parser::ParseSegmentationParams(
int primary_ref_frame,
1104 BitReader* reader) {
1105 SegmentationParams& segmentation_params = frame_header_.segmentation_params;
1107 RCHECK(reader->ReadBits(1, &segmentation_params.segmentation_enabled));
1108 if (segmentation_params.segmentation_enabled) {
1109 bool segmentation_update_data =
false;
1110 if (primary_ref_frame == kPrimaryRefNone) {
1111 segmentation_update_data =
true;
1114 RCHECK(reader->SkipBitsConditional(
true, 1));
1115 RCHECK(reader->ReadBits(1, &segmentation_update_data));
1117 if (segmentation_update_data) {
1118 static const int kSegmentationFeatureBits[kSegLvlMax] = {8, 6, 6, 6,
1120 static const int kSegmentationFeatureSigned[kSegLvlMax] = {1, 1, 1, 1,
1122 const int kMaxLoopFilter = 63;
1123 static const int kSegmentationFeatureMax[kSegLvlMax] = {255,
1132 for (
int i = 0; i < kMaxSegments; i++) {
1133 for (
int j = 0; j < kSegLvlMax; j++) {
1134 bool feature_enabled =
false;
1135 RCHECK(reader->ReadBits(1, &feature_enabled));
1136 segmentation_params.feature_enabled[i][j] = feature_enabled;
1137 int clipped_value = 0;
1138 if (feature_enabled) {
1139 const int bits_to_read = kSegmentationFeatureBits[j];
1140 const int limit = kSegmentationFeatureMax[j];
1141 if (kSegmentationFeatureSigned[j]) {
1142 int feature_value = 0;
1143 RCHECK(ReadSu(1 + bits_to_read, reader, &feature_value));
1144 clipped_value = Clip3(-limit, limit, feature_value);
1146 int feature_value = 0;
1147 RCHECK(reader->ReadBits(bits_to_read, &feature_value));
1148 clipped_value = Clip3(0, limit, feature_value);
1151 segmentation_params.feature_data[i][j] = clipped_value;
1156 for (
int i = 0; i < kMaxSegments; i++) {
1157 for (
int j = 0; j < kSegLvlMax; j++) {
1158 segmentation_params.feature_enabled[i][j] =
false;
1159 segmentation_params.feature_data[i][j] = 0;
1167bool AV1Parser::ParseTileInfo(BitReader* reader) {
1168 const int kMaxTileWidth = 4096;
1169 const int kMaxTileArea = 4096 * 2304;
1170 const int kMaxTileRows = 64;
1171 const int kMaxTileCols = 64;
1173 TileInfo& tile_info = frame_header_.tile_info;
1175 const int sb_cols = sequence_header_.use_128x128_superblock
1176 ? ((frame_header_.mi_cols + 31) >> 5)
1177 : ((frame_header_.mi_cols + 15) >> 4);
1178 const int sb_rows = sequence_header_.use_128x128_superblock
1179 ? ((frame_header_.mi_rows + 31) >> 5)
1180 : ((frame_header_.mi_rows + 15) >> 4);
1181 const int sb_shift = sequence_header_.use_128x128_superblock ? 5 : 4;
1182 const int sb_size = sb_shift + 2;
1183 const int max_tile_width_sb = kMaxTileWidth >> sb_size;
1184 int max_tile_area_sb = kMaxTileArea >> (2 * sb_size);
1185 const int min_log2_tile_cols = TileLog2(max_tile_width_sb, sb_cols);
1186 const int max_log2_tile_cols = TileLog2(1, std::min(sb_cols, kMaxTileCols));
1187 const int max_log2_tile_rows = TileLog2(1, std::min(sb_rows, kMaxTileRows));
1188 const int min_log2_tiles = std::max(
1189 min_log2_tile_cols, TileLog2(max_tile_area_sb, sb_rows * sb_cols));
1191 bool uniform_tile_spacing_flag =
false;
1192 RCHECK(reader->ReadBits(1, &uniform_tile_spacing_flag));
1193 if (uniform_tile_spacing_flag) {
1194 tile_info.tile_cols_log2 = min_log2_tile_cols;
1195 while (tile_info.tile_cols_log2 < max_log2_tile_cols) {
1196 bool increment_tile_cols_log2 =
false;
1197 RCHECK(reader->ReadBits(1, &increment_tile_cols_log2));
1198 if (increment_tile_cols_log2)
1199 tile_info.tile_cols_log2++;
1203 const int tile_width_sb = (sb_cols + (1 << tile_info.tile_cols_log2) - 1) >>
1204 tile_info.tile_cols_log2;
1206 for (
int start_sb = 0; start_sb < sb_cols; start_sb += tile_width_sb) {
1209 tile_info.tile_cols = i;
1211 const int min_log2_tile_rows =
1212 std::max(min_log2_tiles - tile_info.tile_cols_log2, 0);
1213 tile_info.tile_rows_log2 = min_log2_tile_rows;
1214 while (tile_info.tile_rows_log2 < max_log2_tile_rows) {
1215 bool increment_tile_rows_log2 =
false;
1216 RCHECK(reader->ReadBits(1, &increment_tile_rows_log2));
1217 if (increment_tile_rows_log2)
1218 tile_info.tile_rows_log2++;
1222 const int tile_height_sb =
1223 (sb_rows + (1 << tile_info.tile_rows_log2) - 1) >>
1224 tile_info.tile_rows_log2;
1226 for (
int start_sb = 0; start_sb < sb_rows; start_sb += tile_height_sb) {
1229 tile_info.tile_rows = i;
1231 int widest_tile_sb = 0;
1234 for (; start_sb < sb_cols; i++) {
1235 const int max_width = std::min(sb_cols - start_sb, max_tile_width_sb);
1236 int width_in_sbs_minus_1 = 0;
1237 RCHECK(ReadNs(max_width, reader, &width_in_sbs_minus_1));
1238 const int size_sb = width_in_sbs_minus_1 + 1;
1239 widest_tile_sb = std::max(size_sb, widest_tile_sb);
1240 start_sb += size_sb;
1242 tile_info.tile_cols = i;
1243 tile_info.tile_cols_log2 = TileLog2(1, tile_info.tile_cols);
1245 if (min_log2_tiles > 0)
1246 max_tile_area_sb = (sb_rows * sb_cols) >> (min_log2_tiles + 1);
1248 max_tile_area_sb = sb_rows * sb_cols;
1249 const int max_tile_height_sb =
1250 std::max(max_tile_area_sb / widest_tile_sb, 1);
1254 for (; start_sb < sb_rows; i++) {
1255 const int max_height = std::min(sb_rows - start_sb, max_tile_height_sb);
1256 int height_in_sbs_minus_1 = 0;
1257 RCHECK(ReadNs(max_height, reader, &height_in_sbs_minus_1));
1258 const int size_sb = height_in_sbs_minus_1 + 1;
1259 start_sb += size_sb;
1261 tile_info.tile_rows = i;
1262 tile_info.tile_rows_log2 = TileLog2(1, tile_info.tile_rows);
1264 if (tile_info.tile_cols_log2 > 0 || tile_info.tile_rows_log2 > 0) {
1267 reader->SkipBits(tile_info.tile_rows_log2 + tile_info.tile_cols_log2));
1268 int tile_size_bytes_minus_1 = 0;
1269 RCHECK(reader->ReadBits(2, &tile_size_bytes_minus_1));
1270 tile_info.tile_size_bytes = tile_size_bytes_minus_1 + 1;
1276bool AV1Parser::SkipDeltaQParams(BitReader* reader,
bool* delta_q_present) {
1277 *delta_q_present =
false;
1278 if (frame_header_.quantization_params.base_q_idx > 0)
1279 RCHECK(reader->ReadBits(1, delta_q_present));
1280 if (*delta_q_present) {
1282 RCHECK(reader->SkipBits(2));
1288bool AV1Parser::SkipDeltaLfParams(
bool delta_q_present,
1290 BitReader* reader) {
1291 bool delta_lf_present =
false;
1292 if (delta_q_present) {
1294 RCHECK(reader->ReadBits(1, &delta_lf_present));
1295 if (delta_lf_present) {
1297 RCHECK(reader->SkipBits(2 + 1));
1304bool AV1Parser::ParseCdefParams(
bool coded_lossless,
1306 BitReader* reader) {
1307 if (coded_lossless || allow_intrabc || !sequence_header_.enable_cdef)
1311 RCHECK(reader->SkipBits(2));
1313 RCHECK(reader->ReadBits(2, &cdef_bits));
1314 for (
int i = 0; i < (1 << cdef_bits); i++) {
1316 RCHECK(reader->SkipBits(4 + 2));
1317 if (sequence_header_.color_config.num_planes > 1) {
1319 RCHECK(reader->SkipBits(4 + 2));
1326bool AV1Parser::ParseLrParams(
bool all_lossless,
1328 BitReader* reader) {
1329 if (all_lossless || allow_intrabc || !sequence_header_.enable_restoration)
1332 enum FrameRestorationType {
1334 RESTORE_SWITCHABLE = 3,
1336 RESTORE_SGRPROJ = 2,
1338 static const int kRemapLrType[4] = {RESTORE_NONE, RESTORE_SWITCHABLE,
1339 RESTORE_WIENER, RESTORE_SGRPROJ};
1340 bool uses_lr =
false;
1341 bool uses_chroma_lr =
false;
1342 for (
int i = 0; i < sequence_header_.color_config.num_planes; i++) {
1344 RCHECK(reader->ReadBits(2, &lr_type));
1345 const int frame_restoration_type = kRemapLrType[lr_type];
1346 if (frame_restoration_type != RESTORE_NONE) {
1349 uses_chroma_lr =
true;
1354 if (sequence_header_.use_128x128_superblock) {
1356 RCHECK(reader->SkipBits(1));
1359 RCHECK(reader->SkipBitsConditional(
true, 1));
1361 if (sequence_header_.color_config.subsampling_x &&
1362 sequence_header_.color_config.subsampling_y && uses_chroma_lr) {
1364 RCHECK(reader->SkipBits(1));
1371bool AV1Parser::SkipTxMode(
bool coded_lossless, BitReader* reader) {
1372 if (!coded_lossless) {
1374 RCHECK(reader->SkipBits(1));
1380bool AV1Parser::SkipSkipModeParams(
bool frame_is_intra,
1381 bool reference_select,
1382 BitReader* reader) {
1383 bool skip_mode_allowed =
false;
1384 if (frame_is_intra || !reference_select ||
1385 !sequence_header_.enable_order_hint) {
1386 skip_mode_allowed =
false;
1388 int forward_idx = -1;
1389 int forward_hint = 0;
1390 int backward_idx = -1;
1391 int backward_hint = 0;
1392 for (
int i = 0; i < kRefsPerFrame; i++) {
1393 const int ref_hint =
1394 reference_frames_[frame_header_.ref_frame_idx[i]].order_hint;
1395 if (GetRelativeDist(ref_hint, frame_header_.order_hint) < 0) {
1396 if (forward_idx < 0 || GetRelativeDist(ref_hint, forward_hint) > 0) {
1398 forward_hint = ref_hint;
1400 }
else if (GetRelativeDist(ref_hint, frame_header_.order_hint) > 0) {
1401 if (backward_idx < 0 || GetRelativeDist(ref_hint, backward_hint) < 0) {
1403 backward_hint = ref_hint;
1407 if (forward_idx < 0) {
1408 skip_mode_allowed =
false;
1409 }
else if (backward_idx >= 0) {
1410 skip_mode_allowed =
true;
1412 int second_forward_idx = -1;
1413 int second_forward_hint = 0;
1414 for (
int i = 0; i < kRefsPerFrame; i++) {
1415 const int ref_hint =
1416 reference_frames_[frame_header_.ref_frame_idx[i]].order_hint;
1417 if (GetRelativeDist(ref_hint, forward_hint) < 0) {
1418 if (second_forward_idx < 0 ||
1419 GetRelativeDist(ref_hint, second_forward_hint) > 0) {
1420 second_forward_idx = i;
1421 second_forward_hint = ref_hint;
1425 skip_mode_allowed = second_forward_idx >= 0;
1429 if (skip_mode_allowed) {
1431 RCHECK(reader->SkipBits(1));
1437bool AV1Parser::ParseFrameReferenceMode(
bool frame_is_intra,
1439 bool* reference_select) {
1441 *reference_select =
false;
1443 RCHECK(reader->ReadBits(1, reference_select));
1448bool AV1Parser::SkipGlobalMotionParams(
bool frame_is_intra,
1449 bool allow_high_precision_mv,
1450 BitReader* reader) {
1454 for (
int ref = LAST_FRAME; ref <= ALTREF_FRAME; ref++) {
1457 bool is_global =
false;
1458 RCHECK(reader->ReadBits(1, &is_global));
1460 bool is_rot_zoom =
false;
1461 RCHECK(reader->ReadBits(1, &is_rot_zoom));
1465 bool is_translation =
false;
1466 RCHECK(reader->ReadBits(1, &is_translation));
1467 type = is_translation ? TRANSLATION : AFFINE;
1473 if (type >= ROTZOOM) {
1474 RCHECK(SkipGlobalParam(type, ref, 2, allow_high_precision_mv, reader));
1475 RCHECK(SkipGlobalParam(type, ref, 3, allow_high_precision_mv, reader));
1476 if (type == AFFINE) {
1477 RCHECK(SkipGlobalParam(type, ref, 4, allow_high_precision_mv, reader));
1478 RCHECK(SkipGlobalParam(type, ref, 5, allow_high_precision_mv, reader));
1481 if (type >= TRANSLATION) {
1482 RCHECK(SkipGlobalParam(type, ref, 0, allow_high_precision_mv, reader));
1483 RCHECK(SkipGlobalParam(type, ref, 1, allow_high_precision_mv, reader));
1490bool AV1Parser::SkipGlobalParam(
int type,
1493 bool allow_high_precision_mv,
1494 BitReader* reader) {
1495 const int kGmAbsTransBits = 12;
1496 const int kGmAbsTransOnlyBits = 9;
1497 const int kGmAbsAlphaBits = 12;
1499 int abs_bits = kGmAbsAlphaBits;
1501 if (type == TRANSLATION) {
1502 abs_bits = kGmAbsTransOnlyBits - (allow_high_precision_mv ? 0 : 1);
1504 abs_bits = kGmAbsTransBits;
1507 const int mx = 1 << abs_bits;
1508 RCHECK(SkipDecodeSignedSubexpWithRef(-mx, mx + 1, reader));
1513bool AV1Parser::SkipDecodeSignedSubexpWithRef(
int low,
1515 BitReader* reader) {
1516 RCHECK(SkipDecodeUnsignedSubexpWithRef(high - low, reader));
1521bool AV1Parser::SkipDecodeUnsignedSubexpWithRef(
int mx, BitReader* reader) {
1522 RCHECK(SkipDecodeSubexp(mx, reader));
1527bool AV1Parser::SkipDecodeSubexp(
int num_syms, BitReader* reader) {
1532 const int b2 = i ? (k + i - 1) : k;
1533 const int a = 1 << b2;
1534 if (num_syms <= mk + 3 * a) {
1535 int subexp_final_bits = 0;
1536 RCHECK(ReadNs(num_syms - mk, reader, &subexp_final_bits));
1539 bool subexp_more_bits =
false;
1540 RCHECK(reader->ReadBits(1, &subexp_more_bits));
1541 if (subexp_more_bits) {
1546 RCHECK(reader->SkipBits(b2));
1555bool AV1Parser::SkipFilmGrainParams(
bool show_frame,
1556 bool showable_frame,
1557 BitReader* reader) {
1558 if (!sequence_header_.film_grain_params_present ||
1559 (!show_frame && !showable_frame)) {
1563 bool apply_grain =
false;
1564 RCHECK(reader->ReadBits(1, &apply_grain));
1569 RCHECK(reader->SkipBits(16));
1570 bool update_grain =
true;
1571 if (frame_header_.frame_type == INTER_FRAME)
1572 RCHECK(reader->ReadBits(1, &update_grain));
1573 if (!update_grain) {
1575 RCHECK(reader->SkipBits(3));
1579 int num_y_points = 0;
1580 RCHECK(reader->ReadBits(4, &num_y_points));
1582 RCHECK(reader->SkipBits((8 + 8) * num_y_points));
1584 const ColorConfig& color_config = sequence_header_.color_config;
1585 bool chroma_scaling_from_luma =
false;
1586 if (!color_config.mono_chrome)
1587 RCHECK(reader->ReadBits(1, &chroma_scaling_from_luma));
1588 int num_cb_points = 0;
1589 int num_cr_points = 0;
1590 if (color_config.mono_chrome || chroma_scaling_from_luma ||
1591 (color_config.subsampling_x && color_config.subsampling_y &&
1592 num_y_points == 0)) {
1596 RCHECK(reader->ReadBits(4, &num_cb_points));
1598 RCHECK(reader->SkipBits((8 + 8) * num_cb_points));
1599 RCHECK(reader->ReadBits(4, &num_cr_points));
1601 RCHECK(reader->SkipBits((8 + 8) * num_cr_points));
1605 RCHECK(reader->SkipBits(2));
1606 int ar_coeff_lag = 0;
1607 RCHECK(reader->ReadBits(2, &ar_coeff_lag));
1608 const int num_pos_luma = 2 * ar_coeff_lag * (ar_coeff_lag + 1);
1609 int num_pos_chroma = num_pos_luma;
1611 num_pos_chroma = num_pos_luma + 1;
1613 RCHECK(reader->SkipBits(8 * num_pos_luma));
1615 if (chroma_scaling_from_luma || num_cb_points) {
1617 RCHECK(reader->SkipBits(8 * num_pos_chroma));
1619 if (chroma_scaling_from_luma || num_cr_points) {
1621 RCHECK(reader->SkipBits(8 * num_pos_chroma));
1625 RCHECK(reader->SkipBits(2 + 2));
1626 if (num_cb_points) {
1628 RCHECK(reader->SkipBits(8 + 8 + 9));
1630 if (num_cr_points) {
1632 RCHECK(reader->SkipBits(8 + 8 + 9));
1635 RCHECK(reader->SkipBits(1 + 1));
1640bool AV1Parser::SkipTemporalPointInfo(BitReader* reader) {
1641 const int frame_presentation_time_length =
1642 sequence_header_.decoder_model_info
1643 .frame_presentation_time_length_minus_1 +
1646 RCHECK(reader->SkipBits(frame_presentation_time_length));
1651bool AV1Parser::ParseFrameObu(
const ObuHeader& obu_header,
1654 std::vector<Tile>* tiles) {
1655 const size_t start_bit_pos = reader->bit_position();
1656 RCHECK(ParseFrameHeaderObu(obu_header, reader));
1657 RCHECK(ByteAlignment(reader));
1658 const size_t end_bit_pos = reader->bit_position();
1659 const size_t header_bytes = (end_bit_pos - start_bit_pos) / 8;
1660 RCHECK(ParseTileGroupObu(size - header_bytes, reader, tiles));
1665bool AV1Parser::ParseTileGroupObu(
size_t size,
1667 std::vector<Tile>* tiles) {
1668 const TileInfo& tile_info = frame_header_.tile_info;
1669 const size_t start_bit_pos = reader->bit_position();
1671 const int num_tiles = tile_info.tile_cols * tile_info.tile_rows;
1672 bool tile_start_and_end_present_flag =
false;
1674 RCHECK(reader->ReadBits(1, &tile_start_and_end_present_flag));
1677 int tg_end = num_tiles - 1;
1678 if (num_tiles > 1 && tile_start_and_end_present_flag) {
1679 const int tile_bits = tile_info.tile_cols_log2 + tile_info.tile_rows_log2;
1680 RCHECK(reader->ReadBits(tile_bits, &tg_start));
1681 RCHECK(reader->ReadBits(tile_bits, &tg_end));
1683 RCHECK(ByteAlignment(reader));
1685 const size_t end_bit_pos = reader->bit_position();
1686 const size_t header_bytes = (end_bit_pos - start_bit_pos) / 8;
1687 size -= header_bytes;
1689 for (
int tile_num = tg_start; tile_num <= tg_end; tile_num++) {
1690 const bool last_tile = tile_num == tg_end;
1691 size_t tile_size = size;
1693 size_t tile_size_minus_1 = 0;
1694 RCHECK(ReadLe(tile_info.tile_size_bytes, reader, &tile_size_minus_1));
1695 tile_size = tile_size_minus_1 + 1;
1696 size -= tile_size + tile_info.tile_size_bytes;
1698 tiles->push_back({reader->bit_position() / 8, tile_size});
1699 RCHECK(reader->SkipBits(tile_size * 8));
1702 if (tg_end == num_tiles - 1) {
1703 DecodeFrameWrapup();
1704 frame_header_.seen_frame_header =
false;
1710bool AV1Parser::SegFeatureActiveIdx(
int idx,
int feature) {
1711 const SegmentationParams& segmentation_params =
1712 frame_header_.segmentation_params;
1713 return segmentation_params.segmentation_enabled &&
1714 segmentation_params.feature_enabled[idx][feature];
1718void AV1Parser::DecodeFrameWrapup() {
1719 const int refresh_frame_flags = frame_header_.refresh_frame_flags;
1720 if (frame_header_.show_existing_frame &&
1721 frame_header_.frame_type == KEY_FRAME) {
1723 const ReferenceFrame& reference_frame =
1724 reference_frames_[frame_header_.frame_to_show_map_idx];
1726 frame_header_.upscaled_width = reference_frame.upscaled_width;
1727 frame_header_.frame_width = reference_frame.frame_width;
1728 frame_header_.frame_height = reference_frame.frame_height;
1729 frame_header_.render_width = reference_frame.render_width;
1730 frame_header_.render_height = reference_frame.render_height;
1731 frame_header_.mi_cols = reference_frame.mi_cols;
1732 frame_header_.mi_rows = reference_frame.mi_rows;
1734 ColorConfig& color_config = sequence_header_.color_config;
1735 color_config.subsampling_x = reference_frame.subsampling_x;
1736 color_config.subsampling_y = reference_frame.subsampling_y;
1737 color_config.bit_depth = reference_frame.bit_depth;
1739 frame_header_.order_hint = reference_frame.order_hint;
1742 for (
int i = 0; i <= kNumRefFrames - 1; i++) {
1743 if ((refresh_frame_flags >> i) & 1) {
1744 ReferenceFrame& reference_frame = reference_frames_[i];
1746 reference_frame.upscaled_width = frame_header_.upscaled_width;
1747 reference_frame.frame_width = frame_header_.frame_width;
1748 reference_frame.frame_height = frame_header_.frame_height;
1749 reference_frame.render_width = frame_header_.render_width;
1750 reference_frame.render_height = frame_header_.render_height;
1751 reference_frame.mi_cols = frame_header_.mi_cols;
1752 reference_frame.mi_rows = frame_header_.mi_rows;
1753 reference_frame.frame_type = frame_header_.frame_type;
1755 const ColorConfig& color_config = sequence_header_.color_config;
1756 reference_frame.subsampling_x = color_config.subsampling_x;
1757 reference_frame.subsampling_y = color_config.subsampling_y;
1758 reference_frame.bit_depth = color_config.bit_depth;
1760 reference_frame.order_hint = frame_header_.order_hint;
1766bool AV1Parser::SetFrameRefs(
int last_frame_idx,
int gold_frame_idx) {
1767 for (
int i = 0; i < kRefsPerFrame; i++)
1768 frame_header_.ref_frame_idx[i] = -1;
1769 frame_header_.ref_frame_idx[LAST_FRAME - LAST_FRAME] = last_frame_idx;
1770 frame_header_.ref_frame_idx[GOLDEN_FRAME - LAST_FRAME] = gold_frame_idx;
1772 bool used_frame[kNumRefFrames] = {};
1773 used_frame[last_frame_idx] =
true;
1774 used_frame[gold_frame_idx] =
true;
1776 const int cur_frame_hint = 1 << (sequence_header_.order_hint_bits - 1);
1780 int shifted_order_hints[kNumRefFrames];
1781 for (
int i = 0; i < kNumRefFrames; i++) {
1782 shifted_order_hints[i] =
1783 cur_frame_hint + GetRelativeDist(reference_frames_[i].order_hint,
1784 frame_header_.order_hint);
1787 const int last_order_hint = shifted_order_hints[last_frame_idx];
1788 RCHECK(last_order_hint < cur_frame_hint);
1789 const int gold_order_hint = shifted_order_hints[gold_frame_idx];
1790 RCHECK(gold_order_hint < cur_frame_hint);
1794 int ref = FindLatestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1796 frame_header_.ref_frame_idx[ALTREF_FRAME - LAST_FRAME] = ref;
1797 used_frame[ref] =
true;
1802 ref = FindEarliestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1804 frame_header_.ref_frame_idx[BWDREF_FRAME - LAST_FRAME] = ref;
1805 used_frame[ref] =
true;
1809 ref = FindEarliestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1811 frame_header_.ref_frame_idx[ALTREF2_FRAME - LAST_FRAME] = ref;
1812 used_frame[ref] =
true;
1817 static const int kRefFrameList[] = {
1818 LAST2_FRAME, LAST3_FRAME, BWDREF_FRAME, ALTREF2_FRAME, ALTREF_FRAME,
1820 static_assert(std::size(kRefFrameList) == kRefsPerFrame - 2,
1821 "Unexpected kRefFrameList size.");
1822 for (
const int ref_frame : kRefFrameList) {
1823 if (frame_header_.ref_frame_idx[ref_frame - LAST_FRAME] < 0) {
1824 ref = FindLatestForward(shifted_order_hints, used_frame, cur_frame_hint);
1826 frame_header_.ref_frame_idx[ref_frame - LAST_FRAME] = ref;
1827 used_frame[ref] =
true;
1835 int earliest_order_hint = 0;
1836 for (
int i = 0; i < kNumRefFrames; i++) {
1837 const int hint = shifted_order_hints[i];
1838 if (ref < 0 || hint < earliest_order_hint) {
1840 earliest_order_hint = hint;
1843 for (
int i = 0; i < kRefsPerFrame; i++) {
1844 if (frame_header_.ref_frame_idx[i] < 0) {
1845 frame_header_.ref_frame_idx[i] = ref;
1854int AV1Parser::GetQIndex(
bool ignore_delta_q,
int segment_id) {
1856 CHECK(ignore_delta_q) <<
"ignoreDeltaQ equal to 0 is not supported.";
1858 const int base_q_idx = frame_header_.quantization_params.base_q_idx;
1860 const int kSegLvlAltQ = 0;
1861 if (SegFeatureActiveIdx(segment_id, kSegLvlAltQ)) {
1863 frame_header_.segmentation_params.feature_data[segment_id][kSegLvlAltQ];
1864 const int qindex = base_q_idx + data;
1865 return Clip3(0, 255, qindex);
All the methods that are virtual are virtual for mocking.