xref: /aosp_15_r20/external/libgav1/src/obu_parser_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1 // Copyright 2021 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/obu_parser.h"
16 
17 #include <array>
18 #include <cstddef>
19 #include <cstdint>
20 #include <cstring>
21 #include <memory>
22 #include <new>
23 #include <string>
24 #include <vector>
25 
26 #include "gtest/gtest.h"
27 #include "src/buffer_pool.h"
28 #include "src/decoder_impl.h"
29 #include "src/decoder_state.h"
30 #include "src/gav1/decoder_buffer.h"
31 #include "src/gav1/status_code.h"
32 #include "src/utils/common.h"
33 #include "src/utils/constants.h"
34 #include "src/utils/dynamic_buffer.h"
35 #include "src/utils/segmentation.h"
36 #include "src/utils/types.h"
37 #include "src/utils/vector.h"
38 #include "tests/third_party/libvpx/acm_random.h"
39 
40 // Note the following test classes access private functions/members of
41 // ObuParser. To be declared friends of ObuParser they must not have internal
42 // linkage (they must be outside the anonymous namespace).
43 namespace libgav1 {
44 
45 // Helper class to manipulate individual bits and generate a byte string.
46 class BytesAndBits {
47  public:
48   // Append a bit to the end.
AppendBit(uint8_t bit)49   void AppendBit(uint8_t bit) { bits_.push_back(bit != 0); }
50 
51   // Append a byte to the end.
AppendByte(uint8_t byte)52   void AppendByte(uint8_t byte) {
53     for (int i = 0; i < 8; ++i) {
54       AppendBit(GetNthBit(byte, i, 8));
55     }
56   }
57 
58   // Append a literal of size |bits| to the end.
AppendLiteral(int bits,int value)59   void AppendLiteral(int bits, int value) {
60     InsertLiteral(static_cast<int>(bits_.size()), bits, value);
61   }
62 
63   // Append an inverse signed literal to the end. |bits + 1| bits are appended.
AppendInverseSignedLiteral(int bits,int value)64   void AppendInverseSignedLiteral(int bits, int value) {
65     InsertInverseSignedLiteral(static_cast<int>(bits_.size()), bits, value);
66   }
67 
68   // Append a sequence of bytes to the end.
AppendBytes(const std::vector<uint8_t> & bytes)69   void AppendBytes(const std::vector<uint8_t>& bytes) {
70     for (const auto& byte : bytes) {
71       AppendByte(byte);
72     }
73   }
74 
75   // Insert |bit| in |offset|. Moves all other bits to the right by 1.
InsertBit(int offset,uint8_t bit)76   void InsertBit(int offset, uint8_t bit) {
77     auto iterator = bits_.begin();
78     bits_.insert(iterator + offset, bit != 0);
79   }
80 
81   // Insert |value| of size |bits| at offset |offset|. Moves all other bits to
82   // the right by |bits|.
InsertLiteral(int offset,int bits,int value)83   void InsertLiteral(int offset, int bits, int value) {
84     for (int i = 0; i < bits; ++i) {
85       InsertBit(i + offset, GetNthBit(value, i, bits));
86     }
87   }
88 
89   // Insert |value| of size |bits| at offset |offset| as an inverse signed
90   // literal. Move all other bits to the right by |bits + 1|.
91   //
92   // Note: This is denoted su(1+bits) in the spec.
InsertInverseSignedLiteral(int offset,int bits,int value)93   void InsertInverseSignedLiteral(int offset, int bits, int value) {
94     InsertBit(offset, (value >= 0) ? 0 : 1);
95     InsertLiteral(offset + 1, bits, value);
96   }
97 
98   // Insert |value| at |offset| as an unsigned variable length code (uvlc).
99   // Return the number of bits inserted.
InsertUvlc(int offset,int value)100   int InsertUvlc(int offset, int value) {
101     int leading_zeros = 1;
102     int shift_value = ++value;
103     while ((shift_value >>= 1) != 0) leading_zeros += 2;
104     int bits = 0;
105     InsertLiteral(offset, leading_zeros >> 1, 0);
106     bits += leading_zeros >> 1;
107     InsertLiteral(offset + bits, (leading_zeros + 1) >> 1, value);
108     bits += (leading_zeros + 1) >> 1;
109     return bits;
110   }
111 
112   // Set the bit at |offset| to |bit|. The bit should already exist.
SetBit(int offset,uint8_t bit)113   void SetBit(int offset, uint8_t bit) { bits_[offset] = bit != 0; }
114 
115   // Set |bits| starting at |offset| to |value|. The bits should already exist.
SetLiteral(int offset,int bits,int value)116   void SetLiteral(int offset, int bits, int value) {
117     for (int i = 0; i < bits; ++i) {
118       SetBit(offset + i, GetNthBit(value, i, bits));
119     }
120   }
121 
122   // Remove a bit in |offset|. Moves over all the following bits to the left by
123   // 1.
RemoveBit(int offset)124   void RemoveBit(int offset) { RemoveLiteral(offset, 1); }
125 
126   // Remove a literal of size |bits| from |offset|. Moves over all the
127   // following bits to the left by |bits|.
RemoveLiteral(int offset,int bits)128   void RemoveLiteral(int offset, int bits) {
129     bits_.erase(bits_.begin() + offset, bits_.begin() + offset + bits);
130   }
131 
132   // Remove all bits after offset.
RemoveAllBitsAfter(int offset)133   void RemoveAllBitsAfter(int offset) {
134     RemoveLiteral(offset, static_cast<int>(bits_.size()) - offset);
135   }
136 
137   // Clear all the bits stored.
Clear()138   void Clear() { bits_.clear(); }
139 
140   // Generate the data vector from the bits. Pads 0 to the end of the last byte
141   // if necessary.
GenerateData()142   const std::vector<uint8_t>& GenerateData() {
143     data_.clear();
144     for (size_t i = 0; i < bits_.size(); i += 8) {
145       uint8_t byte = 0;
146       for (int j = 0; j < 8; ++j) {
147         const uint8_t bit =
148             ((i + j) < bits_.size()) ? static_cast<uint8_t>(bits_[i + j]) : 0;
149         byte |= bit << (7 - j);
150       }
151       data_.push_back(byte);
152     }
153     return data_;
154   }
155 
156  private:
157   // Get the |n|th MSB from |value| with the assumption that |value| has |size|
158   // bits.
GetNthBit(int value,int n,int size)159   static uint8_t GetNthBit(int value, int n, int size) {
160     return (value >> (size - n - 1)) & 0x01;
161   }
162 
163   std::vector<uint8_t> data_;
164   std::vector<bool> bits_;
165 };
166 
167 class ObuParserTest : public testing::Test {
168  protected:
169   // Constants for unit tests.
170   static constexpr int kFrameWidthBits = 9;
171   static constexpr int kFrameHeightBits = 8;
172   static constexpr int kHeight = 240;
173   static constexpr int kWidth = 426;
174   static constexpr int kRows4x4 = 60;
175   static constexpr int kColumns4x4 = 108;
176   static constexpr int kFrameToShow = 2;
177   static constexpr int kDisplayFrameId = 10;
178   static constexpr int kFrameIdLengthBits = 15;
179   static constexpr int kDeltaFrameIdLengthBits = 14;
180 
181   // Bit streams for testing. These may contain trailing bits and tests may have
182   // to remove some of the trailing bits to keep the boundary alignment.
183   const std::vector<uint8_t> kDefaultTemporalDelimiter = {0x12, 0x00};
184   // Bits  Syntax element                  Value
185   // 1     obu_forbidden_bit               0
186   // 4     obu_type                        2 (OBU_TEMPORAL_DELIMITER)
187   // 1     obu_extension_flag              1
188   // 1     obu_has_size_field              1
189   // 1     obu_reserved_1bit               0
190   // 3     temporal_id                     6
191   // 2     spatial_id                      2
192   // 3     extension_header_reserved_3bits 0
193   // 8     obu_size                        0
194   const std::vector<uint8_t> kDefaultTemporalDelimiterWithExtension = {
195       0x16, 0xd0, 0x00};
196   const std::vector<uint8_t> kDefaultHeaderWithoutSizeField = {0x10};
197   // Offset  Bits  Syntax element                     Value
198   // 0       3     seq_profile                        0
199   // 3       1     still_picture                      0
200   // 4       1     reduced_still_picture_header       0
201   // 5       1     timing_info_present_flag           0
202   // 6       1     initial_display_delay_present_flag 0
203   // 7       5     operating_points_cnt_minus_1       0
204   // 12      12    operating_point_idc[ 0 ]           0
205   // 24      5     seq_level_idx[ 0 ]                 0
206   // 29      4     frame_width_bits_minus_1           8
207   // 33      4     frame_height_bits_minus_1          7
208   // 37      9     max_frame_width_minus_1            425
209   // 46      8     max_frame_height_minus_1           239
210   // 54      1     frame_id_numbers_present_flag      0
211   // 55      1     use_128x128_superblock             1
212   // 56      1     enable_filter_intra                1
213   // 57      1     enable_intra_edge_filter           1
214   // 58      1     enable_interintra_compound         1
215   // 59      1     enable_masked_compound             1
216   // 60      1     enable_warped_motion               0
217   // 61      1     enable_dual_filter                 1
218   // 62      1     enable_order_hint                  1
219   // 63      1     enable_jnt_comp                    1
220   // 64      1     enable_ref_frame_mvs               1
221   // 65      1     seq_choose_screen_content_tools    1
222   // 66      1     seq_choose_integer_mv              1
223   // 67      3     order_hint_bits_minus_1            6
224   // 70      1     enable_superres                    0
225   // 71      1     enable_cdef                        1
226   // 72      1     enable_restoration                 1
227   // ...
228   const std::vector<uint8_t> kDefaultSequenceHeader = {
229       0x00, 0x00, 0x00, 0x04, 0x3e, 0xa7, 0xbd, 0xf7, 0xf9, 0x80, 0x40};
230   const std::vector<uint8_t> kDefaultFrameHeaderKeyFrame = {0x10, 0x00};
231   // Bits  Syntax element           Value
232   // 1     show_existing_frame      0
233   // 2     frame_type               2 (kFrameIntraOnly)
234   // 1     show_frame               1
235   // 1     error_resilient_mode     0
236   // 1     disable_cdf_update       0
237   // 1     frame_size_override_flag 0
238   // 8     refresh_frame_flags      4
239   // ...
240   const std::vector<uint8_t> kDefaultFrameHeaderIntraOnlyFrame = {0x50, 0x08,
241                                                                   0x00};
242   // Bits  Syntax element           Value
243   // 1     show_existing_frame      0
244   // 2     frame_type               1 (kFrameInter)
245   // 1     show_frame               1
246   // 1     error_resilient_mode     0
247   // 1     disable_cdf_update       0
248   // 1     frame_size_override_flag 0
249   // 3     primary_ref_frame        1
250   // 8     refresh_frame_flags      4
251   // 3     ref_frame_idx[0]         0
252   // 3     ref_frame_idx[1]         1
253   // 3     ref_frame_idx[2]         2
254   // 3     ref_frame_idx[3]         3
255   // 3     ref_frame_idx[4]         4
256   // 3     ref_frame_idx[5]         5
257   // 3     ref_frame_idx[6]         6
258   // ...
259   const std::vector<uint8_t> kDefaultFrameHeaderInterFrame = {0x30, 0x41, 0x01,
260                                                               0x4e, 0x5c, 0x60};
261   const std::vector<uint8_t> kDefaultGlobalMotionParametersRotZoom = {
262       0xff, 0x50, 0x77, 0x7e, 0x1f, 0xcd};
263   const std::vector<uint8_t> kDefaultGlobalMotionParametersAffine = {
264       0x3f, 0x50, 0x77, 0x7b, 0xbf, 0xa8, 0x3e, 0x1f, 0xcd};
265 
SetUp()266   void SetUp() override {
267     buffer_pool_.reset(new (std::nothrow)
268                            BufferPool(nullptr, nullptr, nullptr, nullptr));
269     ASSERT_NE(buffer_pool_, nullptr);
270   }
271 
Init()272   bool Init() {
273     obu_.reset(new (std::nothrow) ObuParser(nullptr, 0, 0, buffer_pool_.get(),
274                                             &decoder_state_));
275     if (obu_ == nullptr) return false;
276     obu_headers_ = &obu_->obu_headers_;
277     obu_frame_header_ = &obu_->frame_header_;
278     obu_sequence_header_ = &obu_->sequence_header_;
279     return true;
280   }
281 
Init(const std::vector<uint8_t> & data,bool init_bit_reader=true)282   bool Init(const std::vector<uint8_t>& data, bool init_bit_reader = true) {
283     obu_.reset(new (std::nothrow) ObuParser(
284         data.data(), data.size(), 0, buffer_pool_.get(), &decoder_state_));
285     if (obu_ == nullptr) return false;
286     obu_headers_ = &obu_->obu_headers_;
287     obu_frame_header_ = &obu_->frame_header_;
288     obu_sequence_header_ = &obu_->sequence_header_;
289     return init_bit_reader ? obu_->InitBitReader(data.data(), data.size())
290                            : true;
291   }
292 
Parse(const std::string & input,const ObuSequenceHeader * const sequence_header=nullptr)293   bool Parse(const std::string& input,
294              const ObuSequenceHeader* const sequence_header = nullptr) {
295     std::vector<uint8_t> data(input.begin(), input.end());
296     return Parse(data, sequence_header);
297   }
298 
Parse(const std::vector<uint8_t> & data,const ObuSequenceHeader * const sequence_header=nullptr)299   bool Parse(const std::vector<uint8_t>& data,
300              const ObuSequenceHeader* const sequence_header = nullptr) {
301     EXPECT_TRUE(Init(data, false));
302     if (sequence_header != nullptr) obu_->set_sequence_header(*sequence_header);
303     return obu_->ParseOneFrame(&current_frame_) == kStatusOk;
304   }
305 
ParseSequenceHeader(const std::vector<uint8_t> & data)306   bool ParseSequenceHeader(const std::vector<uint8_t>& data) {
307     EXPECT_TRUE(Init(data));
308     return obu_->ParseSequenceHeader(/*seen_frame_header=*/false);
309   }
310 
ParseFrameParameters(const std::vector<uint8_t> & data,bool id_bits_present=false,int force_screen_content_tools=0,int force_integer_mv=0,bool enable_superres=false)311   bool ParseFrameParameters(const std::vector<uint8_t>& data,
312                             bool id_bits_present = false,
313                             int force_screen_content_tools = 0,
314                             int force_integer_mv = 0,
315                             bool enable_superres = false) {
316     EXPECT_TRUE(Init(data));
317     if (id_bits_present) {
318       obu_->sequence_header_.frame_id_numbers_present = true;
319       obu_->sequence_header_.frame_id_length_bits = kFrameIdLengthBits;
320       obu_->sequence_header_.delta_frame_id_length_bits =
321           kDeltaFrameIdLengthBits;
322     }
323     obu_->sequence_header_.force_screen_content_tools =
324         force_screen_content_tools;
325     obu_->sequence_header_.force_integer_mv = force_integer_mv;
326     obu_->sequence_header_.enable_superres = enable_superres;
327     obu_->sequence_header_.frame_width_bits = kFrameWidthBits;
328     obu_->sequence_header_.frame_height_bits = kFrameHeightBits;
329     obu_->sequence_header_.max_frame_width = kWidth;
330     obu_->sequence_header_.max_frame_height = kHeight;
331     return obu_->ParseFrameParameters();
332   }
333 
ParseSegmentationParameters(const std::vector<uint8_t> & data,int primary_reference_frame,int prev_frame_index)334   bool ParseSegmentationParameters(const std::vector<uint8_t>& data,
335                                    int primary_reference_frame,
336                                    int prev_frame_index) {
337     EXPECT_TRUE(Init(data));
338     obu_->frame_header_.primary_reference_frame = primary_reference_frame;
339     if (primary_reference_frame != kPrimaryReferenceNone) {
340       obu_->frame_header_.reference_frame_index[primary_reference_frame] =
341           prev_frame_index;
342     }
343     return obu_->ParseSegmentationParameters();
344   }
345 
ParseFrameReferenceModeSyntax(const std::vector<uint8_t> & data,FrameType frame_type)346   bool ParseFrameReferenceModeSyntax(const std::vector<uint8_t>& data,
347                                      FrameType frame_type) {
348     EXPECT_TRUE(Init(data));
349     obu_->frame_header_.frame_type = frame_type;
350     return obu_->ParseFrameReferenceModeSyntax();
351   }
352 
ParseGlobalMotionParameters(const std::vector<uint8_t> & data,FrameType frame_type)353   bool ParseGlobalMotionParameters(const std::vector<uint8_t>& data,
354                                    FrameType frame_type) {
355     EXPECT_TRUE(Init(data));
356     obu_->frame_header_.frame_type = frame_type;
357     obu_->frame_header_.primary_reference_frame = kPrimaryReferenceNone;
358     return obu_->ParseGlobalMotionParameters();
359   }
360 
ParseFilmGrainParameters(const std::vector<uint8_t> & data,const ObuSequenceHeader & sequence_header,const ObuFrameHeader & frame_header)361   bool ParseFilmGrainParameters(const std::vector<uint8_t>& data,
362                                 const ObuSequenceHeader& sequence_header,
363                                 const ObuFrameHeader& frame_header) {
364     EXPECT_TRUE(Init(data));
365     obu_->set_sequence_header(sequence_header);
366     obu_->frame_header_ = frame_header;
367     return obu_->ParseFilmGrainParameters();
368   }
369 
ParseTileInfoSyntax(const std::vector<uint8_t> & data,int columns4x4,int rows4x4,bool use_128x128_superblock)370   bool ParseTileInfoSyntax(const std::vector<uint8_t>& data, int columns4x4,
371                            int rows4x4, bool use_128x128_superblock) {
372     EXPECT_TRUE(Init(data));
373     obu_->frame_header_.columns4x4 = columns4x4;
374     obu_->frame_header_.rows4x4 = rows4x4;
375     obu_->sequence_header_.use_128x128_superblock = use_128x128_superblock;
376     return obu_->ParseTileInfoSyntax();
377   }
378 
ParseMetadata(const std::vector<uint8_t> & data)379   bool ParseMetadata(const std::vector<uint8_t>& data) {
380     EXPECT_TRUE(Init(data));
381     return obu_->ParseMetadata(data.data(), data.size());
382   }
383 
DefaultSequenceHeader(ObuSequenceHeader * const gold)384   void DefaultSequenceHeader(ObuSequenceHeader* const gold) {
385     memset(gold, 0, sizeof(*gold));
386     gold->profile = kProfile0;
387     gold->level[0].major = kMinimumMajorBitstreamLevel;
388     gold->operating_points = 1;
389     gold->max_frame_width = kWidth;
390     gold->max_frame_height = kHeight;
391     gold->frame_width_bits = kFrameWidthBits;
392     gold->frame_height_bits = kFrameHeightBits;
393     gold->use_128x128_superblock = true;
394     gold->enable_filter_intra = true;
395     gold->enable_intra_edge_filter = true;
396     gold->enable_interintra_compound = true;
397     gold->enable_masked_compound = true;
398     gold->enable_dual_filter = true;
399     gold->enable_order_hint = true;
400     gold->enable_jnt_comp = true;
401     gold->enable_ref_frame_mvs = true;
402     gold->choose_screen_content_tools = true;
403     gold->force_screen_content_tools = 2;
404     gold->choose_integer_mv = true;
405     gold->force_integer_mv = 2;
406     gold->order_hint_bits = 7;
407     gold->enable_cdef = true;
408     gold->enable_restoration = true;
409     gold->color_config.bitdepth = 8;
410     gold->color_config.color_primary = kColorPrimaryUnspecified;
411     gold->color_config.transfer_characteristics =
412         kTransferCharacteristicsUnspecified;
413     gold->color_config.matrix_coefficients = kMatrixCoefficientsUnspecified;
414     gold->color_config.subsampling_x = 1;
415     gold->color_config.subsampling_y = 1;
416   }
417 
DefaultFrameHeader(ObuFrameHeader * const gold,FrameType frame_type)418   void DefaultFrameHeader(ObuFrameHeader* const gold, FrameType frame_type) {
419     memset(gold, 0, sizeof(*gold));
420     gold->frame_type = frame_type;
421     gold->show_frame = true;
422     gold->showable_frame = (frame_type != kFrameKey);
423     gold->enable_cdf_update = true;
424     gold->width = kWidth;
425     gold->height = kHeight;
426     gold->render_width = kWidth;
427     gold->render_height = kHeight;
428     gold->upscaled_width = kWidth;
429     gold->primary_reference_frame = kPrimaryReferenceNone;
430     gold->enable_frame_end_update_cdf = true;
431     gold->rows4x4 = kRows4x4;
432     gold->columns4x4 = kColumns4x4;
433     if (frame_type == kFrameKey) {
434       gold->refresh_frame_flags = 0xff;
435       gold->error_resilient_mode = true;
436       gold->force_integer_mv = 1;
437     } else if (frame_type == kFrameIntraOnly) {
438       gold->refresh_frame_flags = 4;
439       gold->force_integer_mv = 1;
440     } else if (frame_type == kFrameInter) {
441       gold->refresh_frame_flags = 4;
442       gold->primary_reference_frame = 1;
443       for (int i = 0; i < kNumInterReferenceFrameTypes; ++i) {
444         gold->reference_frame_index[i] = i;
445       }
446       gold->is_motion_mode_switchable = true;
447     }
448   }
449 
OverrideFrameSize(BytesAndBits * const data,ObuFrameHeader * const gold,int flag_offset,int size_offset)450   void OverrideFrameSize(BytesAndBits* const data, ObuFrameHeader* const gold,
451                          int flag_offset, int size_offset) {
452     data->SetBit(flag_offset, 1);  // frame_size_override_flag.
453     data->InsertLiteral(size_offset, kFrameWidthBits,
454                         kWidth - 2);  // frame_width_minus_1.
455     data->InsertLiteral(size_offset + kFrameWidthBits, kFrameHeightBits,
456                         kHeight - 2);  // frame_height_minus_1.
457     gold->frame_size_override_flag = true;
458     gold->width = kWidth - 1;
459     gold->height = kHeight - 1;
460     gold->render_width = gold->width;
461     gold->render_height = gold->height;
462     gold->upscaled_width = gold->width;
463   }
464 
OverrideRenderSize(BytesAndBits * const data,ObuFrameHeader * const gold,int flag_offset)465   void OverrideRenderSize(BytesAndBits* const data, ObuFrameHeader* const gold,
466                           int flag_offset) {
467     data->SetBit(flag_offset, 1);  // render_and_frame_size_different.
468     data->InsertLiteral(flag_offset + 1, 16,
469                         kWidth - 10);  // render_width_minus_1.
470     data->InsertLiteral(flag_offset + 17, 16,
471                         kHeight - 10);  // render_height_minus_1.
472     gold->render_width = kWidth - 9;
473     gold->render_height = kHeight - 9;
474     gold->render_and_frame_size_different = true;
475   }
476 
OverrideSegmentation(BytesAndBits * const data,Segmentation * const gold,int offset)477   void OverrideSegmentation(BytesAndBits* const data, Segmentation* const gold,
478                             int offset) {
479     gold->update_data = true;
480     data->SetBit(offset++, static_cast<uint8_t>(gold->update_data));
481     libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
482     gold->segment_id_pre_skip = false;
483     gold->last_active_segment_id = 0;
484     for (int i = 0; i < kMaxSegments; ++i) {
485       for (int j = 0; j < kSegmentFeatureMax; ++j) {
486         gold->feature_enabled[i][j] = static_cast<bool>(rnd.Rand8() & 1);
487         data->InsertBit(offset++,
488                         static_cast<uint8_t>(gold->feature_enabled[i][j]));
489         if (gold->feature_enabled[i][j]) {
490           gold->feature_data[i][j] = rnd(1 << kSegmentationFeatureBits[j]);
491           if (Segmentation::FeatureSigned(static_cast<SegmentFeature>(j))) {
492             if (static_cast<bool>(rnd.Rand8() & 1)) {
493               gold->feature_data[i][j] *= -1;
494             }
495             data->InsertInverseSignedLiteral(
496                 offset, kSegmentationFeatureBits[j], gold->feature_data[i][j]);
497             offset += kSegmentationFeatureBits[j] + 1;
498           } else {
499             data->InsertLiteral(offset, kSegmentationFeatureBits[j],
500                                 gold->feature_data[i][j]);
501             offset += kSegmentationFeatureBits[j];
502           }
503           gold->last_active_segment_id = i;
504           if (j >= kSegmentFeatureReferenceFrame) {
505             gold->segment_id_pre_skip = true;
506           }
507         }
508       }
509     }
510   }
511 
VerifyObuHeader(bool extension)512   void VerifyObuHeader(bool extension) {
513     EXPECT_EQ(obu_->obu_headers().back().temporal_id, extension ? 6 : 0);
514     EXPECT_EQ(obu_->obu_headers().back().spatial_id, extension ? 2 : 0);
515   }
516 
517 #define OBU_TEST_COMPARE(x) EXPECT_EQ(expected.x, actual.x)
VerifyFrameParameters(const ObuFrameHeader & expected,bool id_bits_present=false)518   void VerifyFrameParameters(const ObuFrameHeader& expected,
519                              bool id_bits_present = false) {
520     const ObuFrameHeader& actual = obu_->frame_header();
521     OBU_TEST_COMPARE(show_existing_frame);
522     if (actual.show_existing_frame) {
523       OBU_TEST_COMPARE(frame_to_show);
524       OBU_TEST_COMPARE(frame_presentation_time);
525       if (id_bits_present) {
526         OBU_TEST_COMPARE(display_frame_id);
527       }
528       return;
529     }
530     OBU_TEST_COMPARE(frame_type);
531     OBU_TEST_COMPARE(show_frame);
532     OBU_TEST_COMPARE(frame_presentation_time);
533     OBU_TEST_COMPARE(showable_frame);
534     OBU_TEST_COMPARE(error_resilient_mode);
535     OBU_TEST_COMPARE(enable_cdf_update);
536     OBU_TEST_COMPARE(current_frame_id);
537     OBU_TEST_COMPARE(frame_size_override_flag);
538     OBU_TEST_COMPARE(order_hint);
539     for (int i = 0; i < kNumReferenceFrameTypes; ++i) {
540       OBU_TEST_COMPARE(reference_order_hint[i]);
541     }
542     OBU_TEST_COMPARE(primary_reference_frame);
543     OBU_TEST_COMPARE(width);
544     OBU_TEST_COMPARE(height);
545     OBU_TEST_COMPARE(render_and_frame_size_different);
546     OBU_TEST_COMPARE(render_width);
547     OBU_TEST_COMPARE(render_height);
548     OBU_TEST_COMPARE(upscaled_width);
549     OBU_TEST_COMPARE(coded_lossless);
550     OBU_TEST_COMPARE(upscaled_lossless);
551     OBU_TEST_COMPARE(allow_screen_content_tools);
552     OBU_TEST_COMPARE(is_motion_mode_switchable);
553     OBU_TEST_COMPARE(refresh_frame_flags);
554     OBU_TEST_COMPARE(enable_frame_end_update_cdf);
555     OBU_TEST_COMPARE(force_integer_mv);
556     if (actual.frame_type == kFrameInter) {
557       for (int i = 0; i < kNumInterReferenceFrameTypes; ++i) {
558         OBU_TEST_COMPARE(reference_frame_index[i]);
559       }
560     }
561     OBU_TEST_COMPARE(use_superres);
562     OBU_TEST_COMPARE(rows4x4);
563     OBU_TEST_COMPARE(columns4x4);
564   }
565 
VerifyLoopFilterParameters(const LoopFilter & expected)566   void VerifyLoopFilterParameters(const LoopFilter& expected) {
567     const LoopFilter& actual = obu_->frame_header().loop_filter;
568     for (int i = 0; i < 4; ++i) {
569       OBU_TEST_COMPARE(level[i]);
570     }
571     OBU_TEST_COMPARE(sharpness);
572     OBU_TEST_COMPARE(delta_enabled);
573     OBU_TEST_COMPARE(delta_update);
574     for (int i = 0; i < kNumReferenceFrameTypes; ++i) {
575       OBU_TEST_COMPARE(ref_deltas[i]);
576     }
577     for (int i = 0; i < kLoopFilterMaxModeDeltas; ++i) {
578       OBU_TEST_COMPARE(mode_deltas[i]);
579     }
580   }
581 
VerifyQuantizerParameters(const QuantizerParameters & expected)582   void VerifyQuantizerParameters(const QuantizerParameters& expected) {
583     const QuantizerParameters& actual = obu_->frame_header().quantizer;
584     OBU_TEST_COMPARE(base_index);
585     OBU_TEST_COMPARE(delta_dc[kPlaneY]);
586     OBU_TEST_COMPARE(delta_dc[kPlaneU]);
587     OBU_TEST_COMPARE(delta_dc[kPlaneV]);
588     EXPECT_EQ(0, actual.delta_ac[kPlaneY]);
589     OBU_TEST_COMPARE(delta_ac[kPlaneY]);
590     OBU_TEST_COMPARE(delta_ac[kPlaneU]);
591     OBU_TEST_COMPARE(delta_ac[kPlaneV]);
592     OBU_TEST_COMPARE(use_matrix);
593     OBU_TEST_COMPARE(matrix_level[kPlaneY]);
594     OBU_TEST_COMPARE(matrix_level[kPlaneU]);
595     OBU_TEST_COMPARE(matrix_level[kPlaneV]);
596   }
597 
VerifySegmentationParameters(const Segmentation & expected)598   void VerifySegmentationParameters(const Segmentation& expected) {
599     const Segmentation& actual = obu_->frame_header().segmentation;
600     OBU_TEST_COMPARE(enabled);
601     OBU_TEST_COMPARE(update_map);
602     OBU_TEST_COMPARE(update_data);
603     OBU_TEST_COMPARE(temporal_update);
604     OBU_TEST_COMPARE(segment_id_pre_skip);
605     OBU_TEST_COMPARE(last_active_segment_id);
606     for (int i = 0; i < kMaxSegments; ++i) {
607       for (int j = 0; j < kSegmentFeatureMax; ++j) {
608         OBU_TEST_COMPARE(feature_enabled[i][j]);
609         OBU_TEST_COMPARE(feature_data[i][j]);
610       }
611     }
612   }
613 
VerifyDeltaParameters(const Delta & expected,const Delta & actual)614   void VerifyDeltaParameters(const Delta& expected, const Delta& actual) {
615     OBU_TEST_COMPARE(present);
616     OBU_TEST_COMPARE(scale);
617     OBU_TEST_COMPARE(multi);
618   }
619 
VerifyCdefParameters(const Cdef & expected)620   void VerifyCdefParameters(const Cdef& expected) {
621     const Cdef& actual = obu_->frame_header().cdef;
622     OBU_TEST_COMPARE(damping);
623     OBU_TEST_COMPARE(bits);
624     for (int i = 0; i < (1 << actual.bits); ++i) {
625       OBU_TEST_COMPARE(y_primary_strength[i]);
626       OBU_TEST_COMPARE(y_secondary_strength[i]);
627       OBU_TEST_COMPARE(uv_primary_strength[i]);
628       OBU_TEST_COMPARE(uv_secondary_strength[i]);
629     }
630   }
631 
VerifyLoopRestorationParameters(const LoopRestoration & expected)632   void VerifyLoopRestorationParameters(const LoopRestoration& expected) {
633     const LoopRestoration& actual = obu_->frame_header().loop_restoration;
634     for (int i = 0; i < kMaxPlanes; ++i) {
635       OBU_TEST_COMPARE(type[i]);
636       OBU_TEST_COMPARE(unit_size_log2[i]);
637     }
638   }
639 
VerifyGlobalMotionParameters(const std::array<GlobalMotion,kNumReferenceFrameTypes> & gold)640   void VerifyGlobalMotionParameters(
641       const std::array<GlobalMotion, kNumReferenceFrameTypes>& gold) {
642     for (int i = kReferenceFrameLast; i <= kReferenceFrameAlternate; ++i) {
643       const GlobalMotion& expected = gold[i];
644       const GlobalMotion& actual = obu_->frame_header().global_motion[i];
645       OBU_TEST_COMPARE(type) << " i: " << i;
646       for (int j = 0; j < 6; ++j) {
647         OBU_TEST_COMPARE(params[j]) << " i: " << i << " j: " << j;
648       }
649     }
650   }
651 
VerifyFilmGrainParameters(const FilmGrainParams & expected)652   void VerifyFilmGrainParameters(const FilmGrainParams& expected) {
653     const FilmGrainParams& actual = obu_->frame_header().film_grain_params;
654     OBU_TEST_COMPARE(apply_grain);
655     OBU_TEST_COMPARE(update_grain);
656     OBU_TEST_COMPARE(chroma_scaling_from_luma);
657     OBU_TEST_COMPARE(overlap_flag);
658     OBU_TEST_COMPARE(clip_to_restricted_range);
659     OBU_TEST_COMPARE(num_y_points);
660     OBU_TEST_COMPARE(num_u_points);
661     OBU_TEST_COMPARE(num_v_points);
662     for (int i = 0; i < 14; ++i) {
663       OBU_TEST_COMPARE(point_y_value[i]);
664       OBU_TEST_COMPARE(point_y_scaling[i]);
665     }
666     for (int i = 0; i < 10; ++i) {
667       OBU_TEST_COMPARE(point_u_value[i]);
668       OBU_TEST_COMPARE(point_u_scaling[i]);
669     }
670     for (int i = 0; i < 10; ++i) {
671       OBU_TEST_COMPARE(point_v_value[i]);
672       OBU_TEST_COMPARE(point_v_scaling[i]);
673     }
674     OBU_TEST_COMPARE(chroma_scaling);
675     OBU_TEST_COMPARE(auto_regression_coeff_lag);
676     for (int i = 0; i < 24; ++i) {
677       OBU_TEST_COMPARE(auto_regression_coeff_y[i]);
678     }
679     for (int i = 0; i < 25; ++i) {
680       OBU_TEST_COMPARE(auto_regression_coeff_u[i]);
681     }
682     for (int i = 0; i < 25; ++i) {
683       OBU_TEST_COMPARE(auto_regression_coeff_v[i]);
684     }
685     OBU_TEST_COMPARE(auto_regression_shift);
686     OBU_TEST_COMPARE(grain_seed);
687     OBU_TEST_COMPARE(reference_index);
688     OBU_TEST_COMPARE(grain_scale_shift);
689     OBU_TEST_COMPARE(u_multiplier);
690     OBU_TEST_COMPARE(u_luma_multiplier);
691     OBU_TEST_COMPARE(u_offset);
692     OBU_TEST_COMPARE(v_multiplier);
693     OBU_TEST_COMPARE(v_luma_multiplier);
694     OBU_TEST_COMPARE(v_offset);
695   }
696 
VerifyTileInfoParameters(const TileInfo & expected)697   void VerifyTileInfoParameters(const TileInfo& expected) {
698     const TileInfo& actual = obu_->frame_header().tile_info;
699     OBU_TEST_COMPARE(uniform_spacing);
700     OBU_TEST_COMPARE(tile_columns_log2);
701     OBU_TEST_COMPARE(tile_columns);
702     for (int i = 0; i < kMaxTileColumns + 1; ++i) {
703       OBU_TEST_COMPARE(tile_column_start[i]) << "tile_column: " << i;
704       OBU_TEST_COMPARE(tile_column_width_in_superblocks[i])
705           << "tile_column: " << i;
706     }
707     OBU_TEST_COMPARE(tile_rows_log2);
708     OBU_TEST_COMPARE(tile_rows);
709     for (int i = 0; i < kMaxTileRows + 1; ++i) {
710       OBU_TEST_COMPARE(tile_row_start[i]) << "tile_row: " << i;
711       OBU_TEST_COMPARE(tile_row_height_in_superblocks[i]) << "tile_rows: " << i;
712     }
713     OBU_TEST_COMPARE(tile_count);
714     OBU_TEST_COMPARE(context_update_id);
715     OBU_TEST_COMPARE(tile_size_bytes);
716   }
717 
VerifySequenceHeader(const ObuSequenceHeader & expected)718   void VerifySequenceHeader(const ObuSequenceHeader& expected) {
719     EXPECT_TRUE(obu_->sequence_header_changed());
720     const ObuSequenceHeader& actual = obu_->sequence_header();
721     OBU_TEST_COMPARE(profile);
722     OBU_TEST_COMPARE(still_picture);
723     OBU_TEST_COMPARE(reduced_still_picture_header);
724     OBU_TEST_COMPARE(operating_points);
725     for (int i = 0; i < actual.operating_points; ++i) {
726       OBU_TEST_COMPARE(operating_point_idc[i]) << "i: " << i;
727       OBU_TEST_COMPARE(level[i].major) << "i: " << i;
728       OBU_TEST_COMPARE(level[i].minor) << "i: " << i;
729       OBU_TEST_COMPARE(tier[i]) << "i: " << i;
730     }
731     OBU_TEST_COMPARE(frame_width_bits);
732     OBU_TEST_COMPARE(frame_height_bits);
733     OBU_TEST_COMPARE(max_frame_width);
734     OBU_TEST_COMPARE(max_frame_height);
735     OBU_TEST_COMPARE(frame_id_numbers_present);
736     if (actual.frame_id_numbers_present) {
737       OBU_TEST_COMPARE(frame_id_length_bits);
738       OBU_TEST_COMPARE(delta_frame_id_length_bits);
739     }
740     OBU_TEST_COMPARE(use_128x128_superblock);
741     OBU_TEST_COMPARE(enable_filter_intra);
742     OBU_TEST_COMPARE(enable_intra_edge_filter);
743     OBU_TEST_COMPARE(enable_interintra_compound);
744     OBU_TEST_COMPARE(enable_masked_compound);
745     OBU_TEST_COMPARE(enable_warped_motion);
746     OBU_TEST_COMPARE(enable_dual_filter);
747     OBU_TEST_COMPARE(enable_order_hint);
748     OBU_TEST_COMPARE(enable_jnt_comp);
749     OBU_TEST_COMPARE(enable_ref_frame_mvs);
750     OBU_TEST_COMPARE(choose_screen_content_tools);
751     OBU_TEST_COMPARE(force_screen_content_tools);
752     OBU_TEST_COMPARE(choose_integer_mv);
753     OBU_TEST_COMPARE(force_integer_mv);
754     OBU_TEST_COMPARE(order_hint_bits);
755     OBU_TEST_COMPARE(enable_superres);
756     OBU_TEST_COMPARE(enable_cdef);
757     OBU_TEST_COMPARE(enable_restoration);
758     OBU_TEST_COMPARE(color_config.bitdepth);
759     OBU_TEST_COMPARE(color_config.is_monochrome);
760     OBU_TEST_COMPARE(color_config.color_range);
761     OBU_TEST_COMPARE(color_config.subsampling_x);
762     OBU_TEST_COMPARE(color_config.subsampling_y);
763     OBU_TEST_COMPARE(color_config.chroma_sample_position);
764     OBU_TEST_COMPARE(timing_info_present_flag);
765     OBU_TEST_COMPARE(timing_info.num_units_in_tick);
766     OBU_TEST_COMPARE(timing_info.time_scale);
767     OBU_TEST_COMPARE(timing_info.equal_picture_interval);
768     OBU_TEST_COMPARE(timing_info.num_ticks_per_picture);
769     OBU_TEST_COMPARE(decoder_model_info_present_flag);
770     OBU_TEST_COMPARE(decoder_model_info.encoder_decoder_buffer_delay_length);
771     OBU_TEST_COMPARE(decoder_model_info.num_units_in_decoding_tick);
772     OBU_TEST_COMPARE(decoder_model_info.buffer_removal_time_length);
773     OBU_TEST_COMPARE(decoder_model_info.frame_presentation_time_length);
774     for (int i = 0; i < actual.operating_points; ++i) {
775       SCOPED_TRACE("i: " + std::to_string(i));
776       OBU_TEST_COMPARE(operating_parameters.decoder_buffer_delay[i]);
777       OBU_TEST_COMPARE(operating_parameters.encoder_buffer_delay[i]);
778       OBU_TEST_COMPARE(operating_parameters.low_delay_mode_flag[i]);
779       OBU_TEST_COMPARE(initial_display_delay[i]);
780     }
781     OBU_TEST_COMPARE(film_grain_params_present);
782   }
783 
VerifyMetadataHdrCll(const ObuMetadataHdrCll & expected)784   void VerifyMetadataHdrCll(const ObuMetadataHdrCll& expected) {
785     EXPECT_TRUE(obu_->current_frame_->hdr_cll_set());
786     const ObuMetadataHdrCll& actual = obu_->current_frame_->hdr_cll();
787     OBU_TEST_COMPARE(max_cll);
788     OBU_TEST_COMPARE(max_fall);
789   }
790 
VerifyMetadataHdrMdcv(const ObuMetadataHdrMdcv & expected)791   void VerifyMetadataHdrMdcv(const ObuMetadataHdrMdcv& expected) {
792     EXPECT_TRUE(obu_->current_frame_->hdr_mdcv_set());
793     const ObuMetadataHdrMdcv& actual = obu_->current_frame_->hdr_mdcv();
794     for (int i = 0; i < 3; ++i) {
795       OBU_TEST_COMPARE(primary_chromaticity_x[i]);
796       OBU_TEST_COMPARE(primary_chromaticity_y[i]);
797     }
798     OBU_TEST_COMPARE(white_point_chromaticity_x);
799     OBU_TEST_COMPARE(white_point_chromaticity_y);
800     OBU_TEST_COMPARE(luminance_max);
801     OBU_TEST_COMPARE(luminance_min);
802   }
803 
VerifyMetadataItutT35(const ObuMetadataItutT35 & expected)804   void VerifyMetadataItutT35(const ObuMetadataItutT35& expected) {
805     EXPECT_TRUE(obu_->current_frame_->itut_t35_set());
806     const ObuMetadataItutT35& actual = obu_->current_frame_->itut_t35();
807     OBU_TEST_COMPARE(country_code);
808     if (actual.country_code == 0xFF) {
809       OBU_TEST_COMPARE(country_code_extension_byte);
810     }
811     ASSERT_EQ(expected.payload_size, actual.payload_size);
812     if (actual.payload_size != 0) {
813       EXPECT_EQ(memcmp(expected.payload_bytes, actual.payload_bytes,
814                        actual.payload_size),
815                 0);
816     }
817   }
818 
819 #undef OBU_TEST_COMPARE
820 
821   // Accessors to private members of ObuParser. This avoids the need for a
822   // dependency on a googletest header in the main library for FRIEND_TEST()
823   // (or the need to duplicate the implementation).
ObuParseFrameParameters()824   bool ObuParseFrameParameters() { return obu_->ParseFrameParameters(); }
ObuParseLoopFilterParameters()825   bool ObuParseLoopFilterParameters() {
826     return obu_->ParseLoopFilterParameters();
827   }
ObuParseLoopFilterDeltaParameters()828   bool ObuParseLoopFilterDeltaParameters() {
829     return obu_->ParseLoopFilterDeltaParameters();
830   }
ObuParseQuantizerParameters()831   bool ObuParseQuantizerParameters() {
832     return obu_->ParseQuantizerParameters();
833   }
ObuParseQuantizerIndexDeltaParameters()834   bool ObuParseQuantizerIndexDeltaParameters() {
835     return obu_->ParseQuantizerIndexDeltaParameters();
836   }
ObuComputeSegmentLosslessAndQIndex()837   void ObuComputeSegmentLosslessAndQIndex() {
838     obu_->ComputeSegmentLosslessAndQIndex();
839   }
ObuParseCdefParameters()840   bool ObuParseCdefParameters() { return obu_->ParseCdefParameters(); }
ObuParseLoopRestorationParameters()841   bool ObuParseLoopRestorationParameters() {
842     return obu_->ParseLoopRestorationParameters();
843   }
ObuParseTxModeSyntax()844   bool ObuParseTxModeSyntax() { return obu_->ParseTxModeSyntax(); }
ObuIsSkipModeAllowed()845   bool ObuIsSkipModeAllowed() { return obu_->IsSkipModeAllowed(); }
ObuParseSkipModeParameters()846   bool ObuParseSkipModeParameters() { return obu_->ParseSkipModeParameters(); }
ObuReadAllowWarpedMotion()847   bool ObuReadAllowWarpedMotion() { return obu_->ReadAllowWarpedMotion(); }
ObuSetFrameReferences(int8_t last_frame_idx,int8_t gold_frame_idx)848   bool ObuSetFrameReferences(int8_t last_frame_idx, int8_t gold_frame_idx) {
849     return obu_->SetFrameReferences(last_frame_idx, gold_frame_idx);
850   }
851 
852   std::unique_ptr<BufferPool> buffer_pool_;
853   DecoderState decoder_state_;
854   std::unique_ptr<ObuParser> obu_;
855   // The following members are reset with each Init().
856   Vector<ObuHeader>* obu_headers_;
857   ObuFrameHeader* obu_frame_header_;
858   ObuSequenceHeader* obu_sequence_header_;
859   RefCountedBufferPtr current_frame_;
860 };
861 
TEST_F(ObuParserTest,InvalidInputs)862 TEST_F(ObuParserTest, InvalidInputs) {
863   obu_.reset(new (std::nothrow)
864                  ObuParser(nullptr, 0, 0, buffer_pool_.get(), &decoder_state_));
865   EXPECT_EQ(obu_->ParseOneFrame(&current_frame_), kStatusInvalidArgument);
866   obu_.reset(new (std::nothrow) ObuParser(nullptr, 10, 0, buffer_pool_.get(),
867                                           &decoder_state_));
868   EXPECT_EQ(obu_->ParseOneFrame(&current_frame_), kStatusInvalidArgument);
869   obu_.reset(new (std::nothrow)
870                  ObuParser(kDefaultTemporalDelimiter.data(), 0, 0,
871                            buffer_pool_.get(), &decoder_state_));
872   EXPECT_EQ(obu_->ParseOneFrame(&current_frame_), kStatusInvalidArgument);
873 }
874 
TEST_F(ObuParserTest,TemporalDelimiter)875 TEST_F(ObuParserTest, TemporalDelimiter) {
876   BytesAndBits data;
877   data.AppendBytes(kDefaultTemporalDelimiter);
878 
879   ASSERT_TRUE(Parse(data.GenerateData()));
880   EXPECT_EQ(obu_->obu_headers().size(), 1);
881   EXPECT_EQ(obu_->obu_headers().back().type, kObuTemporalDelimiter);
882   VerifyObuHeader(false);
883 
884   // forbidden_bit is not zero.
885   data.SetBit(0, 1);
886   EXPECT_FALSE(Parse(data.GenerateData()));
887 }
888 
TEST_F(ObuParserTest,HeaderExtensions)889 TEST_F(ObuParserTest, HeaderExtensions) {
890   BytesAndBits data;
891   data.AppendBytes(kDefaultTemporalDelimiterWithExtension);
892 
893   ASSERT_TRUE(Parse(data.GenerateData()));
894   EXPECT_EQ(obu_->obu_headers().size(), 1);
895   EXPECT_EQ(obu_->obu_headers().back().type, kObuTemporalDelimiter);
896   VerifyObuHeader(true);
897 
898   // extension flag is set but no extensions found.
899   data.Clear();
900   data.AppendByte(kDefaultTemporalDelimiterWithExtension[0]);
901   EXPECT_FALSE(Parse(data.GenerateData()));
902 }
903 
TEST_F(ObuParserTest,HeaderHasSizeFieldNotSet)904 TEST_F(ObuParserTest, HeaderHasSizeFieldNotSet) {
905   BytesAndBits data;
906   data.AppendBytes(kDefaultHeaderWithoutSizeField);
907 
908   EXPECT_FALSE(Parse(data.GenerateData()));
909 }
910 
TEST_F(ObuParserTest,SequenceHeader)911 TEST_F(ObuParserTest, SequenceHeader) {
912   BytesAndBits data;
913   data.AppendBytes(kDefaultSequenceHeader);
914   ObuSequenceHeader gold;
915   DefaultSequenceHeader(&gold);
916 
917   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
918   VerifySequenceHeader(gold);
919 }
920 
TEST_F(ObuParserTest,SequenceHeaderLevel)921 TEST_F(ObuParserTest, SequenceHeaderLevel) {
922   BytesAndBits data;
923   data.AppendBytes(kDefaultSequenceHeader);
924   ObuSequenceHeader gold;
925   DefaultSequenceHeader(&gold);
926 
927   // Set level to 1.
928   gold.level[0].major = 2;
929   gold.level[0].minor = 1;
930   data.SetLiteral(24, 5, 1);  // level.
931 
932   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
933   VerifySequenceHeader(gold);
934 
935   // Set operating_point_idc of operating point 1 to 0x101 (temporal layer 0
936   // and spatial layer 0 should be decoded). Set level of operating point 1 to
937   // 8 (4.0) and tier to 1.
938   gold.operating_points = 2;
939   gold.operating_point_idc[1] = (1 << 0) | (1 << (0 + 8));
940   gold.level[1].major = 4;
941   gold.level[1].minor = 0;
942   gold.tier[1] = 1;
943   data.SetLiteral(7, 5, gold.operating_points - 1);
944   data.InsertLiteral(29, 12, 0x101);  // operating_point_idc.
945   data.InsertLiteral(41, 5, 8);       // level.
946   data.InsertBit(46, gold.tier[1]);
947 
948   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
949   VerifySequenceHeader(gold);
950 }
951 
TEST_F(ObuParserTest,SequenceHeaderProfile)952 TEST_F(ObuParserTest, SequenceHeaderProfile) {
953   BytesAndBits data;
954   data.AppendBytes(kDefaultSequenceHeader);
955   ObuSequenceHeader gold;
956   DefaultSequenceHeader(&gold);
957 
958   gold.still_picture = true;
959   data.SetBit(3, static_cast<uint8_t>(gold.still_picture));
960 
961   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
962   VerifySequenceHeader(gold);
963 
964   // profile 2; bitdepth 8;
965   gold.profile = kProfile2;
966   gold.color_config.bitdepth = 8;
967   gold.color_config.subsampling_x = 1;
968   gold.color_config.subsampling_y = 0;
969   data.SetLiteral(0, 3, gold.profile);
970 
971   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
972   VerifySequenceHeader(gold);
973 
974   // profile 2; bitdepth 10;
975   gold.color_config.bitdepth = 10;
976   data.SetBit(73, 1);     // high_bitdepth.
977   data.InsertBit(74, 0);  // twelve_bit.
978 
979   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
980   VerifySequenceHeader(gold);
981 
982   // profile 2; bitdepth 12;
983   gold.color_config.bitdepth = 12;
984   gold.color_config.subsampling_y = 1;
985   data.SetBit(74, 1);     // twelve_bit.
986   data.InsertBit(78, 1);  // subsampling_x.
987   data.InsertBit(79, 1);  // subsampling_y.
988 
989   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
990   VerifySequenceHeader(gold);
991 }
992 
TEST_F(ObuParserTest,SequenceHeaderIdLength)993 TEST_F(ObuParserTest, SequenceHeaderIdLength) {
994   BytesAndBits data;
995   data.AppendBytes(kDefaultSequenceHeader);
996   ObuSequenceHeader gold;
997   DefaultSequenceHeader(&gold);
998 
999   gold.frame_id_numbers_present = true;
1000   gold.delta_frame_id_length_bits = kDeltaFrameIdLengthBits;
1001   gold.frame_id_length_bits = kFrameIdLengthBits;
1002   data.SetBit(54, 1);  // frame_id_numbers_present.
1003   data.InsertLiteral(55, 4, kDeltaFrameIdLengthBits - 2);
1004   data.InsertLiteral(59, 3, kFrameIdLengthBits - kDeltaFrameIdLengthBits - 1);
1005 
1006   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1007   VerifySequenceHeader(gold);
1008 }
1009 
1010 // An idLen greater than 16 is invalid.
TEST_F(ObuParserTest,SequenceHeaderIdLengthInvalid)1011 TEST_F(ObuParserTest, SequenceHeaderIdLengthInvalid) {
1012   BytesAndBits data;
1013   data.AppendBytes(kDefaultSequenceHeader);
1014 
1015   data.SetBit(54, 1);  // frame_id_numbers_present.
1016   data.InsertLiteral(55, 4, kDeltaFrameIdLengthBits - 2);
1017   data.InsertLiteral(59, 3, 17 - kDeltaFrameIdLengthBits - 1);  // idLen = 17.
1018 
1019   ASSERT_FALSE(ParseSequenceHeader(data.GenerateData()));
1020 }
1021 
TEST_F(ObuParserTest,SequenceHeaderFlags)1022 TEST_F(ObuParserTest, SequenceHeaderFlags) {
1023   BytesAndBits data;
1024   data.AppendBytes(kDefaultSequenceHeader);
1025   ObuSequenceHeader gold;
1026   DefaultSequenceHeader(&gold);
1027 
1028   gold.enable_warped_motion = true;
1029   gold.enable_superres = true;
1030   data.SetBit(60, 1);  // enable_warped_motion.
1031   data.SetBit(70, 1);  // enable_superres.
1032 
1033   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1034   VerifySequenceHeader(gold);
1035 }
1036 
TEST_F(ObuParserTest,SequenceHeaderForceScreenContentToolsEqualTo0)1037 TEST_F(ObuParserTest, SequenceHeaderForceScreenContentToolsEqualTo0) {
1038   BytesAndBits data;
1039   data.AppendBytes(kDefaultSequenceHeader);
1040   ObuSequenceHeader gold;
1041   DefaultSequenceHeader(&gold);
1042 
1043   gold.choose_screen_content_tools = false;
1044   gold.force_screen_content_tools = 0;
1045   gold.choose_integer_mv = false;
1046   gold.force_integer_mv = 2;
1047   data.SetBit(65, 0);  // choose_screen_content_tools.
1048   data.SetBit(66, 0);  // force_screen_content_tools.
1049 
1050   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1051   VerifySequenceHeader(gold);
1052 }
1053 
TEST_F(ObuParserTest,SequenceHeaderMonochrome)1054 TEST_F(ObuParserTest, SequenceHeaderMonochrome) {
1055   BytesAndBits data;
1056   data.AppendBytes(kDefaultSequenceHeader);
1057   ObuSequenceHeader gold;
1058   DefaultSequenceHeader(&gold);
1059 
1060   gold.color_config.is_monochrome = true;
1061   gold.color_config.color_range = kColorRangeFull;
1062   data.SetBit(74, 1);     // monochrome.
1063   data.InsertBit(76, 1);  // color_range.
1064 
1065   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1066   VerifySequenceHeader(gold);
1067 }
1068 
1069 // This tests TimingInfo, DecoderModelInfo and OperatingParameters. The test is
1070 // kind of long but it is the simplest way to test all three since they are
1071 // dependent on one another.
TEST_F(ObuParserTest,SequenceHeaderTimingInfo)1072 TEST_F(ObuParserTest, SequenceHeaderTimingInfo) {
1073   BytesAndBits data;
1074   data.AppendBytes(kDefaultSequenceHeader);
1075   ObuSequenceHeader gold;
1076   DefaultSequenceHeader(&gold);
1077 
1078   gold.timing_info_present_flag = true;
1079   gold.timing_info.num_units_in_tick = 100;
1080   gold.timing_info.time_scale = 1000;
1081   gold.timing_info.equal_picture_interval = false;
1082   gold.decoder_model_info_present_flag = false;
1083   data.SetBit(5, static_cast<uint8_t>(gold.timing_info_present_flag));
1084   data.InsertLiteral(6, 32, gold.timing_info.num_units_in_tick);
1085   data.InsertLiteral(38, 32, gold.timing_info.time_scale);
1086   data.InsertBit(70,
1087                  static_cast<uint8_t>(gold.timing_info.equal_picture_interval));
1088   data.InsertBit(71,
1089                  static_cast<uint8_t>(gold.decoder_model_info_present_flag));
1090 
1091   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1092   VerifySequenceHeader(gold);
1093 
1094   gold.timing_info.equal_picture_interval = true;
1095   gold.timing_info.num_ticks_per_picture = 7;
1096   data.SetBit(70,
1097               static_cast<uint8_t>(gold.timing_info.equal_picture_interval));
1098   EXPECT_EQ(data.InsertUvlc(71, gold.timing_info.num_ticks_per_picture - 1), 5);
1099 
1100   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1101   VerifySequenceHeader(gold);
1102 
1103   gold.decoder_model_info_present_flag = true;
1104   gold.decoder_model_info.encoder_decoder_buffer_delay_length = 5;
1105   gold.decoder_model_info.num_units_in_decoding_tick = 1000;
1106   gold.decoder_model_info.buffer_removal_time_length = 18;
1107   gold.decoder_model_info.frame_presentation_time_length = 20;
1108 
1109   data.SetBit(76, static_cast<uint8_t>(gold.decoder_model_info_present_flag));
1110   data.InsertLiteral(
1111       77, 5, gold.decoder_model_info.encoder_decoder_buffer_delay_length - 1);
1112   data.InsertLiteral(82, 32,
1113                      gold.decoder_model_info.num_units_in_decoding_tick);
1114   data.InsertLiteral(114, 5,
1115                      gold.decoder_model_info.buffer_removal_time_length - 1);
1116   data.InsertLiteral(
1117       119, 5, gold.decoder_model_info.frame_presentation_time_length - 1);
1118   data.InsertBit(147, 0);  // decoder_model_present_for_this_op.
1119 
1120   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1121   VerifySequenceHeader(gold);
1122 
1123   gold.operating_parameters.decoder_buffer_delay[0] = 10;
1124   gold.operating_parameters.encoder_buffer_delay[0] = 20;
1125   gold.operating_parameters.low_delay_mode_flag[0] = true;
1126 
1127   data.SetBit(147, 1);  // decoder_model_present_for_this_op.
1128   data.InsertLiteral(
1129       148, gold.decoder_model_info.encoder_decoder_buffer_delay_length,
1130       gold.operating_parameters.decoder_buffer_delay[0]);
1131   data.InsertLiteral(
1132       153, gold.decoder_model_info.encoder_decoder_buffer_delay_length,
1133       gold.operating_parameters.encoder_buffer_delay[0]);
1134   data.InsertBit(158, static_cast<uint8_t>(
1135                           gold.operating_parameters.low_delay_mode_flag[0]));
1136 
1137   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1138   VerifySequenceHeader(gold);
1139 }
1140 
TEST_F(ObuParserTest,SequenceHeaderInitialDisplayDelay)1141 TEST_F(ObuParserTest, SequenceHeaderInitialDisplayDelay) {
1142   BytesAndBits data;
1143   data.AppendBytes(kDefaultSequenceHeader);
1144   ObuSequenceHeader gold;
1145   DefaultSequenceHeader(&gold);
1146 
1147   gold.initial_display_delay[0] = 8;
1148 
1149   data.SetBit(6, 1);      // initial_display_delay_present_flag.
1150   data.InsertBit(29, 1);  // initial_display_delay_present_for_this_op.
1151   data.InsertLiteral(30, 4, gold.initial_display_delay[0] - 1);
1152 
1153   ASSERT_TRUE(ParseSequenceHeader(data.GenerateData()));
1154   VerifySequenceHeader(gold);
1155 }
1156 
1157 // Parsing of a frame header should fail if no sequence header has been
1158 // received.
TEST_F(ObuParserTest,FrameHeaderWithoutSequenceHeader)1159 TEST_F(ObuParserTest, FrameHeaderWithoutSequenceHeader) {
1160   // The aom-test-data test vector av1-1-b8-01-size-16x16.ivf has two temporal
1161   // units. The first temporal unit has a presentation timestamp of 0 and
1162   // consists of three OBUs: a temporal delimiter OBU, a sequence header OBU,
1163   // and a frame OBU.
1164   const std::vector<uint8_t> kTemporalDelimiter = {0x12, 0x00};
1165   const std::vector<uint8_t> kSequenceHeader = {
1166       0x0a, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xfb, 0xff, 0xf3, 0x00, 0x80};
1167   const std::vector<uint8_t> kFrame = {
1168       0x32, 0xa6, 0x01, 0x10, 0x00, 0x87, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00,
1169       0x40, 0x00, 0x9e, 0x86, 0x5b, 0xb2, 0x22, 0xb5, 0x58, 0x4d, 0x68, 0xe6,
1170       0x37, 0x54, 0x42, 0x7b, 0x84, 0xce, 0xdf, 0x9f, 0xec, 0xab, 0x07, 0x4d,
1171       0xf6, 0xe1, 0x5e, 0x9e, 0x27, 0xbf, 0x93, 0x2f, 0x47, 0x0d, 0x7b, 0x7c,
1172       0x45, 0x8d, 0xcf, 0x26, 0xf7, 0x6c, 0x06, 0xd7, 0x8c, 0x2e, 0xf5, 0x2c,
1173       0xb0, 0x8a, 0x31, 0xac, 0x69, 0xf5, 0xcd, 0xd8, 0x71, 0x5d, 0xaf, 0xf8,
1174       0x96, 0x43, 0x8c, 0x9c, 0x23, 0x6f, 0xab, 0xd0, 0x35, 0x43, 0xdf, 0x81,
1175       0x12, 0xe3, 0x7d, 0xec, 0x22, 0xb0, 0x30, 0x54, 0x32, 0x9f, 0x90, 0xc0,
1176       0x5d, 0x64, 0x9b, 0x0f, 0x75, 0x31, 0x84, 0x3a, 0x57, 0xd7, 0x5f, 0x03,
1177       0x6e, 0x7f, 0x43, 0x17, 0x6d, 0x08, 0xc3, 0x81, 0x8a, 0xae, 0x73, 0x1c,
1178       0xa8, 0xa7, 0xe4, 0x9c, 0xa9, 0x5b, 0x3f, 0xd1, 0xeb, 0x75, 0x3a, 0x7f,
1179       0x22, 0x77, 0x38, 0x64, 0x1c, 0x77, 0xdb, 0xcd, 0xef, 0xb7, 0x08, 0x45,
1180       0x8e, 0x7f, 0xea, 0xa3, 0xd0, 0x81, 0xc9, 0xc1, 0xbc, 0x93, 0x9b, 0x41,
1181       0xb1, 0xa1, 0x42, 0x17, 0x98, 0x3f, 0x1e, 0x95, 0xdf, 0x68, 0x7c, 0xb7,
1182       0x98};
1183 
1184   BytesAndBits data;
1185   data.AppendBytes(kTemporalDelimiter);
1186   // Skip the sequence header OBU.
1187   data.AppendBytes(kFrame);
1188   ASSERT_FALSE(Parse(data.GenerateData()));
1189 
1190   // Now verify that all three OBUs are correct, by adding them to |data|
1191   // successively.
1192   data.Clear();
1193   data.AppendBytes(kTemporalDelimiter);
1194   ASSERT_TRUE(Parse(data.GenerateData()));
1195   data.Clear();
1196   data.AppendBytes(kTemporalDelimiter);
1197   data.AppendBytes(kSequenceHeader);
1198   ASSERT_TRUE(Parse(data.GenerateData()));
1199   data.Clear();
1200   data.AppendBytes(kTemporalDelimiter);
1201   data.AppendBytes(kSequenceHeader);
1202   data.AppendBytes(kFrame);
1203   ASSERT_TRUE(Parse(data.GenerateData()));
1204 }
1205 
TEST_F(ObuParserTest,FrameParameterShowExistingFrame)1206 TEST_F(ObuParserTest, FrameParameterShowExistingFrame) {
1207   BytesAndBits data;
1208   data.AppendBit(1);                    // show_existing_frame.
1209   data.AppendLiteral(3, kFrameToShow);  // frame_to_show.
1210   ObuFrameHeader gold;
1211   DefaultFrameHeader(&gold, kFrameKey);
1212   gold.show_existing_frame = true;
1213   gold.frame_to_show = kFrameToShow;
1214 
1215   // kFrameToShow'th frame is not yet decoded.
1216   ASSERT_FALSE(ParseFrameParameters(data.GenerateData()));
1217 
1218   decoder_state_.reference_frame[kFrameToShow] = buffer_pool_->GetFreeBuffer();
1219   // kFrameToShow'th frame is not a showable frame.
1220   ASSERT_FALSE(ParseFrameParameters(data.GenerateData()));
1221 
1222   decoder_state_.reference_frame[kFrameToShow]->set_showable_frame(true);
1223   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1224   VerifyFrameParameters(gold);
1225 }
1226 
TEST_F(ObuParserTest,FrameParametersShowExistingFrameWithDisplayFrameId)1227 TEST_F(ObuParserTest, FrameParametersShowExistingFrameWithDisplayFrameId) {
1228   BytesAndBits data;
1229   data.AppendBit(1);                        // show_existing_frame.
1230   data.AppendLiteral(3, kFrameToShow);      // frame_to_show.
1231   data.AppendLiteral(15, kDisplayFrameId);  // display_frame_id.
1232   ObuFrameHeader gold;
1233   DefaultFrameHeader(&gold, kFrameKey);
1234   gold.show_existing_frame = true;
1235   gold.frame_to_show = kFrameToShow;
1236   gold.display_frame_id = kDisplayFrameId;
1237 
1238   // kFrameToShow'th frame is not yet decoded.
1239   ASSERT_FALSE(ParseFrameParameters(data.GenerateData(), true));
1240 
1241   decoder_state_.reference_frame_id[kFrameToShow] = kDisplayFrameId;
1242   decoder_state_.reference_frame[kFrameToShow] = buffer_pool_->GetFreeBuffer();
1243   // kFrameToShow'th frame is not a showable frame.
1244   ASSERT_FALSE(ParseFrameParameters(data.GenerateData(), true));
1245 
1246   decoder_state_.reference_frame[kFrameToShow]->set_showable_frame(true);
1247   ASSERT_TRUE(ParseFrameParameters(data.GenerateData(), true));
1248   VerifyFrameParameters(gold, true);
1249 }
1250 
TEST_F(ObuParserTest,FrameParameterShowExistingFrameTemporalPointInfo)1251 TEST_F(ObuParserTest, FrameParameterShowExistingFrameTemporalPointInfo) {
1252   BytesAndBits data;
1253   data.AppendBit(1);                    // show_existing_frame.
1254   data.AppendLiteral(3, kFrameToShow);  // frame_to_show.
1255   data.AppendLiteral(20, 38);           // frame_presentation_time.
1256   ObuFrameHeader gold;
1257   DefaultFrameHeader(&gold, kFrameKey);
1258   gold.show_existing_frame = true;
1259   gold.frame_to_show = kFrameToShow;
1260   gold.frame_presentation_time = 38;
1261 
1262   EXPECT_TRUE(Init(data.GenerateData()));
1263   obu_sequence_header_->frame_width_bits = kFrameWidthBits;
1264   obu_sequence_header_->frame_height_bits = kFrameHeightBits;
1265   obu_sequence_header_->max_frame_width = kWidth;
1266   obu_sequence_header_->max_frame_height = kHeight;
1267 
1268   obu_sequence_header_->decoder_model_info_present_flag = true;
1269   obu_sequence_header_->decoder_model_info.frame_presentation_time_length = 20;
1270 
1271   decoder_state_.reference_frame[kFrameToShow] = buffer_pool_->GetFreeBuffer();
1272   decoder_state_.reference_frame[kFrameToShow]->set_showable_frame(true);
1273 
1274   ASSERT_TRUE(ObuParseFrameParameters());
1275   VerifyFrameParameters(gold);
1276 }
1277 
TEST_F(ObuParserTest,FrameParameterErrorResilientMode)1278 TEST_F(ObuParserTest, FrameParameterErrorResilientMode) {
1279   BytesAndBits data;
1280   data.AppendBytes(kDefaultFrameHeaderIntraOnlyFrame);
1281   ObuFrameHeader gold;
1282   DefaultFrameHeader(&gold, kFrameIntraOnly);
1283 
1284   gold.error_resilient_mode = true;
1285   data.SetBit(4, static_cast<uint8_t>(gold.error_resilient_mode));
1286 
1287   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1288   VerifyFrameParameters(gold);
1289 }
1290 
TEST_F(ObuParserTest,FrameParameterKeyFrame)1291 TEST_F(ObuParserTest, FrameParameterKeyFrame) {
1292   BytesAndBits data;
1293   data.AppendBytes(kDefaultFrameHeaderKeyFrame);
1294   ObuFrameHeader gold;
1295   DefaultFrameHeader(&gold, kFrameKey);
1296 
1297   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1298   VerifyFrameParameters(gold);
1299 }
1300 
TEST_F(ObuParserTest,FrameParameterKeyFrameTemporalPointInfo)1301 TEST_F(ObuParserTest, FrameParameterKeyFrameTemporalPointInfo) {
1302   BytesAndBits data;
1303   data.AppendBytes(kDefaultFrameHeaderKeyFrame);
1304   ObuFrameHeader gold;
1305   DefaultFrameHeader(&gold, kFrameKey);
1306 
1307   data.InsertLiteral(4, 20, 38);  // frame_presentation_time.
1308   gold.frame_presentation_time = 38;
1309 
1310   EXPECT_TRUE(Init(data.GenerateData()));
1311   obu_sequence_header_->frame_width_bits = kFrameWidthBits;
1312   obu_sequence_header_->frame_height_bits = kFrameHeightBits;
1313   obu_sequence_header_->max_frame_width = kWidth;
1314   obu_sequence_header_->max_frame_height = kHeight;
1315 
1316   obu_sequence_header_->decoder_model_info_present_flag = true;
1317   obu_sequence_header_->decoder_model_info.frame_presentation_time_length = 20;
1318 
1319   ASSERT_TRUE(ObuParseFrameParameters());
1320   VerifyFrameParameters(gold);
1321 }
1322 
TEST_F(ObuParserTest,FrameParameterKeyFrameOverrideSize)1323 TEST_F(ObuParserTest, FrameParameterKeyFrameOverrideSize) {
1324   BytesAndBits data;
1325   data.AppendBytes(kDefaultFrameHeaderKeyFrame);
1326   ObuFrameHeader gold;
1327   DefaultFrameHeader(&gold, kFrameKey);
1328 
1329   OverrideFrameSize(&data, &gold, 5, 6);
1330 
1331   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1332   VerifyFrameParameters(gold);
1333 
1334   OverrideRenderSize(&data, &gold, 23);
1335 
1336   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1337   VerifyFrameParameters(gold);
1338 }
1339 
TEST_F(ObuParserTest,FrameParameterKeyFrameSuperRes)1340 TEST_F(ObuParserTest, FrameParameterKeyFrameSuperRes) {
1341   BytesAndBits data;
1342   data.AppendBytes(kDefaultFrameHeaderKeyFrame);
1343   ObuFrameHeader gold;
1344   DefaultFrameHeader(&gold, kFrameKey);
1345   gold.use_superres = true;
1346   gold.superres_scale_denominator = 15;
1347   gold.width = kWidth * 8 / 15;
1348   gold.columns4x4 = 58;
1349 
1350   data.SetBit(6, static_cast<int>(gold.use_superres));
1351   data.SetLiteral(7, 3, gold.superres_scale_denominator - 9);
1352 
1353   ASSERT_TRUE(ParseFrameParameters(data.GenerateData(), false, 0, 0, true));
1354   VerifyFrameParameters(gold);
1355 }
1356 
TEST_F(ObuParserTest,FrameParameterKeyFrameAllowScreenContentTools)1357 TEST_F(ObuParserTest, FrameParameterKeyFrameAllowScreenContentTools) {
1358   BytesAndBits data;
1359   data.AppendBytes(kDefaultFrameHeaderKeyFrame);
1360   ObuFrameHeader gold;
1361   DefaultFrameHeader(&gold, kFrameKey);
1362 
1363   data.InsertBit(5, 1);  // allow_screen_content_tools.
1364   data.InsertBit(8, 1);  // allow_intrabc.
1365   gold.allow_screen_content_tools = true;
1366   gold.allow_intrabc = true;
1367 
1368   ASSERT_TRUE(ParseFrameParameters(data.GenerateData(), false, 2));
1369   VerifyFrameParameters(gold);
1370 
1371   data.InsertBit(6, 1);  // force_integer_mv.
1372   gold.force_integer_mv = 1;
1373 
1374   ASSERT_TRUE(ParseFrameParameters(data.GenerateData(), false, 2, 2));
1375   VerifyFrameParameters(gold);
1376 
1377   data.SetBit(6, 0);  // force_integer_mv.
1378 
1379   // Gold need not be updated, because force_integer_mv is always 1 for
1380   // keyframes.
1381   ASSERT_TRUE(ParseFrameParameters(data.GenerateData(), false, 2, 2));
1382   VerifyFrameParameters(gold);
1383 }
1384 
TEST_F(ObuParserTest,FrameParameterIntraOnlyFrame)1385 TEST_F(ObuParserTest, FrameParameterIntraOnlyFrame) {
1386   BytesAndBits data;
1387   data.AppendBytes(kDefaultFrameHeaderIntraOnlyFrame);
1388   ObuFrameHeader gold;
1389   DefaultFrameHeader(&gold, kFrameIntraOnly);
1390 
1391   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1392   VerifyFrameParameters(gold);
1393 }
1394 
TEST_F(ObuParserTest,FrameParameterIntraOnlyFrameOverrideSize)1395 TEST_F(ObuParserTest, FrameParameterIntraOnlyFrameOverrideSize) {
1396   BytesAndBits data;
1397   data.AppendBytes(kDefaultFrameHeaderIntraOnlyFrame);
1398   ObuFrameHeader gold;
1399   DefaultFrameHeader(&gold, kFrameIntraOnly);
1400 
1401   OverrideFrameSize(&data, &gold, 6, 15);
1402 
1403   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1404   VerifyFrameParameters(gold);
1405 
1406   OverrideRenderSize(&data, &gold, 32);
1407 
1408   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1409   VerifyFrameParameters(gold);
1410 }
1411 
1412 // An INTRA_ONLY_FRAME cannot set refresh_frame_flags to 0xff.
TEST_F(ObuParserTest,FrameParameterIntraOnlyFrameRefreshAllFrames)1413 TEST_F(ObuParserTest, FrameParameterIntraOnlyFrameRefreshAllFrames) {
1414   BytesAndBits data;
1415   data.AppendBytes(kDefaultFrameHeaderIntraOnlyFrame);
1416   data.SetLiteral(7, 8, 0xFF);  // refresh_frame_flags.
1417 
1418   ASSERT_FALSE(ParseFrameParameters(data.GenerateData()));
1419 }
1420 
TEST_F(ObuParserTest,FrameParameterInterFrame)1421 TEST_F(ObuParserTest, FrameParameterInterFrame) {
1422   BytesAndBits data;
1423   data.AppendBytes(kDefaultFrameHeaderInterFrame);
1424   ObuFrameHeader gold;
1425   DefaultFrameHeader(&gold, kFrameInter);
1426   ObuFrameHeader reference_frame_header;
1427   reference_frame_header.width = kWidth;
1428   reference_frame_header.height = kHeight;
1429   reference_frame_header.render_width = kWidth;
1430   reference_frame_header.render_height = kHeight;
1431   reference_frame_header.upscaled_width = kWidth;
1432   reference_frame_header.rows4x4 = kRows4x4;
1433   reference_frame_header.columns4x4 = kColumns4x4;
1434   reference_frame_header.refresh_frame_flags = 0;
1435   for (auto& reference_frame : decoder_state_.reference_frame) {
1436     reference_frame = buffer_pool_->GetFreeBuffer();
1437     EXPECT_TRUE(reference_frame->SetFrameDimensions(reference_frame_header));
1438   }
1439 
1440   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1441   VerifyFrameParameters(gold);
1442 }
1443 
TEST_F(ObuParserTest,FrameParameterInterFrameOverrideSize)1444 TEST_F(ObuParserTest, FrameParameterInterFrameOverrideSize) {
1445   BytesAndBits data;
1446   data.AppendBytes(kDefaultFrameHeaderInterFrame);
1447   ObuFrameHeader gold;
1448   DefaultFrameHeader(&gold, kFrameInter);
1449   ObuFrameHeader reference_frame_header;
1450   reference_frame_header.width = kWidth;
1451   reference_frame_header.height = kHeight;
1452   reference_frame_header.render_width = kWidth;
1453   reference_frame_header.render_height = kHeight;
1454   reference_frame_header.upscaled_width = kWidth;
1455   reference_frame_header.rows4x4 = kRows4x4;
1456   reference_frame_header.columns4x4 = kColumns4x4;
1457   reference_frame_header.refresh_frame_flags = 0;
1458   for (auto& reference_frame : decoder_state_.reference_frame) {
1459     reference_frame = buffer_pool_->GetFreeBuffer();
1460     EXPECT_TRUE(reference_frame->SetFrameDimensions(reference_frame_header));
1461   }
1462 
1463   data.InsertLiteral(39, kNumInterReferenceFrameTypes, 0);  // found_ref.
1464   OverrideFrameSize(&data, &gold, 6, 46);
1465 
1466   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1467   VerifyFrameParameters(gold);
1468 
1469   OverrideRenderSize(&data, &gold, 63);
1470 
1471   ASSERT_TRUE(ParseFrameParameters(data.GenerateData()));
1472   VerifyFrameParameters(gold);
1473 }
1474 
1475 // This test verifies we check the following requirement at the end of Section
1476 // 6.8.4:
1477 //   If FrameIsIntra is equal to 0 (indicating that this frame may use inter
1478 //   prediction), the requirements described in the frame size with refs
1479 //   semantics of section 6.8.6 must also be satisfied.
TEST_F(ObuParserTest,FrameParameterInterFrameInvalidSize)1480 TEST_F(ObuParserTest, FrameParameterInterFrameInvalidSize) {
1481   BytesAndBits data;
1482   data.AppendBytes(kDefaultFrameHeaderInterFrame);
1483   ObuFrameHeader gold;
1484   DefaultFrameHeader(&gold, kFrameInter);
1485   ObuFrameHeader reference_frame_header;
1486   reference_frame_header.width = kWidth;
1487   reference_frame_header.height = 2 * kHeight + 8;
1488   reference_frame_header.render_width = kWidth;
1489   reference_frame_header.render_height = 2 * kHeight + 8;
1490   reference_frame_header.upscaled_width = kWidth;
1491   reference_frame_header.rows4x4 = 2 * kRows4x4 + 2;
1492   reference_frame_header.columns4x4 = kColumns4x4;
1493   reference_frame_header.refresh_frame_flags = 0;
1494   for (auto& reference_frame : decoder_state_.reference_frame) {
1495     reference_frame = buffer_pool_->GetFreeBuffer();
1496     EXPECT_TRUE(reference_frame->SetFrameDimensions(reference_frame_header));
1497   }
1498 
1499   EXPECT_FALSE(ParseFrameParameters(data.GenerateData()));
1500 }
1501 
1502 // Tests the ObuParser::SetFrameReferences() method.
1503 //
1504 // This method uses the following data members as input:
1505 //   decoder_state_.reference_order_hint
1506 //   sequence_header_.enable_order_hint
1507 //   sequence_header_.order_hint_bits
1508 //   frame_header_.order_hint
1509 // So we need to set up these data members before calling
1510 // ObuParser::SetFrameReferences().
1511 //
1512 // The output is in frame_header_.reference_frame_index.
TEST_F(ObuParserTest,SetFrameReferences)1513 TEST_F(ObuParserTest, SetFrameReferences) {
1514   // All reference frames are forward references (because 9 < 17).
1515   for (int i = 0; i < kNumReferenceFrameTypes; ++i) {
1516     decoder_state_.reference_order_hint[i] = 9;
1517   }
1518 
1519   ASSERT_TRUE(Init());
1520   obu_sequence_header_->enable_order_hint = true;
1521   obu_sequence_header_->order_hint_bits = 5;
1522   obu_sequence_header_->order_hint_shift_bits =
1523       Mod32(32 - obu_sequence_header_->order_hint_bits);
1524   obu_frame_header_->order_hint = 17;
1525 
1526   const int8_t last_frame_idx = 0;
1527   const int8_t gold_frame_idx = 1;
1528 
1529   // Since all reference frames are forward references, we set the remaining
1530   // five references in reverse chronological order. So Last2, Last3, Backward,
1531   // Alternate2, and Alternate are set to 7, 6, 5, 4, and 3, respectively.
1532 
1533   EXPECT_TRUE(ObuSetFrameReferences(last_frame_idx, gold_frame_idx));
1534 
1535   EXPECT_EQ(
1536       obu_frame_header_
1537           ->reference_frame_index[kReferenceFrameLast - kReferenceFrameLast],
1538       0);
1539   EXPECT_EQ(
1540       obu_frame_header_
1541           ->reference_frame_index[kReferenceFrameLast2 - kReferenceFrameLast],
1542       7);
1543   EXPECT_EQ(
1544       obu_frame_header_
1545           ->reference_frame_index[kReferenceFrameLast3 - kReferenceFrameLast],
1546       6);
1547   EXPECT_EQ(
1548       obu_frame_header_
1549           ->reference_frame_index[kReferenceFrameGolden - kReferenceFrameLast],
1550       1);
1551   EXPECT_EQ(obu_frame_header_->reference_frame_index[kReferenceFrameBackward -
1552                                                      kReferenceFrameLast],
1553             5);
1554   EXPECT_EQ(obu_frame_header_->reference_frame_index[kReferenceFrameAlternate2 -
1555                                                      kReferenceFrameLast],
1556             4);
1557   EXPECT_EQ(obu_frame_header_->reference_frame_index[kReferenceFrameAlternate -
1558                                                      kReferenceFrameLast],
1559             3);
1560 }
1561 
TEST_F(ObuParserTest,LoopFilterParameters)1562 TEST_F(ObuParserTest, LoopFilterParameters) {
1563   LoopFilter gold;
1564   memset(&gold, 0, sizeof(gold));
1565 
1566   BytesAndBits data;
1567   data.AppendBit(0);  // dummy.
1568 
1569   ASSERT_TRUE(Init(data.GenerateData()));
1570   obu_frame_header_->primary_reference_frame = kPrimaryReferenceNone;
1571   obu_frame_header_->coded_lossless = true;
1572   gold.ref_deltas[kReferenceFrameIntra] = 1;
1573   gold.ref_deltas[kReferenceFrameGolden] = -1;
1574   gold.ref_deltas[kReferenceFrameAlternate] = -1;
1575   gold.ref_deltas[kReferenceFrameAlternate2] = -1;
1576   ASSERT_TRUE(ObuParseLoopFilterParameters());
1577   VerifyLoopFilterParameters(gold);
1578 
1579   ASSERT_TRUE(Init(data.GenerateData()));
1580   obu_frame_header_->primary_reference_frame = kPrimaryReferenceNone;
1581   obu_frame_header_->allow_intrabc = true;
1582   ASSERT_TRUE(ObuParseLoopFilterParameters());
1583   VerifyLoopFilterParameters(gold);
1584 
1585   gold.level[0] = 32;
1586   gold.level[3] = 48;
1587   gold.sharpness = 4;
1588   data.Clear();
1589   for (const auto& level : gold.level) {
1590     data.AppendLiteral(6, level);
1591   }
1592   data.AppendLiteral(3, gold.sharpness);
1593   data.AppendBit(0);  // delta_enabled.
1594 
1595   ASSERT_TRUE(Init(data.GenerateData()));
1596   obu_frame_header_->primary_reference_frame = kPrimaryReferenceNone;
1597   ASSERT_TRUE(ObuParseLoopFilterParameters());
1598   VerifyLoopFilterParameters(gold);
1599 
1600   gold.delta_enabled = true;
1601   gold.delta_update = true;
1602   gold.ref_deltas[0] = 20;
1603   gold.mode_deltas[0] = -20;
1604   data.SetBit(27, 1);  // delta_enabled.
1605   data.AppendBit(1);   // delta_update.
1606   for (int i = 0; i < kNumReferenceFrameTypes; ++i) {
1607     if (i == 0) {
1608       data.AppendBit(1);  // update_ref_delta.
1609       data.AppendInverseSignedLiteral(6, gold.ref_deltas[0]);  // ref_delta.
1610     } else {
1611       data.AppendBit(0);  // update_ref_delta.
1612     }
1613   }
1614   for (int i = 0; i < kLoopFilterMaxModeDeltas; ++i) {
1615     if (i == 0) {
1616       data.AppendBit(1);  // update_mode_delta.
1617       data.AppendInverseSignedLiteral(6, gold.mode_deltas[0]);  // mode_delta.
1618     } else {
1619       data.AppendBit(0);  // update_mode_delta.
1620     }
1621   }
1622 
1623   ASSERT_TRUE(Init(data.GenerateData()));
1624   obu_frame_header_->primary_reference_frame = kPrimaryReferenceNone;
1625   ASSERT_TRUE(ObuParseLoopFilterParameters());
1626   VerifyLoopFilterParameters(gold);
1627 }
1628 
TEST_F(ObuParserTest,QuantizerParameters)1629 TEST_F(ObuParserTest, QuantizerParameters) {
1630   QuantizerParameters gold = {};
1631   gold.base_index = 48;
1632 
1633   BytesAndBits data;
1634   data.AppendLiteral(8, gold.base_index);
1635   data.AppendLiteral(3, 0);  // delta_coded.
1636   data.AppendBit(0);         // use_matrix.
1637 
1638   ASSERT_TRUE(Init(data.GenerateData()));
1639   ASSERT_TRUE(ObuParseQuantizerParameters());
1640   VerifyQuantizerParameters(gold);
1641 }
1642 
TEST_F(ObuParserTest,QuantizerParametersMonochrome)1643 TEST_F(ObuParserTest, QuantizerParametersMonochrome) {
1644   QuantizerParameters gold = {};
1645   gold.base_index = 48;
1646 
1647   BytesAndBits data;
1648   data.AppendLiteral(8, gold.base_index);
1649   data.AppendBit(0);  // delta_coded.
1650   data.AppendBit(0);  // use_matrix.
1651   // The quantizer parameters end here. Add a 1 bit. It should not be parsed.
1652   data.AppendBit(1);  // Would be segmentation_enabled in a bitstream.
1653 
1654   ASSERT_TRUE(Init(data.GenerateData()));
1655   obu_sequence_header_->color_config.is_monochrome = true;
1656   ASSERT_TRUE(ObuParseQuantizerParameters());
1657   VerifyQuantizerParameters(gold);
1658 }
1659 
TEST_F(ObuParserTest,QuantizerParametersDeltaCoded)1660 TEST_F(ObuParserTest, QuantizerParametersDeltaCoded) {
1661   QuantizerParameters gold = {};
1662   gold.base_index = 48;
1663   gold.delta_dc[kPlaneY] = -30;
1664 
1665   BytesAndBits data;
1666   data.AppendLiteral(8, gold.base_index);
1667   data.AppendBit(1);  // delta_coded.
1668   data.AppendInverseSignedLiteral(6, gold.delta_dc[kPlaneY]);
1669   data.AppendLiteral(2, 0);  // delta_coded u dc/ac.
1670   data.AppendBit(0);         // use_matrix.
1671 
1672   ASSERT_TRUE(Init(data.GenerateData()));
1673   ASSERT_TRUE(ObuParseQuantizerParameters());
1674   VerifyQuantizerParameters(gold);
1675 
1676   gold.delta_dc[kPlaneU] = -40;
1677   gold.delta_dc[kPlaneV] = gold.delta_dc[kPlaneU];
1678   data.SetBit(16, 1);  // delta_coded.
1679   data.InsertInverseSignedLiteral(17, 6, gold.delta_dc[kPlaneU]);
1680 
1681   ASSERT_TRUE(Init(data.GenerateData()));
1682   ASSERT_TRUE(ObuParseQuantizerParameters());
1683   VerifyQuantizerParameters(gold);
1684 
1685   gold.delta_ac[kPlaneU] = 50;
1686   gold.delta_ac[kPlaneV] = gold.delta_ac[kPlaneU];
1687   data.SetBit(24, 1);  // delta_coded.
1688   data.InsertInverseSignedLiteral(25, 6, gold.delta_ac[kPlaneU]);
1689 
1690   ASSERT_TRUE(Init(data.GenerateData()));
1691   ASSERT_TRUE(ObuParseQuantizerParameters());
1692   VerifyQuantizerParameters(gold);
1693 
1694   gold.delta_dc[kPlaneV] = 60;
1695   gold.delta_ac[kPlaneV] = 0;
1696   data.InsertBit(16, 1);  // diff_uv_delta.
1697   data.InsertBit(33, 1);  // delta_coded.
1698   data.InsertInverseSignedLiteral(34, 6, gold.delta_dc[kPlaneV]);
1699   data.InsertBit(41, 0);  // delta_coded.
1700 
1701   ASSERT_TRUE(Init(data.GenerateData()));
1702   obu_sequence_header_->color_config.separate_uv_delta_q = true;
1703   ASSERT_TRUE(ObuParseQuantizerParameters());
1704   VerifyQuantizerParameters(gold);
1705 
1706   gold.delta_ac[kPlaneV] = -20;
1707   data.SetBit(41, 1);  // delta_coded.
1708   data.InsertInverseSignedLiteral(42, 6, gold.delta_ac[kPlaneV]);
1709 
1710   ASSERT_TRUE(Init(data.GenerateData()));
1711   obu_sequence_header_->color_config.separate_uv_delta_q = true;
1712   ASSERT_TRUE(ObuParseQuantizerParameters());
1713   VerifyQuantizerParameters(gold);
1714 }
1715 
TEST_F(ObuParserTest,QuantizerParametersUseQmatrix)1716 TEST_F(ObuParserTest, QuantizerParametersUseQmatrix) {
1717   QuantizerParameters gold = {};
1718   gold.base_index = 48;
1719   gold.use_matrix = true;
1720   gold.matrix_level[kPlaneY] = 3;
1721   gold.matrix_level[kPlaneU] = 6;
1722   gold.matrix_level[kPlaneV] = gold.matrix_level[kPlaneU];
1723 
1724   // Test three cases.
1725   // 1. separate_uv_delta_q = false (which implies diff_uv_delta = false).
1726   BytesAndBits data;
1727   data.AppendLiteral(8, gold.base_index);
1728   data.AppendLiteral(3, 0);  // delta_coded.
1729   data.AppendBit(static_cast<uint8_t>(gold.use_matrix));
1730   data.AppendLiteral(4, gold.matrix_level[kPlaneY]);
1731   data.AppendLiteral(4, gold.matrix_level[kPlaneU]);
1732 
1733   ASSERT_TRUE(Init(data.GenerateData()));
1734   ASSERT_TRUE(ObuParseQuantizerParameters());
1735   VerifyQuantizerParameters(gold);
1736 
1737   // 2. separate_uv_delta_q = true and diff_uv_delta = false.
1738   gold.matrix_level[kPlaneV] = 5;
1739   data.InsertBit(9, 0);  // diff_uv_delta.
1740   data.AppendLiteral(4, gold.matrix_level[kPlaneV]);
1741 
1742   ASSERT_TRUE(Init(data.GenerateData()));
1743   obu_sequence_header_->color_config.separate_uv_delta_q = true;
1744   ASSERT_TRUE(ObuParseQuantizerParameters());
1745   VerifyQuantizerParameters(gold);
1746 
1747   // 3. separate_uv_delta_q = true and diff_uv_delta = true.
1748   data.SetBit(9, 1);             // diff_uv_delta.
1749   data.InsertLiteral(12, 2, 0);  // delta_coded.
1750   ASSERT_TRUE(Init(data.GenerateData()));
1751   obu_sequence_header_->color_config.separate_uv_delta_q = true;
1752   ASSERT_TRUE(ObuParseQuantizerParameters());
1753   VerifyQuantizerParameters(gold);
1754 }
1755 
TEST_F(ObuParserTest,SegmentationParameters)1756 TEST_F(ObuParserTest, SegmentationParameters) {
1757   const int kPrimaryReferenceNotNone = 1;
1758   const int kPrevFrameIndexNotNone = 2;
1759 
1760   // Set up decoder_state_ with a previous frame containing saved segmentation
1761   // parameters.
1762   decoder_state_.reference_frame[kPrevFrameIndexNotNone] =
1763       buffer_pool_->GetFreeBuffer();
1764   ASSERT_NE(decoder_state_.reference_frame[kPrevFrameIndexNotNone], nullptr);
1765   Segmentation prev_segmentation = {};
1766   prev_segmentation.feature_enabled[2][0] = true;
1767   prev_segmentation.feature_enabled[5][0] = true;
1768   prev_segmentation.last_active_segment_id = 5;
1769   decoder_state_.reference_frame[kPrevFrameIndexNotNone]
1770       ->SetSegmentationParameters(prev_segmentation);
1771 
1772   Segmentation gold;
1773   memset(&gold, 0, sizeof(gold));
1774 
1775   BytesAndBits data;
1776   data.AppendBit(0);  // segmentation_enabled.
1777 
1778   // Since segmentation_enabled is false, we expect the parameters to be all
1779   // zero/false.
1780   ASSERT_TRUE(ParseSegmentationParameters(
1781       data.GenerateData(), kPrimaryReferenceNotNone, kPrevFrameIndexNotNone));
1782   VerifySegmentationParameters(gold);
1783 
1784   gold.enabled = true;
1785   gold.update_map = true;
1786   gold.temporal_update = true;
1787   data.SetBit(0, static_cast<uint8_t>(gold.enabled));
1788   data.AppendBit(static_cast<uint8_t>(gold.update_map));
1789   data.AppendBit(static_cast<uint8_t>(gold.temporal_update));
1790   data.AppendBit(static_cast<uint8_t>(gold.update_data));
1791 
1792   // Since update_data is false, we expect the parameters to be loaded from the
1793   // previous frame in |decoder_state_|. So change |gold| accordingly.
1794   gold.feature_enabled[2][0] = true;
1795   gold.feature_enabled[5][0] = true;
1796   gold.last_active_segment_id = 5;
1797 
1798   ASSERT_TRUE(ParseSegmentationParameters(
1799       data.GenerateData(), kPrimaryReferenceNotNone, kPrevFrameIndexNotNone));
1800   VerifySegmentationParameters(gold);
1801 
1802   OverrideSegmentation(&data, &gold, 3);
1803 
1804   ASSERT_TRUE(ParseSegmentationParameters(
1805       data.GenerateData(), kPrimaryReferenceNotNone, kPrevFrameIndexNotNone));
1806   VerifySegmentationParameters(gold);
1807 
1808   // If primary_ref_frame is kPrimaryReferenceNone, these three fields are
1809   // implied.
1810   data.RemoveBit(1);  // segmentation_update_map.
1811   data.RemoveBit(1);  // segmentation_temporal_update.
1812   data.RemoveBit(1);  // segmentation_update_data.
1813   gold.update_map = true;
1814   gold.temporal_update = false;
1815   gold.update_data = true;
1816 
1817   // Since update_data is true, we expect the parameters to be read from
1818   // |data|.
1819   ASSERT_TRUE(ParseSegmentationParameters(data.GenerateData(),
1820                                           kPrimaryReferenceNone, 0));
1821   VerifySegmentationParameters(gold);
1822 }
1823 
TEST_F(ObuParserTest,QuantizerIndexDeltaParameters)1824 TEST_F(ObuParserTest, QuantizerIndexDeltaParameters) {
1825   BytesAndBits data;
1826   data.AppendBit(1);         // delta_q_present.
1827   data.AppendLiteral(2, 2);  // delta_q_res.
1828 
1829   Delta gold;
1830   memset(&gold, 0, sizeof(gold));
1831 
1832   ASSERT_TRUE(Init(data.GenerateData()));
1833   ASSERT_TRUE(ObuParseQuantizerIndexDeltaParameters());
1834   VerifyDeltaParameters(gold, obu_->frame_header().delta_q);
1835 
1836   gold.present = true;
1837   gold.scale = 2;
1838   ASSERT_TRUE(Init(data.GenerateData()));
1839   obu_frame_header_->quantizer.base_index = 40;
1840   ASSERT_TRUE(ObuParseQuantizerIndexDeltaParameters());
1841   VerifyDeltaParameters(gold, obu_->frame_header().delta_q);
1842 }
1843 
TEST_F(ObuParserTest,LoopFilterDeltaParameters)1844 TEST_F(ObuParserTest, LoopFilterDeltaParameters) {
1845   BytesAndBits data;
1846   data.AppendBit(1);         // delta_lf_present.
1847   data.AppendLiteral(2, 2);  // delta_lf_res.
1848   data.AppendBit(1);         // delta_lf_multi.
1849 
1850   Delta gold;
1851   memset(&gold, 0, sizeof(gold));
1852 
1853   // delta_q_present is false, so loop filter delta will not be read.
1854   ASSERT_TRUE(Init(data.GenerateData()));
1855   ASSERT_TRUE(ObuParseLoopFilterDeltaParameters());
1856   VerifyDeltaParameters(gold, obu_->frame_header().delta_lf);
1857 
1858   // allow_intrabc is true, so loop filter delta will not be read.
1859   ASSERT_TRUE(Init(data.GenerateData()));
1860   obu_frame_header_->delta_q.present = true;
1861   obu_frame_header_->allow_intrabc = true;
1862   ASSERT_TRUE(ObuParseLoopFilterDeltaParameters());
1863   VerifyDeltaParameters(gold, obu_->frame_header().delta_lf);
1864 
1865   gold.present = true;
1866   gold.scale = 2;
1867   gold.multi = true;
1868   ASSERT_TRUE(Init(data.GenerateData()));
1869   obu_frame_header_->delta_q.present = true;
1870   ASSERT_TRUE(ObuParseLoopFilterDeltaParameters());
1871   VerifyDeltaParameters(gold, obu_->frame_header().delta_lf);
1872 }
1873 
TEST_F(ObuParserTest,ComputeSegmentLosslessAndQIndex)1874 TEST_F(ObuParserTest, ComputeSegmentLosslessAndQIndex) {
1875   BytesAndBits data;
1876   data.AppendBit(0);  // dummy.
1877 
1878   ASSERT_TRUE(Init(data.GenerateData()));
1879 
1880   // Segmentation is disabled. All quantizers are 0.
1881   ObuComputeSegmentLosslessAndQIndex();
1882   EXPECT_TRUE(obu_->frame_header().coded_lossless);
1883   EXPECT_TRUE(obu_->frame_header().upscaled_lossless);
1884   for (const auto& qindex : obu_->frame_header().segmentation.qindex) {
1885     EXPECT_EQ(qindex, 0);
1886   }
1887 
1888   // Segmentation is enabled. All quantizers are zero.
1889   obu_frame_header_->segmentation.enabled = true;
1890   ObuComputeSegmentLosslessAndQIndex();
1891   EXPECT_TRUE(obu_->frame_header().coded_lossless);
1892   EXPECT_TRUE(obu_->frame_header().upscaled_lossless);
1893   for (const auto& qindex : obu_->frame_header().segmentation.qindex) {
1894     EXPECT_EQ(qindex, 0);
1895   }
1896 
1897   // Segmentation is enabled. All quantizers are zero. upscaled_width != width.
1898   obu_frame_header_->segmentation.enabled = true;
1899   obu_frame_header_->upscaled_width = 100;
1900   ObuComputeSegmentLosslessAndQIndex();
1901   EXPECT_TRUE(obu_->frame_header().coded_lossless);
1902   EXPECT_FALSE(obu_->frame_header().upscaled_lossless);
1903   for (const auto& qindex : obu_->frame_header().segmentation.qindex) {
1904     EXPECT_EQ(qindex, 0);
1905   }
1906 
1907   // Segmentation in disabled. Some quantizer deltas are non zero.
1908   obu_frame_header_->segmentation.enabled = false;
1909   obu_frame_header_->quantizer.delta_dc[kPlaneY] = 40;
1910   ObuComputeSegmentLosslessAndQIndex();
1911   EXPECT_FALSE(obu_->frame_header().coded_lossless);
1912   EXPECT_FALSE(obu_->frame_header().upscaled_lossless);
1913   for (const auto& qindex : obu_->frame_header().segmentation.qindex) {
1914     EXPECT_EQ(qindex, 0);
1915   }
1916 
1917   // Segmentation is disabled. Quantizer base index is non zero.
1918   obu_frame_header_->segmentation.enabled = true;
1919   obu_frame_header_->quantizer.delta_dc[kPlaneY] = 0;
1920   obu_frame_header_->quantizer.base_index = 40;
1921   ObuComputeSegmentLosslessAndQIndex();
1922   EXPECT_FALSE(obu_->frame_header().coded_lossless);
1923   EXPECT_FALSE(obu_->frame_header().upscaled_lossless);
1924   for (const auto& qindex : obu_->frame_header().segmentation.qindex) {
1925     EXPECT_EQ(qindex, 40);
1926   }
1927 }
1928 
TEST_F(ObuParserTest,CdefParameters)1929 TEST_F(ObuParserTest, CdefParameters) {
1930   Cdef gold;
1931   memset(&gold, 0, sizeof(gold));
1932   const int coeff_shift = 2;  // bitdepth - 8.
1933   gold.damping = 3 + coeff_shift;
1934 
1935   BytesAndBits data;
1936   data.AppendBit(0);  // dummy.
1937 
1938   ASSERT_TRUE(Init(data.GenerateData()));
1939   obu_sequence_header_->color_config.bitdepth = 10;
1940   ASSERT_TRUE(ObuParseCdefParameters());
1941   // Cdef will be {0} except for damping because enable_cdef is false.
1942   VerifyCdefParameters(gold);
1943 
1944   ASSERT_TRUE(Init(data.GenerateData()));
1945   obu_sequence_header_->enable_cdef = true;
1946   obu_sequence_header_->color_config.bitdepth = 10;
1947   obu_frame_header_->coded_lossless = true;
1948   ASSERT_TRUE(ObuParseCdefParameters());
1949   // Cdef will be {0} except for damping because coded_lossless is true.
1950   VerifyCdefParameters(gold);
1951 
1952   ASSERT_TRUE(Init(data.GenerateData()));
1953   obu_sequence_header_->enable_cdef = true;
1954   obu_sequence_header_->color_config.bitdepth = 10;
1955   obu_frame_header_->allow_intrabc = true;
1956   ASSERT_TRUE(ObuParseCdefParameters());
1957   // Cdef will be {0} except for damping because allow_intrabc is true.
1958   VerifyCdefParameters(gold);
1959 
1960   gold.damping = 5;
1961   gold.bits = 1;
1962   data.Clear();
1963   data.AppendLiteral(2, gold.damping - 3);  // cdef_damping_minus3.
1964   gold.damping += coeff_shift;
1965   data.AppendLiteral(2, gold.bits);  // cdef_bits.
1966   for (int i = 0; i < 2; ++i) {
1967     gold.y_primary_strength[i] = 10;
1968     gold.y_secondary_strength[i] = (i == 0) ? 2 : 3;
1969     gold.uv_primary_strength[i] = 12;
1970     gold.uv_secondary_strength[i] = (i == 1) ? 2 : 3;
1971     data.AppendLiteral(4, gold.y_primary_strength[i]);
1972     data.AppendLiteral(2, gold.y_secondary_strength[i]);
1973     data.AppendLiteral(4, gold.uv_primary_strength[i]);
1974     data.AppendLiteral(2, gold.uv_secondary_strength[i]);
1975     if (gold.y_secondary_strength[i] == 3) ++gold.y_secondary_strength[i];
1976     if (gold.uv_secondary_strength[i] == 3) ++gold.uv_secondary_strength[i];
1977     gold.y_primary_strength[i] <<= coeff_shift;
1978     gold.uv_primary_strength[i] <<= coeff_shift;
1979     gold.y_secondary_strength[i] <<= coeff_shift;
1980     gold.uv_secondary_strength[i] <<= coeff_shift;
1981   }
1982 
1983   ASSERT_TRUE(Init(data.GenerateData()));
1984   obu_sequence_header_->enable_cdef = true;
1985   obu_sequence_header_->color_config.bitdepth = 10;
1986   ASSERT_TRUE(ObuParseCdefParameters());
1987   VerifyCdefParameters(gold);
1988 }
1989 
TEST_F(ObuParserTest,LoopRestorationParameters)1990 TEST_F(ObuParserTest, LoopRestorationParameters) {
1991   for (bool use_128x128_superblock : testing::Bool()) {
1992     SCOPED_TRACE("use_128x128_superblock: " +
1993                  std::to_string(use_128x128_superblock));
1994     LoopRestoration gold;
1995     memset(&gold, 0, sizeof(gold));
1996 
1997     BytesAndBits data;
1998     data.AppendBit(0);  // dummy.
1999 
2000     // enable_restoration is false. nothing will be read.
2001     ASSERT_TRUE(Init(data.GenerateData()));
2002     obu_frame_header_->allow_intrabc = true;
2003     obu_frame_header_->coded_lossless = true;
2004     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2005     VerifyLoopRestorationParameters(gold);
2006 
2007     // allow_intrabc is true. nothing will be read.
2008     ASSERT_TRUE(Init(data.GenerateData()));
2009     obu_frame_header_->allow_intrabc = true;
2010     obu_sequence_header_->enable_restoration = true;
2011     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2012     VerifyLoopRestorationParameters(gold);
2013 
2014     // coded_lossless is true. nothing will be read.
2015     ASSERT_TRUE(Init(data.GenerateData()));
2016     obu_frame_header_->coded_lossless = true;
2017     obu_sequence_header_->enable_restoration = true;
2018     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2019     VerifyLoopRestorationParameters(gold);
2020 
2021     data.Clear();
2022     for (int i = 0; i < kMaxPlanes; ++i) {
2023       data.AppendLiteral(2, kLoopRestorationTypeNone);  // lr_type.
2024     }
2025 
2026     ASSERT_TRUE(Init(data.GenerateData()));
2027     obu_sequence_header_->enable_restoration = true;
2028     obu_sequence_header_->use_128x128_superblock = use_128x128_superblock;
2029     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2030     VerifyLoopRestorationParameters(gold);
2031 
2032     gold.type[0] = gold.type[1] = kLoopRestorationTypeWiener;
2033     gold.unit_size_log2[0] = gold.unit_size_log2[1] = gold.unit_size_log2[2] =
2034         use_128x128_superblock ? 8 : 7;
2035     data.SetLiteral(0, 2, gold.type[0]);  // lr_type.
2036     data.SetLiteral(2, 2, gold.type[0]);  // lr_type.
2037     data.AppendBit(1);                    // lr_unit_shift.
2038     if (!use_128x128_superblock) {
2039       data.AppendBit(0);  // lr_unit_extra_shift.
2040     }
2041 
2042     ASSERT_TRUE(Init(data.GenerateData()));
2043     obu_sequence_header_->enable_restoration = true;
2044     obu_sequence_header_->use_128x128_superblock = use_128x128_superblock;
2045     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2046     VerifyLoopRestorationParameters(gold);
2047 
2048     if (!use_128x128_superblock) {
2049       gold.unit_size_log2[0] = gold.unit_size_log2[1] = gold.unit_size_log2[2] =
2050           8;
2051       data.SetBit(7, 1);  // lr_unit_extra_shift.
2052 
2053       ASSERT_TRUE(Init(data.GenerateData()));
2054       obu_sequence_header_->enable_restoration = true;
2055       obu_sequence_header_->use_128x128_superblock = use_128x128_superblock;
2056       ASSERT_TRUE(ObuParseLoopRestorationParameters());
2057       VerifyLoopRestorationParameters(gold);
2058     }
2059 
2060     gold.unit_size_log2[1] = gold.unit_size_log2[2] = 7;
2061     data.AppendBit(1);  // lr_uv_shift.
2062 
2063     ASSERT_TRUE(Init(data.GenerateData()));
2064     obu_sequence_header_->enable_restoration = true;
2065     obu_sequence_header_->use_128x128_superblock = use_128x128_superblock;
2066     obu_sequence_header_->color_config.subsampling_x = 1;
2067     obu_sequence_header_->color_config.subsampling_y = 1;
2068     ASSERT_TRUE(ObuParseLoopRestorationParameters());
2069     VerifyLoopRestorationParameters(gold);
2070   }
2071 }
2072 
TEST_F(ObuParserTest,TxModeSyntax)2073 TEST_F(ObuParserTest, TxModeSyntax) {
2074   BytesAndBits data;
2075   data.AppendBit(1);  // tx_mode_select.
2076 
2077   ASSERT_TRUE(Init(data.GenerateData()));
2078   ASSERT_TRUE(ObuParseTxModeSyntax());
2079   EXPECT_EQ(kTxModeSelect, obu_->frame_header().tx_mode);
2080 
2081   data.SetBit(0, 0);  // tx_mode_select.
2082 
2083   ASSERT_TRUE(Init(data.GenerateData()));
2084   ASSERT_TRUE(ObuParseTxModeSyntax());
2085   EXPECT_EQ(kTxModeLargest, obu_->frame_header().tx_mode);
2086 
2087   ASSERT_TRUE(Init(data.GenerateData()));
2088   obu_frame_header_->coded_lossless = true;
2089   ASSERT_TRUE(ObuParseTxModeSyntax());
2090   EXPECT_EQ(kTxModeOnly4x4, obu_->frame_header().tx_mode);
2091 }
2092 
TEST_F(ObuParserTest,FrameReferenceModeSyntax)2093 TEST_F(ObuParserTest, FrameReferenceModeSyntax) {
2094   BytesAndBits data;
2095   data.AppendBit(0);  // dummy.
2096 
2097   ASSERT_TRUE(ParseFrameReferenceModeSyntax(data.GenerateData(), kFrameKey));
2098   EXPECT_FALSE(obu_->frame_header().reference_mode_select);
2099 
2100   data.SetBit(0, 1);  // reference_mode_select.
2101 
2102   ASSERT_TRUE(ParseFrameReferenceModeSyntax(data.GenerateData(), kFrameInter));
2103   EXPECT_TRUE(obu_->frame_header().reference_mode_select);
2104 }
2105 
TEST_F(ObuParserTest,SkipModeParameters)2106 TEST_F(ObuParserTest, SkipModeParameters) {
2107   BytesAndBits data;
2108   data.AppendBit(1);  // skip_mode_present.
2109 
2110   ASSERT_TRUE(Init(data.GenerateData()));
2111   obu_frame_header_->frame_type = kFrameKey;
2112   ASSERT_FALSE(ObuIsSkipModeAllowed());
2113   ASSERT_TRUE(ObuParseSkipModeParameters());
2114   EXPECT_FALSE(obu_->frame_header().skip_mode_present);
2115 
2116   ASSERT_TRUE(Init(data.GenerateData()));
2117   obu_frame_header_->frame_type = kFrameInter;
2118   obu_frame_header_->reference_mode_select = true;
2119   ASSERT_FALSE(ObuIsSkipModeAllowed());
2120   ASSERT_TRUE(ObuParseSkipModeParameters());
2121   EXPECT_FALSE(obu_->frame_header().skip_mode_present);
2122 
2123   ASSERT_TRUE(Init(data.GenerateData()));
2124   obu_frame_header_->frame_type = kFrameInter;
2125   obu_frame_header_->reference_mode_select = true;
2126   obu_sequence_header_->enable_order_hint = true;
2127   obu_sequence_header_->order_hint_bits = 7;
2128   obu_sequence_header_->order_hint_shift_bits =
2129       Mod32(32 - obu_sequence_header_->order_hint_bits);
2130   ASSERT_FALSE(ObuIsSkipModeAllowed());
2131   ASSERT_TRUE(ObuParseSkipModeParameters());
2132   EXPECT_FALSE(obu_->frame_header().skip_mode_present);
2133 
2134   ASSERT_TRUE(Init(data.GenerateData()));
2135   obu_frame_header_->frame_type = kFrameInter;
2136   obu_frame_header_->reference_mode_select = true;
2137   obu_frame_header_->order_hint = 1;
2138   decoder_state_.order_hint = 1;
2139   obu_sequence_header_->enable_order_hint = true;
2140   obu_sequence_header_->order_hint_bits = 7;
2141   obu_sequence_header_->order_hint_shift_bits =
2142       Mod32(32 - obu_sequence_header_->order_hint_bits);
2143   ASSERT_FALSE(ObuIsSkipModeAllowed());
2144   ASSERT_TRUE(ObuParseSkipModeParameters());
2145   EXPECT_FALSE(obu_->frame_header().skip_mode_present);
2146 
2147   ASSERT_TRUE(Init(data.GenerateData()));
2148   for (int i = 0; i < kNumInterReferenceFrameTypes; ++i) {
2149     obu_frame_header_->reference_frame_index[i] = i;
2150     decoder_state_.reference_order_hint[i] = i;
2151   }
2152   obu_frame_header_->frame_type = kFrameInter;
2153   obu_frame_header_->reference_mode_select = true;
2154   obu_frame_header_->order_hint = 1;
2155   decoder_state_.order_hint = 1;
2156   obu_sequence_header_->enable_order_hint = true;
2157   obu_sequence_header_->order_hint_bits = 7;
2158   obu_sequence_header_->order_hint_shift_bits =
2159       Mod32(32 - obu_sequence_header_->order_hint_bits);
2160   ASSERT_TRUE(ObuIsSkipModeAllowed());
2161   ASSERT_TRUE(ObuParseSkipModeParameters());
2162   EXPECT_TRUE(obu_->frame_header().skip_mode_present);
2163 }
2164 
TEST_F(ObuParserTest,AllowWarpedMotion)2165 TEST_F(ObuParserTest, AllowWarpedMotion) {
2166   BytesAndBits data;
2167   data.AppendBit(0xff);  // dummy.
2168 
2169   // IsIntraFrame is true, so nothing will be read.
2170   ASSERT_TRUE(Init(data.GenerateData()));
2171   obu_frame_header_->frame_type = kFrameKey;
2172   obu_frame_header_->error_resilient_mode = false;
2173   obu_sequence_header_->enable_warped_motion = true;
2174   ASSERT_TRUE(ObuReadAllowWarpedMotion());
2175   EXPECT_FALSE(obu_->frame_header().allow_warped_motion);
2176 
2177   // error_resilient_mode is true, so nothing will be read.
2178   ASSERT_TRUE(Init(data.GenerateData()));
2179   obu_frame_header_->frame_type = kFrameInter;
2180   obu_frame_header_->error_resilient_mode = true;
2181   obu_sequence_header_->enable_warped_motion = true;
2182   ASSERT_TRUE(ObuReadAllowWarpedMotion());
2183   EXPECT_FALSE(obu_->frame_header().allow_warped_motion);
2184 
2185   // enable_warped_motion is false, so nothing will be read.
2186   ASSERT_TRUE(Init(data.GenerateData()));
2187   obu_frame_header_->frame_type = kFrameInter;
2188   obu_frame_header_->error_resilient_mode = false;
2189   obu_sequence_header_->enable_warped_motion = false;
2190   ASSERT_TRUE(ObuReadAllowWarpedMotion());
2191   EXPECT_FALSE(obu_->frame_header().allow_warped_motion);
2192 
2193   // allow_warped_motion will be read and equal to true.
2194   ASSERT_TRUE(Init(data.GenerateData()));
2195   obu_frame_header_->frame_type = kFrameInter;
2196   obu_frame_header_->error_resilient_mode = false;
2197   obu_sequence_header_->enable_warped_motion = true;
2198   ASSERT_TRUE(ObuReadAllowWarpedMotion());
2199   EXPECT_TRUE(obu_->frame_header().allow_warped_motion);
2200 }
2201 
TEST_F(ObuParserTest,GlobalMotionParameters)2202 TEST_F(ObuParserTest, GlobalMotionParameters) {
2203   BytesAndBits data;
2204   data.AppendBit(0);  // dummy.
2205   std::array<GlobalMotion, kNumReferenceFrameTypes> gold;
2206   for (int i = kReferenceFrameLast; i <= kReferenceFrameAlternate; ++i) {
2207     gold[i].type = kGlobalMotionTransformationTypeIdentity;
2208     for (int j = 0; j < 6; ++j) {
2209       gold[i].params[j] = (j % 3 == 2) ? 1 << kWarpedModelPrecisionBits : 0;
2210     }
2211   }
2212 
2213   ASSERT_TRUE(ParseGlobalMotionParameters(data.GenerateData(), kFrameKey));
2214   VerifyGlobalMotionParameters(gold);
2215 
2216   data.Clear();
2217   for (int i = kReferenceFrameLast; i <= kReferenceFrameAlternate; ++i) {
2218     // is_global=1; is_rot_zoom=1; parameter_values;
2219     data.AppendBytes(kDefaultGlobalMotionParametersRotZoom);
2220 
2221     // Magic numbers based on kDefaultGlobalMotionParametersRotZoom.
2222     gold[i].type = kGlobalMotionTransformationTypeRotZoom;
2223     gold[i].params[0] = -73728;
2224     gold[i].params[1] = -23552;
2225     gold[i].params[2] = 65952;
2226     gold[i].params[3] = -62;
2227     gold[i].params[4] = 62;
2228     gold[i].params[5] = 65952;
2229   }
2230 
2231   ASSERT_TRUE(ParseGlobalMotionParameters(data.GenerateData(), kFrameInter));
2232   VerifyGlobalMotionParameters(gold);
2233 
2234   data.Clear();
2235   for (int i = kReferenceFrameLast; i <= kReferenceFrameAlternate; ++i) {
2236     // This bit is not part of the hex string because it would make the whole
2237     // string not align to 8 bits. Appending this separately so that we can keep
2238     // the rest of them a magic hex string.
2239     data.AppendBit(1);  // is_global.
2240     // is_rot_zoom=0; is_translation=0; parameter_values;
2241     data.AppendBytes(kDefaultGlobalMotionParametersAffine);
2242 
2243     // Magic numbers based on kDefaultGlobalMotionParametersAffine.
2244     gold[i].type = kGlobalMotionTransformationTypeAffine;
2245     gold[i].params[4] = -62;
2246   }
2247 
2248   ASSERT_TRUE(ParseGlobalMotionParameters(data.GenerateData(), kFrameInter));
2249   VerifyGlobalMotionParameters(gold);
2250 }
2251 
TEST_F(ObuParserTest,FilmGrainParameters)2252 TEST_F(ObuParserTest, FilmGrainParameters) {
2253   BytesAndBits data;
2254   data.AppendBit(0);  // dummy.
2255 
2256   // Test film grain not present.
2257   FilmGrainParams gold = {};
2258   ObuSequenceHeader sequence_header = {};
2259   sequence_header.film_grain_params_present = false;
2260   ObuFrameHeader frame_header = {};
2261   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2262                                        frame_header));
2263   VerifyFilmGrainParameters(gold);
2264 
2265   // Test if show_frame = false and showable_frame = false.
2266   data.Clear();
2267   gold = {};
2268   sequence_header.film_grain_params_present = true;
2269   frame_header.show_frame = false;
2270   frame_header.showable_frame = false;
2271   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2272                                        frame_header));
2273   VerifyFilmGrainParameters(gold);
2274 
2275   // Test if apply_grain = false.
2276   data.Clear();
2277   gold = {};
2278   sequence_header.film_grain_params_present = true;
2279   frame_header.show_frame = true;
2280   frame_header.showable_frame = true;
2281   data.AppendBit(0);
2282   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2283                                        frame_header));
2284   VerifyFilmGrainParameters(gold);
2285 
2286   // Test if update_grain = false.
2287   data.Clear();
2288   gold = {};
2289   sequence_header.film_grain_params_present = true;
2290   frame_header.show_frame = true;
2291   frame_header.showable_frame = true;
2292   frame_header.frame_type = kFrameInter;
2293   for (auto& index : frame_header.reference_frame_index) {
2294     index = 1;
2295   }
2296   data.AppendBit(1);
2297   gold.apply_grain = true;
2298   data.AppendLiteral(16, 8);
2299   gold.grain_seed = 8;
2300   data.AppendBit(0);
2301   gold.update_grain = false;
2302   data.AppendLiteral(3, 1);
2303   gold.reference_index = 1;
2304   // Set up decoder_state_ with a previous frame containing saved film grain
2305   // parameters.
2306   decoder_state_.reference_frame[1] = buffer_pool_->GetFreeBuffer();
2307   EXPECT_NE(decoder_state_.reference_frame[1], nullptr);
2308   FilmGrainParams prev_grain_params = {};
2309   prev_grain_params.apply_grain = true;
2310   prev_grain_params.grain_seed = 11;
2311   prev_grain_params.update_grain = true;
2312   decoder_state_.reference_frame[1]->set_film_grain_params(prev_grain_params);
2313   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2314                                        frame_header));
2315   VerifyFilmGrainParameters(gold);
2316 
2317   // Test if update_grain = true, is_monochrome = true;
2318   data.Clear();
2319   gold = {};
2320   frame_header.frame_type = kFrameKey;
2321   for (auto& index : frame_header.reference_frame_index) {
2322     index = 0;
2323   }
2324   data.AppendBit(1);
2325   gold.apply_grain = true;
2326   data.AppendLiteral(16, 8);
2327   gold.grain_seed = 8;
2328   gold.update_grain = true;
2329   data.AppendLiteral(4, 10);
2330   gold.num_y_points = 10;
2331   for (int i = 0; i < gold.num_y_points; ++i) {
2332     data.AppendLiteral(8, 2 * i);
2333     gold.point_y_value[i] = 2 * i;
2334     data.AppendLiteral(8, i);
2335     gold.point_y_scaling[i] = i;
2336   }
2337   sequence_header.color_config.is_monochrome = true;
2338   gold.chroma_scaling_from_luma = false;
2339   gold.num_u_points = 0;
2340   gold.num_v_points = 0;
2341   data.AppendLiteral(2, 3);
2342   gold.chroma_scaling = 11;
2343   data.AppendLiteral(2, 1);
2344   gold.auto_regression_coeff_lag = 1;
2345   const int num_pos_luma =
2346       2 * gold.auto_regression_coeff_lag * (gold.auto_regression_coeff_lag + 1);
2347   for (int i = 0; i < num_pos_luma; ++i) {
2348     data.AppendLiteral(8, i + 128);
2349     gold.auto_regression_coeff_y[i] = i;
2350   }
2351   data.AppendLiteral(2, 0);
2352   gold.auto_regression_shift = 6;
2353   data.AppendLiteral(2, 1);
2354   gold.grain_scale_shift = 1;
2355   data.AppendBit(1);
2356   gold.overlap_flag = true;
2357   data.AppendBit(0);
2358   gold.clip_to_restricted_range = false;
2359   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2360                                        frame_header));
2361   ASSERT_TRUE(
2362       obu_->frame_header().frame_type == kFrameInter ||
2363       obu_->frame_header().film_grain_params.update_grain);  // a implies b.
2364   VerifyFilmGrainParameters(gold);
2365 
2366   // Test if update_grain = true, is_monochrome = false;
2367   data.Clear();
2368   gold = {};
2369   frame_header.frame_type = kFrameKey;
2370   data.AppendBit(1);
2371   gold.apply_grain = true;
2372   data.AppendLiteral(16, 8);
2373   gold.grain_seed = 8;
2374   gold.update_grain = true;
2375   data.AppendLiteral(4, 10);
2376   gold.num_y_points = 10;
2377   for (int i = 0; i < gold.num_y_points; ++i) {
2378     data.AppendLiteral(8, 2 * i);
2379     gold.point_y_value[i] = 2 * i;
2380     data.AppendLiteral(8, i);
2381     gold.point_y_scaling[i] = i;
2382   }
2383   sequence_header.color_config.is_monochrome = false;
2384   data.AppendBit(0);
2385   gold.chroma_scaling_from_luma = false;
2386   data.AppendLiteral(4, 5);
2387   gold.num_u_points = 5;
2388   for (int i = 0; i < gold.num_u_points; ++i) {
2389     data.AppendLiteral(8, 2 * i + 1);
2390     gold.point_u_value[i] = 2 * i + 1;
2391     data.AppendLiteral(8, i);
2392     gold.point_u_scaling[i] = i;
2393   }
2394   data.AppendLiteral(4, 3);
2395   gold.num_v_points = 3;
2396   for (int i = 0; i < gold.num_v_points; ++i) {
2397     data.AppendLiteral(8, i);
2398     gold.point_v_value[i] = i;
2399     data.AppendLiteral(8, i + 1);
2400     gold.point_v_scaling[i] = i + 1;
2401   }
2402   data.AppendLiteral(2, 3);
2403   gold.chroma_scaling = 11;
2404   data.AppendLiteral(2, 1);
2405   gold.auto_regression_coeff_lag = 1;
2406   const int num_pos_luma2 =
2407       2 * gold.auto_regression_coeff_lag * (gold.auto_regression_coeff_lag + 1);
2408   for (int i = 0; i < num_pos_luma2; ++i) {
2409     data.AppendLiteral(8, i + 128);
2410     gold.auto_regression_coeff_y[i] = i;
2411   }
2412   for (int i = 0; i < num_pos_luma2 + 1; ++i) {
2413     data.AppendLiteral(8, i);
2414     gold.auto_regression_coeff_u[i] = i - 128;
2415   }
2416   for (int i = 0; i < num_pos_luma2 + 1; ++i) {
2417     data.AppendLiteral(8, i);
2418     gold.auto_regression_coeff_v[i] = i - 128;
2419   }
2420   data.AppendLiteral(2, 0);
2421   gold.auto_regression_shift = 6;
2422   data.AppendLiteral(2, 1);
2423   gold.grain_scale_shift = 1;
2424   data.AppendLiteral(8, 2);
2425   gold.u_multiplier = -126;
2426   data.AppendLiteral(8, 1);
2427   gold.u_luma_multiplier = -127;
2428   data.AppendLiteral(9, 3);
2429   gold.u_offset = -253;
2430   data.AppendLiteral(8, 3);
2431   gold.v_multiplier = -125;
2432   data.AppendLiteral(8, 2);
2433   gold.v_luma_multiplier = -126;
2434   data.AppendLiteral(9, 1);
2435   gold.v_offset = -255;
2436   data.AppendBit(1);
2437   gold.overlap_flag = true;
2438   data.AppendBit(0);
2439   gold.clip_to_restricted_range = false;
2440   ASSERT_TRUE(ParseFilmGrainParameters(data.GenerateData(), sequence_header,
2441                                        frame_header));
2442   ASSERT_TRUE(
2443       obu_->frame_header().frame_type == kFrameInter ||
2444       obu_->frame_header().film_grain_params.update_grain);  // a implies b.
2445   VerifyFilmGrainParameters(gold);
2446 }
2447 
TEST_F(ObuParserTest,TileInfoSyntax)2448 TEST_F(ObuParserTest, TileInfoSyntax) {
2449   BytesAndBits data;
2450   TileInfo gold;
2451   memset(&gold, 0, sizeof(gold));
2452 
2453   gold.uniform_spacing = true;
2454   gold.tile_columns_log2 = 1;
2455   gold.tile_columns = 2;
2456   gold.tile_rows_log2 = 1;
2457   gold.tile_rows = 2;
2458   gold.tile_count = 4;
2459   gold.tile_column_start[1] = 64;
2460   gold.tile_column_start[2] = 88;
2461   gold.tile_row_start[1] = 64;
2462   gold.tile_row_start[2] = 72;
2463   gold.context_update_id = 3;
2464   gold.tile_size_bytes = 4;
2465   data.AppendBit(static_cast<uint8_t>(gold.uniform_spacing));
2466   data.AppendBit(1);  // increment_tile_cols_log2.
2467   data.AppendBit(0);  // increment_tile_cols_log2.
2468   data.AppendBit(1);  // increment_tile_rows_log2.
2469   data.AppendBit(0);  // increment_tile_rows_log2.
2470   data.AppendBit(1);  // context update id, columns_log2+rows_log2 bits
2471   data.AppendBit(1);
2472   data.AppendLiteral(2, gold.tile_size_bytes - 1);
2473 
2474   ASSERT_TRUE(ParseTileInfoSyntax(data.GenerateData(), 88, 72, true));
2475   VerifyTileInfoParameters(gold);
2476 
2477   gold.uniform_spacing = false;
2478   gold.tile_column_width_in_superblocks[0] = 2;
2479   gold.tile_column_width_in_superblocks[1] = 1;
2480   gold.tile_row_height_in_superblocks[0] = 2;
2481   gold.tile_row_height_in_superblocks[1] = 1;
2482 
2483   data.SetBit(0, static_cast<uint8_t>(gold.uniform_spacing));
2484   // The next 4 bits remain the same except now they represent f(w - 1) and
2485   // extra_bit in DecodeUniform. All the subsequent bits are unchanged the
2486   // represent the same thing as above.
2487 
2488   ASSERT_TRUE(ParseTileInfoSyntax(data.GenerateData(), 88, 72, true));
2489   VerifyTileInfoParameters(gold);
2490 
2491   // No tiles.
2492   memset(&gold, 0, sizeof(gold));
2493   gold.uniform_spacing = true;
2494   gold.tile_columns = 1;
2495   gold.tile_rows = 1;
2496   gold.tile_count = 1;
2497   gold.tile_column_start[1] = 88;
2498   gold.tile_row_start[1] = 72;
2499   data.Clear();
2500   data.AppendBit(static_cast<uint8_t>(gold.uniform_spacing));
2501   data.AppendBit(0);  // tile_cols_log2.
2502   data.AppendBit(0);  // tile_rows_log2.
2503 
2504   ASSERT_TRUE(ParseTileInfoSyntax(data.GenerateData(), 88, 72, true));
2505   VerifyTileInfoParameters(gold);
2506 
2507   // 64x64 superblocks. No tiles.
2508   gold.tile_column_start[1] = 640;
2509   gold.tile_row_start[1] = 360;
2510 
2511   ASSERT_TRUE(ParseTileInfoSyntax(data.GenerateData(), 640, 360, false));
2512   VerifyTileInfoParameters(gold);
2513 }
2514 
TEST_F(ObuParserTest,MetadataUnknownType)2515 TEST_F(ObuParserTest, MetadataUnknownType) {
2516   BytesAndBits data;
2517   // The metadata_type 10 is a user private value (6-31).
2518   data.AppendLiteral(8, 10);  // metadata_type.
2519   // The Note in Section 5.8.1 says "Decoders should ignore the entire OBU if
2520   // they do not understand the metadata_type."
2521   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2522 }
2523 
TEST_F(ObuParserTest,MetadataHdrCll)2524 TEST_F(ObuParserTest, MetadataHdrCll) {
2525   BytesAndBits data;
2526   ObuMetadataHdrCll gold;
2527   gold.max_cll = 25;
2528   gold.max_fall = 100;
2529 
2530   data.AppendLiteral(8, kMetadataTypeHdrContentLightLevel);
2531   data.AppendLiteral(16, gold.max_cll);
2532   data.AppendLiteral(16, gold.max_fall);
2533 
2534   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2535   VerifyMetadataHdrCll(gold);
2536 }
2537 
TEST_F(ObuParserTest,MetadataHdrMdcv)2538 TEST_F(ObuParserTest, MetadataHdrMdcv) {
2539   BytesAndBits data;
2540   ObuMetadataHdrMdcv gold;
2541   for (int i = 0; i < 3; ++i) {
2542     gold.primary_chromaticity_x[i] = 0;
2543     gold.primary_chromaticity_y[i] = 0;
2544   }
2545   gold.white_point_chromaticity_x = 250;
2546   gold.white_point_chromaticity_y = 2500;
2547   gold.luminance_max = 6000;
2548   gold.luminance_min = 3000;
2549 
2550   data.AppendLiteral(8, kMetadataTypeHdrMasteringDisplayColorVolume);
2551   for (int i = 0; i < 3; ++i) {
2552     data.AppendLiteral(16, gold.primary_chromaticity_x[i]);
2553     data.AppendLiteral(16, gold.primary_chromaticity_y[i]);
2554   }
2555   data.AppendLiteral(16, gold.white_point_chromaticity_x);
2556   data.AppendLiteral(16, gold.white_point_chromaticity_y);
2557   data.AppendLiteral(32, gold.luminance_max);
2558   data.AppendLiteral(32, gold.luminance_min);
2559 
2560   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2561   VerifyMetadataHdrMdcv(gold);
2562 }
2563 
TEST_F(ObuParserTest,MetadataScalability)2564 TEST_F(ObuParserTest, MetadataScalability) {
2565   BytesAndBits data;
2566 
2567   data.AppendLiteral(8, kMetadataTypeScalability);
2568   data.AppendLiteral(8, 0);  // scalability_mode_idc
2569 
2570   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2571 }
2572 
TEST_F(ObuParserTest,MetadataItutT35)2573 TEST_F(ObuParserTest, MetadataItutT35) {
2574   BytesAndBits data;
2575   ObuMetadataItutT35 gold;
2576   gold.country_code = 0xA6;  // 1 0 1 0 0 1 1 0 Switzerland
2577   DynamicBuffer<uint8_t> payload_bytes;
2578   ASSERT_TRUE(payload_bytes.Resize(10));
2579   gold.payload_bytes = payload_bytes.get();
2580   for (int i = 0; i < 10; ++i) {
2581     gold.payload_bytes[i] = 9 - i;
2582   }
2583   gold.payload_size = 10;
2584 
2585   data.AppendLiteral(8, kMetadataTypeItutT35);
2586   data.AppendLiteral(8, gold.country_code);
2587   for (int i = 0; i < 10; ++i) {
2588     data.AppendLiteral(8, 9 - i);
2589   }
2590   // For the kMetadataTypeItutT35 metadata type, we must include the trailing
2591   // bit so that the end of the itu_t_t35_payload_bytes can be identified.
2592   data.AppendLiteral(8, 0x80);
2593   data.AppendLiteral(8, 0x00);
2594   data.AppendLiteral(8, 0x00);
2595 
2596   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2597   VerifyMetadataItutT35(gold);
2598 
2599   gold.country_code = 0xFF;
2600   gold.country_code_extension_byte = 10;
2601 
2602   data.SetLiteral(8, 8, gold.country_code);
2603   data.InsertLiteral(16, 8, gold.country_code_extension_byte);
2604 
2605   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2606   VerifyMetadataItutT35(gold);
2607 }
2608 
TEST_F(ObuParserTest,MetadataTimecode)2609 TEST_F(ObuParserTest, MetadataTimecode) {
2610   BytesAndBits data;
2611 
2612   data.AppendLiteral(8, kMetadataTypeTimecode);
2613   data.AppendLiteral(5, 0);   // counting_type
2614   data.AppendBit(1);          // full_timestamp_flag
2615   data.AppendBit(0);          // discontinuity_flag
2616   data.AppendBit(0);          // cnt_dropped_flag
2617   data.AppendLiteral(9, 8);   // n_frames
2618   data.AppendLiteral(6, 59);  // seconds_value
2619   data.AppendLiteral(6, 59);  // minutes_value
2620   data.AppendLiteral(5, 23);  // hours_value
2621   data.AppendLiteral(5, 0);   // time_offset_length
2622 
2623   ASSERT_TRUE(ParseMetadata(data.GenerateData()));
2624 }
2625 
TEST_F(ObuParserTest,MetadataTimecodeInvalidSecondsValue)2626 TEST_F(ObuParserTest, MetadataTimecodeInvalidSecondsValue) {
2627   BytesAndBits data;
2628 
2629   data.AppendLiteral(8, kMetadataTypeTimecode);
2630   data.AppendLiteral(5, 0);   // counting_type
2631   data.AppendBit(1);          // full_timestamp_flag
2632   data.AppendBit(0);          // discontinuity_flag
2633   data.AppendBit(0);          // cnt_dropped_flag
2634   data.AppendLiteral(9, 8);   // n_frames
2635   data.AppendLiteral(6, 60);  // seconds_value
2636   data.AppendLiteral(6, 59);  // minutes_value
2637   data.AppendLiteral(5, 23);  // hours_value
2638   data.AppendLiteral(5, 0);   // time_offset_length
2639 
2640   EXPECT_FALSE(ParseMetadata(data.GenerateData()));
2641 }
2642 
TEST_F(ObuParserTest,MetadataTimecodeInvalidMinutesValue)2643 TEST_F(ObuParserTest, MetadataTimecodeInvalidMinutesValue) {
2644   BytesAndBits data;
2645 
2646   data.AppendLiteral(8, kMetadataTypeTimecode);
2647   data.AppendLiteral(5, 0);   // counting_type
2648   data.AppendBit(1);          // full_timestamp_flag
2649   data.AppendBit(0);          // discontinuity_flag
2650   data.AppendBit(0);          // cnt_dropped_flag
2651   data.AppendLiteral(9, 8);   // n_frames
2652   data.AppendLiteral(6, 59);  // seconds_value
2653   data.AppendLiteral(6, 60);  // minutes_value
2654   data.AppendLiteral(5, 23);  // hours_value
2655   data.AppendLiteral(5, 0);   // time_offset_length
2656 
2657   EXPECT_FALSE(ParseMetadata(data.GenerateData()));
2658 }
2659 
TEST_F(ObuParserTest,MetadataTimecodeInvalidHoursValue)2660 TEST_F(ObuParserTest, MetadataTimecodeInvalidHoursValue) {
2661   BytesAndBits data;
2662 
2663   data.AppendLiteral(8, kMetadataTypeTimecode);
2664   data.AppendLiteral(5, 0);   // counting_type
2665   data.AppendBit(1);          // full_timestamp_flag
2666   data.AppendBit(0);          // discontinuity_flag
2667   data.AppendBit(0);          // cnt_dropped_flag
2668   data.AppendLiteral(9, 8);   // n_frames
2669   data.AppendLiteral(6, 59);  // seconds_value
2670   data.AppendLiteral(6, 59);  // minutes_value
2671   data.AppendLiteral(5, 24);  // hours_value
2672   data.AppendLiteral(5, 0);   // time_offset_length
2673 
2674   EXPECT_FALSE(ParseMetadata(data.GenerateData()));
2675 }
2676 
2677 }  // namespace libgav1
2678