blob: 425542c949c0365222e4aca04b5f1c6713b8a68d [file] [log] [blame]
philipelc707ab72016-04-01 02:01:54 -07001/*
2 * Copyright (c) 2016 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
11#include <cstring>
philipel02447bc2016-05-13 06:01:03 -070012#include <map>
13#include <set>
philipela1059872016-05-09 11:41:48 +020014#include <utility>
philipelc707ab72016-04-01 02:01:54 -070015
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "common_video/h264/h264_common.h"
17#include "modules/video_coding/frame_object.h"
18#include "modules/video_coding/packet_buffer.h"
19#include "rtc_base/random.h"
20#include "system_wrappers/include/clock.h"
Rasmus Brandtedf4ff72017-10-24 10:07:48 +020021#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "test/gtest.h"
philipelc707ab72016-04-01 02:01:54 -070023
24namespace webrtc {
25namespace video_coding {
26
27class TestPacketBuffer : public ::testing::Test,
philipel17deeb42016-08-11 15:09:26 +020028 public OnReceivedFrameCallback {
philipelc707ab72016-04-01 02:01:54 -070029 protected:
Rasmus Brandt88f080a2017-11-02 14:28:06 +010030 TestPacketBuffer() : TestPacketBuffer("") {}
31 explicit TestPacketBuffer(std::string field_trials)
32 : scoped_field_trials_(field_trials),
33 rand_(0x7732213),
philipelb4d31082016-07-11 08:46:29 -070034 clock_(new SimulatedClock(0)),
philipel17deeb42016-08-11 15:09:26 +020035 packet_buffer_(
36 PacketBuffer::Create(clock_.get(), kStartSize, kMaxSize, this)) {}
philipelc707ab72016-04-01 02:01:54 -070037
philipel17deeb42016-08-11 15:09:26 +020038 uint16_t Rand() { return rand_.Rand<uint16_t>(); }
philipelc707ab72016-04-01 02:01:54 -070039
philipel17deeb42016-08-11 15:09:26 +020040 void OnReceivedFrame(std::unique_ptr<RtpFrameObject> frame) override {
41 uint16_t first_seq_num = frame->first_seq_num();
42 if (frames_from_callback_.find(first_seq_num) !=
43 frames_from_callback_.end()) {
44 ADD_FAILURE() << "Already received frame with first sequence number "
45 << first_seq_num << ".";
philipelf4139332016-04-20 10:26:34 +020046 return;
47 }
philipel2c9f9f22017-06-13 02:47:28 -070048
philipelf4139332016-04-20 10:26:34 +020049 frames_from_callback_.insert(
philipel17deeb42016-08-11 15:09:26 +020050 std::make_pair(frame->first_seq_num(), std::move(frame)));
philipelc707ab72016-04-01 02:01:54 -070051 }
52
philipel17deeb42016-08-11 15:09:26 +020053 enum IsKeyFrame { kKeyFrame, kDeltaFrame };
54 enum IsFirst { kFirst, kNotFirst };
55 enum IsLast { kLast, kNotLast };
philipelc707ab72016-04-01 02:01:54 -070056
Ilya Nikolaevskiyd397a0d2018-02-21 15:57:09 +010057 bool Insert(uint16_t seq_num, // packet sequence number
58 IsKeyFrame keyframe, // is keyframe
59 IsFirst first, // is first packet of frame
60 IsLast last, // is last packet of frame
61 int data_size = 0, // size of data
62 uint8_t* data = nullptr, // data pointer
63 uint32_t timestamp = 123u) { // rtp timestamp
philipelf4139332016-04-20 10:26:34 +020064 VCMPacket packet;
65 packet.codec = kVideoCodecGeneric;
Ilya Nikolaevskiyd397a0d2018-02-21 15:57:09 +010066 packet.timestamp = timestamp;
philipelf4139332016-04-20 10:26:34 +020067 packet.seqNum = seq_num;
philipel3184f8e2017-05-18 08:08:53 -070068 packet.frameType =
69 keyframe == kKeyFrame ? kVideoFrameKey : kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -080070 packet.is_first_packet_in_frame = first == kFirst;
philipelef615ea2018-09-13 11:07:48 +020071 packet.is_last_packet_in_frame = last == kLast;
philipelf4139332016-04-20 10:26:34 +020072 packet.sizeBytes = data_size;
73 packet.dataPtr = data;
74
philipel759e0b72016-11-30 01:32:05 -080075 return packet_buffer_->InsertPacket(&packet);
philipelf4139332016-04-20 10:26:34 +020076 }
77
philipel17deeb42016-08-11 15:09:26 +020078 void CheckFrame(uint16_t first_seq_num) {
79 auto frame_it = frames_from_callback_.find(first_seq_num);
80 ASSERT_FALSE(frame_it == frames_from_callback_.end())
81 << "Could not find frame with first sequence number " << first_seq_num
82 << ".";
philipelf4139332016-04-20 10:26:34 +020083 }
84
Johannes Kron957c62e2018-10-01 14:53:01 +020085 void DeleteFrame(uint16_t first_seq_num) {
86 auto frame_it = frames_from_callback_.find(first_seq_num);
87 ASSERT_FALSE(frame_it == frames_from_callback_.end())
88 << "Could not find frame with first sequence number " << first_seq_num
89 << ".";
90 frames_from_callback_.erase(frame_it);
91 }
92
philipel227f8b92017-08-04 06:39:31 -070093 static constexpr int kStartSize = 16;
94 static constexpr int kMaxSize = 64;
philipelc707ab72016-04-01 02:01:54 -070095
Rasmus Brandt88f080a2017-11-02 14:28:06 +010096 const test::ScopedFieldTrials scoped_field_trials_;
97
philipelc707ab72016-04-01 02:01:54 -070098 Random rand_;
philipel3184f8e2017-05-18 08:08:53 -070099 std::unique_ptr<SimulatedClock> clock_;
philipel17deeb42016-08-11 15:09:26 +0200100 rtc::scoped_refptr<PacketBuffer> packet_buffer_;
101 std::map<uint16_t, std::unique_ptr<RtpFrameObject>> frames_from_callback_;
philipelc707ab72016-04-01 02:01:54 -0700102};
103
104TEST_F(TestPacketBuffer, InsertOnePacket) {
philipelaee3e0e2016-11-01 11:45:34 +0100105 const uint16_t seq_num = Rand();
106 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700107}
108
109TEST_F(TestPacketBuffer, InsertMultiplePackets) {
philipelaee3e0e2016-11-01 11:45:34 +0100110 const uint16_t seq_num = Rand();
111 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
112 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast));
113 EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kFirst, kLast));
114 EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700115}
116
117TEST_F(TestPacketBuffer, InsertDuplicatePacket) {
philipelaee3e0e2016-11-01 11:45:34 +0100118 const uint16_t seq_num = Rand();
119 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
120 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
121}
122
Artem Titarenko03c592a2018-09-24 11:22:17 +0200123#if defined(WEBRTC_ANDROID)
124// Fails on android after clang update
125// TODO(crbug.com/887464): Reenable this
126#define MAYBE_SeqNumWrapOneFrame DISABLED_SeqNumWrapOneFrame
127#else
128#define MAYBE_SeqNumWrapOneFrame SeqNumWrapOneFrame
129#endif
130TEST_F(TestPacketBuffer, MAYBE_SeqNumWrapOneFrame) {
philipel2c2f34c2017-01-03 05:55:34 -0800131 EXPECT_TRUE(Insert(0xFFFF, kKeyFrame, kFirst, kNotLast));
132 EXPECT_TRUE(Insert(0x0, kKeyFrame, kNotFirst, kLast));
133
134 CheckFrame(0xFFFF);
135}
136
137TEST_F(TestPacketBuffer, SeqNumWrapTwoFrames) {
philipelaee3e0e2016-11-01 11:45:34 +0100138 EXPECT_TRUE(Insert(0xFFFF, kKeyFrame, kFirst, kLast));
139 EXPECT_TRUE(Insert(0x0, kKeyFrame, kFirst, kLast));
140
141 CheckFrame(0xFFFF);
philipel2c2f34c2017-01-03 05:55:34 -0800142 CheckFrame(0x0);
philipelaee3e0e2016-11-01 11:45:34 +0100143}
144
145TEST_F(TestPacketBuffer, InsertOldPackets) {
146 const uint16_t seq_num = Rand();
147
148 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
149 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
150 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast));
151 ASSERT_EQ(2UL, frames_from_callback_.size());
152
153 frames_from_callback_.erase(seq_num + 2);
154 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
155 ASSERT_EQ(1UL, frames_from_callback_.size());
156
157 frames_from_callback_.erase(frames_from_callback_.find(seq_num));
158 ASSERT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
159 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
160
161 packet_buffer_->ClearTo(seq_num + 2);
162 EXPECT_FALSE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
163 EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
164 ASSERT_EQ(2UL, frames_from_callback_.size());
philipelc707ab72016-04-01 02:01:54 -0700165}
166
philipel5ceaaae2016-05-24 10:20:47 +0200167TEST_F(TestPacketBuffer, NackCount) {
philipelaee3e0e2016-11-01 11:45:34 +0100168 const uint16_t seq_num = Rand();
philipel5ceaaae2016-05-24 10:20:47 +0200169
170 VCMPacket packet;
171 packet.codec = kVideoCodecGeneric;
172 packet.seqNum = seq_num;
173 packet.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800174 packet.is_first_packet_in_frame = true;
philipelef615ea2018-09-13 11:07:48 +0200175 packet.is_last_packet_in_frame = false;
philipel5ceaaae2016-05-24 10:20:47 +0200176 packet.timesNacked = 0;
177
philipel759e0b72016-11-30 01:32:05 -0800178 packet_buffer_->InsertPacket(&packet);
philipel5ceaaae2016-05-24 10:20:47 +0200179
180 packet.seqNum++;
johan0d1b2b62017-01-10 04:21:35 -0800181 packet.is_first_packet_in_frame = false;
philipel5ceaaae2016-05-24 10:20:47 +0200182 packet.timesNacked = 1;
philipel759e0b72016-11-30 01:32:05 -0800183 packet_buffer_->InsertPacket(&packet);
philipel5ceaaae2016-05-24 10:20:47 +0200184
185 packet.seqNum++;
186 packet.timesNacked = 3;
philipel759e0b72016-11-30 01:32:05 -0800187 packet_buffer_->InsertPacket(&packet);
philipel5ceaaae2016-05-24 10:20:47 +0200188
189 packet.seqNum++;
philipelef615ea2018-09-13 11:07:48 +0200190 packet.is_last_packet_in_frame = true;
philipel5ceaaae2016-05-24 10:20:47 +0200191 packet.timesNacked = 1;
philipel759e0b72016-11-30 01:32:05 -0800192 packet_buffer_->InsertPacket(&packet);
philipel5ceaaae2016-05-24 10:20:47 +0200193
philipel5ceaaae2016-05-24 10:20:47 +0200194 ASSERT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200195 RtpFrameObject* frame = frames_from_callback_.begin()->second.get();
196 EXPECT_EQ(3, frame->times_nacked());
philipel5ceaaae2016-05-24 10:20:47 +0200197}
198
199TEST_F(TestPacketBuffer, FrameSize) {
philipelaee3e0e2016-11-01 11:45:34 +0100200 const uint16_t seq_num = Rand();
philipel41b8ca02016-11-07 15:42:24 +0100201 uint8_t* data1 = new uint8_t[5]();
202 uint8_t* data2 = new uint8_t[5]();
203 uint8_t* data3 = new uint8_t[5]();
204 uint8_t* data4 = new uint8_t[5]();
philipel5ceaaae2016-05-24 10:20:47 +0200205
philipel41b8ca02016-11-07 15:42:24 +0100206 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast, 5, data1));
207 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast, 5, data2));
208 EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kNotLast, 5, data3));
209 EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kNotFirst, kLast, 5, data4));
philipel5ceaaae2016-05-24 10:20:47 +0200210
211 ASSERT_EQ(1UL, frames_from_callback_.size());
nisse37abf532016-10-28 00:37:29 -0700212 EXPECT_EQ(20UL, frames_from_callback_.begin()->second->size());
philipel5ceaaae2016-05-24 10:20:47 +0200213}
214
Ilya Nikolaevskiyd397a0d2018-02-21 15:57:09 +0100215TEST_F(TestPacketBuffer, CountsUniqueFrames) {
216 const uint16_t seq_num = Rand();
217
218 ASSERT_EQ(0, packet_buffer_->GetUniqueFramesSeen());
219
220 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast, 0, nullptr, 100));
221 ASSERT_EQ(1, packet_buffer_->GetUniqueFramesSeen());
222 // Still the same frame.
223 EXPECT_TRUE(
224 Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast, 0, nullptr, 100));
225 ASSERT_EQ(1, packet_buffer_->GetUniqueFramesSeen());
226
227 // Second frame.
228 EXPECT_TRUE(
229 Insert(seq_num + 2, kKeyFrame, kFirst, kNotLast, 0, nullptr, 200));
230 ASSERT_EQ(2, packet_buffer_->GetUniqueFramesSeen());
231 EXPECT_TRUE(
232 Insert(seq_num + 3, kKeyFrame, kNotFirst, kLast, 0, nullptr, 200));
233 ASSERT_EQ(2, packet_buffer_->GetUniqueFramesSeen());
234
235 // Old packet.
236 EXPECT_TRUE(
237 Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast, 0, nullptr, 100));
238 ASSERT_EQ(2, packet_buffer_->GetUniqueFramesSeen());
239
240 // Missing middle packet.
241 EXPECT_TRUE(
242 Insert(seq_num + 4, kKeyFrame, kFirst, kNotLast, 0, nullptr, 300));
243 EXPECT_TRUE(
244 Insert(seq_num + 6, kKeyFrame, kNotFirst, kLast, 0, nullptr, 300));
245 ASSERT_EQ(3, packet_buffer_->GetUniqueFramesSeen());
246}
247
248TEST_F(TestPacketBuffer, HasHistoryOfUniqueFrames) {
249 const int kNumFrames = 1500;
250 const int kRequiredHistoryLength = 1000;
251 const uint16_t seq_num = Rand();
252 const uint32_t timestamp = 0xFFFFFFF0; // Large enough to cause wrap-around.
253
254 for (int i = 0; i < kNumFrames; ++i) {
255 EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kNotLast, 0, nullptr,
256 timestamp + 10 * i));
257 }
258 ASSERT_EQ(kNumFrames, packet_buffer_->GetUniqueFramesSeen());
259
260 // Old packets within history should not affect number of seen unique frames.
261 for (int i = kNumFrames - kRequiredHistoryLength; i < kNumFrames; ++i) {
262 EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kNotLast, 0, nullptr,
263 timestamp + 10 * i));
264 }
265 ASSERT_EQ(kNumFrames, packet_buffer_->GetUniqueFramesSeen());
266
267 // Very old packets should be treated as unique.
268 EXPECT_TRUE(
269 Insert(seq_num, kKeyFrame, kFirst, kNotLast, 0, nullptr, timestamp));
270 ASSERT_EQ(kNumFrames + 1, packet_buffer_->GetUniqueFramesSeen());
271}
272
philipelc707ab72016-04-01 02:01:54 -0700273TEST_F(TestPacketBuffer, ExpandBuffer) {
philipelaee3e0e2016-11-01 11:45:34 +0100274 const uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700275
276 for (int i = 0; i < kStartSize + 1; ++i) {
philipelaee3e0e2016-11-01 11:45:34 +0100277 EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700278 }
279}
280
philipelaee3e0e2016-11-01 11:45:34 +0100281TEST_F(TestPacketBuffer, SingleFrameExpandsBuffer) {
282 const uint16_t seq_num = Rand();
283
284 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
285 for (int i = 1; i < kStartSize; ++i)
286 EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kNotFirst, kNotLast));
287 EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kNotFirst, kLast));
288
289 ASSERT_EQ(1UL, frames_from_callback_.size());
290 CheckFrame(seq_num);
291}
292
philipelc707ab72016-04-01 02:01:54 -0700293TEST_F(TestPacketBuffer, ExpandBufferOverflow) {
philipelaee3e0e2016-11-01 11:45:34 +0100294 const uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700295
philipelaee3e0e2016-11-01 11:45:34 +0100296 for (int i = 0; i < kMaxSize; ++i)
297 EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast));
philipelc703dc22017-03-23 06:50:37 -0700298 EXPECT_TRUE(Insert(seq_num + kMaxSize + 1, kKeyFrame, kFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700299}
300
philipel17deeb42016-08-11 15:09:26 +0200301TEST_F(TestPacketBuffer, OnePacketOneFrame) {
philipelaee3e0e2016-11-01 11:45:34 +0100302 const uint16_t seq_num = Rand();
303 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200304 ASSERT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200305 CheckFrame(seq_num);
philipelc707ab72016-04-01 02:01:54 -0700306}
307
philipel17deeb42016-08-11 15:09:26 +0200308TEST_F(TestPacketBuffer, TwoPacketsTwoFrames) {
philipelaee3e0e2016-11-01 11:45:34 +0100309 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200310
philipelaee3e0e2016-11-01 11:45:34 +0100311 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
312 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200313
philipelc707ab72016-04-01 02:01:54 -0700314 EXPECT_EQ(2UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200315 CheckFrame(seq_num);
316 CheckFrame(seq_num + 1);
philipelc707ab72016-04-01 02:01:54 -0700317}
318
philipel17deeb42016-08-11 15:09:26 +0200319TEST_F(TestPacketBuffer, TwoPacketsOneFrames) {
philipelaee3e0e2016-11-01 11:45:34 +0100320 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200321
philipelaee3e0e2016-11-01 11:45:34 +0100322 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
323 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200324
philipelc707ab72016-04-01 02:01:54 -0700325 EXPECT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200326 CheckFrame(seq_num);
philipelc707ab72016-04-01 02:01:54 -0700327}
328
philipel17deeb42016-08-11 15:09:26 +0200329TEST_F(TestPacketBuffer, ThreePacketReorderingOneFrame) {
philipelaee3e0e2016-11-01 11:45:34 +0100330 const uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700331
philipelaee3e0e2016-11-01 11:45:34 +0100332 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
333 EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kLast));
334 EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast));
philipelf4139332016-04-20 10:26:34 +0200335
philipelc707ab72016-04-01 02:01:54 -0700336 EXPECT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200337 CheckFrame(seq_num);
philipelc707ab72016-04-01 02:01:54 -0700338}
339
philipel17deeb42016-08-11 15:09:26 +0200340TEST_F(TestPacketBuffer, Frames) {
philipelaee3e0e2016-11-01 11:45:34 +0100341 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200342
philipelaee3e0e2016-11-01 11:45:34 +0100343 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
344 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast));
345 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
346 EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200347
348 ASSERT_EQ(4UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200349 CheckFrame(seq_num);
350 CheckFrame(seq_num + 1);
351 CheckFrame(seq_num + 2);
352 CheckFrame(seq_num + 3);
philipelf4139332016-04-20 10:26:34 +0200353}
354
philipelaee3e0e2016-11-01 11:45:34 +0100355TEST_F(TestPacketBuffer, ClearSinglePacket) {
356 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200357
philipelaee3e0e2016-11-01 11:45:34 +0100358 for (int i = 0; i < kMaxSize; ++i)
359 EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kFirst, kLast));
360
361 packet_buffer_->ClearTo(seq_num);
362 EXPECT_TRUE(Insert(seq_num + kMaxSize, kDeltaFrame, kFirst, kLast));
363}
364
philipelc5fb4682017-08-02 04:28:57 -0700365TEST_F(TestPacketBuffer, ClearFullBuffer) {
366 for (int i = 0; i < kMaxSize; ++i)
367 EXPECT_TRUE(Insert(i, kDeltaFrame, kFirst, kLast));
368
369 packet_buffer_->ClearTo(kMaxSize - 1);
370
371 for (int i = kMaxSize; i < 2 * kMaxSize; ++i)
372 EXPECT_TRUE(Insert(i, kDeltaFrame, kFirst, kLast));
373}
374
375TEST_F(TestPacketBuffer, DontClearNewerPacket) {
376 EXPECT_TRUE(Insert(0, kKeyFrame, kFirst, kLast));
377 packet_buffer_->ClearTo(0);
378 EXPECT_TRUE(Insert(2 * kStartSize, kKeyFrame, kFirst, kLast));
379 EXPECT_TRUE(Insert(3 * kStartSize + 1, kKeyFrame, kFirst, kNotLast));
380 packet_buffer_->ClearTo(2 * kStartSize);
381 EXPECT_TRUE(Insert(3 * kStartSize + 2, kKeyFrame, kNotFirst, kLast));
382
383 ASSERT_EQ(3UL, frames_from_callback_.size());
384 CheckFrame(0);
385 CheckFrame(2 * kStartSize);
386 CheckFrame(3 * kStartSize + 1);
387}
388
philipelaee3e0e2016-11-01 11:45:34 +0100389TEST_F(TestPacketBuffer, OneIncompleteFrame) {
390 const uint16_t seq_num = Rand();
391
392 EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast));
393 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kLast));
394 EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast));
395
396 ASSERT_EQ(1UL, frames_from_callback_.size());
397 CheckFrame(seq_num);
398}
399
400TEST_F(TestPacketBuffer, TwoIncompleteFramesFullBuffer) {
401 const uint16_t seq_num = Rand();
402
403 for (int i = 1; i < kMaxSize - 1; ++i)
404 EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kNotFirst, kNotLast));
405 EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast));
406 EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast));
407
408 ASSERT_EQ(0UL, frames_from_callback_.size());
409}
410
411TEST_F(TestPacketBuffer, FramesReordered) {
412 const uint16_t seq_num = Rand();
413
414 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast));
415 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
416 EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
417 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200418
419 ASSERT_EQ(4UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200420 CheckFrame(seq_num);
421 CheckFrame(seq_num + 1);
422 CheckFrame(seq_num + 2);
423 CheckFrame(seq_num + 3);
philipelf4139332016-04-20 10:26:34 +0200424}
425
philipel36928452016-11-07 10:42:36 +0100426TEST_F(TestPacketBuffer, GetBitstream) {
philipelc707ab72016-04-01 02:01:54 -0700427 // "many bitstream, such data" with null termination.
philipel41b8ca02016-11-07 15:42:24 +0100428 uint8_t many_data[] = {0x6d, 0x61, 0x6e, 0x79, 0x20};
429 uint8_t bitstream_data[] = {0x62, 0x69, 0x74, 0x73, 0x74, 0x72,
430 0x65, 0x61, 0x6d, 0x2c, 0x20};
431 uint8_t such_data[] = {0x73, 0x75, 0x63, 0x68, 0x20};
432 uint8_t data_data[] = {0x64, 0x61, 0x74, 0x61, 0x0};
433
434 uint8_t* many = new uint8_t[sizeof(many_data)];
435 uint8_t* bitstream = new uint8_t[sizeof(bitstream_data)];
436 uint8_t* such = new uint8_t[sizeof(such_data)];
437 uint8_t* data = new uint8_t[sizeof(data_data)];
438
439 memcpy(many, many_data, sizeof(many_data));
440 memcpy(bitstream, bitstream_data, sizeof(bitstream_data));
441 memcpy(such, such_data, sizeof(such_data));
442 memcpy(data, data_data, sizeof(data_data));
443
444 uint8_t result[sizeof(many_data) + sizeof(bitstream_data) +
445 sizeof(such_data) + sizeof(data_data)];
philipelc707ab72016-04-01 02:01:54 -0700446
philipelaee3e0e2016-11-01 11:45:34 +0100447 const uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700448
philipelaee3e0e2016-11-01 11:45:34 +0100449 EXPECT_TRUE(
philipel41b8ca02016-11-07 15:42:24 +0100450 Insert(seq_num, kKeyFrame, kFirst, kNotLast, sizeof(many_data), many));
451 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast,
452 sizeof(bitstream_data), bitstream));
453 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kNotLast,
454 sizeof(such_data), such));
455 EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kNotFirst, kLast,
456 sizeof(data_data), data));
philipelf4139332016-04-20 10:26:34 +0200457
458 ASSERT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200459 CheckFrame(seq_num);
philipel227f8b92017-08-04 06:39:31 -0700460 EXPECT_EQ(frames_from_callback_[seq_num]->size(), sizeof(result));
philipel17deeb42016-08-11 15:09:26 +0200461 EXPECT_TRUE(frames_from_callback_[seq_num]->GetBitstream(result));
philipel9b2ce6b2016-07-05 05:04:46 -0700462 EXPECT_EQ(memcmp(result, "many bitstream, such data", sizeof(result)), 0);
philipelc707ab72016-04-01 02:01:54 -0700463}
464
philipel227f8b92017-08-04 06:39:31 -0700465TEST_F(TestPacketBuffer, GetBitstreamOneFrameOnePacket) {
466 uint8_t bitstream_data[] = "All the bitstream data for this frame!";
467 uint8_t result[sizeof(bitstream_data)];
468 uint8_t* data = new uint8_t[sizeof(bitstream_data)];
469 memcpy(data, bitstream_data, sizeof(bitstream_data));
470
471 EXPECT_TRUE(
472 Insert(0, kKeyFrame, kFirst, kLast, sizeof(bitstream_data), data));
473
474 ASSERT_EQ(1UL, frames_from_callback_.size());
475 CheckFrame(0);
476 EXPECT_EQ(frames_from_callback_[0]->size(), sizeof(bitstream_data));
477 EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
478 EXPECT_EQ(memcmp(result, data, sizeof(bitstream_data)), 0);
479}
480
481TEST_F(TestPacketBuffer, GetBitstreamOneFrameFullBuffer) {
482 uint8_t* data_arr[kStartSize];
483 uint8_t expected[kStartSize];
484 uint8_t result[kStartSize];
485
486 for (uint8_t i = 0; i < kStartSize; ++i) {
487 data_arr[i] = new uint8_t[1];
488 data_arr[i][0] = i;
489 expected[i] = i;
490 }
491
492 EXPECT_TRUE(Insert(0, kKeyFrame, kFirst, kNotLast, 1, data_arr[0]));
493 for (uint8_t i = 1; i < kStartSize - 1; ++i)
494 EXPECT_TRUE(Insert(i, kKeyFrame, kNotFirst, kNotLast, 1, data_arr[i]));
495 EXPECT_TRUE(Insert(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1,
496 data_arr[kStartSize - 1]));
497
498 ASSERT_EQ(1UL, frames_from_callback_.size());
499 CheckFrame(0);
500 EXPECT_EQ(frames_from_callback_[0]->size(), static_cast<size_t>(kStartSize));
501 EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
502 EXPECT_EQ(memcmp(result, expected, kStartSize), 0);
503}
504
Johannes Kron957c62e2018-10-01 14:53:01 +0200505TEST_F(TestPacketBuffer, InsertPacketAfterOldFrameObjectIsRemoved) {
506 uint16_t kFirstSeqNum = 0;
507 uint32_t kTimestampDelta = 100;
508 uint32_t timestamp = 10000;
509 uint16_t seq_num = kFirstSeqNum;
510
511 // Loop until seq_num wraps around.
512 SeqNumUnwrapper<uint16_t> unwrapper(0);
513 while (unwrapper.Unwrap(seq_num) < std::numeric_limits<uint16_t>::max()) {
514 Insert(seq_num++, kKeyFrame, kFirst, kNotLast, 0, nullptr, timestamp);
515 for (int i = 0; i < 5; ++i) {
516 Insert(seq_num++, kKeyFrame, kNotFirst, kNotLast, 0, nullptr, timestamp);
517 }
518 Insert(seq_num++, kKeyFrame, kNotFirst, kLast, 0, nullptr, timestamp);
519 timestamp += kTimestampDelta;
520 }
521
522 size_t number_of_frames = frames_from_callback_.size();
523 // Delete old frame object while receiving frame with overlapping sequence
524 // numbers.
525 Insert(seq_num++, kKeyFrame, kFirst, kNotLast, 0, nullptr, timestamp);
526 for (int i = 0; i < 5; ++i) {
527 Insert(seq_num++, kKeyFrame, kNotFirst, kNotLast, 0, nullptr, timestamp);
528 }
529 // Delete FrameObject connected to packets that have already been cleared.
530 DeleteFrame(kFirstSeqNum);
531 Insert(seq_num++, kKeyFrame, kNotFirst, kLast, 0, nullptr, timestamp);
532
533 // Regardless of the initial size, the number of frames should be constant
534 // after removing and then adding a new frame object.
535 EXPECT_EQ(number_of_frames, frames_from_callback_.size());
536}
537
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100538// If |sps_pps_idr_is_keyframe| is true, we require keyframes to contain
539// SPS/PPS/IDR and the keyframes we create as part of the test do contain
540// SPS/PPS/IDR. If |sps_pps_idr_is_keyframe| is false, we only require and
541// create keyframes containing only IDR.
542class TestPacketBufferH264 : public TestPacketBuffer {
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200543 protected:
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200544 explicit TestPacketBufferH264(bool sps_pps_idr_is_keyframe)
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100545 : TestPacketBuffer(sps_pps_idr_is_keyframe
546 ? "WebRTC-SpsPpsIdrIsH264Keyframe/Enabled/"
547 : ""),
548 sps_pps_idr_is_keyframe_(sps_pps_idr_is_keyframe) {}
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200549
550 bool InsertH264(uint16_t seq_num, // packet sequence number
551 IsKeyFrame keyframe, // is keyframe
552 IsFirst first, // is first packet of frame
553 IsLast last, // is last packet of frame
554 uint32_t timestamp, // rtp timestamp
555 int data_size = 0, // size of data
556 uint8_t* data = nullptr) { // data pointer
557 VCMPacket packet;
558 packet.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200559 auto& h264_header =
560 packet.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200561 packet.seqNum = seq_num;
562 packet.timestamp = timestamp;
563 if (keyframe == kKeyFrame) {
564 if (sps_pps_idr_is_keyframe_) {
philipel7d745e52018-08-02 14:03:53 +0200565 h264_header.nalus[0].type = H264::NaluType::kSps;
566 h264_header.nalus[1].type = H264::NaluType::kPps;
567 h264_header.nalus[2].type = H264::NaluType::kIdr;
568 h264_header.nalus_length = 3;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200569 } else {
philipel7d745e52018-08-02 14:03:53 +0200570 h264_header.nalus[0].type = H264::NaluType::kIdr;
571 h264_header.nalus_length = 1;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200572 }
573 }
574 packet.is_first_packet_in_frame = first == kFirst;
philipelef615ea2018-09-13 11:07:48 +0200575 packet.is_last_packet_in_frame = last == kLast;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200576 packet.sizeBytes = data_size;
577 packet.dataPtr = data;
578
579 return packet_buffer_->InsertPacket(&packet);
580 }
581
582 const bool sps_pps_idr_is_keyframe_;
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100583};
584
585// This fixture is used to test the general behaviour of the packet buffer
586// in both configurations.
587class TestPacketBufferH264Parameterized
588 : public ::testing::WithParamInterface<bool>,
589 public TestPacketBufferH264 {
590 protected:
591 TestPacketBufferH264Parameterized() : TestPacketBufferH264(GetParam()) {}
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200592};
593
594INSTANTIATE_TEST_CASE_P(SpsPpsIdrIsKeyframe,
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100595 TestPacketBufferH264Parameterized,
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200596 ::testing::Values(false, true));
597
philipelbc5a4082017-12-06 10:41:08 +0100598TEST_P(TestPacketBufferH264Parameterized, DontRemoveMissingPacketOnClearTo) {
599 EXPECT_TRUE(InsertH264(0, kKeyFrame, kFirst, kLast, 0));
600 EXPECT_TRUE(InsertH264(2, kDeltaFrame, kFirst, kNotLast, 2));
601 packet_buffer_->ClearTo(0);
602 EXPECT_TRUE(InsertH264(3, kDeltaFrame, kNotFirst, kLast, 2));
603
604 ASSERT_EQ(1UL, frames_from_callback_.size());
605 CheckFrame(0);
606}
607
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100608TEST_P(TestPacketBufferH264Parameterized, GetBitstreamOneFrameFullBuffer) {
philipel227f8b92017-08-04 06:39:31 -0700609 uint8_t* data_arr[kStartSize];
610 uint8_t expected[kStartSize];
611 uint8_t result[kStartSize];
612
613 for (uint8_t i = 0; i < kStartSize; ++i) {
614 data_arr[i] = new uint8_t[1];
615 data_arr[i][0] = i;
616 expected[i] = i;
617 }
618
619 EXPECT_TRUE(InsertH264(0, kKeyFrame, kFirst, kNotLast, 1, 1, data_arr[0]));
620 for (uint8_t i = 1; i < kStartSize - 1; ++i) {
621 EXPECT_TRUE(
622 InsertH264(i, kKeyFrame, kNotFirst, kNotLast, 1, 1, data_arr[i]));
623 }
624 EXPECT_TRUE(InsertH264(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1, 1,
625 data_arr[kStartSize - 1]));
626
627 ASSERT_EQ(1UL, frames_from_callback_.size());
628 CheckFrame(0);
629 EXPECT_EQ(frames_from_callback_[0]->size(), static_cast<size_t>(kStartSize));
630 EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
631 EXPECT_EQ(memcmp(result, expected, kStartSize), 0);
632}
633
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100634TEST_P(TestPacketBufferH264Parameterized, GetBitstreamBufferPadding) {
philipel36928452016-11-07 10:42:36 +0100635 uint16_t seq_num = Rand();
philipel41b8ca02016-11-07 15:42:24 +0100636 uint8_t data_data[] = "some plain old data";
637 uint8_t* data = new uint8_t[sizeof(data_data)];
638 memcpy(data, data_data, sizeof(data_data));
philipel36928452016-11-07 10:42:36 +0100639
640 // EncodedImage::kBufferPaddingBytesH264 is unknown at compile time.
philipel41b8ca02016-11-07 15:42:24 +0100641 std::unique_ptr<uint8_t[]> result(
642 new uint8_t[sizeof(data_data) + EncodedImage::kBufferPaddingBytesH264]);
philipel36928452016-11-07 10:42:36 +0100643
644 VCMPacket packet;
philipel7d745e52018-08-02 14:03:53 +0200645 auto& h264_header =
646 packet.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
647 h264_header.nalus_length = 1;
648 h264_header.nalus[0].type = H264::NaluType::kIdr;
649 h264_header.packetization_type = kH264SingleNalu;
philipel36928452016-11-07 10:42:36 +0100650 packet.seqNum = seq_num;
651 packet.codec = kVideoCodecH264;
652 packet.insertStartCode = true;
philipel36928452016-11-07 10:42:36 +0100653 packet.dataPtr = data;
philipel41b8ca02016-11-07 15:42:24 +0100654 packet.sizeBytes = sizeof(data_data);
johan0d1b2b62017-01-10 04:21:35 -0800655 packet.is_first_packet_in_frame = true;
philipelef615ea2018-09-13 11:07:48 +0200656 packet.is_last_packet_in_frame = true;
philipel759e0b72016-11-30 01:32:05 -0800657 packet_buffer_->InsertPacket(&packet);
philipel36928452016-11-07 10:42:36 +0100658
659 ASSERT_EQ(1UL, frames_from_callback_.size());
660 EXPECT_EQ(frames_from_callback_[seq_num]->EncodedImage()._length,
philipel41b8ca02016-11-07 15:42:24 +0100661 sizeof(data_data));
philipel36928452016-11-07 10:42:36 +0100662 EXPECT_EQ(frames_from_callback_[seq_num]->EncodedImage()._size,
philipel41b8ca02016-11-07 15:42:24 +0100663 sizeof(data_data) + EncodedImage::kBufferPaddingBytesH264);
664 EXPECT_TRUE(frames_from_callback_[seq_num]->GetBitstream(result.get()));
665 EXPECT_EQ(memcmp(result.get(), data, sizeof(data_data)), 0);
philipel36928452016-11-07 10:42:36 +0100666}
667
philipelc707ab72016-04-01 02:01:54 -0700668TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) {
philipelaee3e0e2016-11-01 11:45:34 +0100669 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200670
philipelaee3e0e2016-11-01 11:45:34 +0100671 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
672 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast));
673 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700674 EXPECT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200675 CheckFrame(seq_num);
philipelc707ab72016-04-01 02:01:54 -0700676
677 frames_from_callback_.clear();
678
philipel17deeb42016-08-11 15:09:26 +0200679 // Insert frame that fills the whole buffer.
philipelaee3e0e2016-11-01 11:45:34 +0100680 EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kNotLast));
philipel17deeb42016-08-11 15:09:26 +0200681 for (int i = 0; i < kMaxSize - 2; ++i)
philipelaee3e0e2016-11-01 11:45:34 +0100682 EXPECT_TRUE(Insert(seq_num + i + 4, kDeltaFrame, kNotFirst, kNotLast));
683 EXPECT_TRUE(Insert(seq_num + kMaxSize + 2, kKeyFrame, kNotFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700684 EXPECT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200685 CheckFrame(seq_num + 3);
philipelc707ab72016-04-01 02:01:54 -0700686}
687
philipel02447bc2016-05-13 06:01:03 -0700688TEST_F(TestPacketBuffer, Clear) {
philipelaee3e0e2016-11-01 11:45:34 +0100689 const uint16_t seq_num = Rand();
philipelf4139332016-04-20 10:26:34 +0200690
philipelaee3e0e2016-11-01 11:45:34 +0100691 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
692 EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast));
693 EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast));
philipelf4139332016-04-20 10:26:34 +0200694 EXPECT_EQ(1UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200695 CheckFrame(seq_num);
philipelf4139332016-04-20 10:26:34 +0200696
philipel02447bc2016-05-13 06:01:03 -0700697 packet_buffer_->Clear();
philipelf4139332016-04-20 10:26:34 +0200698
philipelaee3e0e2016-11-01 11:45:34 +0100699 EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kFirst, kNotLast));
700 EXPECT_TRUE(
701 Insert(seq_num + kStartSize + 1, kDeltaFrame, kNotFirst, kNotLast));
702 EXPECT_TRUE(Insert(seq_num + kStartSize + 2, kDeltaFrame, kNotFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700703 EXPECT_EQ(2UL, frames_from_callback_.size());
philipel17deeb42016-08-11 15:09:26 +0200704 CheckFrame(seq_num + kStartSize);
philipelc707ab72016-04-01 02:01:54 -0700705}
706
philipel02447bc2016-05-13 06:01:03 -0700707TEST_F(TestPacketBuffer, InvalidateFrameByClearing) {
philipelaee3e0e2016-11-01 11:45:34 +0100708 const uint16_t seq_num = Rand();
709
710 EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
philipelc707ab72016-04-01 02:01:54 -0700711 ASSERT_EQ(1UL, frames_from_callback_.size());
712
philipel02447bc2016-05-13 06:01:03 -0700713 packet_buffer_->Clear();
philipelf4139332016-04-20 10:26:34 +0200714 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr));
715}
716
philipel20dce342016-11-28 16:14:57 +0100717TEST_F(TestPacketBuffer, FramesAfterClear) {
718 Insert(9025, kDeltaFrame, kFirst, kLast);
719 Insert(9024, kKeyFrame, kFirst, kLast);
720 packet_buffer_->ClearTo(9025);
721 Insert(9057, kDeltaFrame, kFirst, kLast);
722 Insert(9026, kDeltaFrame, kFirst, kLast);
723
724 CheckFrame(9024);
725 CheckFrame(9025);
726 CheckFrame(9026);
727 CheckFrame(9057);
728}
729
philipel759e0b72016-11-30 01:32:05 -0800730TEST_F(TestPacketBuffer, DontLeakPayloadData) {
731 // NOTE! Any eventual leak is suppose to be detected by valgrind
732 // or any other similar tool.
733 uint8_t* data1 = new uint8_t[5];
734 uint8_t* data2 = new uint8_t[5];
735 uint8_t* data3 = new uint8_t[5];
736 uint8_t* data4 = new uint8_t[5];
737
738 // Expected to free data1 upon PacketBuffer destruction.
739 EXPECT_TRUE(Insert(2, kKeyFrame, kFirst, kNotLast, 5, data1));
740
741 // Expect to free data2 upon insertion.
742 EXPECT_TRUE(Insert(2, kKeyFrame, kFirst, kNotLast, 5, data2));
743
744 // Expect to free data3 upon insertion (old packet).
745 packet_buffer_->ClearTo(1);
746 EXPECT_FALSE(Insert(1, kKeyFrame, kFirst, kNotLast, 5, data3));
747
748 // Expect to free data4 upon insertion (packet buffer is full).
philipelc703dc22017-03-23 06:50:37 -0700749 EXPECT_TRUE(Insert(2 + kMaxSize, kKeyFrame, kFirst, kNotLast, 5, data4));
philipel759e0b72016-11-30 01:32:05 -0800750}
751
philipelea142f82017-01-11 02:01:56 -0800752TEST_F(TestPacketBuffer, ContinuousSeqNumDoubleMarkerBit) {
753 Insert(2, kKeyFrame, kNotFirst, kNotLast);
754 Insert(1, kKeyFrame, kFirst, kLast);
755 frames_from_callback_.clear();
756 Insert(3, kKeyFrame, kNotFirst, kLast);
757
758 EXPECT_EQ(0UL, frames_from_callback_.size());
759}
760
philipel3184f8e2017-05-18 08:08:53 -0700761TEST_F(TestPacketBuffer, PacketTimestamps) {
Danil Chapovalov0040b662018-06-18 10:48:16 +0200762 absl::optional<int64_t> packet_ms;
763 absl::optional<int64_t> packet_keyframe_ms;
philipel3184f8e2017-05-18 08:08:53 -0700764
765 packet_ms = packet_buffer_->LastReceivedPacketMs();
766 packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
767 EXPECT_FALSE(packet_ms);
768 EXPECT_FALSE(packet_keyframe_ms);
769
770 int64_t keyframe_ms = clock_->TimeInMilliseconds();
771 EXPECT_TRUE(Insert(100, kKeyFrame, kFirst, kLast));
772 packet_ms = packet_buffer_->LastReceivedPacketMs();
773 packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
774 EXPECT_TRUE(packet_ms);
775 EXPECT_TRUE(packet_keyframe_ms);
776 EXPECT_EQ(keyframe_ms, *packet_ms);
777 EXPECT_EQ(keyframe_ms, *packet_keyframe_ms);
778
779 clock_->AdvanceTimeMilliseconds(100);
780 int64_t delta_ms = clock_->TimeInMilliseconds();
781 EXPECT_TRUE(Insert(101, kDeltaFrame, kFirst, kLast));
782 packet_ms = packet_buffer_->LastReceivedPacketMs();
783 packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
784 EXPECT_TRUE(packet_ms);
785 EXPECT_TRUE(packet_keyframe_ms);
786 EXPECT_EQ(delta_ms, *packet_ms);
787 EXPECT_EQ(keyframe_ms, *packet_keyframe_ms);
788
789 packet_buffer_->Clear();
790 packet_ms = packet_buffer_->LastReceivedPacketMs();
791 packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
792 EXPECT_FALSE(packet_ms);
793 EXPECT_FALSE(packet_keyframe_ms);
794}
795
philipel09133af2018-05-17 14:11:09 +0200796TEST_F(TestPacketBuffer, IncomingCodecChange) {
797 VCMPacket packet;
798 packet.is_first_packet_in_frame = true;
philipelef615ea2018-09-13 11:07:48 +0200799 packet.is_last_packet_in_frame = true;
philipel09133af2018-05-17 14:11:09 +0200800 packet.sizeBytes = 0;
801 packet.dataPtr = nullptr;
802
803 packet.codec = kVideoCodecVP8;
804 packet.timestamp = 1;
805 packet.seqNum = 1;
806 packet.frameType = kVideoFrameKey;
807 EXPECT_TRUE(packet_buffer_->InsertPacket(&packet));
808
809 packet.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200810 auto& h264_header =
811 packet.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
812 h264_header.nalus_length = 1;
philipel09133af2018-05-17 14:11:09 +0200813 packet.timestamp = 3;
814 packet.seqNum = 3;
815 EXPECT_TRUE(packet_buffer_->InsertPacket(&packet));
816
817 packet.codec = kVideoCodecVP8;
818 packet.timestamp = 2;
819 packet.seqNum = 2;
820 packet.frameType = kVideoFrameDelta;
821
822 EXPECT_TRUE(packet_buffer_->InsertPacket(&packet));
823
824 EXPECT_EQ(3UL, frames_from_callback_.size());
825}
826
827TEST_F(TestPacketBuffer, TooManyNalusInPacket) {
828 VCMPacket packet;
829 packet.codec = kVideoCodecH264;
830 packet.timestamp = 1;
831 packet.seqNum = 1;
832 packet.frameType = kVideoFrameKey;
833 packet.is_first_packet_in_frame = true;
philipelef615ea2018-09-13 11:07:48 +0200834 packet.is_last_packet_in_frame = true;
philipel7d745e52018-08-02 14:03:53 +0200835 auto& h264_header =
836 packet.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
837 h264_header.nalus_length = kMaxNalusPerPacket;
philipel09133af2018-05-17 14:11:09 +0200838 packet.sizeBytes = 0;
839 packet.dataPtr = nullptr;
840 EXPECT_TRUE(packet_buffer_->InsertPacket(&packet));
841
842 EXPECT_EQ(0UL, frames_from_callback_.size());
843}
844
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100845TEST_P(TestPacketBufferH264Parameterized, OneFrameFillBuffer) {
philipel2c9f9f22017-06-13 02:47:28 -0700846 InsertH264(0, kKeyFrame, kFirst, kNotLast, 1000);
847 for (int i = 1; i < kStartSize - 1; ++i)
848 InsertH264(i, kKeyFrame, kNotFirst, kNotLast, 1000);
849 InsertH264(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1000);
850
851 EXPECT_EQ(1UL, frames_from_callback_.size());
852 CheckFrame(0);
853}
854
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100855TEST_P(TestPacketBufferH264Parameterized, CreateFramesAfterFilledBuffer) {
philipel227f8b92017-08-04 06:39:31 -0700856 InsertH264(kStartSize - 2, kKeyFrame, kFirst, kLast, 0);
857 ASSERT_EQ(1UL, frames_from_callback_.size());
858 frames_from_callback_.clear();
859
860 InsertH264(kStartSize, kDeltaFrame, kFirst, kNotLast, 2000);
861 for (int i = 1; i < kStartSize; ++i)
862 InsertH264(kStartSize + i, kDeltaFrame, kNotFirst, kNotLast, 2000);
863 InsertH264(kStartSize + kStartSize, kDeltaFrame, kNotFirst, kLast, 2000);
864 ASSERT_EQ(0UL, frames_from_callback_.size());
865
866 InsertH264(kStartSize - 1, kKeyFrame, kFirst, kLast, 1000);
867 ASSERT_EQ(2UL, frames_from_callback_.size());
868 CheckFrame(kStartSize - 1);
869 CheckFrame(kStartSize);
870}
871
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100872TEST_P(TestPacketBufferH264Parameterized, OneFrameMaxSeqNum) {
philipel2c9f9f22017-06-13 02:47:28 -0700873 InsertH264(65534, kKeyFrame, kFirst, kNotLast, 1000);
874 InsertH264(65535, kKeyFrame, kNotFirst, kLast, 1000);
875
876 EXPECT_EQ(1UL, frames_from_callback_.size());
877 CheckFrame(65534);
878}
879
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100880TEST_P(TestPacketBufferH264Parameterized, ClearMissingPacketsOnKeyframe) {
philipel2c9f9f22017-06-13 02:47:28 -0700881 InsertH264(0, kKeyFrame, kFirst, kLast, 1000);
882 InsertH264(2, kKeyFrame, kFirst, kLast, 3000);
883 InsertH264(3, kDeltaFrame, kFirst, kNotLast, 4000);
884 InsertH264(4, kDeltaFrame, kNotFirst, kLast, 4000);
885
886 ASSERT_EQ(3UL, frames_from_callback_.size());
887
888 InsertH264(kStartSize + 1, kKeyFrame, kFirst, kLast, 18000);
889
890 ASSERT_EQ(4UL, frames_from_callback_.size());
891 CheckFrame(0);
892 CheckFrame(2);
893 CheckFrame(3);
894 CheckFrame(kStartSize + 1);
895}
896
Rasmus Brandt88f080a2017-11-02 14:28:06 +0100897TEST_P(TestPacketBufferH264Parameterized, FindFramesOnPadding) {
philipel2c9f9f22017-06-13 02:47:28 -0700898 InsertH264(0, kKeyFrame, kFirst, kLast, 1000);
899 InsertH264(2, kDeltaFrame, kFirst, kLast, 1000);
900
901 ASSERT_EQ(1UL, frames_from_callback_.size());
902 packet_buffer_->PaddingReceived(1);
903 ASSERT_EQ(2UL, frames_from_callback_.size());
904 CheckFrame(0);
905 CheckFrame(2);
906}
907
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200908class TestPacketBufferH264XIsKeyframe : public TestPacketBufferH264 {
909 protected:
910 const uint16_t kSeqNum = 5;
911
912 explicit TestPacketBufferH264XIsKeyframe(bool sps_pps_idr_is_keyframe)
913 : TestPacketBufferH264(sps_pps_idr_is_keyframe) {
914 packet_.codec = kVideoCodecH264;
915 packet_.seqNum = kSeqNum;
916
917 packet_.is_first_packet_in_frame = true;
philipelef615ea2018-09-13 11:07:48 +0200918 packet_.is_last_packet_in_frame = true;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200919 }
920
921 VCMPacket packet_;
922};
923
924class TestPacketBufferH264IdrIsKeyframe
925 : public TestPacketBufferH264XIsKeyframe {
926 protected:
927 TestPacketBufferH264IdrIsKeyframe()
928 : TestPacketBufferH264XIsKeyframe(false) {}
929};
930
931TEST_F(TestPacketBufferH264IdrIsKeyframe, IdrIsKeyframe) {
philipel7d745e52018-08-02 14:03:53 +0200932 auto& h264_header =
933 packet_.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
934 h264_header.nalus[0].type = H264::NaluType::kIdr;
935 h264_header.nalus_length = 1;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200936 packet_buffer_->InsertPacket(&packet_);
937
938 ASSERT_EQ(1u, frames_from_callback_.size());
939 EXPECT_EQ(kVideoFrameKey, frames_from_callback_[kSeqNum]->frame_type());
940}
941
942TEST_F(TestPacketBufferH264IdrIsKeyframe, SpsPpsIdrIsKeyframe) {
philipel7d745e52018-08-02 14:03:53 +0200943 auto& h264_header =
944 packet_.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
945 h264_header.nalus[0].type = H264::NaluType::kSps;
946 h264_header.nalus[1].type = H264::NaluType::kPps;
947 h264_header.nalus[2].type = H264::NaluType::kIdr;
948 h264_header.nalus_length = 3;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200949
950 packet_buffer_->InsertPacket(&packet_);
951
952 ASSERT_EQ(1u, frames_from_callback_.size());
953 EXPECT_EQ(kVideoFrameKey, frames_from_callback_[kSeqNum]->frame_type());
954}
955
956class TestPacketBufferH264SpsPpsIdrIsKeyframe
957 : public TestPacketBufferH264XIsKeyframe {
958 protected:
959 TestPacketBufferH264SpsPpsIdrIsKeyframe()
960 : TestPacketBufferH264XIsKeyframe(true) {}
961};
962
963TEST_F(TestPacketBufferH264SpsPpsIdrIsKeyframe, IdrIsNotKeyframe) {
philipel7d745e52018-08-02 14:03:53 +0200964 auto& h264_header =
965 packet_.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
966 h264_header.nalus[0].type = H264::NaluType::kIdr;
967 h264_header.nalus_length = 1;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200968
969 packet_buffer_->InsertPacket(&packet_);
970
971 ASSERT_EQ(1u, frames_from_callback_.size());
972 EXPECT_EQ(kVideoFrameDelta, frames_from_callback_[5]->frame_type());
973}
974
975TEST_F(TestPacketBufferH264SpsPpsIdrIsKeyframe, SpsPpsIsNotKeyframe) {
philipel7d745e52018-08-02 14:03:53 +0200976 auto& h264_header =
977 packet_.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
978 h264_header.nalus[0].type = H264::NaluType::kSps;
979 h264_header.nalus[1].type = H264::NaluType::kPps;
980 h264_header.nalus_length = 2;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200981
982 packet_buffer_->InsertPacket(&packet_);
983
984 ASSERT_EQ(1u, frames_from_callback_.size());
985 EXPECT_EQ(kVideoFrameDelta, frames_from_callback_[kSeqNum]->frame_type());
986}
987
988TEST_F(TestPacketBufferH264SpsPpsIdrIsKeyframe, SpsPpsIdrIsKeyframe) {
philipel7d745e52018-08-02 14:03:53 +0200989 auto& h264_header =
990 packet_.video_header.video_type_header.emplace<RTPVideoHeaderH264>();
991 h264_header.nalus[0].type = H264::NaluType::kSps;
992 h264_header.nalus[1].type = H264::NaluType::kPps;
993 h264_header.nalus[2].type = H264::NaluType::kIdr;
994 h264_header.nalus_length = 3;
Rasmus Brandtedf4ff72017-10-24 10:07:48 +0200995
996 packet_buffer_->InsertPacket(&packet_);
997
998 ASSERT_EQ(1u, frames_from_callback_.size());
999 EXPECT_EQ(kVideoFrameKey, frames_from_callback_[kSeqNum]->frame_type());
1000}
1001
philipelc707ab72016-04-01 02:01:54 -07001002} // namespace video_coding
1003} // namespace webrtc