blob: 39fab888aa70a3899ec90c7d32ca642b7e661652 [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 */
10#include "modules/video_coding/frame_buffer3.h"
11
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/field_trial.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
Jonas Orelande02f9ee2022-03-25 12:43:14 +010019#include "test/scoped_key_value_config.h"
philipelceac5d52021-12-07 18:13:09 +010020
21namespace webrtc {
22namespace {
23
24using ::testing::ElementsAre;
25using ::testing::Eq;
26using ::testing::IsEmpty;
27using ::testing::Matches;
28
29MATCHER_P(FrameWithId, id, "") {
30 return Matches(Eq(id))(arg->Id());
31}
32
philipelceac5d52021-12-07 18:13:09 +010033TEST(FrameBuffer3Test, RejectInvalidRefs) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010034 test::ScopedKeyValueConfig field_trials;
35 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
36 field_trials);
philipelceac5d52021-12-07 18:13:09 +010037 // Ref must be less than the id of this frame.
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020038 buffer.InsertFrame(
39 test::FakeFrameBuilder().Time(0).Id(0).Refs({0}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +010040 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
41
42 // Duplicate ids are also invalid.
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020043 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
44 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 Shrubsolea0ee64c2022-04-26 10:09:04 +020056 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
philipelceac5d52021-12-07 18:13:09 +010057 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
58 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
59
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020060 buffer.InsertFrame(
61 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +010062 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(2));
63 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
64}
65
66TEST(FrameBuffer3Test, LastContinuousFrameReordering) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010067 test::ScopedKeyValueConfig field_trials;
68 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
69 field_trials);
philipelceac5d52021-12-07 18:13:09 +010070
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020071 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
72 buffer.InsertFrame(
73 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +010074 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
75
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020076 buffer.InsertFrame(
77 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +010078 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(3));
79}
80
81TEST(FrameBuffer3Test, LastContinuousTemporalUnit) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010082 test::ScopedKeyValueConfig field_trials;
83 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
84 field_trials);
philipelceac5d52021-12-07 18:13:09 +010085
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020086 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
philipelceac5d52021-12-07 18:13:09 +010087 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020088 buffer.InsertFrame(
89 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +010090 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
91}
92
93TEST(FrameBuffer3Test, LastContinuousTemporalUnitReordering) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +010094 test::ScopedKeyValueConfig field_trials;
95 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
96 field_trials);
philipelceac5d52021-12-07 18:13:09 +010097
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +020098 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
99 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(3).Refs({1}).Build());
100 buffer.InsertFrame(
101 test::FakeFrameBuilder().Time(20).Id(4).Refs({2, 3}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100102 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
103
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200104 buffer.InsertFrame(
105 test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100106 EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(4));
107}
108
109TEST(FrameBuffer3Test, NextDecodable) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100110 test::ScopedKeyValueConfig field_trials;
111 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
112 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100113
114 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(),
115 Eq(absl::nullopt));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200116 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100117 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
118}
119
120TEST(FrameBuffer3Test, AdvanceNextDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100121 test::ScopedKeyValueConfig field_trials;
122 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
123 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100124
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200125 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
126 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
127 buffer.InsertFrame(
128 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100129 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
130
131 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
132 ElementsAre(FrameWithId(1)));
133 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(20U));
134 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
135 ElementsAre(FrameWithId(2)));
136 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(30U));
137 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
138 ElementsAre(FrameWithId(3)));
139}
140
141TEST(FrameBuffer3Test, AdvanceLastDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100142 test::ScopedKeyValueConfig field_trials;
143 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
144 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100145
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200146 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
147 buffer.InsertFrame(
148 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
149 buffer.InsertFrame(
150 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100151 EXPECT_THAT(buffer.LastDecodableTemporalUnitRtpTimestamp(), Eq(10U));
152
153 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
154 ElementsAre(FrameWithId(1)));
155 EXPECT_THAT(buffer.LastDecodableTemporalUnitRtpTimestamp(), Eq(30U));
156}
157
158TEST(FrameBuffer3Test, FrameUpdatesNextDecodable) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100159 test::ScopedKeyValueConfig field_trials;
160 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
161 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100162
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200163 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100164 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(20U));
165
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200166 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100167 EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
168}
169
170TEST(FrameBuffer3Test, KeyframeClearsFullBuffer) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100171 test::ScopedKeyValueConfig field_trials;
172 FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
173 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200174 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
175 buffer.InsertFrame(
176 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
177 buffer.InsertFrame(
178 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
179 buffer.InsertFrame(
180 test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build());
181 buffer.InsertFrame(
182 test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100183 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
184
185 // Frame buffer is full
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200186 buffer.InsertFrame(
187 test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100188 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
189
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200190 buffer.InsertFrame(test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100191 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
192}
193
194TEST(FrameBuffer3Test, DropNextDecodableTemporalUnit) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100195 test::ScopedKeyValueConfig field_trials;
196 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
197 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200198 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
199 buffer.InsertFrame(
200 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
201 buffer.InsertFrame(
202 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100203
204 buffer.ExtractNextDecodableTemporalUnit();
205 buffer.DropNextDecodableTemporalUnit();
206 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
207 ElementsAre(FrameWithId(3)));
208}
209
210TEST(FrameBuffer3Test, OldFramesAreIgnored) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100211 test::ScopedKeyValueConfig field_trials;
212 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
213 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200214 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
215 buffer.InsertFrame(
216 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100217
218 buffer.ExtractNextDecodableTemporalUnit();
219 buffer.ExtractNextDecodableTemporalUnit();
220
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200221 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
222 buffer.InsertFrame(
223 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
224 buffer.InsertFrame(
225 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100226
227 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
228 ElementsAre(FrameWithId(3)));
229}
230
231TEST(FrameBuffer3Test, ReturnFullTemporalUnitKSVC) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100232 test::ScopedKeyValueConfig field_trials;
233 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
234 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200235 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
236 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build());
237 buffer.InsertFrame(
238 test::FakeFrameBuilder().Time(10).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100239 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
240 ElementsAre(FrameWithId(1), FrameWithId(2), FrameWithId(3)));
241
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200242 buffer.InsertFrame(
243 test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100244 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
245 ElementsAre(FrameWithId(4)));
246}
247
248TEST(FrameBuffer3Test, InterleavedStream) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100249 test::ScopedKeyValueConfig field_trials;
250 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
251 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200252 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
253 buffer.InsertFrame(
254 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
255 buffer.InsertFrame(
256 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
257 buffer.InsertFrame(
258 test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build());
259 buffer.InsertFrame(
260 test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100261
262 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
263 ElementsAre(FrameWithId(1)));
264 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
265 ElementsAre(FrameWithId(2)));
266 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
267 ElementsAre(FrameWithId(3)));
268 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
269 ElementsAre(FrameWithId(4)));
270 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
271 ElementsAre(FrameWithId(5)));
272
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200273 buffer.InsertFrame(
274 test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100275 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
276 ElementsAre(FrameWithId(7)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200277 buffer.InsertFrame(
278 test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100279 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200280 buffer.InsertFrame(
281 test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100282 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
283 ElementsAre(FrameWithId(9)));
284}
285
286TEST(FrameBuffer3Test, LegacyFrameIdJumpBehavior) {
287 {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100288 test::ScopedKeyValueConfig field_trials(
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100289 "WebRTC-LegacyFrameIdJumpBehavior/Disabled/");
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100290 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
291 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100292
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200293 buffer.InsertFrame(
294 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100295 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
296 ElementsAre(FrameWithId(3)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200297 buffer.InsertFrame(
298 test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100299 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
300 }
301
302 {
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100303 // WebRTC-LegacyFrameIdJumpBehavior is disabled by default.
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100304 test::ScopedKeyValueConfig field_trials;
305 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
306 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100307
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200308 buffer.InsertFrame(
309 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100310 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
311 ElementsAre(FrameWithId(3)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200312 buffer.InsertFrame(
313 test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100314 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200315 buffer.InsertFrame(
316 test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100317 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
318 ElementsAre(FrameWithId(1)));
319 }
320}
321
322TEST(FrameBuffer3Test, TotalNumberOfContinuousTemporalUnits) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100323 test::ScopedKeyValueConfig field_trials;
324 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
325 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100326 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
327
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200328 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100329 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
330
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200331 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
philipelceac5d52021-12-07 18:13:09 +0100332 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
333
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200334 buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build());
335 buffer.InsertFrame(
336 test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100337 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
338
339 // Reordered
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200340 buffer.InsertFrame(
341 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100342 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
343}
344
345TEST(FrameBuffer3Test, TotalNumberOfDroppedFrames) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100346 test::ScopedKeyValueConfig field_trials;
347 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
348 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100349 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
350
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200351 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
352 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
353 buffer.InsertFrame(
354 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
355 buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build());
356 buffer.InsertFrame(
357 test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100358
359 buffer.ExtractNextDecodableTemporalUnit();
360 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
361
362 buffer.DropNextDecodableTemporalUnit();
363 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
364
365 buffer.ExtractNextDecodableTemporalUnit();
366 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
367}
368
369} // namespace
370} // namespace webrtc