rtp_vp9_ref_finder_unittest.cc (23724B)
1 /* 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/video_coding/rtp_vp9_ref_finder.h" 12 13 #include <algorithm> 14 #include <cstddef> 15 #include <cstdint> 16 #include <memory> 17 #include <optional> 18 #include <ostream> 19 #include <utility> 20 #include <vector> 21 22 #include "api/array_view.h" 23 #include "api/rtp_packet_infos.h" 24 #include "api/video/encoded_frame.h" 25 #include "api/video/encoded_image.h" 26 #include "api/video/video_codec_type.h" 27 #include "api/video/video_content_type.h" 28 #include "api/video/video_frame_type.h" 29 #include "api/video/video_rotation.h" 30 #include "api/video/video_timing.h" 31 #include "modules/rtp_rtcp/source/frame_object.h" 32 #include "modules/rtp_rtcp/source/rtp_video_header.h" 33 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h" 34 #include "rtc_base/checks.h" 35 #include "test/gmock.h" 36 #include "test/gtest.h" 37 38 using ::testing::Contains; 39 using ::testing::Matcher; 40 using ::testing::MatcherInterface; 41 using ::testing::Matches; 42 using ::testing::MatchResultListener; 43 using ::testing::Pointee; 44 using ::testing::Property; 45 using ::testing::SizeIs; 46 using ::testing::UnorderedElementsAreArray; 47 48 namespace webrtc { 49 50 namespace { 51 class Frame { 52 public: 53 Frame& SeqNum(uint16_t start, uint16_t end) { 54 seq_num_start = start; 55 seq_num_end = end; 56 return *this; 57 } 58 59 Frame& AsKeyFrame(bool is_keyframe = true) { 60 keyframe = is_keyframe; 61 return *this; 62 } 63 64 Frame& Pid(int pid) { 65 picture_id = pid; 66 return *this; 67 } 68 69 Frame& SidAndTid(int sid, int tid) { 70 spatial_id = sid; 71 temporal_id = tid; 72 return *this; 73 } 74 75 Frame& Tl0(int tl0) { 76 tl0_idx = tl0; 77 return *this; 78 } 79 80 Frame& AsUpswitch(bool is_up = true) { 81 up_switch = is_up; 82 return *this; 83 } 84 85 Frame& AsInterLayer(bool is_inter_layer = true) { 86 inter_layer = is_inter_layer; 87 return *this; 88 } 89 90 Frame& NotAsInterPic(bool is_inter_pic = false) { 91 inter_pic = is_inter_pic; 92 return *this; 93 } 94 95 Frame& Gof(GofInfoVP9* ss) { 96 scalability_structure = ss; 97 return *this; 98 } 99 100 Frame& FlexRefs(const std::vector<uint8_t>& refs) { 101 flex_refs = refs; 102 return *this; 103 } 104 105 operator std::unique_ptr<RtpFrameObject>() { 106 RTPVideoHeaderVP9 vp9_header{}; 107 vp9_header.picture_id = *picture_id; 108 vp9_header.temporal_idx = *temporal_id; 109 vp9_header.spatial_idx = *spatial_id; 110 if (tl0_idx.has_value()) { 111 RTC_DCHECK(flex_refs.empty()); 112 vp9_header.flexible_mode = false; 113 vp9_header.tl0_pic_idx = *tl0_idx; 114 } else { 115 vp9_header.flexible_mode = true; 116 vp9_header.num_ref_pics = flex_refs.size(); 117 for (size_t i = 0; i < flex_refs.size(); ++i) { 118 vp9_header.pid_diff[i] = flex_refs.at(i); 119 } 120 } 121 vp9_header.temporal_up_switch = up_switch; 122 vp9_header.inter_layer_predicted = inter_layer; 123 vp9_header.inter_pic_predicted = inter_pic && !keyframe; 124 if (scalability_structure != nullptr) { 125 vp9_header.ss_data_available = true; 126 vp9_header.gof = *scalability_structure; 127 } 128 129 RTPVideoHeader video_header; 130 video_header.frame_type = keyframe ? VideoFrameType::kVideoFrameKey 131 : VideoFrameType::kVideoFrameDelta; 132 video_header.video_type_header = vp9_header; 133 // clang-format off 134 return std::make_unique<RtpFrameObject>( 135 seq_num_start, 136 seq_num_end, 137 /*markerBit=*/true, 138 /*times_nacked=*/0, 139 /*first_packet_received_time=*/0, 140 /*last_packet_received_time=*/0, 141 /*rtp_timestamp=*/0, 142 /*ntp_time_ms=*/0, 143 VideoSendTiming(), 144 /*payload_type=*/0, 145 kVideoCodecVP9, 146 kVideoRotation_0, 147 VideoContentType::UNSPECIFIED, 148 video_header, 149 /*color_space=*/std::nullopt, 150 /*frame_instrumentation_data=*/std::nullopt, 151 RtpPacketInfos(), 152 EncodedImageBuffer::Create(/*size=*/0)); 153 // clang-format on 154 } 155 156 private: 157 uint16_t seq_num_start = 0; 158 uint16_t seq_num_end = 0; 159 bool keyframe = false; 160 std::optional<int> picture_id; 161 std::optional<int> spatial_id; 162 std::optional<int> temporal_id; 163 std::optional<int> tl0_idx; 164 bool up_switch = false; 165 bool inter_layer = false; 166 bool inter_pic = true; 167 GofInfoVP9* scalability_structure = nullptr; 168 std::vector<uint8_t> flex_refs; 169 }; 170 171 using FrameVector = std::vector<std::unique_ptr<EncodedFrame>>; 172 173 // Would have been nice to use the MATCHER_P3 macro instead, but when used it 174 // fails to infer the type of the vector if not explicitly given in the 175 class HasFrameMatcher : public MatcherInterface<const FrameVector&> { 176 public: 177 explicit HasFrameMatcher(int64_t frame_id, 178 const std::vector<int64_t>& expected_refs) 179 : frame_id_(frame_id), expected_refs_(expected_refs) {} 180 181 bool MatchAndExplain(const FrameVector& frames, 182 MatchResultListener* result_listener) const override { 183 auto it = std::find_if(frames.begin(), frames.end(), 184 [this](const std::unique_ptr<EncodedFrame>& f) { 185 return f->Id() == frame_id_; 186 }); 187 if (it == frames.end()) { 188 if (result_listener->IsInterested()) { 189 *result_listener << "No frame with frame_id:" << frame_id_; 190 } 191 return false; 192 } 193 194 ArrayView<int64_t> actual_refs((*it)->references, (*it)->num_references); 195 if (!Matches(UnorderedElementsAreArray(expected_refs_))(actual_refs)) { 196 if (result_listener->IsInterested()) { 197 *result_listener << "Frame with frame_id:" << frame_id_ << " and " 198 << actual_refs.size() << " references { "; 199 for (auto r : actual_refs) { 200 *result_listener << r << " "; 201 } 202 *result_listener << "}"; 203 } 204 return false; 205 } 206 207 return true; 208 } 209 210 void DescribeTo(std::ostream* os) const override { 211 *os << "frame with frame_id:" << frame_id_ << " and " 212 << expected_refs_.size() << " references { "; 213 for (auto r : expected_refs_) { 214 *os << r << " "; 215 } 216 *os << "}"; 217 } 218 219 private: 220 const int64_t frame_id_; 221 const std::vector<int64_t> expected_refs_; 222 }; 223 224 } // namespace 225 226 class RtpVp9RefFinderTest : public ::testing::Test { 227 protected: 228 RtpVp9RefFinderTest() : ref_finder_(std::make_unique<RtpVp9RefFinder>()) {} 229 230 void Insert(std::unique_ptr<RtpFrameObject> frame) { 231 for (auto& f : ref_finder_->ManageFrame(std::move(frame))) { 232 frames_.push_back(std::move(f)); 233 } 234 } 235 236 std::unique_ptr<RtpVp9RefFinder> ref_finder_; 237 FrameVector frames_; 238 }; 239 240 Matcher<const FrameVector&> HasFrameWithIdAndRefs(int64_t frame_id, 241 std::vector<int64_t> refs) { 242 return MakeMatcher(new HasFrameMatcher(frame_id, refs)); 243 } 244 245 TEST_F(RtpVp9RefFinderTest, GofInsertOneFrame) { 246 GofInfoVP9 ss; 247 ss.SetGofInfoVP9(kTemporalStructureMode1); 248 249 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); 250 251 EXPECT_EQ(frames_.size(), 1UL); 252 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {})); 253 } 254 255 TEST_F(RtpVp9RefFinderTest, GofTemporalLayers_0) { 256 GofInfoVP9 ss; 257 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer. 258 259 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); 260 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 261 262 EXPECT_EQ(frames_.size(), 2UL); 263 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {})); 264 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {5})); 265 } 266 267 TEST_F(RtpVp9RefFinderTest, GofSpatialLayers_2) { 268 GofInfoVP9 ss; 269 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer. 270 271 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); 272 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 273 Insert(Frame().Pid(2).SidAndTid(1, 0).Tl0(1).NotAsInterPic()); 274 Insert(Frame().Pid(3).SidAndTid(0, 0).Tl0(2)); 275 Insert(Frame().Pid(3).SidAndTid(1, 0).Tl0(2)); 276 277 EXPECT_EQ(frames_.size(), 5UL); 278 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {})); 279 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {5})); 280 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(11, {})); 281 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 282 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(16, {11})); 283 } 284 285 TEST_F(RtpVp9RefFinderTest, GofTemporalLayersReordered_0) { 286 GofInfoVP9 ss; 287 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer. 288 289 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 290 Insert(Frame().Pid(2).SidAndTid(1, 0).Tl0(1).NotAsInterPic()); 291 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); 292 Insert(Frame().Pid(3).SidAndTid(0, 0).Tl0(2)); 293 Insert(Frame().Pid(3).SidAndTid(1, 0).Tl0(2)); 294 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(3)); 295 Insert(Frame().Pid(5).SidAndTid(1, 0).Tl0(4)); 296 Insert(Frame().Pid(4).SidAndTid(1, 0).Tl0(3)); 297 Insert(Frame().Pid(5).SidAndTid(0, 0).Tl0(4)); 298 299 EXPECT_EQ(frames_.size(), 9UL); 300 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {})); 301 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {5})); 302 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(11, {})); 303 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 304 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(16, {11})); 305 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {15})); 306 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(21, {16})); 307 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 308 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(26, {21})); 309 } 310 311 TEST_F(RtpVp9RefFinderTest, GofSkipFramesTemporalLayers_01) { 312 GofInfoVP9 ss; 313 ss.SetGofInfoVP9(kTemporalStructureMode2); // 0101 pattern 314 315 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 316 &ss)); 317 Insert(Frame().Pid(1).SidAndTid(0, 1).Tl0(0)); 318 // Skip GOF with tl0 1 319 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(2).AsKeyFrame().Gof(&ss)); 320 Insert(Frame().Pid(5).SidAndTid(0, 1).Tl0(2)); 321 // Skip GOF with tl0 3 322 // Skip GOF with tl0 4 323 Insert(Frame().Pid(10).SidAndTid(0, 0).Tl0(5).Gof(&ss)); 324 Insert(Frame().Pid(11).SidAndTid(0, 1).Tl0(5)); 325 326 ASSERT_EQ(6UL, frames_.size()); 327 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 328 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 329 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {})); 330 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 331 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(50, {40})); 332 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(55, {50})); 333 } 334 335 TEST_F(RtpVp9RefFinderTest, GofSkipFramesTemporalLayers_0212) { 336 GofInfoVP9 ss; 337 ss.SetGofInfoVP9(kTemporalStructureMode3); // 02120212 pattern 338 339 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 340 &ss)); 341 Insert(Frame().Pid(1).SidAndTid(0, 2).Tl0(0)); 342 Insert(Frame().Pid(2).SidAndTid(0, 1).Tl0(0)); 343 Insert(Frame().Pid(3).SidAndTid(0, 2).Tl0(0)); 344 345 ASSERT_EQ(4UL, frames_.size()); 346 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 347 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 348 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 349 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 350 351 // Skip frames with tl0 = 1 352 353 Insert(Frame().Pid(8).SidAndTid(0, 0).Tl0(2).AsKeyFrame().NotAsInterPic().Gof( 354 &ss)); 355 Insert(Frame().Pid(9).SidAndTid(0, 2).Tl0(2)); 356 Insert(Frame().Pid(10).SidAndTid(0, 1).Tl0(2)); 357 Insert(Frame().Pid(11).SidAndTid(0, 2).Tl0(2)); 358 359 ASSERT_EQ(8UL, frames_.size()); 360 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(40, {})); 361 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(45, {40})); 362 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(50, {40})); 363 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(55, {50})); 364 365 // Now insert frames with tl0 = 1 366 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(1).AsKeyFrame().Gof(&ss)); 367 Insert(Frame().Pid(7).SidAndTid(0, 2).Tl0(1)); 368 369 ASSERT_EQ(9UL, frames_.size()); 370 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {})); 371 372 Insert(Frame().Pid(5).SidAndTid(0, 2).Tl0(1)); 373 Insert(Frame().Pid(6).SidAndTid(0, 1).Tl0(1)); 374 375 ASSERT_EQ(12UL, frames_.size()); 376 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 377 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(30, {20})); 378 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(35, {30})); 379 } 380 381 TEST_F(RtpVp9RefFinderTest, GofInterLayerPredS0KeyS1Delta) { 382 GofInfoVP9 ss; 383 ss.SetGofInfoVP9(kTemporalStructureMode1); 384 385 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); 386 Insert(Frame().Pid(1).SidAndTid(1, 0).Tl0(0).AsInterLayer().NotAsInterPic()); 387 388 ASSERT_EQ(2UL, frames_.size()); 389 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {})); 390 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(6, {5})); 391 } 392 393 TEST_F(RtpVp9RefFinderTest, GofTemporalLayers_01) { 394 GofInfoVP9 ss; 395 ss.SetGofInfoVP9(kTemporalStructureMode2); // 0101 pattern 396 397 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 398 &ss)); 399 Insert(Frame().Pid(1).SidAndTid(0, 1).Tl0(0)); 400 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 401 Insert(Frame().Pid(3).SidAndTid(0, 1).Tl0(1)); 402 403 ASSERT_EQ(4UL, frames_.size()); 404 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 405 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 406 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 407 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 408 } 409 410 TEST_F(RtpVp9RefFinderTest, GofTemporalLayersReordered_01) { 411 GofInfoVP9 ss; 412 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern 413 414 Insert(Frame().Pid(1).SidAndTid(0, 1).Tl0(0)); 415 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 416 &ss)); 417 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 418 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(2)); 419 Insert(Frame().Pid(3).SidAndTid(0, 1).Tl0(1)); 420 Insert(Frame().Pid(5).SidAndTid(0, 1).Tl0(2)); 421 Insert(Frame().Pid(7).SidAndTid(0, 1).Tl0(3)); 422 Insert(Frame().Pid(6).SidAndTid(0, 0).Tl0(3)); 423 Insert(Frame().Pid(8).SidAndTid(0, 0).Tl0(4)); 424 Insert(Frame().Pid(9).SidAndTid(0, 1).Tl0(4)); 425 426 ASSERT_EQ(10UL, frames_.size()); 427 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 428 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 429 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 430 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 431 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {10})); 432 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 433 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(30, {20})); 434 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(35, {30})); 435 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(40, {30})); 436 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(45, {40})); 437 } 438 439 TEST_F(RtpVp9RefFinderTest, GofTemporalLayers_0212) { 440 GofInfoVP9 ss; 441 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern 442 443 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 444 &ss)); 445 Insert(Frame().Pid(1).SidAndTid(0, 2).Tl0(0)); 446 Insert(Frame().Pid(2).SidAndTid(0, 1).Tl0(0)); 447 Insert(Frame().Pid(3).SidAndTid(0, 2).Tl0(0)); 448 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(1)); 449 Insert(Frame().Pid(5).SidAndTid(0, 2).Tl0(1)); 450 Insert(Frame().Pid(6).SidAndTid(0, 1).Tl0(1)); 451 Insert(Frame().Pid(7).SidAndTid(0, 2).Tl0(1)); 452 453 ASSERT_EQ(8UL, frames_.size()); 454 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 455 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 456 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 457 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 458 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {0})); 459 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 460 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(30, {20})); 461 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(35, {30})); 462 } 463 464 TEST_F(RtpVp9RefFinderTest, GofTemporalLayersReordered_0212) { 465 GofInfoVP9 ss; 466 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern 467 468 Insert(Frame().Pid(2).SidAndTid(0, 1).Tl0(0)); 469 Insert(Frame().Pid(1).SidAndTid(0, 2).Tl0(0)); 470 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 471 &ss)); 472 Insert(Frame().Pid(3).SidAndTid(0, 2).Tl0(0)); 473 Insert(Frame().Pid(6).SidAndTid(0, 1).Tl0(1)); 474 Insert(Frame().Pid(5).SidAndTid(0, 2).Tl0(1)); 475 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(1)); 476 Insert(Frame().Pid(9).SidAndTid(0, 2).Tl0(2)); 477 Insert(Frame().Pid(7).SidAndTid(0, 2).Tl0(1)); 478 Insert(Frame().Pid(8).SidAndTid(0, 0).Tl0(2)); 479 Insert(Frame().Pid(11).SidAndTid(0, 2).Tl0(2)); 480 Insert(Frame().Pid(10).SidAndTid(0, 1).Tl0(2)); 481 482 ASSERT_EQ(12UL, frames_.size()); 483 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 484 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 485 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 486 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 487 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {0})); 488 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 489 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(30, {20})); 490 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(35, {30})); 491 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(40, {20})); 492 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(45, {40})); 493 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(50, {40})); 494 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(55, {50})); 495 } 496 497 TEST_F(RtpVp9RefFinderTest, GofTemporalLayersReordered_01_0212) { 498 GofInfoVP9 ss; 499 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern 500 501 Insert(Frame().Pid(1).SidAndTid(0, 1).Tl0(0)); 502 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 503 &ss)); 504 Insert(Frame().Pid(3).SidAndTid(0, 1).Tl0(1)); 505 Insert(Frame().Pid(6).SidAndTid(0, 1).Tl0(2)); 506 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern 507 Insert(Frame().Pid(4).SidAndTid(0, 0).Tl0(2).Gof(&ss)); 508 Insert(Frame().Pid(2).SidAndTid(0, 0).Tl0(1)); 509 Insert(Frame().Pid(5).SidAndTid(0, 2).Tl0(2)); 510 Insert(Frame().Pid(8).SidAndTid(0, 0).Tl0(3)); 511 Insert(Frame().Pid(10).SidAndTid(0, 1).Tl0(3)); 512 Insert(Frame().Pid(7).SidAndTid(0, 2).Tl0(2)); 513 Insert(Frame().Pid(11).SidAndTid(0, 2).Tl0(3)); 514 Insert(Frame().Pid(9).SidAndTid(0, 2).Tl0(3)); 515 516 ASSERT_EQ(12UL, frames_.size()); 517 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 518 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 519 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 520 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(15, {10})); 521 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {0})); 522 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(25, {20})); 523 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(30, {20})); 524 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(35, {30})); 525 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(40, {20})); 526 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(45, {40})); 527 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(50, {40})); 528 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(55, {50})); 529 } 530 531 TEST_F(RtpVp9RefFinderTest, FlexibleModeOneFrame) { 532 Insert(Frame().Pid(0).SidAndTid(0, 0).AsKeyFrame()); 533 534 ASSERT_EQ(1UL, frames_.size()); 535 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 536 } 537 538 TEST_F(RtpVp9RefFinderTest, FlexibleModeTwoSpatialLayers) { 539 Insert(Frame().Pid(0).SidAndTid(0, 0).AsKeyFrame()); 540 Insert(Frame().Pid(0).SidAndTid(1, 0).AsKeyFrame().AsInterLayer()); 541 Insert(Frame().Pid(1).SidAndTid(1, 0).FlexRefs({1})); 542 Insert(Frame().Pid(2).SidAndTid(0, 0).FlexRefs({2})); 543 Insert(Frame().Pid(2).SidAndTid(1, 0).FlexRefs({1})); 544 Insert(Frame().Pid(3).SidAndTid(1, 0).FlexRefs({1})); 545 Insert(Frame().Pid(4).SidAndTid(0, 0).FlexRefs({2})); 546 Insert(Frame().Pid(4).SidAndTid(1, 0).FlexRefs({1})); 547 548 ASSERT_EQ(8UL, frames_.size()); 549 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 550 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(1, {0})); 551 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(6, {1})); 552 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 553 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(11, {6})); 554 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(16, {11})); 555 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {10})); 556 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(21, {16})); 557 } 558 559 TEST_F(RtpVp9RefFinderTest, FlexibleModeTwoSpatialLayersReordered) { 560 Insert(Frame().Pid(0).SidAndTid(1, 0).AsKeyFrame().AsInterLayer()); 561 Insert(Frame().Pid(1).SidAndTid(1, 0).FlexRefs({1})); 562 Insert(Frame().Pid(0).SidAndTid(0, 0).AsKeyFrame()); 563 Insert(Frame().Pid(2).SidAndTid(1, 0).FlexRefs({1})); 564 Insert(Frame().Pid(3).SidAndTid(1, 0).FlexRefs({1})); 565 Insert(Frame().Pid(2).SidAndTid(0, 0).FlexRefs({2})); 566 Insert(Frame().Pid(4).SidAndTid(1, 0).FlexRefs({1})); 567 Insert(Frame().Pid(4).SidAndTid(0, 0).FlexRefs({2})); 568 569 ASSERT_EQ(8UL, frames_.size()); 570 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 571 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(1, {0})); 572 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(6, {1})); 573 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(10, {0})); 574 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(11, {6})); 575 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(16, {11})); 576 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(20, {10})); 577 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(21, {16})); 578 } 579 580 TEST_F(RtpVp9RefFinderTest, WrappingFlexReference) { 581 Insert(Frame().Pid(0).SidAndTid(0, 0).FlexRefs({1})); 582 583 ASSERT_EQ(1UL, frames_.size()); 584 const EncodedFrame& frame = *frames_[0]; 585 586 ASSERT_EQ(frame.Id() - frame.references[0], 5); 587 } 588 589 TEST_F(RtpVp9RefFinderTest, GofPidJump) { 590 GofInfoVP9 ss; 591 ss.SetGofInfoVP9(kTemporalStructureMode3); 592 593 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 594 &ss)); 595 Insert(Frame().Pid(1000).SidAndTid(0, 0).Tl0(1)); 596 } 597 598 TEST_F(RtpVp9RefFinderTest, GofTl0Jump) { 599 GofInfoVP9 ss; 600 ss.SetGofInfoVP9(kTemporalStructureMode3); 601 602 Insert(Frame() 603 .Pid(0) 604 .SidAndTid(0, 0) 605 .Tl0(125) 606 .AsUpswitch() 607 .AsKeyFrame() 608 .NotAsInterPic() 609 .Gof(&ss)); 610 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(0).Gof(&ss)); 611 } 612 613 TEST_F(RtpVp9RefFinderTest, GofTidTooHigh) { 614 const int kMaxTemporalLayers = 5; 615 GofInfoVP9 ss; 616 ss.SetGofInfoVP9(kTemporalStructureMode2); 617 ss.temporal_idx[1] = kMaxTemporalLayers; 618 619 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 620 &ss)); 621 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(1)); 622 623 ASSERT_EQ(1UL, frames_.size()); 624 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 625 } 626 627 TEST_F(RtpVp9RefFinderTest, GofZeroFrames) { 628 GofInfoVP9 ss; 629 ss.num_frames_in_gof = 0; 630 631 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().NotAsInterPic().Gof( 632 &ss)); 633 Insert(Frame().Pid(1).SidAndTid(0, 0).Tl0(1)); 634 635 ASSERT_EQ(2UL, frames_.size()); 636 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(0, {})); 637 EXPECT_THAT(frames_, HasFrameWithIdAndRefs(5, {0})); 638 } 639 640 TEST_F(RtpVp9RefFinderTest, SpatialIndex) { 641 Insert(Frame().Pid(0).SidAndTid(0, 0).AsKeyFrame()); 642 Insert(Frame().Pid(0).SidAndTid(1, 0).AsKeyFrame()); 643 Insert(Frame().Pid(0).SidAndTid(2, 0).AsKeyFrame()); 644 645 ASSERT_EQ(3UL, frames_.size()); 646 EXPECT_THAT(frames_, 647 Contains(Pointee(Property(&EncodedFrame::SpatialIndex, 0)))); 648 EXPECT_THAT(frames_, 649 Contains(Pointee(Property(&EncodedFrame::SpatialIndex, 1)))); 650 EXPECT_THAT(frames_, 651 Contains(Pointee(Property(&EncodedFrame::SpatialIndex, 2)))); 652 } 653 654 TEST_F(RtpVp9RefFinderTest, StashedFramesDoNotWrapTl0Backwards) { 655 GofInfoVP9 ss; 656 ss.SetGofInfoVP9(kTemporalStructureMode1); 657 658 Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0)); 659 EXPECT_THAT(frames_, SizeIs(0)); 660 661 Insert(Frame().Pid(128).SidAndTid(0, 0).Tl0(128).AsKeyFrame().Gof(&ss)); 662 EXPECT_THAT(frames_, SizeIs(1)); 663 Insert(Frame().Pid(129).SidAndTid(0, 0).Tl0(129)); 664 EXPECT_THAT(frames_, SizeIs(2)); 665 } 666 667 } // namespace webrtc