blob: 305471ffc23597a70768b7d9672c5686de82abab [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
philipel1bcd8272022-05-03 15:21:34 +0200114 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo(), Eq(absl::nullopt));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200115 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipel1bcd8272022-05-03 15:21:34 +0200116 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100117}
118
119TEST(FrameBuffer3Test, AdvanceNextDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100120 test::ScopedKeyValueConfig field_trials;
121 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
122 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100123
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200124 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
125 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
126 buffer.InsertFrame(
127 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
philipel1bcd8272022-05-03 15:21:34 +0200128 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100129
130 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
131 ElementsAre(FrameWithId(1)));
philipel1bcd8272022-05-03 15:21:34 +0200132 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
philipelceac5d52021-12-07 18:13:09 +0100133 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
134 ElementsAre(FrameWithId(2)));
philipel1bcd8272022-05-03 15:21:34 +0200135 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(30U));
philipelceac5d52021-12-07 18:13:09 +0100136 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
137 ElementsAre(FrameWithId(3)));
138}
139
140TEST(FrameBuffer3Test, AdvanceLastDecodableOnExtraction) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100141 test::ScopedKeyValueConfig field_trials;
142 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
143 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100144
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200145 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
146 buffer.InsertFrame(
147 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
148 buffer.InsertFrame(
149 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipel1bcd8272022-05-03 15:21:34 +0200150 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100151
152 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
153 ElementsAre(FrameWithId(1)));
philipel1bcd8272022-05-03 15:21:34 +0200154 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(30U));
philipelceac5d52021-12-07 18:13:09 +0100155}
156
157TEST(FrameBuffer3Test, FrameUpdatesNextDecodable) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100158 test::ScopedKeyValueConfig field_trials;
159 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
160 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100161
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200162 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
philipel1bcd8272022-05-03 15:21:34 +0200163 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
philipelceac5d52021-12-07 18:13:09 +0100164
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200165 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipel1bcd8272022-05-03 15:21:34 +0200166 EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
philipelceac5d52021-12-07 18:13:09 +0100167}
168
169TEST(FrameBuffer3Test, KeyframeClearsFullBuffer) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100170 test::ScopedKeyValueConfig field_trials;
171 FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
172 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200173 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
174 buffer.InsertFrame(
175 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
176 buffer.InsertFrame(
177 test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
178 buffer.InsertFrame(
179 test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build());
180 buffer.InsertFrame(
181 test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100182 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
183
184 // Frame buffer is full
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200185 buffer.InsertFrame(
186 test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100187 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
188
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200189 buffer.InsertFrame(test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100190 EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
191}
192
193TEST(FrameBuffer3Test, DropNextDecodableTemporalUnit) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100194 test::ScopedKeyValueConfig field_trials;
195 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
196 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200197 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
198 buffer.InsertFrame(
199 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
200 buffer.InsertFrame(
201 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100202
203 buffer.ExtractNextDecodableTemporalUnit();
204 buffer.DropNextDecodableTemporalUnit();
205 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
206 ElementsAre(FrameWithId(3)));
207}
208
209TEST(FrameBuffer3Test, OldFramesAreIgnored) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100210 test::ScopedKeyValueConfig field_trials;
211 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
212 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200213 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
214 buffer.InsertFrame(
215 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100216
217 buffer.ExtractNextDecodableTemporalUnit();
218 buffer.ExtractNextDecodableTemporalUnit();
219
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200220 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
221 buffer.InsertFrame(
222 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
223 buffer.InsertFrame(
224 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100225
226 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
227 ElementsAre(FrameWithId(3)));
228}
229
230TEST(FrameBuffer3Test, ReturnFullTemporalUnitKSVC) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100231 test::ScopedKeyValueConfig field_trials;
232 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
233 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200234 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
235 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build());
236 buffer.InsertFrame(
237 test::FakeFrameBuilder().Time(10).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100238 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
239 ElementsAre(FrameWithId(1), FrameWithId(2), FrameWithId(3)));
240
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200241 buffer.InsertFrame(
242 test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100243 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
244 ElementsAre(FrameWithId(4)));
245}
246
247TEST(FrameBuffer3Test, InterleavedStream) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100248 test::ScopedKeyValueConfig field_trials;
249 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
250 field_trials);
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200251 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
252 buffer.InsertFrame(
253 test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
254 buffer.InsertFrame(
255 test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
256 buffer.InsertFrame(
257 test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build());
258 buffer.InsertFrame(
259 test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100260
261 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
262 ElementsAre(FrameWithId(1)));
263 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
264 ElementsAre(FrameWithId(2)));
265 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
266 ElementsAre(FrameWithId(3)));
267 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
268 ElementsAre(FrameWithId(4)));
269 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
270 ElementsAre(FrameWithId(5)));
271
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200272 buffer.InsertFrame(
273 test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100274 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
275 ElementsAre(FrameWithId(7)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200276 buffer.InsertFrame(
277 test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100278 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200279 buffer.InsertFrame(
280 test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100281 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
282 ElementsAre(FrameWithId(9)));
283}
284
285TEST(FrameBuffer3Test, LegacyFrameIdJumpBehavior) {
286 {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100287 test::ScopedKeyValueConfig field_trials(
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100288 "WebRTC-LegacyFrameIdJumpBehavior/Disabled/");
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100289 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
290 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100291
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200292 buffer.InsertFrame(
293 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100294 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
295 ElementsAre(FrameWithId(3)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200296 buffer.InsertFrame(
297 test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100298 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
299 }
300
301 {
Evan Shrubsoleb39fce82022-01-21 14:51:18 +0100302 // WebRTC-LegacyFrameIdJumpBehavior is disabled by default.
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100303 test::ScopedKeyValueConfig field_trials;
304 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
305 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100306
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200307 buffer.InsertFrame(
308 test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100309 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
310 ElementsAre(FrameWithId(3)));
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200311 buffer.InsertFrame(
312 test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100313 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200314 buffer.InsertFrame(
315 test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100316 EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
317 ElementsAre(FrameWithId(1)));
318 }
319}
320
321TEST(FrameBuffer3Test, TotalNumberOfContinuousTemporalUnits) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100322 test::ScopedKeyValueConfig field_trials;
323 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
324 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100325 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
326
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200327 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100328 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
329
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200330 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
philipelceac5d52021-12-07 18:13:09 +0100331 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
332
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200333 buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build());
334 buffer.InsertFrame(
335 test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100336 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
337
338 // Reordered
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200339 buffer.InsertFrame(
340 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100341 EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
342}
343
344TEST(FrameBuffer3Test, TotalNumberOfDroppedFrames) {
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100345 test::ScopedKeyValueConfig field_trials;
346 FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
347 field_trials);
philipelceac5d52021-12-07 18:13:09 +0100348 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
349
Evan Shrubsolea0ee64c2022-04-26 10:09:04 +0200350 buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
351 buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
352 buffer.InsertFrame(
353 test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
354 buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build());
355 buffer.InsertFrame(
356 test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build());
philipelceac5d52021-12-07 18:13:09 +0100357
358 buffer.ExtractNextDecodableTemporalUnit();
359 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
360
361 buffer.DropNextDecodableTemporalUnit();
362 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
363
364 buffer.ExtractNextDecodableTemporalUnit();
365 EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(2));
366}
367
368} // namespace
369} // namespace webrtc