tor-browser

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

frame_buffer_unittest.cc (16724B)


      1 /*
      2 *  Copyright (c) 2021 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 #include "api/video/frame_buffer.h"
     11 
     12 #include <optional>
     13 #include <vector>
     14 
     15 #include "api/field_trials.h"
     16 #include "test/create_test_field_trials.h"
     17 #include "test/fake_encoded_frame.h"
     18 #include "test/gmock.h"
     19 #include "test/gtest.h"
     20 
     21 namespace webrtc {
     22 namespace {
     23 
     24 using ::testing::ElementsAre;
     25 using ::testing::Eq;
     26 using ::testing::IsEmpty;
     27 using ::testing::Matches;
     28 
     29 MATCHER_P(FrameWithId, id, "") {
     30  return Matches(Eq(id))(arg->Id());
     31 }
     32 
     33 TEST(FrameBuffer3Test, RejectInvalidRefs) {
     34  FieldTrials field_trials = CreateTestFieldTrials();
     35  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
     36                     field_trials);
     37  // Ref must be less than the id of this frame.
     38  EXPECT_FALSE(buffer.InsertFrame(
     39      test::FakeFrameBuilder().Time(0).Id(0).Refs({0}).AsLast().Build()));
     40  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(std::nullopt));
     41 
     42  // Duplicate ids are also invalid.
     43  EXPECT_TRUE(buffer.InsertFrame(
     44      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
     45  EXPECT_FALSE(buffer.InsertFrame(
     46      test::FakeFrameBuilder().Time(20).Id(2).Refs({1, 1}).AsLast().Build()));
     47  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
     48 }
     49 
     50 TEST(FrameBuffer3Test, LastContinuousUpdatesOnInsertedFrames) {
     51  FieldTrials field_trials = CreateTestFieldTrials();
     52  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
     53                     field_trials);
     54  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(std::nullopt));
     55  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(std::nullopt));
     56 
     57  EXPECT_TRUE(
     58      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
     59  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
     60  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(std::nullopt));
     61 
     62  EXPECT_TRUE(buffer.InsertFrame(
     63      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
     64  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(2));
     65  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
     66 }
     67 
     68 TEST(FrameBuffer3Test, LastContinuousFrameReordering) {
     69  FieldTrials field_trials = CreateTestFieldTrials();
     70  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
     71                     field_trials);
     72 
     73  EXPECT_TRUE(buffer.InsertFrame(
     74      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
     75  EXPECT_TRUE(buffer.InsertFrame(
     76      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
     77  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
     78 
     79  EXPECT_TRUE(buffer.InsertFrame(
     80      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
     81  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(3));
     82 }
     83 
     84 TEST(FrameBuffer3Test, LastContinuousTemporalUnit) {
     85  FieldTrials field_trials = CreateTestFieldTrials();
     86  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
     87                     field_trials);
     88 
     89  EXPECT_TRUE(
     90      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
     91  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(std::nullopt));
     92  EXPECT_TRUE(buffer.InsertFrame(
     93      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
     94  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
     95 }
     96 
     97 TEST(FrameBuffer3Test, LastContinuousTemporalUnitReordering) {
     98  FieldTrials field_trials = CreateTestFieldTrials();
     99  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    100                     field_trials);
    101 
    102  EXPECT_TRUE(
    103      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
    104  EXPECT_TRUE(buffer.InsertFrame(
    105      test::FakeFrameBuilder().Time(20).Id(3).Refs({1}).Build()));
    106  EXPECT_TRUE(buffer.InsertFrame(
    107      test::FakeFrameBuilder().Time(20).Id(4).Refs({2, 3}).AsLast().Build()));
    108  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(std::nullopt));
    109 
    110  EXPECT_TRUE(buffer.InsertFrame(
    111      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
    112  EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(4));
    113 }
    114 
    115 TEST(FrameBuffer3Test, NextDecodable) {
    116  FieldTrials field_trials = CreateTestFieldTrials();
    117  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    118                     field_trials);
    119 
    120  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo(), Eq(std::nullopt));
    121  EXPECT_TRUE(buffer.InsertFrame(
    122      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    123  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
    124 }
    125 
    126 TEST(FrameBuffer3Test, AdvanceNextDecodableOnExtraction) {
    127  FieldTrials field_trials = CreateTestFieldTrials();
    128  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    129                     field_trials);
    130 
    131  EXPECT_TRUE(buffer.InsertFrame(
    132      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    133  EXPECT_TRUE(buffer.InsertFrame(
    134      test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
    135  EXPECT_TRUE(buffer.InsertFrame(
    136      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
    137  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
    138 
    139  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    140              ElementsAre(FrameWithId(1)));
    141  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
    142  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    143              ElementsAre(FrameWithId(2)));
    144  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(30U));
    145  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    146              ElementsAre(FrameWithId(3)));
    147 }
    148 
    149 TEST(FrameBuffer3Test, AdvanceLastDecodableOnExtraction) {
    150  FieldTrials field_trials = CreateTestFieldTrials();
    151  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    152                     field_trials);
    153 
    154  EXPECT_TRUE(buffer.InsertFrame(
    155      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    156  EXPECT_TRUE(buffer.InsertFrame(
    157      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    158  EXPECT_TRUE(buffer.InsertFrame(
    159      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
    160  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(10U));
    161 
    162  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    163              ElementsAre(FrameWithId(1)));
    164  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(30U));
    165 }
    166 
    167 TEST(FrameBuffer3Test, FrameUpdatesNextDecodable) {
    168  FieldTrials field_trials = CreateTestFieldTrials();
    169  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    170                     field_trials);
    171 
    172  EXPECT_TRUE(buffer.InsertFrame(
    173      test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
    174  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
    175 
    176  EXPECT_TRUE(buffer.InsertFrame(
    177      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    178  EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
    179 }
    180 
    181 TEST(FrameBuffer3Test, KeyframeClearsFullBuffer) {
    182  FieldTrials field_trials = CreateTestFieldTrials();
    183  FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
    184                     field_trials);
    185  EXPECT_TRUE(buffer.InsertFrame(
    186      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    187  EXPECT_TRUE(buffer.InsertFrame(
    188      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    189  EXPECT_TRUE(buffer.InsertFrame(
    190      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
    191  EXPECT_TRUE(buffer.InsertFrame(
    192      test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build()));
    193  EXPECT_TRUE(buffer.InsertFrame(
    194      test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build()));
    195  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
    196 
    197  // Frame buffer is full
    198  EXPECT_FALSE(buffer.InsertFrame(
    199      test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build()));
    200  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
    201 
    202  EXPECT_TRUE(buffer.InsertFrame(
    203      test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build()));
    204  EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
    205 }
    206 
    207 TEST(FrameBuffer3Test, DropNextDecodableTemporalUnit) {
    208  FieldTrials field_trials = CreateTestFieldTrials();
    209  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    210                     field_trials);
    211  EXPECT_TRUE(buffer.InsertFrame(
    212      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    213  EXPECT_TRUE(buffer.InsertFrame(
    214      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    215  EXPECT_TRUE(buffer.InsertFrame(
    216      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
    217 
    218  buffer.ExtractNextDecodableTemporalUnit();
    219  buffer.DropNextDecodableTemporalUnit();
    220  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    221              ElementsAre(FrameWithId(3)));
    222 }
    223 
    224 TEST(FrameBuffer3Test, OldFramesAreIgnored) {
    225  FieldTrials field_trials = CreateTestFieldTrials();
    226  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    227                     field_trials);
    228  EXPECT_TRUE(buffer.InsertFrame(
    229      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    230  EXPECT_TRUE(buffer.InsertFrame(
    231      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    232 
    233  buffer.ExtractNextDecodableTemporalUnit();
    234  buffer.ExtractNextDecodableTemporalUnit();
    235 
    236  EXPECT_FALSE(buffer.InsertFrame(
    237      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    238  EXPECT_FALSE(buffer.InsertFrame(
    239      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    240  EXPECT_TRUE(buffer.InsertFrame(
    241      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
    242  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    243              ElementsAre(FrameWithId(3)));
    244 }
    245 
    246 TEST(FrameBuffer3Test, ReturnFullTemporalUnitKSVC) {
    247  FieldTrials field_trials = CreateTestFieldTrials();
    248  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    249                     field_trials);
    250  EXPECT_TRUE(
    251      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
    252  EXPECT_TRUE(buffer.InsertFrame(
    253      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build()));
    254  EXPECT_TRUE(buffer.InsertFrame(
    255      test::FakeFrameBuilder().Time(10).Id(3).Refs({2}).AsLast().Build()));
    256  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    257              ElementsAre(FrameWithId(1), FrameWithId(2), FrameWithId(3)));
    258 
    259  EXPECT_TRUE(buffer.InsertFrame(
    260      test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build()));
    261  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    262              ElementsAre(FrameWithId(4)));
    263 }
    264 
    265 TEST(FrameBuffer3Test, InterleavedStream) {
    266  FieldTrials field_trials = CreateTestFieldTrials();
    267  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    268                     field_trials);
    269  EXPECT_TRUE(buffer.InsertFrame(
    270      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    271  EXPECT_TRUE(buffer.InsertFrame(
    272      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
    273  EXPECT_TRUE(buffer.InsertFrame(
    274      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
    275  EXPECT_TRUE(buffer.InsertFrame(
    276      test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build()));
    277  EXPECT_TRUE(buffer.InsertFrame(
    278      test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build()));
    279 
    280  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    281              ElementsAre(FrameWithId(1)));
    282  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    283              ElementsAre(FrameWithId(2)));
    284  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    285              ElementsAre(FrameWithId(3)));
    286  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    287              ElementsAre(FrameWithId(4)));
    288  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    289              ElementsAre(FrameWithId(5)));
    290 
    291  EXPECT_TRUE(buffer.InsertFrame(
    292      test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build()));
    293  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    294              ElementsAre(FrameWithId(7)));
    295  EXPECT_FALSE(buffer.InsertFrame(
    296      test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build()));
    297  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
    298  EXPECT_TRUE(buffer.InsertFrame(
    299      test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build()));
    300  EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    301              ElementsAre(FrameWithId(9)));
    302 }
    303 
    304 TEST(FrameBuffer3Test, LegacyFrameIdJumpBehavior) {
    305  {
    306    FieldTrials field_trials =
    307        CreateTestFieldTrials("WebRTC-LegacyFrameIdJumpBehavior/Disabled/");
    308    FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    309                       field_trials);
    310 
    311    EXPECT_TRUE(buffer.InsertFrame(
    312        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
    313    EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    314                ElementsAre(FrameWithId(3)));
    315    EXPECT_FALSE(buffer.InsertFrame(
    316        test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build()));
    317    EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
    318  }
    319 
    320  {
    321    // WebRTC-LegacyFrameIdJumpBehavior is disabled by default.
    322    FieldTrials field_trials = CreateTestFieldTrials();
    323    FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    324                       field_trials);
    325 
    326    EXPECT_TRUE(buffer.InsertFrame(
    327        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
    328    EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    329                ElementsAre(FrameWithId(3)));
    330    EXPECT_FALSE(buffer.InsertFrame(
    331        test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build()));
    332    EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
    333    EXPECT_TRUE(buffer.InsertFrame(
    334        test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build()));
    335    EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
    336                ElementsAre(FrameWithId(1)));
    337  }
    338 }
    339 
    340 TEST(FrameBuffer3Test, TotalNumberOfContinuousTemporalUnits) {
    341  FieldTrials field_trials = CreateTestFieldTrials();
    342  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    343                     field_trials);
    344  EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
    345 
    346  EXPECT_TRUE(buffer.InsertFrame(
    347      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    348  EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
    349 
    350  EXPECT_TRUE(buffer.InsertFrame(
    351      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
    352  EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
    353 
    354  EXPECT_TRUE(buffer.InsertFrame(
    355      test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build()));
    356  EXPECT_TRUE(buffer.InsertFrame(
    357      test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build()));
    358  EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
    359 
    360  // Reordered
    361  EXPECT_TRUE(buffer.InsertFrame(
    362      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
    363  EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
    364 }
    365 
    366 TEST(FrameBuffer3Test, TotalNumberOfDroppedFrames) {
    367  FieldTrials field_trials = CreateTestFieldTrials();
    368  FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
    369                     field_trials);
    370  EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
    371 
    372  EXPECT_TRUE(buffer.InsertFrame(
    373      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
    374  EXPECT_TRUE(buffer.InsertFrame(
    375      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
    376  EXPECT_TRUE(buffer.InsertFrame(
    377      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
    378  EXPECT_TRUE(buffer.InsertFrame(
    379      test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build()));
    380  EXPECT_TRUE(buffer.InsertFrame(
    381      test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build()));
    382 
    383  buffer.ExtractNextDecodableTemporalUnit();
    384  EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
    385 
    386  buffer.DropNextDecodableTemporalUnit();
    387  EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
    388 
    389  buffer.ExtractNextDecodableTemporalUnit();
    390  EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
    391 }
    392 
    393 }  // namespace
    394 }  // namespace webrtc