tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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