tor-browser

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

frame_dependencies_calculator_unittest.cc (4891B)


      1 /*
      2 *  Copyright (c) 2020 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/frame_dependencies_calculator.h"
     12 
     13 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
     14 #include "test/gmock.h"
     15 #include "test/gtest.h"
     16 
     17 namespace webrtc {
     18 namespace {
     19 
     20 using ::testing::ElementsAre;
     21 using ::testing::IsEmpty;
     22 using ::testing::UnorderedElementsAre;
     23 
     24 constexpr CodecBufferUsage ReferenceAndUpdate(int id) {
     25  return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/true);
     26 }
     27 constexpr CodecBufferUsage Reference(int id) {
     28  return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/false);
     29 }
     30 constexpr CodecBufferUsage Update(int id) {
     31  return CodecBufferUsage(id, /*referenced=*/false, /*updated=*/true);
     32 }
     33 
     34 TEST(FrameDependenciesCalculatorTest, SingleLayer) {
     35  CodecBufferUsage pattern[] = {ReferenceAndUpdate(0)};
     36  FrameDependenciesCalculator calculator;
     37 
     38  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern), IsEmpty());
     39  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern),
     40              ElementsAre(1));
     41  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern),
     42              ElementsAre(3));
     43 }
     44 
     45 TEST(FrameDependenciesCalculatorTest, TwoTemporalLayers) {
     46  // Shortened 4-frame pattern:
     47  // T1:  2---4   6---8 ...
     48  //      /   /   /   /
     49  // T0: 1---3---5---7 ...
     50  CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)};
     51  CodecBufferUsage pattern1[] = {Reference(0), Update(1)};
     52  CodecBufferUsage pattern2[] = {ReferenceAndUpdate(0)};
     53  CodecBufferUsage pattern3[] = {Reference(0), Reference(1)};
     54  FrameDependenciesCalculator calculator;
     55 
     56  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty());
     57  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1),
     58              ElementsAre(1));
     59  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern2),
     60              ElementsAre(1));
     61  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern3),
     62              UnorderedElementsAre(2, 3));
     63  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0),
     64              ElementsAre(3));
     65  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1),
     66              ElementsAre(5));
     67  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/7, pattern2),
     68              ElementsAre(5));
     69  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/8, pattern3),
     70              UnorderedElementsAre(6, 7));
     71 }
     72 
     73 TEST(FrameDependenciesCalculatorTest, ThreeTemporalLayers4FramePattern) {
     74  // T2:   2---4   6---8 ...
     75  //      /   /   /   /
     76  // T1:  |  3    |  7   ...
     77  //      /_/     /_/
     78  // T0: 1-------5-----  ...
     79  CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)};
     80  CodecBufferUsage pattern1[] = {Reference(0), Update(2)};
     81  CodecBufferUsage pattern2[] = {Reference(0), Update(1)};
     82  CodecBufferUsage pattern3[] = {Reference(0), Reference(1), Reference(2)};
     83  FrameDependenciesCalculator calculator;
     84 
     85  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty());
     86  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1),
     87              ElementsAre(1));
     88  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern2),
     89              ElementsAre(1));
     90  // Note that frame#4 references buffer#0 that is updated by frame#1,
     91  // yet there is no direct dependency from frame#4 to frame#1.
     92  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern3),
     93              UnorderedElementsAre(2, 3));
     94  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0),
     95              ElementsAre(1));
     96  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1),
     97              ElementsAre(5));
     98 }
     99 
    100 TEST(FrameDependenciesCalculatorTest, SimulcastWith2Layers) {
    101  // S1: 2---4---6-  ...
    102  //
    103  // S0: 1---3---5-  ...
    104  CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)};
    105  CodecBufferUsage pattern1[] = {ReferenceAndUpdate(1)};
    106  FrameDependenciesCalculator calculator;
    107 
    108  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty());
    109  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1), IsEmpty());
    110  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern0),
    111              ElementsAre(1));
    112  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern1),
    113              ElementsAre(2));
    114  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0),
    115              ElementsAre(3));
    116  EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1),
    117              ElementsAre(4));
    118 }
    119 
    120 }  // namespace
    121 }  // namespace webrtc