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