blob: 92e2f67540b7242ce237fff000db0324d391beaa [file] [log] [blame]
philipelceac5d52021-12-07 18:13:09 +01001/*
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 */
philipel8615bf02022-05-05 15:12:13 +020010#include "api/video/frame_buffer.h"
philipelceac5d52021-12-07 18:13:09 +010011
12#include <vector>
13
14#include "api/video/encoded_frame.h"
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020015#include "test/fake_encoded_frame.h"
philipelceac5d52021-12-07 18:13:09 +010016#include "test/gmock.h"
17#include "test/gtest.h"
Jonas Orelande02f9ee2022-03-25 12:43:14 +010018#include "test/scoped_key_value_config.h"
philipelceac5d52021-12-07 18:13:09 +010019
20namespace webrtc {
21namespace {
22
23using ::testing::ElementsAre;
24using ::testing::Eq;
25using ::testing::IsEmpty;
26using ::testing::Matches;
27
28MATCHER_P(FrameWithId, id, "") {
29 return Matches(Eq(id))(arg->Id());
30}
31
philipelceac5d52021-12-07 18:13:09 +010032TEST(FrameBuffer3Test, RejectInvalidRefs) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010033 test::ScopedKeyValueConfig field_trials;
34 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
35 field_trials);
philipelceac5d52021-12-07 18:13:09 +010036 // Ref must be less than the id of this frame.
Evan Shrubsole66fcd162022-06-15 08:25:22 +000037 EXPECT_FALSE(buffer.InsertFrame(
38 test::FakeFrameBuilder().Time(0).Id(0).Refs({0}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010039 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
40
41 // Duplicate ids are also invalid.
Evan Shrubsole66fcd162022-06-15 08:25:22 +000042 EXPECT_TRUE(buffer.InsertFrame(
43 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
44 EXPECT_FALSE(buffer.InsertFrame(
45 test::FakeFrameBuilder().Time(20).Id(2).Refs({1, 1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010046 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
47}
48
49TEST(FrameBuffer3Test, LastContinuousUpdatesOnInsertedFrames) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010050 test::ScopedKeyValueConfig field_trials;
51 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
52 field_trials);
philipelceac5d52021-12-07 18:13:09 +010053 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
54 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
55
Evan Shrubsole66fcd162022-06-15 08:25:22 +000056 EXPECT_TRUE(
57 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
philipelceac5d52021-12-07 18:13:09 +010058 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
59 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
60
Evan Shrubsole66fcd162022-06-15 08:25:22 +000061 EXPECT_TRUE(buffer.InsertFrame(
62 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010063 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(2));
64 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
65}
66
67TEST(FrameBuffer3Test, LastContinuousFrameReordering) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010068 test::ScopedKeyValueConfig field_trials;
69 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
70 field_trials);
philipelceac5d52021-12-07 18:13:09 +010071
Evan Shrubsole66fcd162022-06-15 08:25:22 +000072 EXPECT_TRUE(buffer.InsertFrame(
73 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
74 EXPECT_TRUE(buffer.InsertFrame(
75 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010076 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
77
Evan Shrubsole66fcd162022-06-15 08:25:22 +000078 EXPECT_TRUE(buffer.InsertFrame(
79 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010080 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(3));
81}
82
83TEST(FrameBuffer3Test, LastContinuousTemporalUnit) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010084 test::ScopedKeyValueConfig field_trials;
85 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
86 field_trials);
philipelceac5d52021-12-07 18:13:09 +010087
Evan Shrubsole66fcd162022-06-15 08:25:22 +000088 EXPECT_TRUE(
89 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
philipelceac5d52021-12-07 18:13:09 +010090 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
Evan Shrubsole66fcd162022-06-15 08:25:22 +000091 EXPECT_TRUE(buffer.InsertFrame(
92 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +010093 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
94}
95
96TEST(FrameBuffer3Test, LastContinuousTemporalUnitReordering) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010097 test::ScopedKeyValueConfig field_trials;
98 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
99 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100100
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000101 EXPECT_TRUE(
102 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
103 EXPECT_TRUE(buffer.InsertFrame(
104 test::FakeFrameBuilder().Time(20).Id(3).Refs({1}).Build()));
105 EXPECT_TRUE(buffer.InsertFrame(
106 test::FakeFrameBuilder().Time(20).Id(4).Refs({2, 3}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100107 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
108
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000109 EXPECT_TRUE(buffer.InsertFrame(
110 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100111 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(4));
112}
113
114TEST(FrameBuffer3Test, NextDecodable) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100115 test::ScopedKeyValueConfig field_trials;
116 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
117 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100118
philipel1bcd8272022-05-03 15:21:34 +0200119 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo(), Eq(absl::nullopt));
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000120 EXPECT_TRUE(buffer.InsertFrame(
121 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
philipel1bcd8272022-05-03 15:21:34 +0200122 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100123}
124
125TEST(FrameBuffer3Test, AdvanceNextDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100126 test::ScopedKeyValueConfig field_trials;
127 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
128 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100129
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000130 EXPECT_TRUE(buffer.InsertFrame(
131 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
132 EXPECT_TRUE(buffer.InsertFrame(
133 test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
134 EXPECT_TRUE(buffer.InsertFrame(
135 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
philipel1bcd8272022-05-03 15:21:34 +0200136 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100137
138 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
139 ElementsAre(FrameWithId(1)));
philipel1bcd8272022-05-03 15:21:34 +0200140 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
philipelceac5d52021-12-07 18:13:09 +0100141 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
142 ElementsAre(FrameWithId(2)));
philipel1bcd8272022-05-03 15:21:34 +0200143 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(30U));
philipelceac5d52021-12-07 18:13:09 +0100144 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
145 ElementsAre(FrameWithId(3)));
146}
147
148TEST(FrameBuffer3Test, AdvanceLastDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100149 test::ScopedKeyValueConfig field_trials;
150 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
151 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100152
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000153 EXPECT_TRUE(buffer.InsertFrame(
154 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
155 EXPECT_TRUE(buffer.InsertFrame(
156 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
157 EXPECT_TRUE(buffer.InsertFrame(
158 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
philipel1bcd8272022-05-03 15:21:34 +0200159 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100160
161 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
162 ElementsAre(FrameWithId(1)));
philipel1bcd8272022-05-03 15:21:34 +0200163 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(30U));
philipelceac5d52021-12-07 18:13:09 +0100164}
165
166TEST(FrameBuffer3Test, FrameUpdatesNextDecodable) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100167 test::ScopedKeyValueConfig field_trials;
168 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
169 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100170
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000171 EXPECT_TRUE(buffer.InsertFrame(
172 test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
philipel1bcd8272022-05-03 15:21:34 +0200173 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
philipelceac5d52021-12-07 18:13:09 +0100174
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000175 EXPECT_TRUE(buffer.InsertFrame(
176 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
philipel1bcd8272022-05-03 15:21:34 +0200177 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100178}
179
180TEST(FrameBuffer3Test, KeyframeClearsFullBuffer) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100181 test::ScopedKeyValueConfig field_trials;
182 FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
183 field_trials);
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000184 EXPECT_TRUE(buffer.InsertFrame(
185 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
186 EXPECT_TRUE(buffer.InsertFrame(
187 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
188 EXPECT_TRUE(buffer.InsertFrame(
189 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
190 EXPECT_TRUE(buffer.InsertFrame(
191 test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build()));
192 EXPECT_TRUE(buffer.InsertFrame(
193 test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100194 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
195
196 // Frame buffer is full
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000197 EXPECT_FALSE(buffer.InsertFrame(
198 test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100199 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
200
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000201 EXPECT_TRUE(buffer.InsertFrame(
202 test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100203 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
204}
205
206TEST(FrameBuffer3Test, DropNextDecodableTemporalUnit) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100207 test::ScopedKeyValueConfig field_trials;
208 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
209 field_trials);
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000210 EXPECT_TRUE(buffer.InsertFrame(
211 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
212 EXPECT_TRUE(buffer.InsertFrame(
213 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
214 EXPECT_TRUE(buffer.InsertFrame(
215 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100216
217 buffer.ExtractNextDecodableTemporalUnit();
218 buffer.DropNextDecodableTemporalUnit();
219 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
220 ElementsAre(FrameWithId(3)));
221}
222
223TEST(FrameBuffer3Test, OldFramesAreIgnored) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100224 test::ScopedKeyValueConfig field_trials;
225 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
226 field_trials);
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000227 EXPECT_TRUE(buffer.InsertFrame(
228 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
229 EXPECT_TRUE(buffer.InsertFrame(
230 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100231
232 buffer.ExtractNextDecodableTemporalUnit();
233 buffer.ExtractNextDecodableTemporalUnit();
234
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000235 EXPECT_FALSE(buffer.InsertFrame(
236 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
237 EXPECT_FALSE(buffer.InsertFrame(
238 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
239 EXPECT_TRUE(buffer.InsertFrame(
240 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100241 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
242 ElementsAre(FrameWithId(3)));
243}
244
245TEST(FrameBuffer3Test, ReturnFullTemporalUnitKSVC) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100246 test::ScopedKeyValueConfig field_trials;
247 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
248 field_trials);
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000249 EXPECT_TRUE(
250 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
251 EXPECT_TRUE(buffer.InsertFrame(
252 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build()));
253 EXPECT_TRUE(buffer.InsertFrame(
254 test::FakeFrameBuilder().Time(10).Id(3).Refs({2}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100255 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
256 ElementsAre(FrameWithId(1), FrameWithId(2), FrameWithId(3)));
257
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000258 EXPECT_TRUE(buffer.InsertFrame(
259 test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100260 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
261 ElementsAre(FrameWithId(4)));
262}
263
264TEST(FrameBuffer3Test, InterleavedStream) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100265 test::ScopedKeyValueConfig field_trials;
266 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
267 field_trials);
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000268 EXPECT_TRUE(buffer.InsertFrame(
269 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
270 EXPECT_TRUE(buffer.InsertFrame(
271 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
272 EXPECT_TRUE(buffer.InsertFrame(
273 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
274 EXPECT_TRUE(buffer.InsertFrame(
275 test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build()));
276 EXPECT_TRUE(buffer.InsertFrame(
277 test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100278
279 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
280 ElementsAre(FrameWithId(1)));
281 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
282 ElementsAre(FrameWithId(2)));
283 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
284 ElementsAre(FrameWithId(3)));
285 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
286 ElementsAre(FrameWithId(4)));
287 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
288 ElementsAre(FrameWithId(5)));
289
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000290 EXPECT_TRUE(buffer.InsertFrame(
291 test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100292 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
293 ElementsAre(FrameWithId(7)));
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000294 EXPECT_FALSE(buffer.InsertFrame(
295 test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100296 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000297 EXPECT_TRUE(buffer.InsertFrame(
298 test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100299 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
300 ElementsAre(FrameWithId(9)));
301}
302
303TEST(FrameBuffer3Test, LegacyFrameIdJumpBehavior) {
304 {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100305 test::ScopedKeyValueConfig field_trials(
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100306 "WebRTC-LegacyFrameIdJumpBehavior/Disabled/");
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100307 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
308 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100309
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000310 EXPECT_TRUE(buffer.InsertFrame(
311 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100312 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
313 ElementsAre(FrameWithId(3)));
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000314 EXPECT_FALSE(buffer.InsertFrame(
315 test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100316 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
317 }
318
319 {
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100320 // WebRTC-LegacyFrameIdJumpBehavior is disabled by default.
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100321 test::ScopedKeyValueConfig field_trials;
322 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
323 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100324
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000325 EXPECT_TRUE(buffer.InsertFrame(
326 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100327 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
328 ElementsAre(FrameWithId(3)));
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000329 EXPECT_FALSE(buffer.InsertFrame(
330 test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100331 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000332 EXPECT_TRUE(buffer.InsertFrame(
333 test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100334 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
335 ElementsAre(FrameWithId(1)));
336 }
337}
338
339TEST(FrameBuffer3Test, TotalNumberOfContinuousTemporalUnits) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100340 test::ScopedKeyValueConfig field_trials;
341 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
342 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100343 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
344
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000345 EXPECT_TRUE(buffer.InsertFrame(
346 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100347 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
348
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000349 EXPECT_TRUE(buffer.InsertFrame(
350 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
philipelceac5d52021-12-07 18:13:09 +0100351 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
352
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000353 EXPECT_TRUE(buffer.InsertFrame(
354 test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build()));
355 EXPECT_TRUE(buffer.InsertFrame(
356 test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100357 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
358
359 // Reordered
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000360 EXPECT_TRUE(buffer.InsertFrame(
361 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100362 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
363}
364
365TEST(FrameBuffer3Test, TotalNumberOfDroppedFrames) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100366 test::ScopedKeyValueConfig field_trials;
367 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
368 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100369 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
370
Evan Shrubsole66fcd162022-06-15 08:25:22 +0000371 EXPECT_TRUE(buffer.InsertFrame(
372 test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
373 EXPECT_TRUE(buffer.InsertFrame(
374 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
375 EXPECT_TRUE(buffer.InsertFrame(
376 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
377 EXPECT_TRUE(buffer.InsertFrame(
378 test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build()));
379 EXPECT_TRUE(buffer.InsertFrame(
380 test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build()));
philipelceac5d52021-12-07 18:13:09 +0100381
382 buffer.ExtractNextDecodableTemporalUnit();
383 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
384
385 buffer.DropNextDecodableTemporalUnit();
386 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
387
388 buffer.ExtractNextDecodableTemporalUnit();
389 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
390}
391
392} // namespace
393} // namespace webrtc