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