Shaka Packager SDK
Loading...
Searching...
No Matches
av1_parser.cc
1// Copyright 2018 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/codecs/av1_parser.h>
8
9#include <algorithm>
10#include <cstddef>
11#include <cstdint>
12#include <iterator>
13#include <vector>
14
15#include <absl/log/check.h>
16#include <absl/log/log.h>
17
18#include <packager/media/base/bit_reader.h>
19#include <packager/media/base/rcheck.h>
20
21namespace shaka {
22namespace media {
23namespace {
24
25// 3. Symbols and abbreviated terms.
26enum MotionType {
27 IDENTITY = 0,
28 TRANSLATION,
29 ROTZOOM,
30 AFFINE,
31};
32
33const int kSelectScreenContentTools = 2;
34const int kSelectIntegerMv = 2;
35const int kPrimaryRefNone = 7;
36const int kNumRefFrames = 8;
37const int kAllFrames = (1 << kNumRefFrames) - 1;
38
39// 6.2.2. OBU header semantics.
40enum ObuType {
41 OBU_SEQUENCE_HEADER = 1,
42 OBU_TEMPORAL_DELIMITER,
43 OBU_FRAME_HEADER,
44 OBU_TILE_GROUP,
45 OBU_METADATA,
46 OBU_FRAME,
47 OBU_REDUNDENT_FRAME_HEADER,
48 OBU_TILE_LIST,
49 // Reserved types between OBU_TILE_LIST and OBU_PADDING.
50 OBU_PADDING = 15,
51};
52
53// 6.4.2. Color config semantics.
54enum ColorPrimaries {
55 CP_BT_709 = 1,
56 CP_UNSPECIFIED = 2,
57 // We are not interested in the others.
58};
59enum TransferCharacteristics {
60 TC_UNSPECIFIED = 2,
61 TC_SRGB = 13,
62 // We are not interested in the others.
63};
64enum MatrixCoefficients {
65 MC_IDENTITY = 0,
66 MC_UNSPECIFIED = 2,
67 // We are not interested in the others.
68};
69enum ChromaSamplePosition {
70 CSP_UNKNOWN = 0,
71 CSP_VERTICAL,
72 CSP_COLOCATED,
73 CSP_RESERVED,
74};
75
76// 6.8.2. Uncompressed header semantics.
77enum FrameType {
78 KEY_FRAME = 0,
79 INTER_FRAME,
80 INTRA_ONLY_FRAME,
81 SWITCH_FRAME,
82};
83
84// 6.10.24. Ref frames semantics.
85enum RefFrameName {
86 INTRA_FRAME = 0,
87 LAST_FRAME,
88 LAST2_FRAME,
89 LAST3_FRAME,
90 GOLDEN_FRAME,
91 BWDREF_FRAME,
92 ALTREF2_FRAME,
93 ALTREF_FRAME,
94};
95
96// 4.7. Mathematical functions.
97int Clip3(int min_value, int max_value, int value) {
98 if (value < min_value)
99 return min_value;
100 if (value > max_value)
101 return max_value;
102 return value;
103}
104
105// 4.7. Mathematical functions. The FloorLog2(x) function is defined to be the
106// floor of the base 2 logarithm of the input x.
107int FloorLog2(int x) {
108 int s = 0;
109 while (x != 0) {
110 x = x >> 1;
111 s++;
112 }
113 return s - 1;
114}
115
116// 4.10.3. uvlc(). This is a modified form of Exponential-Golomb coding.
117bool ReadUvlc(BitReader* reader, uint32_t* val) {
118 // Count the number of contiguous zero bits.
119 int leading_zeros = 0;
120 while (true) {
121 bool done = false;
122 RCHECK(reader->ReadBits(1, &done));
123 if (done)
124 break;
125 leading_zeros++;
126 }
127
128 if (leading_zeros >= 32) {
129 *val = (1ull << 32) - 1;
130 return true;
131 }
132
133 int value = 0;
134 if (leading_zeros > 0)
135 RCHECK(reader->ReadBits(leading_zeros, &value));
136
137 *val = value + (1 << leading_zeros) - 1;
138 return true;
139}
140
141// 4.10.4. le(n). Unsigned little-endian n-byte number appearing directly in the
142// bitstream.
143bool ReadLe(int n, BitReader* reader, size_t* val) {
144 size_t t = 0;
145 for (int i = 0; i < n; i++) {
146 size_t byte = 0;
147 RCHECK(reader->ReadBits(8, &byte));
148 t += (byte << (i * 8));
149 }
150 *val = t;
151 return true;
152}
153
154// 4.10.5. leb128(). Unsigned integer represented by a variable number of
155// little-endian bytes.
156bool ReadLeb128(BitReader* reader, size_t* size) {
157 size_t value = 0;
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))
163 break;
164 }
165 // It is a requirement of bitstream conformance that the value returned from
166 // the leb128 parsing process is less than or equal to (1<<32) - 1.
167 RCHECK(value <= ((1ull << 32) - 1));
168 *size = value;
169 return true;
170}
171
172// 4.10.6. su(n). Signed integer converted from an n bits unsigned integer in
173// the bitstream.
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;
179 return true;
180}
181
182// 4.10.7. ns(n). Unsigned encoded integer with maximum number of values in n
183// (i.e. output in range 0..n-1).
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));
188 if (*value < m)
189 return true;
190 int extra_bit = 0;
191 RCHECK(reader->ReadBits(1, &extra_bit));
192 *value = (*value << 1) - m + extra_bit;
193 return true;
194}
195
196// 5.9.16. Tile size calculation function: returns the smallest value for k such
197// that blk_size << k is greater than or equal to target.
198int TileLog2(int blk_size, int target) {
199 int k = 0;
200 for (k = 0; (blk_size << k) < target; k++)
201 continue;
202 return k;
203}
204
205// See 7.8. Set frame refs process.
206int FindLatestBackward(int shifted_order_hints[],
207 bool used_frame[],
208 int cur_frame_hint) {
209 int ref = -1;
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)) {
215 ref = i;
216 latest_order_hint = hint;
217 }
218 }
219 return ref;
220}
221
222// See 7.8. Set frame refs process.
223int FindEarliestBackward(int shifted_order_hints[],
224 bool used_frame[],
225 int cur_frame_hint) {
226 int ref = -1;
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)) {
232 ref = i;
233 earliest_order_hint = hint;
234 }
235 }
236 return ref;
237}
238
239// See 7.8. Set frame refs process.
240int FindLatestForward(int shifted_order_hints[],
241 bool used_frame[],
242 int cur_frame_hint) {
243 int ref = -1;
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)) {
249 ref = i;
250 latest_order_hint = hint;
251 }
252 }
253 return ref;
254}
255
256} // namespace
257
258AV1Parser::AV1Parser() = default;
259AV1Parser::~AV1Parser() = default;
260
261bool AV1Parser::Parse(const uint8_t* data,
262 size_t data_size,
263 std::vector<Tile>* tiles) {
264 tiles->clear();
265
266 BitReader reader(data, data_size);
267 while (reader.bits_available() > 0) {
268 if (!ParseOpenBitstreamUnit(&reader, tiles))
269 return false;
270 }
271 return true;
272}
273
274// 5.3.1. General OBU syntax.
275bool AV1Parser::ParseOpenBitstreamUnit(BitReader* reader,
276 std::vector<Tile>* tiles) {
277 ObuHeader obu_header;
278 RCHECK(ParseObuHeader(reader, &obu_header));
279
280 size_t obu_size = 0;
281 if (obu_header.obu_has_size_field)
282 RCHECK(ReadLeb128(reader, &obu_size));
283 else
284 obu_size = reader->bits_available() / 8;
285
286 VLOG(4) << "OBU " << obu_header.obu_type << " size " << obu_size;
287
288 const size_t start_position = reader->bit_position();
289 switch (obu_header.obu_type) {
290 case OBU_SEQUENCE_HEADER:
291 RCHECK(ParseSequenceHeaderObu(reader));
292 break;
293 case OBU_FRAME_HEADER:
294 case OBU_REDUNDENT_FRAME_HEADER:
295 RCHECK(ParseFrameHeaderObu(obu_header, reader));
296 break;
297 case OBU_TILE_GROUP:
298 RCHECK(ParseTileGroupObu(obu_size, reader, tiles));
299 break;
300 case OBU_FRAME:
301 RCHECK(ParseFrameObu(obu_header, obu_size, reader, tiles));
302 break;
303 default:
304 // Skip all OBUs we are not interested. Because this skips the entire
305 // OBU, do not then validate the trailing bits; just return early
306 RCHECK(reader->SkipBits(obu_size * 8));
307 return true;
308 }
309
310 const size_t current_position = reader->bit_position();
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));
318 }
319 return true;
320}
321
322// 5.3.2. OBU header syntax.
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)); // Skip obu_reserved_1bit.
332
333 if (obu_extension_flag)
334 RCHECK(ParseObuExtensionHeader(reader, &obu_header->extension_header));
335
336 return true;
337}
338
339// 5.3.3. OBU extension header syntax.
340bool AV1Parser::ParseObuExtensionHeader(
341 BitReader* reader,
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)); // Skip extension_header_reserved_3bits.
346 return true;
347}
348
349// 5.3.4. Trailing bits syntax.
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);
354 nb_bits--;
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);
359 nb_bits--;
360 }
361 return true;
362}
363
364bool AV1Parser::ByteAlignment(BitReader* reader) {
365 while (reader->bit_position() & 7) {
366 int zero_bit = 0;
367 RCHECK(reader->ReadBits(1, &zero_bit));
368 RCHECK(zero_bit == 0);
369 }
370 return true;
371}
372
373// 5.5.1. General sequence header OBU syntax.
374bool AV1Parser::ParseSequenceHeaderObu(BitReader* reader) {
375 RCHECK(reader->ReadBits(3, &sequence_header_.seq_profile));
376 // Skip still_picture.
377 RCHECK(reader->SkipBits(1));
378
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;
384 // Skip seq_level_idx[0].
385 RCHECK(reader->SkipBits(5));
386 sequence_header_.decoder_model_present_for_this_op[0] = false;
387 } else {
388 bool timing_info_present_flag = false;
389 RCHECK(reader->ReadBits(1, &timing_info_present_flag));
390
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));
397 }
398 sequence_header_.decoder_model_info_present_flag =
399 decoder_model_info_present_flag;
400
401 bool initial_display_delay_present_flag = false;
402 RCHECK(reader->ReadBits(1, &initial_display_delay_present_flag));
403
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) {
410 // Skip seq_tier[i].
411 RCHECK(reader->SkipBits(1));
412 }
413
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));
419 }
420 } else {
421 sequence_header_.decoder_model_present_for_this_op[i] = false;
422 }
423
424 if (initial_display_delay_present_flag) {
425 // Skip initial_display_delay_present_for_this_op[i],
426 // initial_display_delay_minus_1[i].
427 RCHECK(reader->SkipBitsConditional(true, 4));
428 }
429 }
430 }
431
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));
438
439 if (sequence_header_.reduced_still_picture_header) {
440 sequence_header_.frame_id_numbers_present_flag = false;
441 } else {
442 RCHECK(
443 reader->ReadBits(1, &sequence_header_.frame_id_numbers_present_flag));
444 }
445 if (sequence_header_.frame_id_numbers_present_flag) {
446 RCHECK(
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));
450 }
451
452 RCHECK(reader->ReadBits(1, &sequence_header_.use_128x128_superblock));
453 // Skip enable_filter_intra, enable_intra_edge_filter.
454 RCHECK(reader->SkipBits(1 + 1));
455
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;
463 } else {
464 // Skip enable_interintra_compound, enable_masked_compound,
465 RCHECK(reader->SkipBits(1 + 1));
466
467 RCHECK(reader->ReadBits(1, &sequence_header_.enable_warped_motion));
468 RCHECK(reader->SkipBits(1)); // Skip enable_dual_filter.
469 RCHECK(reader->ReadBits(1, &sequence_header_.enable_order_hint));
470 if (sequence_header_.enable_order_hint) {
471 // Skip enable_jnt_comp.
472 RCHECK(reader->SkipBits(1));
473 RCHECK(reader->ReadBits(1, &sequence_header_.enable_ref_frame_mvs));
474 } else {
475 sequence_header_.enable_ref_frame_mvs = false;
476 }
477
478 bool seq_choose_screen_content_tools = false;
479 RCHECK(reader->ReadBits(1, &seq_choose_screen_content_tools));
480
481 if (seq_choose_screen_content_tools) {
482 sequence_header_.seq_force_screen_content_tools =
483 kSelectScreenContentTools;
484 } else {
485 RCHECK(reader->ReadBits(
486 1, &sequence_header_.seq_force_screen_content_tools));
487 }
488
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;
494 else
495 RCHECK(reader->ReadBits(1, &sequence_header_.seq_force_integer_mv));
496 } else {
497 sequence_header_.seq_force_integer_mv = kSelectIntegerMv;
498 }
499
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;
504 } else {
505 sequence_header_.order_hint_bits = 0;
506 }
507 }
508
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));
514 return true;
515}
516
517// 5.5.2. Color config syntax.
518bool AV1Parser::ParseColorConfig(BitReader* reader) {
519 ColorConfig& color_config = sequence_header_.color_config;
520
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;
529 }
530
531 if (sequence_header_.seq_profile == 1)
532 color_config.mono_chrome = 0;
533 else
534 RCHECK(reader->ReadBits(1, &color_config.mono_chrome));
535 color_config.num_planes = color_config.mono_chrome ? 1 : 3;
536
537 bool color_description_present_flag = false;
538 RCHECK(reader->ReadBits(1, &color_description_present_flag));
539
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));
544 } else {
545 color_config.color_primaries = CP_UNSPECIFIED;
546 color_config.transfer_chracteristics = TC_UNSPECIFIED;
547 color_config.matrix_coefficients = MC_UNSPECIFIED;
548 }
549
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;
556 return true;
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;
563 } else {
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;
571 } else {
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));
576 else
577 color_config.subsampling_y = false;
578 } else {
579 color_config.subsampling_x = true;
580 color_config.subsampling_y = false;
581 }
582 }
583
584 if (color_config.subsampling_x && color_config.subsampling_y)
585 RCHECK(reader->ReadBits(2, &color_config.chroma_sampling_position));
586 }
587
588 RCHECK(reader->ReadBits(1, &color_config.separate_uv_delta_q));
589 return true;
590}
591
592// 5.5.3.Timing info syntax.
593bool AV1Parser::ParseTimingInfo(BitReader* reader) {
594 // Skip num_units_in_display_tick, time_scale.
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));
602 }
603 return true;
604}
605
606// 5.5.4. Decoder model info syntax.
607bool AV1Parser::ParseDecoderModelInfo(BitReader* reader) {
608 DecoderModelInfo& decoder_model_info = sequence_header_.decoder_model_info;
609
610 RCHECK(reader->ReadBits(5, &decoder_model_info.buffer_delay_length_minus_1));
611 // Skip num_units_in_decoding_tick.
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));
617 return true;
618}
619
620// 5.5.5. Operating parameters info syntax.
621bool AV1Parser::SkipOperatingParametersInfo(BitReader* reader) {
622 const int n =
623 sequence_header_.decoder_model_info.buffer_delay_length_minus_1 + 1;
624 // Skip decoder_buffer_delay[op], encoder_buffer_delay[op],
625 // low_delay_mode_flag[op].
626 RCHECK(reader->SkipBits(n + n + 1));
627 return true;
628}
629
630// 5.9.1. General frame header OBU syntax.
631bool AV1Parser::ParseFrameHeaderObu(const ObuHeader& obu_header,
632 BitReader* reader) {
633 if (frame_header_.seen_frame_header)
634 return true;
635
636 frame_header_.seen_frame_header = true;
637 RCHECK(ParseUncompressedHeader(obu_header, reader));
638 if (frame_header_.show_existing_frame) {
639 DecodeFrameWrapup();
640 frame_header_.seen_frame_header = false;
641 } else {
642 frame_header_.seen_frame_header = true;
643 }
644 return true;
645}
646
647// 5.9.2. Uncompressed header syntax.
648bool AV1Parser::ParseUncompressedHeader(const ObuHeader& obu_header,
649 BitReader* reader) {
650 int id_len = 0;
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;
654 }
655
656 bool frame_is_intra = false;
657 bool show_frame = false;
658 bool showable_frame = false;
659 bool error_resilient_mode = false;
660
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;
665 show_frame = true;
666 showable_frame = false;
667 } else {
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));
674 }
675 frame_header_.refresh_frame_flags = 0;
676 if (sequence_header_.frame_id_numbers_present_flag) {
677 // Skip display_frame_id.
678 RCHECK(reader->SkipBits(id_len));
679 }
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;
684 }
685 return true;
686 }
687
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));
695 }
696 if (show_frame)
697 showable_frame = frame_header_.frame_type != KEY_FRAME;
698 else
699 RCHECK(reader->ReadBits(1, &showable_frame));
700
701 if (frame_header_.frame_type == SWITCH_FRAME ||
702 (frame_header_.frame_type == KEY_FRAME && show_frame)) {
703 error_resilient_mode = true;
704 } else {
705 RCHECK(reader->ReadBits(1, &error_resilient_mode));
706 }
707 }
708
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;
712 }
713 }
714
715 bool disable_cdf_update = false;
716 RCHECK(reader->ReadBits(1, &disable_cdf_update));
717
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));
722 } else {
723 allow_screen_content_tools =
724 sequence_header_.seq_force_screen_content_tools != 0;
725 }
726
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));
731 else
732 force_integer_mv = sequence_header_.seq_force_integer_mv;
733 }
734 if (frame_is_intra)
735 force_integer_mv = 1;
736
737 if (sequence_header_.frame_id_numbers_present_flag) {
738 // Skip current_frame_id.
739 RCHECK(reader->SkipBits(id_len));
740 }
741
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;
747 else
748 RCHECK(reader->ReadBits(1, &frame_size_override_flag));
749
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;
755 } else {
756 RCHECK(reader->ReadBits(3, &primary_ref_frame));
757 }
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) {
762 for (int op_num = 0;
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)) {
771 // Skip buffer_removal_time[ opNum ].
772 RCHECK(reader->SkipBits(sequence_header_.decoder_model_info
773 .buffer_removal_time_length_minus_1 +
774 1));
775 }
776 }
777 }
778 }
779 }
780
781 bool allow_high_precision_mv = false;
782 bool allow_intrabc = false;
783
784 if (frame_header_.frame_type == SWITCH_FRAME ||
785 (frame_header_.frame_type == KEY_FRAME && show_frame)) {
786 frame_header_.refresh_frame_flags = kAllFrames;
787 } else {
788 RCHECK(reader->ReadBits(8, &frame_header_.refresh_frame_flags));
789 }
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++) {
793 // Skip ref_order_hint[ i ].
794 RCHECK(reader->SkipBits(sequence_header_.order_hint_bits));
795 }
796 }
797 }
798
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));
805 } else {
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));
815 }
816 }
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) {
821 // Skip delta_frame_id_minus_1.
822 RCHECK(reader->SkipBits(sequence_header_.delta_frame_id_length_minus_2 +
823 2));
824 }
825 }
826 if (frame_size_override_flag && !error_resilient_mode) {
827 RCHECK(ParseFrameSizeWithRefs(frame_size_override_flag, reader));
828 } else {
829 RCHECK(ParseFrameSize(frame_size_override_flag, reader));
830 RCHECK(ParseRenderSize(reader));
831 }
832
833 if (force_integer_mv)
834 allow_high_precision_mv = false;
835 else
836 RCHECK(reader->ReadBits(1, &allow_high_precision_mv));
837
838 RCHECK(SkipInterpolationFilter(reader));
839 // Skip is_motion_mode_switchable.
840 RCHECK(reader->SkipBits(1));
841 if (!error_resilient_mode && sequence_header_.enable_ref_frame_mvs) {
842 // Skip use_ref_frame_mvs.
843 RCHECK(reader->SkipBits(1));
844 }
845 }
846
847 if (!sequence_header_.reduced_still_picture_header && !disable_cdf_update) {
848 // Skip disable_frame_end_update_cdf.
849 RCHECK(reader->SkipBits(1));
850 }
851
852 RCHECK(ParseTileInfo(reader));
853 RCHECK(ParseQuantizationParams(reader));
854 RCHECK(ParseSegmentationParams(primary_ref_frame, reader));
855
856 bool delta_q_present = false;
857 RCHECK(SkipDeltaQParams(reader, &delta_q_present));
858 RCHECK(SkipDeltaLfParams(delta_q_present, allow_intrabc, reader));
859
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;
869 if (!lossless)
870 coded_lossless = false;
871 }
872 const bool all_lossless = coded_lossless && (frame_header_.frame_width ==
873 frame_header_.upscaled_width);
874
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));
882
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;
887 } else {
888 RCHECK(reader->ReadBits(1, &allow_warped_motion));
889 }
890 // Skip reduced_tx_set.
891 RCHECK(reader->SkipBits(1));
892
893 RCHECK(
894 SkipGlobalMotionParams(frame_is_intra, allow_high_precision_mv, reader));
895 RCHECK(SkipFilmGrainParams(show_frame, showable_frame, reader));
896 return true;
897}
898
899// 5.9.3. Get relative distance function.
900int AV1Parser::GetRelativeDist(int a, int b) {
901 if (!sequence_header_.enable_order_hint)
902 return 0;
903 int diff = a - b;
904 const int m = 1 << (sequence_header_.order_hint_bits - 1);
905 diff = (diff & (m - 1)) - (diff & m);
906 return diff;
907}
908
909// 5.9.5. Frame size syntax.
910bool AV1Parser::ParseFrameSize(bool frame_size_override_flag,
911 BitReader* reader) {
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;
921 } else {
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;
924 }
925 RCHECK(ParseSuperresParams(reader));
926 ComputeImageSize();
927 return true;
928}
929
930// 5.9.6. Render size syntax.
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;
941 } else {
942 frame_header_.render_width = frame_header_.upscaled_width;
943 frame_header_.render_height = frame_header_.frame_height;
944 }
945 return true;
946}
947
948// 5.9.7. Frame size with refs syntax.
949bool AV1Parser::ParseFrameSizeWithRefs(bool frame_size_override_flag,
950 BitReader* reader) {
951 bool found_ref = false;
952 for (int i = 0; i < kRefsPerFrame; i++) {
953 RCHECK(reader->ReadBits(1, &found_ref));
954 if (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;
962 break;
963 }
964 }
965 if (!found_ref) {
966 RCHECK(ParseFrameSize(frame_size_override_flag, reader));
967 RCHECK(ParseRenderSize(reader));
968 } else {
969 RCHECK(ParseSuperresParams(reader));
970 ComputeImageSize();
971 }
972 return true;
973}
974
975// 5.9.8. Superres params syntax.
976bool AV1Parser::ParseSuperresParams(BitReader* reader) {
977 const int kSuperresNum = 8;
978 const int kSuperresDenomMin = 9;
979 const int kSuperresDenomBits = 3;
980
981 bool use_superres = false;
982 if (sequence_header_.enable_superres)
983 RCHECK(reader->ReadBits(1, &use_superres));
984
985 int superres_denom = 0;
986 if (use_superres) {
987 int coded_denom = 0;
988 RCHECK(reader->ReadBits(kSuperresDenomBits, &coded_denom));
989 superres_denom = coded_denom + kSuperresDenomMin;
990 } else {
991 superres_denom = kSuperresNum;
992 }
993
994 const int upscaled_width = frame_header_.frame_width;
995 frame_header_.upscaled_width =
996 (upscaled_width * kSuperresNum + superres_denom / 2) / superres_denom;
997 return true;
998}
999
1000// 5.9.9. Compute image size function.
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);
1004}
1005
1006// 5.9.10. Interpolation filter syntax.
1007bool AV1Parser::SkipInterpolationFilter(BitReader* reader) {
1008 // SKip is_filter_switchable, interpolation_filter.
1009 RCHECK(reader->SkipBitsConditional(false, 2));
1010 return true;
1011}
1012
1013// 5.9.11. Loop filter parms syntax.
1014bool AV1Parser::ParseLoopFilterParams(bool coded_lossless,
1015 bool allow_intrabc,
1016 BitReader* reader) {
1017 if (coded_lossless || allow_intrabc)
1018 return true;
1019
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]) {
1025 // Skip loop_filter_level[2], loop_filter_level[3].
1026 RCHECK(reader->SkipBits(6 + 6));
1027 }
1028 }
1029 // Skip loop_filter_sharpness.
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++) {
1039 // Skip update_ref_delta, loop_filter_ref_delta[ i ].
1040 RCHECK(reader->SkipBitsConditional(true, 1 + 6));
1041 }
1042 for (int i = 0; i < 2; i++) {
1043 // Skip update_mode_delta, loop_filter_mode_delta[ i ].
1044 RCHECK(reader->SkipBitsConditional(true, 1 + 6));
1045 }
1046 }
1047 }
1048 return true;
1049}
1050
1051// 5.9.12. Quantization params syntax.
1052bool AV1Parser::ParseQuantizationParams(BitReader* reader) {
1053 QuantizationParams& quantization_params = frame_header_.quantization_params;
1054
1055 RCHECK(reader->ReadBits(8, &quantization_params.base_q_idx));
1056 RCHECK(ReadDeltaQ(reader, &quantization_params.delta_qydc));
1057
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));
1068 } else {
1069 quantization_params.delta_qvdc = quantization_params.delta_qudc;
1070 quantization_params.delta_qvac = quantization_params.delta_quac;
1071 }
1072 } else {
1073 quantization_params.delta_qudc = 0;
1074 quantization_params.delta_quac = 0;
1075 quantization_params.delta_qvdc = 0;
1076 quantization_params.delta_qvac = 0;
1077 }
1078 bool using_qmatrix = false;
1079 RCHECK(reader->ReadBits(1, &using_qmatrix));
1080 if (using_qmatrix) {
1081 // Skip qm_y, qm_u.
1082 RCHECK(reader->SkipBits(4 + 4));
1083 if (color_config.separate_uv_delta_q) {
1084 // Skip qm_v.
1085 RCHECK(reader->SkipBits(4));
1086 }
1087 }
1088 return true;
1089}
1090
1091// 5.9.13. Delta quantizer syntax.
1092bool AV1Parser::ReadDeltaQ(BitReader* reader, int* delta_q) {
1093 bool delta_coded = false;
1094 RCHECK(reader->ReadBits(1, &delta_coded));
1095 if (delta_coded)
1096 RCHECK(ReadSu(1 + 6, reader, delta_q));
1097 else
1098 *delta_q = 0;
1099 return true;
1100}
1101
1102// 5.9.14. Segmentation params syntax.
1103bool AV1Parser::ParseSegmentationParams(int primary_ref_frame,
1104 BitReader* reader) {
1105 SegmentationParams& segmentation_params = frame_header_.segmentation_params;
1106
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;
1112 } else {
1113 // Skip segmentation_update_map, segmentation_temporal_update.
1114 RCHECK(reader->SkipBitsConditional(true, 1));
1115 RCHECK(reader->ReadBits(1, &segmentation_update_data));
1116 }
1117 if (segmentation_update_data) {
1118 static const int kSegmentationFeatureBits[kSegLvlMax] = {8, 6, 6, 6,
1119 6, 3, 0, 0};
1120 static const int kSegmentationFeatureSigned[kSegLvlMax] = {1, 1, 1, 1,
1121 1, 0, 0, 0};
1122 const int kMaxLoopFilter = 63;
1123 static const int kSegmentationFeatureMax[kSegLvlMax] = {255,
1124 kMaxLoopFilter,
1125 kMaxLoopFilter,
1126 kMaxLoopFilter,
1127 kMaxLoopFilter,
1128 7,
1129 0,
1130 0};
1131
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);
1145 } else {
1146 int feature_value = 0;
1147 RCHECK(reader->ReadBits(bits_to_read, &feature_value));
1148 clipped_value = Clip3(0, limit, feature_value);
1149 }
1150 }
1151 segmentation_params.feature_data[i][j] = clipped_value;
1152 }
1153 }
1154 }
1155 } else {
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;
1160 }
1161 }
1162 }
1163 return true;
1164}
1165
1166// 5.9.15. Tile info syntax.
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;
1172
1173 TileInfo& tile_info = frame_header_.tile_info;
1174
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));
1190
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++;
1200 else
1201 break;
1202 }
1203 const int tile_width_sb = (sb_cols + (1 << tile_info.tile_cols_log2) - 1) >>
1204 tile_info.tile_cols_log2;
1205 int i = 0;
1206 for (int start_sb = 0; start_sb < sb_cols; start_sb += tile_width_sb) {
1207 i += 1;
1208 }
1209 tile_info.tile_cols = i;
1210
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++;
1219 else
1220 break;
1221 }
1222 const int tile_height_sb =
1223 (sb_rows + (1 << tile_info.tile_rows_log2) - 1) >>
1224 tile_info.tile_rows_log2;
1225 i = 0;
1226 for (int start_sb = 0; start_sb < sb_rows; start_sb += tile_height_sb) {
1227 i += 1;
1228 }
1229 tile_info.tile_rows = i;
1230 } else {
1231 int widest_tile_sb = 0;
1232 int start_sb = 0;
1233 int i = 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;
1241 }
1242 tile_info.tile_cols = i;
1243 tile_info.tile_cols_log2 = TileLog2(1, tile_info.tile_cols);
1244
1245 if (min_log2_tiles > 0)
1246 max_tile_area_sb = (sb_rows * sb_cols) >> (min_log2_tiles + 1);
1247 else
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);
1251
1252 start_sb = 0;
1253 i = 0;
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;
1260 }
1261 tile_info.tile_rows = i;
1262 tile_info.tile_rows_log2 = TileLog2(1, tile_info.tile_rows);
1263 }
1264 if (tile_info.tile_cols_log2 > 0 || tile_info.tile_rows_log2 > 0) {
1265 // Skip context_update_tile_id.
1266 RCHECK(
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;
1271 }
1272 return true;
1273}
1274
1275// 5.9.17. Quantizer index delta parameters syntax.
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) {
1281 // Skip delta_q_res.
1282 RCHECK(reader->SkipBits(2));
1283 }
1284 return true;
1285}
1286
1287// 5.9.18. Loop filter delta parameters syntax.
1288bool AV1Parser::SkipDeltaLfParams(bool delta_q_present,
1289 bool allow_intrabc,
1290 BitReader* reader) {
1291 bool delta_lf_present = false;
1292 if (delta_q_present) {
1293 if (!allow_intrabc)
1294 RCHECK(reader->ReadBits(1, &delta_lf_present));
1295 if (delta_lf_present) {
1296 // Skip delta_lf_res, delta_lf_multi.
1297 RCHECK(reader->SkipBits(2 + 1));
1298 }
1299 }
1300 return true;
1301}
1302
1303// 5.9.19. CDEF params syntax.
1304bool AV1Parser::ParseCdefParams(bool coded_lossless,
1305 bool allow_intrabc,
1306 BitReader* reader) {
1307 if (coded_lossless || allow_intrabc || !sequence_header_.enable_cdef)
1308 return true;
1309
1310 // Skip cdef_damping_minus_3.
1311 RCHECK(reader->SkipBits(2));
1312 int cdef_bits = 0;
1313 RCHECK(reader->ReadBits(2, &cdef_bits));
1314 for (int i = 0; i < (1 << cdef_bits); i++) {
1315 // Skip cdef_y_pri_strength[i], Skip cdef_y_sec_strength[i].
1316 RCHECK(reader->SkipBits(4 + 2));
1317 if (sequence_header_.color_config.num_planes > 1) {
1318 // Skip cdef_uv_pri_strength[i], Skip cdef_uv_sec_strength[i].
1319 RCHECK(reader->SkipBits(4 + 2));
1320 }
1321 }
1322 return true;
1323}
1324
1325// 5.9.20. Loop restoration params syntax.
1326bool AV1Parser::ParseLrParams(bool all_lossless,
1327 bool allow_intrabc,
1328 BitReader* reader) {
1329 if (all_lossless || allow_intrabc || !sequence_header_.enable_restoration)
1330 return true;
1331
1332 enum FrameRestorationType {
1333 RESTORE_NONE = 0,
1334 RESTORE_SWITCHABLE = 3,
1335 RESTORE_WIENER = 1,
1336 RESTORE_SGRPROJ = 2,
1337 };
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++) {
1343 int lr_type = 0;
1344 RCHECK(reader->ReadBits(2, &lr_type));
1345 const int frame_restoration_type = kRemapLrType[lr_type];
1346 if (frame_restoration_type != RESTORE_NONE) {
1347 uses_lr = true;
1348 if (i > 0)
1349 uses_chroma_lr = true;
1350 }
1351 }
1352
1353 if (uses_lr) {
1354 if (sequence_header_.use_128x128_superblock) {
1355 // Skip lr_unit_shift.
1356 RCHECK(reader->SkipBits(1));
1357 } else {
1358 // Skip lr_unit_shift, lr_unit_extra_shift.
1359 RCHECK(reader->SkipBitsConditional(true, 1));
1360 }
1361 if (sequence_header_.color_config.subsampling_x &&
1362 sequence_header_.color_config.subsampling_y && uses_chroma_lr) {
1363 // Skip lr_uv_shift.
1364 RCHECK(reader->SkipBits(1));
1365 }
1366 }
1367 return true;
1368}
1369
1370// 5.9.21. TX mode syntax.
1371bool AV1Parser::SkipTxMode(bool coded_lossless, BitReader* reader) {
1372 if (!coded_lossless) {
1373 // Skip tx_mode_select.
1374 RCHECK(reader->SkipBits(1));
1375 }
1376 return true;
1377}
1378
1379// 5.9.22. Skip mode params syntax.
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;
1387 } else {
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) {
1397 forward_idx = i;
1398 forward_hint = ref_hint;
1399 }
1400 } else if (GetRelativeDist(ref_hint, frame_header_.order_hint) > 0) {
1401 if (backward_idx < 0 || GetRelativeDist(ref_hint, backward_hint) < 0) {
1402 backward_idx = i;
1403 backward_hint = ref_hint;
1404 }
1405 }
1406 }
1407 if (forward_idx < 0) {
1408 skip_mode_allowed = false;
1409 } else if (backward_idx >= 0) {
1410 skip_mode_allowed = true;
1411 } else {
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;
1422 }
1423 }
1424 }
1425 skip_mode_allowed = second_forward_idx >= 0;
1426 }
1427 }
1428
1429 if (skip_mode_allowed) {
1430 // Skip skip_mode_present.
1431 RCHECK(reader->SkipBits(1));
1432 }
1433 return true;
1434}
1435
1436// 5.9.23. Frame reference mode syntax.
1437bool AV1Parser::ParseFrameReferenceMode(bool frame_is_intra,
1438 BitReader* reader,
1439 bool* reference_select) {
1440 if (frame_is_intra)
1441 *reference_select = false;
1442 else
1443 RCHECK(reader->ReadBits(1, reference_select));
1444 return true;
1445}
1446
1447// 5.9.24. Global motion params syntax.
1448bool AV1Parser::SkipGlobalMotionParams(bool frame_is_intra,
1449 bool allow_high_precision_mv,
1450 BitReader* reader) {
1451 if (frame_is_intra)
1452 return true;
1453
1454 for (int ref = LAST_FRAME; ref <= ALTREF_FRAME; ref++) {
1455 int type = 0;
1456
1457 bool is_global = false;
1458 RCHECK(reader->ReadBits(1, &is_global));
1459 if (is_global) {
1460 bool is_rot_zoom = false;
1461 RCHECK(reader->ReadBits(1, &is_rot_zoom));
1462 if (is_rot_zoom) {
1463 type = ROTZOOM;
1464 } else {
1465 bool is_translation = false;
1466 RCHECK(reader->ReadBits(1, &is_translation));
1467 type = is_translation ? TRANSLATION : AFFINE;
1468 }
1469 } else {
1470 type = IDENTITY;
1471 }
1472
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));
1479 }
1480 }
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));
1484 }
1485 }
1486 return true;
1487}
1488
1489// 5.9.25. Global param syntax.
1490bool AV1Parser::SkipGlobalParam(int type,
1491 int /*ref*/,
1492 int idx,
1493 bool allow_high_precision_mv,
1494 BitReader* reader) {
1495 const int kGmAbsTransBits = 12;
1496 const int kGmAbsTransOnlyBits = 9;
1497 const int kGmAbsAlphaBits = 12;
1498
1499 int abs_bits = kGmAbsAlphaBits;
1500 if (idx < 2) {
1501 if (type == TRANSLATION) {
1502 abs_bits = kGmAbsTransOnlyBits - (allow_high_precision_mv ? 0 : 1);
1503 } else {
1504 abs_bits = kGmAbsTransBits;
1505 }
1506 }
1507 const int mx = 1 << abs_bits;
1508 RCHECK(SkipDecodeSignedSubexpWithRef(-mx, mx + 1, reader));
1509 return true;
1510}
1511
1512// 5.9.26. Decode signed subexp with ref syntax.
1513bool AV1Parser::SkipDecodeSignedSubexpWithRef(int low,
1514 int high,
1515 BitReader* reader) {
1516 RCHECK(SkipDecodeUnsignedSubexpWithRef(high - low, reader));
1517 return true;
1518}
1519
1520// 5.9.27. Decode unsigned subbexp with ref syntax.
1521bool AV1Parser::SkipDecodeUnsignedSubexpWithRef(int mx, BitReader* reader) {
1522 RCHECK(SkipDecodeSubexp(mx, reader));
1523 return true;
1524}
1525
1526// 5.9.28. Decode subexp syntax.
1527bool AV1Parser::SkipDecodeSubexp(int num_syms, BitReader* reader) {
1528 int i = 0;
1529 int mk = 0;
1530 int k = 3;
1531 while (true) {
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));
1537 return true;
1538 } else {
1539 bool subexp_more_bits = false;
1540 RCHECK(reader->ReadBits(1, &subexp_more_bits));
1541 if (subexp_more_bits) {
1542 i++;
1543 mk += a;
1544 } else {
1545 // Skip subexp_bits.
1546 RCHECK(reader->SkipBits(b2));
1547 return true;
1548 }
1549 }
1550 }
1551 return true;
1552}
1553
1554// 5.9.30. Film grain params syntax.
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)) {
1560 return true;
1561 }
1562
1563 bool apply_grain = false;
1564 RCHECK(reader->ReadBits(1, &apply_grain));
1565 if (!apply_grain)
1566 return true;
1567
1568 // Skip grain_seed.
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) {
1574 // Skip film_grain_params_ref_idx.
1575 RCHECK(reader->SkipBits(3));
1576 return true;
1577 }
1578
1579 int num_y_points = 0;
1580 RCHECK(reader->ReadBits(4, &num_y_points));
1581 // Skip point_y_value, point_y_scaling.
1582 RCHECK(reader->SkipBits((8 + 8) * num_y_points));
1583
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)) {
1593 num_cb_points = 0;
1594 num_cr_points = 0;
1595 } else {
1596 RCHECK(reader->ReadBits(4, &num_cb_points));
1597 // Skip point_cb_value, point_cb_scaling.
1598 RCHECK(reader->SkipBits((8 + 8) * num_cb_points));
1599 RCHECK(reader->ReadBits(4, &num_cr_points));
1600 // Skip point_cr_value, point_cr_scaling.
1601 RCHECK(reader->SkipBits((8 + 8) * num_cr_points));
1602 }
1603
1604 // Skip grain_scaling_minus_8.
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;
1610 if (num_y_points) {
1611 num_pos_chroma = num_pos_luma + 1;
1612 // Skip ar_coeffs_y_plus_128.
1613 RCHECK(reader->SkipBits(8 * num_pos_luma));
1614 }
1615 if (chroma_scaling_from_luma || num_cb_points) {
1616 // Skip ar_coeffs_cb_plus_128.
1617 RCHECK(reader->SkipBits(8 * num_pos_chroma));
1618 }
1619 if (chroma_scaling_from_luma || num_cr_points) {
1620 // Skip ar_coeffs_cb_plus_128.
1621 RCHECK(reader->SkipBits(8 * num_pos_chroma));
1622 }
1623
1624 // Skip ar_coeff_shift_minus_6, grain_scale_shift.
1625 RCHECK(reader->SkipBits(2 + 2));
1626 if (num_cb_points) {
1627 // Skip cb_mult, cb_luma_mult, cb_offset.
1628 RCHECK(reader->SkipBits(8 + 8 + 9));
1629 }
1630 if (num_cr_points) {
1631 // Skip cr_mult, cr_luma_mult, cr_offset.
1632 RCHECK(reader->SkipBits(8 + 8 + 9));
1633 }
1634 // Skip overlap_flag, clip_restricted_range.
1635 RCHECK(reader->SkipBits(1 + 1));
1636 return true;
1637}
1638
1639// 5.9.31. Temporal point info syntax.
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 +
1644 1;
1645 // Skip frame_presentation_time.
1646 RCHECK(reader->SkipBits(frame_presentation_time_length));
1647 return true;
1648}
1649
1650// 5.10. Frame OBU syntax.
1651bool AV1Parser::ParseFrameObu(const ObuHeader& obu_header,
1652 size_t size,
1653 BitReader* reader,
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));
1661 return true;
1662}
1663
1664// 5.11.1. General tile group OBU syntax.
1665bool AV1Parser::ParseTileGroupObu(size_t size,
1666 BitReader* reader,
1667 std::vector<Tile>* tiles) {
1668 const TileInfo& tile_info = frame_header_.tile_info;
1669 const size_t start_bit_pos = reader->bit_position();
1670
1671 const int num_tiles = tile_info.tile_cols * tile_info.tile_rows;
1672 bool tile_start_and_end_present_flag = false;
1673 if (num_tiles > 1)
1674 RCHECK(reader->ReadBits(1, &tile_start_and_end_present_flag));
1675
1676 int tg_start = 0;
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));
1682 }
1683 RCHECK(ByteAlignment(reader));
1684
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;
1688
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;
1692 if (!last_tile) {
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;
1697 }
1698 tiles->push_back({reader->bit_position() / 8, tile_size});
1699 RCHECK(reader->SkipBits(tile_size * 8)); // Skip the tile.
1700 }
1701
1702 if (tg_end == num_tiles - 1) {
1703 DecodeFrameWrapup();
1704 frame_header_.seen_frame_header = false;
1705 }
1706 return true;
1707}
1708
1709// 5.11.14. Segmentation feature active function.
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];
1715}
1716
1717// 7.4. Decode frame wrapup process.
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) {
1722 // 7.21. Reference frame loading process.
1723 const ReferenceFrame& reference_frame =
1724 reference_frames_[frame_header_.frame_to_show_map_idx];
1725
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;
1733
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;
1738
1739 frame_header_.order_hint = reference_frame.order_hint;
1740 }
1741 // 7.20. Reference frame update process.
1742 for (int i = 0; i <= kNumRefFrames - 1; i++) {
1743 if ((refresh_frame_flags >> i) & 1) {
1744 ReferenceFrame& reference_frame = reference_frames_[i];
1745
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;
1754
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;
1759
1760 reference_frame.order_hint = frame_header_.order_hint;
1761 }
1762 }
1763}
1764
1765// 7.8. Set frame refs process.
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;
1771
1772 bool used_frame[kNumRefFrames] = {};
1773 used_frame[last_frame_idx] = true;
1774 used_frame[gold_frame_idx] = true;
1775
1776 const int cur_frame_hint = 1 << (sequence_header_.order_hint_bits - 1);
1777
1778 // An array containing the expected output order shifted such that the
1779 // current frame has hint equal to |cur_frame_hint| is prepared.
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);
1785 }
1786
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);
1791
1792 // The ALTREF_FRAME reference is set to be a backward reference to the frame
1793 // with highest output order.
1794 int ref = FindLatestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1795 if (ref >= 0) {
1796 frame_header_.ref_frame_idx[ALTREF_FRAME - LAST_FRAME] = ref;
1797 used_frame[ref] = true;
1798 }
1799
1800 // The BWDREF_FRAME reference is set to be a backward reference to the cloest
1801 // frame.
1802 ref = FindEarliestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1803 if (ref >= 0) {
1804 frame_header_.ref_frame_idx[BWDREF_FRAME - LAST_FRAME] = ref;
1805 used_frame[ref] = true;
1806 }
1807
1808 // The ALTREF2_FRAME reference is set to the next closest backward reference.
1809 ref = FindEarliestBackward(shifted_order_hints, used_frame, cur_frame_hint);
1810 if (ref >= 0) {
1811 frame_header_.ref_frame_idx[ALTREF2_FRAME - LAST_FRAME] = ref;
1812 used_frame[ref] = true;
1813 }
1814
1815 // The remaining references are set to be forward references in
1816 // anti-chronological order.
1817 static const int kRefFrameList[] = {
1818 LAST2_FRAME, LAST3_FRAME, BWDREF_FRAME, ALTREF2_FRAME, ALTREF_FRAME,
1819 };
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);
1825 if (ref >= 0) {
1826 frame_header_.ref_frame_idx[ref_frame - LAST_FRAME] = ref;
1827 used_frame[ref] = true;
1828 }
1829 }
1830 }
1831
1832 // Finally, any remaining references are set to the reference frame with
1833 // smallest output order.
1834 ref = -1;
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) {
1839 ref = i;
1840 earliest_order_hint = hint;
1841 }
1842 }
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;
1846 }
1847 }
1848
1849 return true;
1850}
1851
1852// 7.12.2. Dequantization functions. The function returns the quantizer index
1853// for the current block.
1854int AV1Parser::GetQIndex(bool ignore_delta_q, int segment_id) {
1855 // We do not have use case for ignore_delta_q false case.
1856 CHECK(ignore_delta_q) << "ignoreDeltaQ equal to 0 is not supported.";
1857
1858 const int base_q_idx = frame_header_.quantization_params.base_q_idx;
1859
1860 const int kSegLvlAltQ = 0;
1861 if (SegFeatureActiveIdx(segment_id, kSegLvlAltQ)) {
1862 const int data =
1863 frame_header_.segmentation_params.feature_data[segment_id][kSegLvlAltQ];
1864 const int qindex = base_q_idx + data;
1865 return Clip3(0, 255, qindex);
1866 } else {
1867 return base_q_idx;
1868 }
1869}
1870
1871} // namespace media
1872} // namespace shaka
virtual bool Parse(const uint8_t *data, size_t data_size, std::vector< Tile > *tiles)
A class to read bit streams.
Definition bit_reader.h:19
size_t bit_position() const
Definition bit_reader.h:96
bool SkipBits(size_t num_bits)
Definition bit_reader.cc:28
size_t bits_available() const
Definition bit_reader.h:91
All the methods that are virtual are virtual for mocking.