blob: 56e41169ab110a979e243ebb6d48af8bcfc28a66 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 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
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000015
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000016#include "testing/gtest/include/gtest/gtest.h"
philipel83f831a2016-03-12 03:30:23 -080017#include "testing/gmock/include/gmock/gmock.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/frame_buffer.h"
19#include "webrtc/modules/video_coding/jitter_buffer.h"
20#include "webrtc/modules/video_coding/media_opt_util.h"
21#include "webrtc/modules/video_coding/packet.h"
22#include "webrtc/modules/video_coding/test/stream_generator.h"
23#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010024#include "webrtc/system_wrappers/include/clock.h"
philipel83f831a2016-03-12 03:30:23 -080025#include "webrtc/system_wrappers/include/field_trial.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010026#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070027#include "webrtc/system_wrappers/include/metrics_default.h"
philipel83f831a2016-03-12 03:30:23 -080028#include "webrtc/test/field_trial.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000029
30namespace webrtc {
31
asapersson9a4cd872015-10-23 00:27:14 -070032namespace {
philipel9d3ab612015-12-21 04:12:39 -080033const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070034} // namespace
35
36class Vp9SsMapTest : public ::testing::Test {
37 protected:
philipel9d3ab612015-12-21 04:12:39 -080038 Vp9SsMapTest() : packet_(data_, 1400, 1234, 1, true) {}
asapersson9a4cd872015-10-23 00:27:14 -070039
40 virtual void SetUp() {
41 packet_.isFirstPacket = true;
42 packet_.markerBit = true;
43 packet_.frameType = kVideoFrameKey;
44 packet_.codec = kVideoCodecVP9;
45 packet_.codecSpecificHeader.codec = kRtpVideoVp9;
46 packet_.codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
47 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
48 packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
49 packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
50 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
51 packet_.codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
52 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
53 }
54
55 Vp9SsMap map_;
56 uint8_t data_[1500];
57 VCMPacket packet_;
58};
59
60TEST_F(Vp9SsMapTest, Insert) {
61 EXPECT_TRUE(map_.Insert(packet_));
62}
63
64TEST_F(Vp9SsMapTest, Insert_NoSsData) {
65 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
66 EXPECT_FALSE(map_.Insert(packet_));
67}
68
69TEST_F(Vp9SsMapTest, Find) {
70 EXPECT_TRUE(map_.Insert(packet_));
71 Vp9SsMap::SsMap::iterator it;
72 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
73 EXPECT_EQ(packet_.timestamp, it->first);
74}
75
76TEST_F(Vp9SsMapTest, Find_WithWrap) {
77 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
78 const uint32_t kSsTimestamp2 = 100;
79 packet_.timestamp = kSsTimestamp1;
80 EXPECT_TRUE(map_.Insert(packet_));
81 packet_.timestamp = kSsTimestamp2;
82 EXPECT_TRUE(map_.Insert(packet_));
83 Vp9SsMap::SsMap::iterator it;
84 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
85 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
86 EXPECT_EQ(kSsTimestamp1, it->first);
87 EXPECT_TRUE(map_.Find(0, &it));
88 EXPECT_EQ(kSsTimestamp1, it->first);
89 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
90 EXPECT_EQ(kSsTimestamp1, it->first);
91 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
92 EXPECT_EQ(kSsTimestamp2, it->first);
93 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
94 EXPECT_EQ(kSsTimestamp2, it->first);
95}
96
97TEST_F(Vp9SsMapTest, Reset) {
98 EXPECT_TRUE(map_.Insert(packet_));
99 Vp9SsMap::SsMap::iterator it;
100 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
101 EXPECT_EQ(packet_.timestamp, it->first);
102
103 map_.Reset();
104 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
105}
106
107TEST_F(Vp9SsMapTest, RemoveOld) {
108 Vp9SsMap::SsMap::iterator it;
109 const uint32_t kSsTimestamp1 = 10000;
110 packet_.timestamp = kSsTimestamp1;
111 EXPECT_TRUE(map_.Insert(packet_));
112
113 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
114 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
115 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
116
117 map_.RemoveOld(kTimestamp);
118 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
119 EXPECT_TRUE(map_.Find(kTimestamp, &it));
120 EXPECT_EQ(kTimestamp, it->first);
121}
122
123TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
124 Vp9SsMap::SsMap::iterator it;
125 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
126 const uint32_t kSsTimestamp2 = 10;
127 const uint32_t kSsTimestamp3 = 1000;
128 packet_.timestamp = kSsTimestamp1;
129 EXPECT_TRUE(map_.Insert(packet_));
130 packet_.timestamp = kSsTimestamp2;
131 EXPECT_TRUE(map_.Insert(packet_));
132 packet_.timestamp = kSsTimestamp3;
133 EXPECT_TRUE(map_.Insert(packet_));
134
135 map_.RemoveOld(kSsTimestamp3);
136 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
137 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
138 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
139}
140
141TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
142 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
143 EXPECT_FALSE(map_.UpdatePacket(&packet_));
144}
145
146TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
147 EXPECT_TRUE(map_.Insert(packet_));
148 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = kNoGofIdx;
149 EXPECT_FALSE(map_.UpdatePacket(&packet_));
150}
151
152TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
153 EXPECT_TRUE(map_.Insert(packet_));
154 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 4;
155 EXPECT_FALSE(map_.UpdatePacket(&packet_));
156}
157
158TEST_F(Vp9SsMapTest, UpdatePacket) {
159 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
160
161 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
162 EXPECT_TRUE(map_.UpdatePacket(&packet_));
163 EXPECT_EQ(0, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
164 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
165 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
166 EXPECT_EQ(4, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
167
168 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 1;
169 EXPECT_TRUE(map_.UpdatePacket(&packet_));
170 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
171 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
172 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
173 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
174
175 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 2;
176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
177 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
178 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
179 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
180 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
181
182 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 3;
183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
184 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
185 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
186 EXPECT_EQ(2U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
187 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
188 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[1]);
189}
190
philipel83f831a2016-03-12 03:30:23 -0800191class ProcessThreadMock : public ProcessThread {
192 public:
193 MOCK_METHOD0(Start, void());
194 MOCK_METHOD0(Stop, void());
195 MOCK_METHOD1(WakeUp, void(Module* module));
196 MOCK_METHOD1(RegisterModule, void(Module* module));
197 MOCK_METHOD1(DeRegisterModule, void(Module* module));
Tommi400a2762016-05-28 14:16:59 +0200198 void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
philipel83f831a2016-03-12 03:30:23 -0800199};
200
201class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
202 public NackSender,
203 public KeyFrameRequestSender {
204 public:
205 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
206 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
207 sequence_numbers.end());
208 }
209
210 void RequestKeyFrame() override { ++keyframe_requests_; }
211
212 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
213 std::vector<uint16_t> nack_sent_;
214 int keyframe_requests_;
215
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000216 protected:
philipel83f831a2016-03-12 03:30:23 -0800217 TestBasicJitterBuffer() : scoped_field_trial_(GetParam()) {}
nisseef8b61e2016-04-29 06:09:15 -0700218 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000219 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700220 jitter_buffer_.reset(new VCMJitterBuffer(
221 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800222 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
223 this,
224 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000225 jitter_buffer_->Start();
226 seq_num_ = 1234;
227 timestamp_ = 0;
228 size_ = 1400;
229 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
230 data_[0] = 0;
231 data_[1] = 0;
232 data_[2] = 0x80;
233 int count = 3;
234 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
235 data_[i] = count;
236 count++;
237 if (count == 10) {
238 data_[i + 1] = 0;
239 data_[i + 2] = 0;
240 data_[i + 3] = 0x80;
241 count = 3;
242 i += 3;
243 }
244 }
245 packet_.reset(new VCMPacket(data_, size_, seq_num_, timestamp_, true));
246 }
247
248 VCMEncodedFrame* DecodeCompleteFrame() {
249 uint32_t timestamp = 0;
250 bool found_frame = jitter_buffer_->NextCompleteTimestamp(10, &timestamp);
251 if (!found_frame)
252 return NULL;
253 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
254 return frame;
255 }
256
257 VCMEncodedFrame* DecodeIncompleteFrame() {
258 uint32_t timestamp = 0;
259 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
260 if (!found_frame)
261 return NULL;
262 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
263 return frame;
264 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000265
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000266 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800267 unsigned int size,
268 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000269 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000270
271 const uint8_t* outData = frame_out->Buffer();
272 unsigned int i = 0;
273
274 if (startCode) {
275 EXPECT_EQ(0, outData[0]);
276 EXPECT_EQ(0, outData[1]);
277 EXPECT_EQ(0, outData[2]);
278 EXPECT_EQ(1, outData[3]);
279 i += 4;
280 }
281
282 EXPECT_EQ(size, frame_out->Length());
283 int count = 3;
284 for (; i < size; i++) {
285 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
286 i += 2;
287 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
288 EXPECT_EQ(0, outData[0]);
289 EXPECT_EQ(0, outData[1]);
290 EXPECT_EQ(0, outData[2]);
291 EXPECT_EQ(1, outData[3]);
292 i += 3;
293 } else {
294 EXPECT_EQ(count, outData[i]);
295 count++;
296 if (count == 10) {
297 count = 3;
298 }
299 }
300 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000301 }
302
303 uint16_t seq_num_;
304 uint32_t timestamp_;
305 int size_;
306 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800307 std::unique_ptr<VCMPacket> packet_;
308 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800310 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
philipel83f831a2016-03-12 03:30:23 -0800311 test::ScopedFieldTrials scoped_field_trial_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000312};
313
philipel83f831a2016-03-12 03:30:23 -0800314INSTANTIATE_TEST_CASE_P(
315 TestWithNackModule,
316 TestBasicJitterBuffer,
317 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
318 "WebRTC-NewVideoJitterBuffer/Disabled/"));
319
320class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
321 public NackSender,
322 public KeyFrameRequestSender {
323 public:
324 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
325 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
326 sequence_numbers.end());
327 }
328
329 void RequestKeyFrame() { ++keyframe_requests_; }
330
331 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
332 std::vector<uint16_t> nack_sent_;
333 int keyframe_requests_;
334
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000335 protected:
336 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000337
338 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000339 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000340 max_nack_list_size_ = 150;
341 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700342 jitter_buffer_ = new VCMJitterBuffer(
343 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800344 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
345 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700346 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000347 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800348 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
349 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000350 memset(data_buffer_, 0, kDataBufferSize);
351 }
352
353 virtual void TearDown() {
354 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000355 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000356 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000357 }
358
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000359 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000360 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000361 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000362 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000363 EXPECT_TRUE(packet_available);
364 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000365 return kGeneralError; // Return here to avoid crashes below.
366 bool retransmitted = false;
367 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000368 }
369
370 VCMFrameBufferEnum InsertPacket(int index) {
371 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000372 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000373 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000374 EXPECT_TRUE(packet_available);
375 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000376 return kGeneralError; // Return here to avoid crashes below.
377 bool retransmitted = false;
378 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000379 }
380
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000381 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700382 stream_generator_->GenerateFrame(
383 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
384 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000386 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000387 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000388 }
389
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000390 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
391 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000393 VCMFrameBufferEnum ret = InsertFrame(frame_type);
394 if (ret < kNoError) {
395 ret_for_all = ret;
396 } else if (ret_for_all >= kNoError) {
397 ret_for_all = ret;
398 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000399 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000400 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000401 }
402
403 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000404 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000405 clock_->TimeInMilliseconds());
406 for (int i = 0; i < num_packets; ++i)
407 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000408 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000409 }
410
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000411 bool DecodeCompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000412 uint32_t timestamp = 0;
413 bool found_frame = jitter_buffer_->NextCompleteTimestamp(0, &timestamp);
414 if (!found_frame)
415 return false;
416
417 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000418 bool ret = (frame != NULL);
419 jitter_buffer_->ReleaseFrame(frame);
420 return ret;
421 }
422
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000423 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000424 uint32_t timestamp = 0;
425 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
426 if (!found_frame)
427 return false;
428 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000429 bool ret = (frame != NULL);
430 jitter_buffer_->ReleaseFrame(frame);
431 return ret;
432 }
433
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000434 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000435 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800436 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000437 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000438 size_t max_nack_list_size_;
439 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000440 uint8_t data_buffer_[kDataBufferSize];
441};
442
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000443class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444 protected:
philipel83f831a2016-03-12 03:30:23 -0800445 TestJitterBufferNack() : scoped_field_trial_(GetParam()) {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000446 virtual void SetUp() {
447 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000448 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000449 }
450
philipel9d3ab612015-12-21 04:12:39 -0800451 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
philipel83f831a2016-03-12 03:30:23 -0800452
453 test::ScopedFieldTrials scoped_field_trial_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000454};
455
philipel83f831a2016-03-12 03:30:23 -0800456INSTANTIATE_TEST_CASE_P(
457 TestWithNackModule,
458 TestJitterBufferNack,
459 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
460 "WebRTC-NewVideoJitterBuffer/Disabled/"));
461
462TEST_P(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000463 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000464 EXPECT_TRUE(NULL == DecodeCompleteFrame());
465 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
466 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000467 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000468 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000469
470 // No packets inserted.
471 EXPECT_TRUE(NULL == DecodeCompleteFrame());
472 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
473
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000474 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000475 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000476
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000477 // No packets inserted.
478 EXPECT_TRUE(NULL == DecodeCompleteFrame());
479 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
480}
481
philipel83f831a2016-03-12 03:30:23 -0800482TEST_P(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000483 // Always start with a complete key frame when not allowing errors.
484 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000485 packet_->frameType = kVideoFrameKey;
486 packet_->isFirstPacket = true;
487 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000488 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000489
490 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000491 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800492 EXPECT_EQ(kCompleteSession,
493 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000494 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000495 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000496 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000497 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000498}
499
philipel83f831a2016-03-12 03:30:23 -0800500TEST_P(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700501 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200502 // Always start with a complete key frame when not allowing errors.
503 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
504 packet_->frameType = kVideoFrameKey;
505 packet_->isFirstPacket = true;
506 packet_->markerBit = true;
507 packet_->timestamp += 123 * 90;
508
509 // Insert single packet frame to the jitter buffer and get a frame.
510 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800511 EXPECT_EQ(kCompleteSession,
512 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200513 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
514 CheckOutFrame(frame_out, size_, false);
515 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
516 jitter_buffer_->ReleaseFrame(frame_out);
517
518 // Verify that histograms are updated when the jitter buffer is stopped.
519 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
520 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700521 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
522 EXPECT_EQ(1,
523 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800524 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700525 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800526 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700527 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200528
529 // Verify that histograms are not updated if stop is called again.
530 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700531 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
532 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800533 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700534 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
535 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200536}
537
philipel83f831a2016-03-12 03:30:23 -0800538TEST_P(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000539 packet_->frameType = kVideoFrameKey;
540 packet_->isFirstPacket = true;
541 packet_->markerBit = false;
542
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000543 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800544 EXPECT_EQ(kIncomplete,
545 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
547 // Should not be complete.
548 EXPECT_TRUE(frame_out == NULL);
549
550 ++seq_num_;
551 packet_->isFirstPacket = false;
552 packet_->markerBit = true;
553 packet_->seqNum = seq_num_;
554
philipel9d3ab612015-12-21 04:12:39 -0800555 EXPECT_EQ(kCompleteSession,
556 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557
558 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000559 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560
561 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000562 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000563}
564
philipel83f831a2016-03-12 03:30:23 -0800565TEST_P(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000566 packet_->frameType = kVideoFrameKey;
567 packet_->isFirstPacket = true;
568 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000569
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000570 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800571 EXPECT_EQ(kIncomplete,
572 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000573
574 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
575
576 // Frame should not be complete.
577 EXPECT_TRUE(frame_out == NULL);
578
579 // Insert 98 frames.
580 int loop = 0;
581 do {
582 seq_num_++;
583 packet_->isFirstPacket = false;
584 packet_->markerBit = false;
585 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000586
philipel9d3ab612015-12-21 04:12:39 -0800587 EXPECT_EQ(kIncomplete,
588 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000589 loop++;
590 } while (loop < 98);
591
592 // Insert last packet.
593 ++seq_num_;
594 packet_->isFirstPacket = false;
595 packet_->markerBit = true;
596 packet_->seqNum = seq_num_;
597
philipel9d3ab612015-12-21 04:12:39 -0800598 EXPECT_EQ(kCompleteSession,
599 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000600
601 frame_out = DecodeCompleteFrame();
602
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000603 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000605 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000606}
607
philipel83f831a2016-03-12 03:30:23 -0800608TEST_P(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000609 // Always start with a complete key frame.
610 packet_->frameType = kVideoFrameKey;
611 packet_->isFirstPacket = true;
612 packet_->markerBit = true;
613
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000614 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800615 EXPECT_EQ(kCompleteSession,
616 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000617 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
618 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000619 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620
621 ++seq_num_;
622 packet_->seqNum = seq_num_;
623 packet_->markerBit = false;
624 packet_->frameType = kVideoFrameDelta;
625 packet_->timestamp += 33 * 90;
626
philipel9d3ab612015-12-21 04:12:39 -0800627 EXPECT_EQ(kIncomplete,
628 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000629
630 frame_out = DecodeCompleteFrame();
631
632 // Frame should not be complete.
633 EXPECT_TRUE(frame_out == NULL);
634
635 packet_->isFirstPacket = false;
636 // Insert 98 frames.
637 int loop = 0;
638 do {
639 ++seq_num_;
640 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000641
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000642 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800643 EXPECT_EQ(kIncomplete,
644 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000645 loop++;
646 } while (loop < 98);
647
648 // Insert the last packet.
649 ++seq_num_;
650 packet_->isFirstPacket = false;
651 packet_->markerBit = true;
652 packet_->seqNum = seq_num_;
653
philipel9d3ab612015-12-21 04:12:39 -0800654 EXPECT_EQ(kCompleteSession,
655 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000656
657 frame_out = DecodeCompleteFrame();
658
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000659 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000661 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000662}
663
philipel83f831a2016-03-12 03:30:23 -0800664TEST_P(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000665 // Insert the "first" packet last.
666 seq_num_ += 100;
667 packet_->frameType = kVideoFrameKey;
668 packet_->isFirstPacket = false;
669 packet_->markerBit = true;
670 packet_->seqNum = seq_num_;
671 packet_->timestamp = timestamp_;
672
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000673 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800674 EXPECT_EQ(kIncomplete,
675 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000676
677 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
678
679 EXPECT_TRUE(frame_out == NULL);
680
681 // Insert 98 packets.
682 int loop = 0;
683 do {
684 seq_num_--;
685 packet_->isFirstPacket = false;
686 packet_->markerBit = false;
687 packet_->seqNum = seq_num_;
688
philipel9d3ab612015-12-21 04:12:39 -0800689 EXPECT_EQ(kIncomplete,
690 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000691 loop++;
692 } while (loop < 98);
693
694 // Insert the last packet.
695 seq_num_--;
696 packet_->isFirstPacket = true;
697 packet_->markerBit = false;
698 packet_->seqNum = seq_num_;
699
philipel9d3ab612015-12-21 04:12:39 -0800700 EXPECT_EQ(kCompleteSession,
701 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702
philipel9d3ab612015-12-21 04:12:39 -0800703 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000704
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000705 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000706
707 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000708 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000709}
710
philipel83f831a2016-03-12 03:30:23 -0800711TEST_P(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000712 packet_->frameType = kVideoFrameDelta;
713 packet_->isFirstPacket = true;
714 packet_->markerBit = false;
715
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000716 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800717 EXPECT_EQ(kIncomplete,
718 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000719
720 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
721
722 EXPECT_TRUE(frame_out == NULL);
723
724 seq_num_++;
725 packet_->isFirstPacket = false;
726 packet_->markerBit = true;
727 packet_->seqNum = seq_num_;
728
philipel9d3ab612015-12-21 04:12:39 -0800729 EXPECT_EQ(kCompleteSession,
730 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000731
732 // check that we fail to get frame since seqnum is not continuous
733 frame_out = DecodeCompleteFrame();
734 EXPECT_TRUE(frame_out == NULL);
735
736 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800737 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000738 packet_->frameType = kVideoFrameKey;
739 packet_->isFirstPacket = true;
740 packet_->markerBit = false;
741 packet_->seqNum = seq_num_;
742 packet_->timestamp = timestamp_;
743
philipel9d3ab612015-12-21 04:12:39 -0800744 EXPECT_EQ(kIncomplete,
745 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746
747 frame_out = DecodeCompleteFrame();
748
749 // It should not be complete.
750 EXPECT_TRUE(frame_out == NULL);
751
752 seq_num_++;
753 packet_->isFirstPacket = false;
754 packet_->markerBit = true;
755 packet_->seqNum = seq_num_;
756
philipel9d3ab612015-12-21 04:12:39 -0800757 EXPECT_EQ(kCompleteSession,
758 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000759
760 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000761 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000762 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000763 jitter_buffer_->ReleaseFrame(frame_out);
764
765 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000766 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000767 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000768 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000769}
770
philipel83f831a2016-03-12 03:30:23 -0800771TEST_P(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700772 packet_->frameType = kVideoFrameKey;
773 packet_->isFirstPacket = true;
774 packet_->markerBit = true;
775
776 // Send in an initial good packet/frame (Frame A) to start things off.
777 bool retransmitted = false;
778 EXPECT_EQ(kCompleteSession,
779 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
780 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
781 EXPECT_TRUE(frame_out != NULL);
782 jitter_buffer_->ReleaseFrame(frame_out);
783
784 // Now send in a complete delta frame (Frame C), but with a sequence number
785 // gap. No pic index either, so no temporal scalability cheating :)
786 packet_->frameType = kVideoFrameDelta;
787 // Leave a gap of 2 sequence numbers and two frames.
788 packet_->seqNum = seq_num_ + 3;
789 packet_->timestamp = timestamp_ + (66 * 90);
790 // Still isFirst = marker = true.
791 // Session should be complete (frame is complete), but there's nothing to
792 // decode yet.
793 EXPECT_EQ(kCompleteSession,
794 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
795 frame_out = DecodeCompleteFrame();
796 EXPECT_TRUE(frame_out == NULL);
797
798 // Now send in a complete delta frame (Frame B) that is continuous from A, but
799 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
800 packet_->seqNum = seq_num_ + 1;
801 packet_->timestamp = timestamp_ + (33 * 90);
802 // Still isFirst = marker = true.
803 EXPECT_EQ(kCompleteSession,
804 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
805 frame_out = DecodeCompleteFrame();
806 EXPECT_TRUE(frame_out != NULL);
807 jitter_buffer_->ReleaseFrame(frame_out);
808
809 // But Frame C isn't continuous yet.
810 frame_out = DecodeCompleteFrame();
811 EXPECT_TRUE(frame_out == NULL);
812
813 // Add in the padding. These are empty packets (data length is 0) with no
814 // marker bit and matching the timestamp of Frame B.
815 VCMPacket empty_packet(data_, 0, seq_num_ + 2, timestamp_ + (33 * 90), false);
816 EXPECT_EQ(kOldPacket,
817 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
818 empty_packet.seqNum += 1;
819 EXPECT_EQ(kOldPacket,
820 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
821
822 // But now Frame C should be ready!
823 frame_out = DecodeCompleteFrame();
824 EXPECT_TRUE(frame_out != NULL);
825 jitter_buffer_->ReleaseFrame(frame_out);
826}
827
philipel83f831a2016-03-12 03:30:23 -0800828TEST_P(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000829 packet_->frameType = kVideoFrameKey;
830 packet_->isFirstPacket = true;
831 packet_->markerBit = false;
832 packet_->seqNum = seq_num_;
833 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000834 EXPECT_EQ(0, jitter_buffer_->num_packets());
835 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000836
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000837 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800838 EXPECT_EQ(kIncomplete,
839 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000840
841 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
842
843 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000844 EXPECT_EQ(1, jitter_buffer_->num_packets());
845 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000846
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000847 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800848 EXPECT_EQ(kDuplicatePacket,
849 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000850 EXPECT_EQ(2, jitter_buffer_->num_packets());
851 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000852
853 seq_num_++;
854 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000855 packet_->markerBit = true;
856 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000857
philipel9d3ab612015-12-21 04:12:39 -0800858 EXPECT_EQ(kCompleteSession,
859 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000860
861 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000862 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000863 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000864
865 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000866 EXPECT_EQ(3, jitter_buffer_->num_packets());
867 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000868 jitter_buffer_->ReleaseFrame(frame_out);
869}
870
philipel83f831a2016-03-12 03:30:23 -0800871TEST_P(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000872 packet_->frameType = kVideoFrameKey;
873 packet_->isFirstPacket = true;
874 packet_->markerBit = true;
875 packet_->seqNum = seq_num_;
876 packet_->timestamp = timestamp_;
877 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
878 EXPECT_EQ(0, jitter_buffer_->num_packets());
879 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
880
881 bool retransmitted = false;
882 // Insert first complete frame.
883 EXPECT_EQ(kCompleteSession,
884 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
885
886 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
887 ASSERT_TRUE(frame_out != NULL);
888 CheckOutFrame(frame_out, size_, false);
889 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
890 jitter_buffer_->ReleaseFrame(frame_out);
891
892 // Insert 3 delta frames.
893 for (uint16_t i = 1; i <= 3; ++i) {
894 packet_->seqNum = seq_num_ + i;
895 packet_->timestamp = timestamp_ + (i * 33) * 90;
896 packet_->frameType = kVideoFrameDelta;
897 EXPECT_EQ(kCompleteSession,
898 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
899 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
900 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
901 }
902
903 // Retransmit second delta frame.
904 packet_->seqNum = seq_num_ + 2;
905 packet_->timestamp = timestamp_ + 66 * 90;
906
907 EXPECT_EQ(kDuplicatePacket,
908 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
909
910 EXPECT_EQ(5, jitter_buffer_->num_packets());
911 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
912
913 // Should be able to decode 3 delta frames, key frame already decoded.
914 for (size_t i = 0; i < 3; ++i) {
915 frame_out = DecodeCompleteFrame();
916 ASSERT_TRUE(frame_out != NULL);
917 CheckOutFrame(frame_out, size_, false);
918 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
919 jitter_buffer_->ReleaseFrame(frame_out);
920 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000921}
922
philipel83f831a2016-03-12 03:30:23 -0800923TEST_P(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700924 // Verify that JB skips forward to next base layer frame.
925 // -------------------------------------------------
926 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
927 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
928 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
929 // | ss | x | x | x | |
930 // -------------------------------------------------
931 // |<----------tl0idx:200--------->|<---tl0idx:201---
932
933 bool re = false;
934 packet_->codec = kVideoCodecVP9;
935 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
936 packet_->isFirstPacket = true;
937 packet_->markerBit = true;
938 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
939 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
940 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
941 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700942 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
943
944 packet_->seqNum = 65485;
945 packet_->timestamp = 1000;
946 packet_->frameType = kVideoFrameKey;
947 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
948 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
asapersson394c5372015-11-05 06:07:03 -0800949 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700950 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
951 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
952 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
953 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
954
955 // Insert next temporal layer 0.
956 packet_->seqNum = 65489;
957 packet_->timestamp = 13000;
958 packet_->frameType = kVideoFrameDelta;
959 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9;
960 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201;
asapersson394c5372015-11-05 06:07:03 -0800961 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700962 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
963 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
964
965 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
966 EXPECT_EQ(1000U, frame_out->TimeStamp());
967 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
968 jitter_buffer_->ReleaseFrame(frame_out);
969
970 frame_out = DecodeCompleteFrame();
971 EXPECT_EQ(13000U, frame_out->TimeStamp());
972 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
973 jitter_buffer_->ReleaseFrame(frame_out);
974}
975
philipel83f831a2016-03-12 03:30:23 -0800976TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700977 // Verify that frames are updated with SS data when SS packet is reordered.
978 // --------------------------------
979 // | 65486 | 65487 | 65485 |...
980 // | pid:6 | pid:7 | pid:5 |...
981 // | tid:2 | tid:1 | tid:0 |...
982 // | | | ss |
983 // --------------------------------
984 // |<--------tl0idx:200--------->|
985
986 bool re = false;
987 packet_->codec = kVideoCodecVP9;
988 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
989 packet_->isFirstPacket = true;
990 packet_->markerBit = true;
991 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
992 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
993 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
994 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700995 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
996
997 packet_->seqNum = 65486;
998 packet_->timestamp = 6000;
999 packet_->frameType = kVideoFrameDelta;
1000 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001001 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 2;
1002 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001003 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1004
1005 packet_->seqNum = 65487;
1006 packet_->timestamp = 9000;
1007 packet_->frameType = kVideoFrameDelta;
1008 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7;
asapersson394c5372015-11-05 06:07:03 -08001009 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1010 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001011 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1012
1013 // Insert first frame with SS data.
1014 packet_->seqNum = 65485;
1015 packet_->timestamp = 3000;
1016 packet_->frameType = kVideoFrameKey;
1017 packet_->width = 352;
1018 packet_->height = 288;
1019 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001020 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1021 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001022 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1023 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1024 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1025 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1026
1027 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1028 EXPECT_EQ(3000U, frame_out->TimeStamp());
1029 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1030 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1031 EXPECT_FALSE(
1032 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1033 jitter_buffer_->ReleaseFrame(frame_out);
1034
1035 frame_out = DecodeCompleteFrame();
1036 EXPECT_EQ(6000U, frame_out->TimeStamp());
1037 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1038 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1039 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1040 jitter_buffer_->ReleaseFrame(frame_out);
1041
1042 frame_out = DecodeCompleteFrame();
1043 EXPECT_EQ(9000U, frame_out->TimeStamp());
1044 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1045 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1046 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1047 jitter_buffer_->ReleaseFrame(frame_out);
1048}
1049
philipel83f831a2016-03-12 03:30:23 -08001050TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001051 // Verify that frames are updated with SS data when SS packet is reordered.
1052 // -----------------------------------------
1053 // | 65486 | 65487 | 65485 | 65484 |...
1054 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1055 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1056 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1057 // | t:6000 | t:6000 | t:3000 | t:3000 |
1058 // | | | | ss |
1059 // -----------------------------------------
1060 // |<-----------tl0idx:200------------>|
1061
1062 bool re = false;
1063 packet_->codec = kVideoCodecVP9;
1064 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
1065 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
1066 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
1067 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001068 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
1069
1070 packet_->isFirstPacket = true;
1071 packet_->markerBit = false;
1072 packet_->seqNum = 65486;
1073 packet_->timestamp = 6000;
1074 packet_->frameType = kVideoFrameDelta;
1075 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1076 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001077 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1078 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001079 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1080
1081 packet_->isFirstPacket = false;
1082 packet_->markerBit = true;
1083 packet_->seqNum = 65487;
1084 packet_->frameType = kVideoFrameDelta;
1085 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1086 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001087 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1088 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001089 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1090
1091 packet_->isFirstPacket = false;
1092 packet_->markerBit = true;
1093 packet_->seqNum = 65485;
1094 packet_->timestamp = 3000;
1095 packet_->frameType = kVideoFrameKey;
1096 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1097 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001098 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1099 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001100 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1101
1102 // Insert first frame with SS data.
1103 packet_->isFirstPacket = true;
1104 packet_->markerBit = false;
1105 packet_->seqNum = 65484;
1106 packet_->frameType = kVideoFrameKey;
1107 packet_->width = 352;
1108 packet_->height = 288;
1109 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1110 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001111 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1112 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001113 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1114 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1115 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1116 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1117
1118 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1119 EXPECT_EQ(3000U, frame_out->TimeStamp());
1120 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1121 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1122 EXPECT_FALSE(
1123 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1124 jitter_buffer_->ReleaseFrame(frame_out);
1125
1126 frame_out = DecodeCompleteFrame();
1127 EXPECT_EQ(6000U, frame_out->TimeStamp());
1128 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1129 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1130 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1131 jitter_buffer_->ReleaseFrame(frame_out);
1132}
1133
philipel83f831a2016-03-12 03:30:23 -08001134TEST_P(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001135 packet_->frameType = kVideoFrameKey;
1136 packet_->isFirstPacket = true;
1137 packet_->markerBit = false;
1138 packet_->seqNum = seq_num_;
1139 packet_->timestamp = timestamp_;
1140 packet_->insertStartCode = true;
1141
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001142 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001143 EXPECT_EQ(kIncomplete,
1144 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001145
1146 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1147
1148 // Frame should not be complete.
1149 EXPECT_TRUE(frame_out == NULL);
1150
1151 seq_num_++;
1152 packet_->isFirstPacket = false;
1153 packet_->markerBit = true;
1154 packet_->seqNum = seq_num_;
1155
philipel9d3ab612015-12-21 04:12:39 -08001156 EXPECT_EQ(kCompleteSession,
1157 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001158
1159 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001160 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001161 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001162 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001163}
1164
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001165// Test threshold conditions of decodable state.
philipel83f831a2016-03-12 03:30:23 -08001166TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001167 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001168 // Always start with a key frame. Use 10 packets to test Decodable State
1169 // boundaries.
1170 packet_->frameType = kVideoFrameKey;
1171 packet_->isFirstPacket = true;
1172 packet_->markerBit = false;
1173 packet_->seqNum = seq_num_;
1174 packet_->timestamp = timestamp_;
1175
1176 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001177 EXPECT_EQ(kIncomplete,
1178 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001179 uint32_t timestamp = 0;
1180 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1181 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1182
1183 packet_->isFirstPacket = false;
1184 for (int i = 1; i < 9; ++i) {
1185 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001186 EXPECT_EQ(kIncomplete,
1187 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001188 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1189 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1190 }
1191
1192 // last packet
1193 packet_->markerBit = true;
1194 packet_->seqNum++;
1195
philipel9d3ab612015-12-21 04:12:39 -08001196 EXPECT_EQ(kCompleteSession,
1197 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001198 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1199 CheckOutFrame(frame_out, 10 * size_, false);
1200 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001201 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001202
1203 // An incomplete frame can only be decoded once a subsequent frame has begun
1204 // to arrive. Insert packet in distant frame for this purpose.
1205 packet_->frameType = kVideoFrameDelta;
1206 packet_->isFirstPacket = true;
1207 packet_->markerBit = false;
1208 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001209 packet_->timestamp += 33 * 90 * 8;
1210
philipel9d3ab612015-12-21 04:12:39 -08001211 EXPECT_EQ(kDecodableSession,
1212 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001213 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1214 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1215
1216 // Insert second frame
1217 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001218 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001219
philipel9d3ab612015-12-21 04:12:39 -08001220 EXPECT_EQ(kDecodableSession,
1221 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001222 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1223 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1224
1225 packet_->isFirstPacket = false;
1226 for (int i = 1; i < 8; ++i) {
1227 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001228 EXPECT_EQ(kDecodableSession,
1229 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001230 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1231 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1232 }
1233
1234 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001235 EXPECT_EQ(kDecodableSession,
1236 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001237 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1238 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1239
1240 frame_out = DecodeIncompleteFrame();
1241 ASSERT_FALSE(NULL == frame_out);
1242 CheckOutFrame(frame_out, 9 * size_, false);
1243 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001244 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001245
1246 packet_->markerBit = true;
1247 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001248 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001249}
1250
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001251// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001252TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001253 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1254 // Always start with a key frame.
1255 packet_->frameType = kVideoFrameKey;
1256 packet_->isFirstPacket = true;
1257 packet_->markerBit = true;
1258 packet_->seqNum = seq_num_;
1259 packet_->timestamp = timestamp_;
1260
1261 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001262 EXPECT_EQ(kCompleteSession,
1263 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001264 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1265 CheckOutFrame(frame_out, size_, false);
1266 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001267 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001268
1269 // An incomplete frame can only be decoded once a subsequent frame has begun
1270 // to arrive. Insert packet in distant frame for this purpose.
1271 packet_->frameType = kVideoFrameDelta;
1272 packet_->isFirstPacket = false;
1273 packet_->markerBit = false;
1274 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001275 packet_->timestamp += 33 * 90 * 8;
1276 EXPECT_EQ(kIncomplete,
1277 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001278 uint32_t timestamp;
1279 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1280 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1281
1282 // Insert second frame - an incomplete key frame.
1283 packet_->frameType = kVideoFrameKey;
1284 packet_->isFirstPacket = true;
1285 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001286 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001287
philipel9d3ab612015-12-21 04:12:39 -08001288 EXPECT_EQ(kIncomplete,
1289 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001290 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1291 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1292
1293 // Insert a few more packets. Make sure we're waiting for the key frame to be
1294 // complete.
1295 packet_->isFirstPacket = false;
1296 for (int i = 1; i < 5; ++i) {
1297 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001298 EXPECT_EQ(kIncomplete,
1299 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001300 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1301 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1302 }
1303
1304 // Complete key frame.
1305 packet_->markerBit = true;
1306 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001307 EXPECT_EQ(kCompleteSession,
1308 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001309 frame_out = DecodeCompleteFrame();
1310 CheckOutFrame(frame_out, 6 * size_, false);
1311 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001312 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001313}
1314
1315// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001316TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001317 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1318 // Always start with a key frame.
1319 packet_->frameType = kVideoFrameKey;
1320 packet_->isFirstPacket = true;
1321 packet_->markerBit = true;
1322 packet_->seqNum = seq_num_;
1323 packet_->timestamp = timestamp_;
1324
1325 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001326 EXPECT_EQ(kCompleteSession,
1327 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001328 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1329 CheckOutFrame(frame_out, size_, false);
1330 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001331 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001332
1333 // An incomplete frame can only be decoded once a subsequent frame has begun
1334 // to arrive. Insert packet in distant frame for this purpose.
1335 packet_->frameType = kVideoFrameDelta;
1336 packet_->isFirstPacket = false;
1337 packet_->markerBit = false;
1338 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001339 packet_->timestamp += 33 * 90 * 8;
1340 EXPECT_EQ(kIncomplete,
1341 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001342 uint32_t timestamp;
1343 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1344 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1345
1346 // Insert second frame with the first packet missing. Make sure we're waiting
1347 // for the key frame to be complete.
1348 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001349 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001350
philipel9d3ab612015-12-21 04:12:39 -08001351 EXPECT_EQ(kIncomplete,
1352 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001353 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1354 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1355
1356 for (int i = 0; i < 5; ++i) {
1357 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001358 EXPECT_EQ(kIncomplete,
1359 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001360 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1361 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1362 }
1363
1364 // Add first packet. Frame should now be decodable, but incomplete.
1365 packet_->isFirstPacket = true;
1366 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001367 EXPECT_EQ(kDecodableSession,
1368 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001369 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1370 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1371
1372 frame_out = DecodeIncompleteFrame();
1373 CheckOutFrame(frame_out, 7 * size_, false);
1374 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001375 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001376}
1377
philipel83f831a2016-03-12 03:30:23 -08001378TEST_P(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001379 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001380 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001381 packet_->frameType = kVideoFrameKey;
1382 packet_->isFirstPacket = true;
1383 packet_->markerBit = true;
1384 packet_->seqNum = seq_num_;
1385 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001386 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001387 EXPECT_EQ(kCompleteSession,
1388 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001389 uint32_t next_timestamp;
1390 EXPECT_TRUE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1391 EXPECT_EQ(packet_->timestamp, next_timestamp);
1392 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(next_timestamp);
1393 EXPECT_TRUE(frame != NULL);
1394 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001395
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001396 // Drop a complete frame.
1397 timestamp_ += 2 * 33 * 90;
1398 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001399 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001400 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001401 packet_->markerBit = false;
1402 packet_->seqNum = seq_num_;
1403 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001404 EXPECT_EQ(kDecodableSession,
1405 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001406 // Insert a packet (so the previous one will be released).
1407 timestamp_ += 33 * 90;
1408 seq_num_ += 2;
1409 packet_->frameType = kVideoFrameDelta;
1410 packet_->isFirstPacket = true;
1411 packet_->markerBit = false;
1412 packet_->seqNum = seq_num_;
1413 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001414 EXPECT_EQ(kDecodableSession,
1415 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001416 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1417 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1418 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001419}
1420
philipel83f831a2016-03-12 03:30:23 -08001421TEST_P(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001422 // Verify missing packets statistics and not decodable packets statistics.
1423 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1424 // The last packet is an empty (non-media) packet.
1425
1426 // Select a start seqNum which triggers a difficult wrap situation
1427 // The JB will only output (incomplete)frames if the next one has started
1428 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001429 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001430 seq_num_ = 0xffff - 4;
1431 seq_num_++;
1432 packet_->frameType = kVideoFrameKey;
1433 packet_->isFirstPacket = true;
1434 packet_->markerBit = false;
1435 packet_->seqNum = seq_num_;
1436 packet_->timestamp = timestamp_;
1437 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001438
1439 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001440 EXPECT_EQ(kDecodableSession,
1441 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001442 for (int i = 0; i < 11; ++i) {
1443 webrtc::FrameType frametype = kVideoFrameDelta;
1444 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001445 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001446 packet_->frameType = frametype;
1447 packet_->isFirstPacket = true;
1448 packet_->markerBit = false;
1449 packet_->seqNum = seq_num_;
1450 packet_->timestamp = timestamp_;
1451 packet_->completeNALU = kNaluStart;
1452
philipel9d3ab612015-12-21 04:12:39 -08001453 EXPECT_EQ(kDecodableSession,
1454 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001455
1456 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1457
1458 // Should not be complete.
1459 EXPECT_TRUE(frame_out == NULL);
1460
1461 seq_num_ += 2;
1462 packet_->isFirstPacket = false;
1463 packet_->markerBit = true;
1464 packet_->seqNum = seq_num_;
1465 packet_->completeNALU = kNaluEnd;
1466
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001467 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1468 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001469
1470 // Insert an empty (non-media) packet.
1471 seq_num_++;
1472 packet_->isFirstPacket = false;
1473 packet_->markerBit = false;
1474 packet_->seqNum = seq_num_;
1475 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001476 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001477
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001478 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001479 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001480 frame_out = DecodeIncompleteFrame();
1481
1482 // One of the packets has been discarded by the jitter buffer.
1483 // Last frame can't be extracted yet.
1484 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001485 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001486
1487 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001488 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001489 } else {
philipel9d3ab612015-12-21 04:12:39 -08001490 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001491 }
1492 EXPECT_FALSE(frame_out->Complete());
1493 EXPECT_FALSE(frame_out->MissingFrame());
1494 }
1495
1496 jitter_buffer_->ReleaseFrame(frame_out);
1497 }
1498
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001499 // Insert 3 old packets and verify that we have 3 discarded packets
1500 // Match value to actual latest timestamp decoded.
1501 timestamp_ -= 33 * 90;
1502 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001503
philipel9d3ab612015-12-21 04:12:39 -08001504 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001505
1506 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001507
philipel9d3ab612015-12-21 04:12:39 -08001508 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001509
1510 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001511
philipel9d3ab612015-12-21 04:12:39 -08001512 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001513
1514 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1515
1516 jitter_buffer_->Flush();
1517
1518 // This statistic shouldn't be reset by a flush.
1519 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1520}
1521
philipel83f831a2016-03-12 03:30:23 -08001522TEST_P(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001523 seq_num_ = 0xfff0;
1524 packet_->frameType = kVideoFrameKey;
1525 packet_->isFirstPacket = true;
1526 packet_->markerBit = false;
1527 packet_->seqNum = seq_num_;
1528 packet_->timestamp = timestamp_;
1529
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001530 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001531 EXPECT_EQ(kIncomplete,
1532 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001533
1534 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1535
1536 EXPECT_TRUE(frame_out == NULL);
1537
1538 int loop = 0;
1539 do {
1540 seq_num_++;
1541 packet_->isFirstPacket = false;
1542 packet_->markerBit = false;
1543 packet_->seqNum = seq_num_;
1544
philipel9d3ab612015-12-21 04:12:39 -08001545 EXPECT_EQ(kIncomplete,
1546 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547
1548 frame_out = DecodeCompleteFrame();
1549
1550 EXPECT_TRUE(frame_out == NULL);
1551
1552 loop++;
1553 } while (loop < 98);
1554
1555 seq_num_++;
1556 packet_->isFirstPacket = false;
1557 packet_->markerBit = true;
1558 packet_->seqNum = seq_num_;
1559
philipel9d3ab612015-12-21 04:12:39 -08001560 EXPECT_EQ(kCompleteSession,
1561 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562
1563 frame_out = DecodeCompleteFrame();
1564
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001565 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001566
1567 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001568 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001569}
1570
philipel83f831a2016-03-12 03:30:23 -08001571TEST_P(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001572 // Insert "first" packet last seqnum.
1573 seq_num_ = 10;
1574 packet_->frameType = kVideoFrameKey;
1575 packet_->isFirstPacket = false;
1576 packet_->markerBit = true;
1577 packet_->seqNum = seq_num_;
1578
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001579 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001580 EXPECT_EQ(kIncomplete,
1581 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1583
1584 // Should not be complete.
1585 EXPECT_TRUE(frame_out == NULL);
1586
1587 // Insert 98 frames.
1588 int loop = 0;
1589 do {
1590 seq_num_--;
1591 packet_->isFirstPacket = false;
1592 packet_->markerBit = false;
1593 packet_->seqNum = seq_num_;
1594
philipel9d3ab612015-12-21 04:12:39 -08001595 EXPECT_EQ(kIncomplete,
1596 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001597
1598 frame_out = DecodeCompleteFrame();
1599
1600 EXPECT_TRUE(frame_out == NULL);
1601
1602 loop++;
1603 } while (loop < 98);
1604
1605 // Insert last packet.
1606 seq_num_--;
1607 packet_->isFirstPacket = true;
1608 packet_->markerBit = false;
1609 packet_->seqNum = seq_num_;
1610
philipel9d3ab612015-12-21 04:12:39 -08001611 EXPECT_EQ(kCompleteSession,
1612 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001613
1614 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001615 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001616 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001617 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618}
1619
philipel83f831a2016-03-12 03:30:23 -08001620TEST_P(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001621 // ------- -------
1622 // | 2 | | 1 |
1623 // ------- -------
1624 // t = 3000 t = 2000
1625 seq_num_ = 2;
1626 timestamp_ = 3000;
1627 packet_->frameType = kVideoFrameKey;
1628 packet_->isFirstPacket = true;
1629 packet_->markerBit = true;
1630 packet_->timestamp = timestamp_;
1631 packet_->seqNum = seq_num_;
1632
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001633 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001634 EXPECT_EQ(kCompleteSession,
1635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001636
1637 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1638 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001639 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001641 jitter_buffer_->ReleaseFrame(frame_out);
1642
1643 seq_num_--;
1644 timestamp_ = 2000;
1645 packet_->frameType = kVideoFrameDelta;
1646 packet_->isFirstPacket = true;
1647 packet_->markerBit = true;
1648 packet_->seqNum = seq_num_;
1649 packet_->timestamp = timestamp_;
1650
philipel9d3ab612015-12-21 04:12:39 -08001651 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001652}
1653
philipel83f831a2016-03-12 03:30:23 -08001654TEST_P(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655 // ------- -------
1656 // | 2 | | 1 |
1657 // ------- -------
1658 // t = 3000 t = 0xffffff00
1659
1660 seq_num_ = 2;
1661 timestamp_ = 3000;
1662 packet_->frameType = kVideoFrameKey;
1663 packet_->isFirstPacket = true;
1664 packet_->markerBit = true;
1665 packet_->seqNum = seq_num_;
1666 packet_->timestamp = timestamp_;
1667
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001668 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001669 EXPECT_EQ(kCompleteSession,
1670 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001671
1672 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1673 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1674
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001675 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001676
1677 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1678
1679 jitter_buffer_->ReleaseFrame(frame_out);
1680
1681 seq_num_--;
1682 timestamp_ = 0xffffff00;
1683 packet_->frameType = kVideoFrameDelta;
1684 packet_->isFirstPacket = true;
1685 packet_->markerBit = true;
1686 packet_->seqNum = seq_num_;
1687 packet_->timestamp = timestamp_;
1688
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001690 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001691}
1692
philipel83f831a2016-03-12 03:30:23 -08001693TEST_P(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001694 // --------------- ---------------
1695 // | 1 | 2 | | 3 | 4 |
1696 // --------------- ---------------
1697 // t = 0xffffff00 t = 33*90
1698
1699 timestamp_ = 0xffffff00;
1700 packet_->frameType = kVideoFrameKey;
1701 packet_->isFirstPacket = true;
1702 packet_->markerBit = false;
1703 packet_->seqNum = seq_num_;
1704 packet_->timestamp = timestamp_;
1705
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001706 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001707 EXPECT_EQ(kIncomplete,
1708 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001709
1710 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001711 EXPECT_TRUE(frame_out == NULL);
1712
1713 seq_num_++;
1714 packet_->isFirstPacket = false;
1715 packet_->markerBit = true;
1716 packet_->seqNum = seq_num_;
1717
philipel9d3ab612015-12-21 04:12:39 -08001718 EXPECT_EQ(kCompleteSession,
1719 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001720
1721 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001722 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001723 jitter_buffer_->ReleaseFrame(frame_out);
1724
1725 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001726 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001727 packet_->frameType = kVideoFrameDelta;
1728 packet_->isFirstPacket = true;
1729 packet_->markerBit = false;
1730 packet_->seqNum = seq_num_;
1731 packet_->timestamp = timestamp_;
1732
philipel9d3ab612015-12-21 04:12:39 -08001733 EXPECT_EQ(kIncomplete,
1734 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001735
1736 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737 EXPECT_TRUE(frame_out == NULL);
1738
1739 seq_num_++;
1740 packet_->isFirstPacket = false;
1741 packet_->markerBit = true;
1742 packet_->seqNum = seq_num_;
1743
philipel9d3ab612015-12-21 04:12:39 -08001744 EXPECT_EQ(kCompleteSession,
1745 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001746
1747 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001748 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001750 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001751}
1752
philipel83f831a2016-03-12 03:30:23 -08001753TEST_P(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001754 // ------- -------
1755 // | 1 | | 2 |
1756 // ------- -------
1757 // t = 0xffffff00 t = 2700
1758
1759 timestamp_ = 0xffffff00;
1760 packet_->frameType = kVideoFrameKey;
1761 packet_->isFirstPacket = true;
1762 packet_->markerBit = true;
1763 packet_->timestamp = timestamp_;
1764
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001765 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001766 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001767 EXPECT_EQ(kCompleteSession,
1768 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001769
1770 // Insert next frame.
1771 seq_num_++;
1772 timestamp_ = 2700;
1773 packet_->frameType = kVideoFrameDelta;
1774 packet_->isFirstPacket = true;
1775 packet_->markerBit = true;
1776 packet_->seqNum = seq_num_;
1777 packet_->timestamp = timestamp_;
1778
philipel9d3ab612015-12-21 04:12:39 -08001779 EXPECT_EQ(kCompleteSession,
1780 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001781
1782 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1783 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001784 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001785 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001786 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787
1788 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1789 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001790 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001791 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001792 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001793}
1794
philipel83f831a2016-03-12 03:30:23 -08001795TEST_P(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796 // ------- -------
1797 // | 2 | | 1 |
1798 // ------- -------
1799 // t = 2700 t = 0xffffff00
1800
1801 seq_num_ = 2;
1802 timestamp_ = 2700;
1803 packet_->frameType = kVideoFrameDelta;
1804 packet_->isFirstPacket = true;
1805 packet_->markerBit = true;
1806 packet_->seqNum = seq_num_;
1807 packet_->timestamp = timestamp_;
1808
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001809 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001810 EXPECT_EQ(kCompleteSession,
1811 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001812
1813 // Insert second frame
1814 seq_num_--;
1815 timestamp_ = 0xffffff00;
1816 packet_->frameType = kVideoFrameKey;
1817 packet_->isFirstPacket = true;
1818 packet_->markerBit = true;
1819 packet_->seqNum = seq_num_;
1820 packet_->timestamp = timestamp_;
1821
philipel9d3ab612015-12-21 04:12:39 -08001822 EXPECT_EQ(kCompleteSession,
1823 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001824
1825 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1826 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001827 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001828 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001829 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001830
1831 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1832 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001833 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001835 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001836}
1837
philipel83f831a2016-03-12 03:30:23 -08001838TEST_P(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839 int loop = 0;
1840 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001841 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842 // Insert kMaxPacketsInJitterBuffer into frame.
1843 do {
1844 seq_num_++;
1845 packet_->isFirstPacket = false;
1846 packet_->markerBit = false;
1847 packet_->seqNum = seq_num_;
1848
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001849 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001850 EXPECT_EQ(kIncomplete,
1851 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001852 firstPacket = false;
1853 } else {
philipel9d3ab612015-12-21 04:12:39 -08001854 EXPECT_EQ(kIncomplete,
1855 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001856 }
1857
1858 loop++;
1859 } while (loop < kMaxPacketsInSession);
1860
1861 // Max number of packets inserted.
1862 // Insert one more packet.
1863 seq_num_++;
1864 packet_->isFirstPacket = false;
1865 packet_->markerBit = true;
1866 packet_->seqNum = seq_num_;
1867
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001868 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001869 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001871}
1872
philipel83f831a2016-03-12 03:30:23 -08001873TEST_P(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001874 // TEST fill JB with more than max number of frame (50 delta frames +
1875 // 51 key frames) with wrap in seq_num_
1876 //
1877 // --------------------------------------------------------------
1878 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1879 // --------------------------------------------------------------
1880 // |<-----------delta frames------------->|<------key frames----->|
1881
jbauchdb81ffd2015-11-23 03:59:02 -08001882 // Make sure the jitter doesn't request a keyframe after too much non-
1883 // decodable frames.
1884 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001885 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001886
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001887 int loop = 0;
1888 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001889 uint32_t first_key_frame_timestamp = 0;
1890 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001891 // Insert MAX_NUMBER_OF_FRAMES frames.
1892 do {
philipel9d3ab612015-12-21 04:12:39 -08001893 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001894 seq_num_++;
1895 packet_->isFirstPacket = true;
1896 packet_->markerBit = true;
1897 packet_->seqNum = seq_num_;
1898 packet_->timestamp = timestamp_;
1899
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001900 if (loop == 50) {
1901 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001902 packet_->frameType = kVideoFrameKey;
1903 }
1904
1905 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001906 EXPECT_EQ(kCompleteSession,
1907 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001908
1909 loop++;
1910 } while (loop < kMaxNumberOfFrames);
1911
1912 // Max number of frames inserted.
1913
1914 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001915 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001916 seq_num_++;
1917 packet_->isFirstPacket = true;
1918 packet_->markerBit = true;
1919 packet_->seqNum = seq_num_;
1920 packet_->timestamp = timestamp_;
1921
1922 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001923 EXPECT_EQ(kFlushIndicator,
1924 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001925
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001926 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1927 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001928 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001930 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001931}
1932
philipel83f831a2016-03-12 03:30:23 -08001933TEST_P(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001934 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001935 seq_num_ = 3;
1936 // Insert one empty packet per frame, should never return the last timestamp
1937 // inserted. Only return empty frames in the presence of subsequent frames.
1938 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001939 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001940 for (int i = 0; i < maxSize + 10; i++) {
1941 timestamp_ += 33 * 90;
1942 seq_num_++;
1943 packet_->isFirstPacket = false;
1944 packet_->markerBit = false;
1945 packet_->seqNum = seq_num_;
1946 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001947 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001948
philipel9d3ab612015-12-21 04:12:39 -08001949 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001950 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1951 // Timestamp should never be the last TS inserted.
1952 if (testFrame != NULL) {
1953 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001954 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001955 }
1956 }
1957}
1958
philipel83f831a2016-03-12 03:30:23 -08001959TEST_P(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001960 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001961 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001962 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001963 timestamp_ += 33 * 90;
1964 int insertedLength = 0;
1965 packet_->seqNum = seq_num_;
1966 packet_->timestamp = timestamp_;
1967 packet_->frameType = kVideoFrameKey;
1968 packet_->isFirstPacket = true;
1969 packet_->completeNALU = kNaluStart;
1970 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001971 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001972
philipel9d3ab612015-12-21 04:12:39 -08001973 EXPECT_EQ(kDecodableSession,
1974 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001975
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001976 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001977 packet_->seqNum = seq_num_;
1978 packet_->frameType = kVideoFrameKey;
1979 packet_->isFirstPacket = false;
1980 packet_->completeNALU = kNaluIncomplete;
1981 packet_->markerBit = false;
1982
philipel9d3ab612015-12-21 04:12:39 -08001983 EXPECT_EQ(kDecodableSession,
1984 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001985
1986 seq_num_++;
1987 packet_->seqNum = seq_num_;
1988 packet_->frameType = kVideoFrameKey;
1989 packet_->isFirstPacket = false;
1990 packet_->completeNALU = kNaluEnd;
1991 packet_->markerBit = false;
1992
philipel9d3ab612015-12-21 04:12:39 -08001993 EXPECT_EQ(kDecodableSession,
1994 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001995
1996 seq_num_++;
1997 packet_->seqNum = seq_num_;
1998 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001999 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002000 EXPECT_EQ(kDecodableSession,
2001 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002002 // The JB will only output (incomplete) frames if a packet belonging to a
2003 // subsequent frame was already inserted. Insert one packet of a subsequent
2004 // frame. place high timestamp so the JB would always have a next frame
2005 // (otherwise, for every inserted frame we need to take care of the next
2006 // frame as well).
2007 packet_->seqNum = 1;
2008 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2009 packet_->frameType = kVideoFrameDelta;
2010 packet_->isFirstPacket = false;
2011 packet_->completeNALU = kNaluStart;
2012 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002013
philipel9d3ab612015-12-21 04:12:39 -08002014 EXPECT_EQ(kDecodableSession,
2015 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016
2017 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2018
2019 // We can decode everything from a NALU until a packet has been lost.
2020 // Thus we can decode the first packet of the first NALU and the second NALU
2021 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002022 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002023 jitter_buffer_->ReleaseFrame(frame_out);
2024
2025 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002026 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002027 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002028 insertedLength = 0;
2029
2030 packet_->seqNum = seq_num_;
2031 packet_->timestamp = timestamp_;
2032 packet_->frameType = kVideoFrameKey;
2033 packet_->isFirstPacket = false;
2034 packet_->completeNALU = kNaluEnd;
2035 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002036 EXPECT_EQ(kDecodableSession,
2037 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2038 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002039 seq_num_--;
2040 packet_->seqNum = seq_num_;
2041 packet_->timestamp = timestamp_;
2042 packet_->frameType = kVideoFrameKey;
2043 packet_->isFirstPacket = true;
2044 packet_->completeNALU = kNaluStart;
2045 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002046
philipel9d3ab612015-12-21 04:12:39 -08002047 EXPECT_EQ(kDecodableSession,
2048 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002049 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2050
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002051 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002052 packet_->seqNum = seq_num_;
2053 packet_->timestamp = timestamp_;
2054 packet_->frameType = kVideoFrameKey;
2055 packet_->isFirstPacket = false;
2056 packet_->completeNALU = kNaluComplete;
2057 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002058 EXPECT_EQ(kDecodableSession,
2059 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002060 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002061 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002062 packet_->seqNum = seq_num_;
2063 packet_->timestamp = timestamp_;
2064 packet_->frameType = kVideoFrameKey;
2065 packet_->isFirstPacket = false;
2066 packet_->completeNALU = kNaluStart;
2067 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002068 EXPECT_EQ(kDecodableSession,
2069 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002070 // This packet should be decoded since it's the beginning of a NAL.
2071 insertedLength += packet_->sizeBytes;
2072
2073 seq_num_ += 2;
2074 packet_->seqNum = seq_num_;
2075 packet_->timestamp = timestamp_;
2076 packet_->frameType = kVideoFrameKey;
2077 packet_->isFirstPacket = false;
2078 packet_->completeNALU = kNaluEnd;
2079 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002080 EXPECT_EQ(kDecodableSession,
2081 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002082 // This packet should not be decoded because it is an incomplete NAL if it
2083 // is the last.
2084 frame_out = DecodeIncompleteFrame();
2085 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002086 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002087 jitter_buffer_->ReleaseFrame(frame_out);
2088
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002089 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002090 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002091 timestamp_ += 33 * 90;
2092 VCMPacket emptypacket(data_, 0, seq_num_, timestamp_, true);
2093 emptypacket.seqNum = seq_num_;
2094 emptypacket.timestamp = timestamp_;
2095 emptypacket.frameType = kVideoFrameKey;
2096 emptypacket.isFirstPacket = true;
2097 emptypacket.completeNALU = kNaluComplete;
2098 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002099 EXPECT_EQ(kCompleteSession,
2100 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101 // This packet should not be decoded because it is an incomplete NAL if it
2102 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002103
2104 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2105 // has arrived.
2106 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002107 EXPECT_TRUE(frame_out != NULL);
2108 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002109
2110 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002111 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002112 timestamp_ += 33 * 90;
2113
2114 packet_->seqNum = seq_num_;
2115 packet_->timestamp = timestamp_;
2116 packet_->frameType = kVideoFrameKey;
2117 packet_->isFirstPacket = true;
2118 packet_->completeNALU = kNaluComplete;
2119 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002120
philipel9d3ab612015-12-21 04:12:39 -08002121 EXPECT_EQ(kDecodableSession,
2122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002123
agalusza@google.comd177c102013-08-08 01:12:33 +00002124 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002125 emptypacket.seqNum = seq_num_;
2126 emptypacket.timestamp = timestamp_;
2127 emptypacket.frameType = kVideoFrameKey;
2128 emptypacket.isFirstPacket = true;
2129 emptypacket.completeNALU = kNaluComplete;
2130 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002131 EXPECT_EQ(kCompleteSession,
2132 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002133
2134 frame_out = DecodeCompleteFrame();
2135 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002136 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002137 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002138}
2139
philipel83f831a2016-03-12 03:30:23 -08002140TEST_P(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002141 // Test that a we cannot get incomplete frames from the JB if we haven't
2142 // received the marker bit, unless we have received a packet from a later
2143 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002144 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002145 // Start with a complete key frame - insert and decode.
2146 packet_->frameType = kVideoFrameKey;
2147 packet_->isFirstPacket = true;
2148 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002149 bool retransmitted = false;
2150
philipel9d3ab612015-12-21 04:12:39 -08002151 EXPECT_EQ(kCompleteSession,
2152 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002153 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2154 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002155 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002156
2157 packet_->seqNum += 2;
2158 packet_->timestamp += 33 * 90;
2159 packet_->frameType = kVideoFrameDelta;
2160 packet_->isFirstPacket = false;
2161 packet_->markerBit = false;
2162
philipel9d3ab612015-12-21 04:12:39 -08002163 EXPECT_EQ(kDecodableSession,
2164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002165
2166 frame_out = DecodeIncompleteFrame();
2167 EXPECT_TRUE(frame_out == NULL);
2168
2169 packet_->seqNum += 2;
2170 packet_->timestamp += 33 * 90;
2171 packet_->isFirstPacket = true;
2172
philipel9d3ab612015-12-21 04:12:39 -08002173 EXPECT_EQ(kDecodableSession,
2174 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002175
2176 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002177 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002178 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002179}
2180
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002181TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002182 // Make sure the jitter doesn't request a keyframe after too much non-
2183 // decodable frames.
2184 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002185 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002186 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002187 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002188 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002189 DropFrame(1);
2190 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002191 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002192 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002193 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002194 // This frame will make the jitter buffer recycle frames until a key frame.
2195 // Since none is found it will have to wait until the next key frame before
2196 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002197 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002198 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002199}
2200
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002201TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002202 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002203 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002204 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002205 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002206 // Insert empty packet.
2207 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002208 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002209 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002210 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002211 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002212 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002213 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002214 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002215 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002216 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002217 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002218 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002219}
2220
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002221TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002222 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2223 EXPECT_EQ(0, frame_stats.delta_frames);
2224 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002225
2226 uint32_t framerate = 0;
2227 uint32_t bitrate = 0;
2228 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2229 EXPECT_EQ(0u, framerate);
2230 EXPECT_EQ(0u, bitrate);
2231
2232 // Insert a couple of key and delta frames.
2233 InsertFrame(kVideoFrameKey);
2234 InsertFrame(kVideoFrameDelta);
2235 InsertFrame(kVideoFrameDelta);
2236 InsertFrame(kVideoFrameKey);
2237 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002238 // Decode some of them to make sure the statistics doesn't depend on frames
2239 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002240 EXPECT_TRUE(DecodeCompleteFrame());
2241 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002242 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002243 EXPECT_EQ(3, frame_stats.delta_frames);
2244 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002245
2246 // Insert 20 more frames to get estimates of bitrate and framerate over
2247 // 1 second.
2248 for (int i = 0; i < 20; ++i) {
2249 InsertFrame(kVideoFrameDelta);
2250 }
2251 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2252 // TODO(holmer): The current implementation returns the average of the last
2253 // two framerate calculations, which is why it takes two calls to reach the
2254 // actual framerate. This should be fixed.
2255 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2256 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2257 // Insert 25 more frames to get estimates of bitrate and framerate over
2258 // 2 seconds.
2259 for (int i = 0; i < 25; ++i) {
2260 InsertFrame(kVideoFrameDelta);
2261 }
2262 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2263 EXPECT_EQ(kDefaultFrameRate, framerate);
2264 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2265}
2266
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002267TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2268 // Insert delta frames.
2269 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2270 // Can't decode without a key frame.
2271 EXPECT_FALSE(DecodeCompleteFrame());
2272 InsertFrame(kVideoFrameKey);
2273 // Skip to the next key frame.
2274 EXPECT_TRUE(DecodeCompleteFrame());
2275}
2276
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002277TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2278 InsertFrame(kVideoFrameKey);
2279 EXPECT_TRUE(DecodeCompleteFrame());
2280 const int kNumDeltaFrames = 5;
2281 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2282 InsertFrame(kVideoFrameKey);
2283 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2284 EXPECT_TRUE(DecodeCompleteFrame());
2285 }
2286}
2287
2288TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2289 InsertFrame(kVideoFrameKey);
2290 EXPECT_TRUE(DecodeCompleteFrame());
2291 const int kNumDeltaFrames = 5;
2292 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2293 InsertFrame(kVideoFrameKey);
2294 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2295 InsertFrame(kVideoFrameKey);
2296 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2297 EXPECT_TRUE(DecodeCompleteFrame());
2298 }
2299}
2300
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002301TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2302 InsertFrame(kVideoFrameKey);
2303 EXPECT_TRUE(DecodeCompleteFrame());
2304 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2305 clock_->TimeInMilliseconds());
2306 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2307 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2308 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002309 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002310 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2311 EXPECT_FALSE(DecodeCompleteFrame());
2312 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2313 EXPECT_TRUE(DecodeCompleteFrame());
2314 EXPECT_TRUE(DecodeCompleteFrame());
2315}
2316
philipel83f831a2016-03-12 03:30:23 -08002317TEST_P(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002318 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002319 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002320 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002321 InsertFrame(kVideoFrameKey);
2322 EXPECT_TRUE(DecodeCompleteFrame());
2323}
2324
philipel83f831a2016-03-12 03:30:23 -08002325TEST_P(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002326 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002327 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002328 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002329
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002330 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2331 // old packet.
2332 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002333 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002334 EXPECT_EQ(kFlushIndicator,
2335 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002336 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002337
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002338 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002339 std::vector<uint16_t> nack_list =
2340 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002341 // No key frame will be requested since the jitter buffer is empty.
2342 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002343 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002344
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002345 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002346 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002347 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002348 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002349
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002350 // The next complete continuous frame isn't a key frame, but we're waiting
2351 // for one.
2352 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002353 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002354 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002355 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002356}
2357
philipel83f831a2016-03-12 03:30:23 -08002358TEST_P(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002359 // Insert a key frame and decode it.
2360 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2361 EXPECT_TRUE(DecodeCompleteFrame());
2362
2363 // Insert a frame which should trigger a recycle until the next key frame.
2364 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2365
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002366 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002367 std::vector<uint16_t> nack_list =
2368 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002369 // Verify that the jitter buffer does not request a key frame.
2370 EXPECT_FALSE(request_key_frame);
2371 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002372 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002373 // Verify that we can decode the next frame.
2374 EXPECT_TRUE(DecodeCompleteFrame());
2375}
2376
philipel83f831a2016-03-12 03:30:23 -08002377TEST_P(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002378 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002379 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002380 EXPECT_TRUE(DecodeCompleteFrame());
2381
2382 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002383 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002384 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002385 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002386 EXPECT_FALSE(DecodeCompleteFrame());
2387
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002388 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002389 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002390 // The jitter buffer is empty, so we won't request key frames until we get a
2391 // packet.
2392 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002393
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002394 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002395 // Now we have a packet in the jitter buffer, a key frame will be requested
2396 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002397 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002398 // The jitter buffer is empty, so we won't request key frames until we get a
2399 // packet.
2400 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002401 // The next complete continuous frame isn't a key frame, but we're waiting
2402 // for one.
2403 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002404 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002405 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002406 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002407 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002408}
2409
philipel83f831a2016-03-12 03:30:23 -08002410TEST_P(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002411 DropFrame(10);
2412 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002413 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002414 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002415 std::vector<uint16_t> nack_list =
2416 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002417 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002418 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002419 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002420}
2421
philipel83f831a2016-03-12 03:30:23 -08002422TEST_P(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002423 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002424 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002425 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002426 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002427 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002428 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002429 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002430 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002431 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002432 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2433 EXPECT_EQ(1u, nack_sent_.size());
2434 else
2435 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002436}
2437
philipel83f831a2016-03-12 03:30:23 -08002438TEST_P(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002439 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002440 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2441 clock_->TimeInMilliseconds());
2442 VCMPacket packet;
2443 stream_generator_->PopPacket(&packet, 0);
2444 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002445 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002446 EXPECT_FALSE(retransmitted);
2447 // Drop second packet.
2448 stream_generator_->PopPacket(&packet, 1);
2449 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2450 EXPECT_FALSE(retransmitted);
2451 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002452 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002453 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002454 uint16_t seq_num;
2455 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2456 EXPECT_EQ(1u, nack_sent_.size());
2457 seq_num = nack_sent_[0];
2458 } else {
2459 EXPECT_EQ(1u, nack_list.size());
2460 seq_num = nack_list[0];
2461 }
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002462 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002463 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002464 EXPECT_EQ(kCompleteSession,
2465 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002466 EXPECT_TRUE(retransmitted);
2467 EXPECT_TRUE(DecodeCompleteFrame());
2468}
2469
philipel83f831a2016-03-12 03:30:23 -08002470TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002471 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002472 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002473 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002474 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002475 // Drop second packet.
2476 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2477 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002478 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002479 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002480 uint16_t seq_num;
2481 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2482 ASSERT_EQ(1u, nack_sent_.size());
2483 seq_num = nack_sent_[0];
2484 } else {
2485 ASSERT_EQ(1u, nack_list.size());
2486 seq_num = nack_list[0];
2487 }
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002488 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002489 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002490 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002491}
2492
philipel83f831a2016-03-12 03:30:23 -08002493TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002494 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002495 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002496 // First frame is delta.
2497 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2498 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002499 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002500 // Drop second packet in frame.
2501 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2502 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2503 // Second frame is key.
2504 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2505 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002506 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002507 // Drop second packet in frame.
2508 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2509 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002510 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002511 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002512 uint16_t seq_num;
2513 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2514 ASSERT_EQ(2u, nack_sent_.size());
2515 seq_num = nack_sent_[1];
2516 } else {
2517 ASSERT_EQ(1u, nack_list.size());
2518 seq_num = nack_list[0];
2519 }
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002520 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002521 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002522}
2523
philipel83f831a2016-03-12 03:30:23 -08002524TEST_P(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002525 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002526 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002527
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002528 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002529 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002530
2531 // ----------------------------------------------------------------
2532 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2533 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002534 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002535 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002536 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002537 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002538 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002539 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002540 while (stream_generator_->PacketsRemaining() > 1) {
2541 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002542 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002543 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002544 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002545 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002546 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002547 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002548 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002549 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002550 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002551 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002552
2553 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002554 std::vector<uint16_t> nack_list =
2555 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002556 const size_t kExpectedNackSize = 9;
philipel83f831a2016-03-12 03:30:23 -08002557 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2558 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2559 else
2560 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002561 for (size_t i = 0; i < nack_list.size(); ++i)
2562 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002563}
2564
philipel83f831a2016-03-12 03:30:23 -08002565TEST_P(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002566 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002567 // ------- ------------------------------------------------------------
2568 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2569 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002570 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002571 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002572 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002573 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002574 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002575 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002576 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002577 while (stream_generator_->PacketsRemaining() > 1) {
2578 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002579 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002580 EXPECT_FALSE(request_key_frame);
2581 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002582 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002583 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002584 }
2585 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002586 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002587 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002588 EXPECT_FALSE(DecodeCompleteFrame());
2589 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002590 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002591 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002592 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002593 const size_t kExpectedNackSize = 10;
philipel83f831a2016-03-12 03:30:23 -08002594 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2595 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2596 for (size_t i = 0; i < nack_sent_.size(); ++i)
2597 EXPECT_EQ(i * 10, nack_sent_[i]);
2598 } else {
2599 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2600 for (size_t i = 0; i < nack_list.size(); ++i)
2601 EXPECT_EQ(i * 10, nack_list[i]);
2602 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002603}
2604
philipel83f831a2016-03-12 03:30:23 -08002605TEST_P(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002606 bool request_key_frame = false;
2607 // -----------------------------------
2608 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2609 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002610 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002611 InsertFrame(kVideoFrameKey);
2612 EXPECT_FALSE(request_key_frame);
2613 EXPECT_TRUE(DecodeCompleteFrame());
2614 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2615 clock_->TimeInMilliseconds());
2616 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2617 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002618 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002619 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002620 EXPECT_FALSE(request_key_frame);
2621 } else {
2622 stream_generator_->NextPacket(NULL); // Drop packet
2623 }
2624 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2625 clock_->TimeInMilliseconds());
2626 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2627 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002628 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002629 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002630 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002631 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002632 // Verify the NACK list.
philipel83f831a2016-03-12 03:30:23 -08002633 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2634 ASSERT_EQ(1u, nack_sent_.size());
2635 EXPECT_EQ(65535, nack_sent_[0]);
2636 } else {
2637 ASSERT_EQ(1u, nack_list.size());
2638 EXPECT_EQ(65535, nack_list[0]);
2639 }
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002640}
2641
philipel83f831a2016-03-12 03:30:23 -08002642TEST_P(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002643 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002644 InsertFrame(kVideoFrameKey);
2645 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002646 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002647 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2648 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002649
2650 // Far-into-the-future video frame, could be caused by resetting the encoder
2651 // or otherwise restarting. This should not fail when error when the packet is
2652 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002653 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002654 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2655 InsertFrame(kVideoFrameKey);
2656 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002657 nack_list = jitter_buffer_->GetNackList(&extended);
2658 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002659
2660 // Stream should be decodable from this point.
2661 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2662 InsertFrame(kVideoFrameDelta);
2663 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002664 nack_list = jitter_buffer_->GetNackList(&extended);
2665 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002666}
2667
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002668} // namespace webrtc