xref: /aosp_15_r20/external/webrtc/modules/video_coding/frame_dependencies_calculator_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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 
ReferenceAndUpdate(int id)24 constexpr CodecBufferUsage ReferenceAndUpdate(int id) {
25   return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/true);
26 }
Reference(int id)27 constexpr CodecBufferUsage Reference(int id) {
28   return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/false);
29 }
Update(int id)30 constexpr CodecBufferUsage Update(int id) {
31   return CodecBufferUsage(id, /*referenced=*/false, /*updated=*/true);
32 }
33 
TEST(FrameDependenciesCalculatorTest,SingleLayer)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 
TEST(FrameDependenciesCalculatorTest,TwoTemporalLayers)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 
TEST(FrameDependenciesCalculatorTest,ThreeTemporalLayers4FramePattern)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 
TEST(FrameDependenciesCalculatorTest,SimulcastWith2Layers)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
122