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