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