blob: eb7d78b5bf3fd1896b2f06fb7dc219f3b06304b5 [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"
philipel83f831a2016-03-12 03:30:23 -080027#include "webrtc/test/field_trial.h"
Åsa Perssona96f02b2015-04-24 08:52:11 +020028#include "webrtc/test/histogram.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));
kwiberg84be5112016-04-27 01:19:58 -0700198 void PostTask(std::unique_ptr<ProcessTask> task) {}
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()) {}
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000218 virtual void SetUp() {
219 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) {
Åsa Perssona96f02b2015-04-24 08:52:11 +0200501 test::ClearHistograms();
502 // 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();
philipel9d3ab612015-12-21 04:12:39 -0800521 EXPECT_EQ(
522 0, test::LastHistogramSample("WebRTC.Video.DiscardedPacketsInPercent"));
523 EXPECT_EQ(
524 0, test::LastHistogramSample("WebRTC.Video.DuplicatedPacketsInPercent"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200525 EXPECT_NE(-1, test::LastHistogramSample(
philipel9d3ab612015-12-21 04:12:39 -0800526 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200527 EXPECT_EQ(1000, test::LastHistogramSample(
philipel9d3ab612015-12-21 04:12:39 -0800528 "WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200529
530 // Verify that histograms are not updated if stop is called again.
531 jitter_buffer_->Stop();
philipel9d3ab612015-12-21 04:12:39 -0800532 EXPECT_EQ(
533 1, test::NumHistogramSamples("WebRTC.Video.DiscardedPacketsInPercent"));
534 EXPECT_EQ(
535 1, test::NumHistogramSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200536 EXPECT_EQ(1, test::NumHistogramSamples(
philipel9d3ab612015-12-21 04:12:39 -0800537 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
538 EXPECT_EQ(
539 1, test::NumHistogramSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200540}
541
philipel83f831a2016-03-12 03:30:23 -0800542TEST_P(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000543 packet_->frameType = kVideoFrameKey;
544 packet_->isFirstPacket = true;
545 packet_->markerBit = false;
546
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000547 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800548 EXPECT_EQ(kIncomplete,
549 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000550 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
551 // Should not be complete.
552 EXPECT_TRUE(frame_out == NULL);
553
554 ++seq_num_;
555 packet_->isFirstPacket = false;
556 packet_->markerBit = true;
557 packet_->seqNum = seq_num_;
558
philipel9d3ab612015-12-21 04:12:39 -0800559 EXPECT_EQ(kCompleteSession,
560 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561
562 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000563 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564
565 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000566 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000567}
568
philipel83f831a2016-03-12 03:30:23 -0800569TEST_P(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000570 packet_->frameType = kVideoFrameKey;
571 packet_->isFirstPacket = true;
572 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000573
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000574 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800575 EXPECT_EQ(kIncomplete,
576 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577
578 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
579
580 // Frame should not be complete.
581 EXPECT_TRUE(frame_out == NULL);
582
583 // Insert 98 frames.
584 int loop = 0;
585 do {
586 seq_num_++;
587 packet_->isFirstPacket = false;
588 packet_->markerBit = false;
589 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000590
philipel9d3ab612015-12-21 04:12:39 -0800591 EXPECT_EQ(kIncomplete,
592 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593 loop++;
594 } while (loop < 98);
595
596 // Insert last packet.
597 ++seq_num_;
598 packet_->isFirstPacket = false;
599 packet_->markerBit = true;
600 packet_->seqNum = seq_num_;
601
philipel9d3ab612015-12-21 04:12:39 -0800602 EXPECT_EQ(kCompleteSession,
603 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604
605 frame_out = DecodeCompleteFrame();
606
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000607 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000609 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000610}
611
philipel83f831a2016-03-12 03:30:23 -0800612TEST_P(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613 // Always start with a complete key frame.
614 packet_->frameType = kVideoFrameKey;
615 packet_->isFirstPacket = true;
616 packet_->markerBit = true;
617
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000618 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800619 EXPECT_EQ(kCompleteSession,
620 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000621 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
622 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000623 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000624
625 ++seq_num_;
626 packet_->seqNum = seq_num_;
627 packet_->markerBit = false;
628 packet_->frameType = kVideoFrameDelta;
629 packet_->timestamp += 33 * 90;
630
philipel9d3ab612015-12-21 04:12:39 -0800631 EXPECT_EQ(kIncomplete,
632 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000633
634 frame_out = DecodeCompleteFrame();
635
636 // Frame should not be complete.
637 EXPECT_TRUE(frame_out == NULL);
638
639 packet_->isFirstPacket = false;
640 // Insert 98 frames.
641 int loop = 0;
642 do {
643 ++seq_num_;
644 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000645
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000646 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800647 EXPECT_EQ(kIncomplete,
648 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649 loop++;
650 } while (loop < 98);
651
652 // Insert the last packet.
653 ++seq_num_;
654 packet_->isFirstPacket = false;
655 packet_->markerBit = true;
656 packet_->seqNum = seq_num_;
657
philipel9d3ab612015-12-21 04:12:39 -0800658 EXPECT_EQ(kCompleteSession,
659 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660
661 frame_out = DecodeCompleteFrame();
662
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000663 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000664 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000665 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000666}
667
philipel83f831a2016-03-12 03:30:23 -0800668TEST_P(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000669 // Insert the "first" packet last.
670 seq_num_ += 100;
671 packet_->frameType = kVideoFrameKey;
672 packet_->isFirstPacket = false;
673 packet_->markerBit = true;
674 packet_->seqNum = seq_num_;
675 packet_->timestamp = timestamp_;
676
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000677 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800678 EXPECT_EQ(kIncomplete,
679 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000680
681 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
682
683 EXPECT_TRUE(frame_out == NULL);
684
685 // Insert 98 packets.
686 int loop = 0;
687 do {
688 seq_num_--;
689 packet_->isFirstPacket = false;
690 packet_->markerBit = false;
691 packet_->seqNum = seq_num_;
692
philipel9d3ab612015-12-21 04:12:39 -0800693 EXPECT_EQ(kIncomplete,
694 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000695 loop++;
696 } while (loop < 98);
697
698 // Insert the last packet.
699 seq_num_--;
700 packet_->isFirstPacket = true;
701 packet_->markerBit = false;
702 packet_->seqNum = seq_num_;
703
philipel9d3ab612015-12-21 04:12:39 -0800704 EXPECT_EQ(kCompleteSession,
705 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000706
philipel9d3ab612015-12-21 04:12:39 -0800707 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000708
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000709 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710
711 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000712 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000713}
714
philipel83f831a2016-03-12 03:30:23 -0800715TEST_P(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000716 packet_->frameType = kVideoFrameDelta;
717 packet_->isFirstPacket = true;
718 packet_->markerBit = false;
719
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000720 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800721 EXPECT_EQ(kIncomplete,
722 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000723
724 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
725
726 EXPECT_TRUE(frame_out == NULL);
727
728 seq_num_++;
729 packet_->isFirstPacket = false;
730 packet_->markerBit = true;
731 packet_->seqNum = seq_num_;
732
philipel9d3ab612015-12-21 04:12:39 -0800733 EXPECT_EQ(kCompleteSession,
734 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000735
736 // check that we fail to get frame since seqnum is not continuous
737 frame_out = DecodeCompleteFrame();
738 EXPECT_TRUE(frame_out == NULL);
739
740 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800741 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000742 packet_->frameType = kVideoFrameKey;
743 packet_->isFirstPacket = true;
744 packet_->markerBit = false;
745 packet_->seqNum = seq_num_;
746 packet_->timestamp = timestamp_;
747
philipel9d3ab612015-12-21 04:12:39 -0800748 EXPECT_EQ(kIncomplete,
749 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000750
751 frame_out = DecodeCompleteFrame();
752
753 // It should not be complete.
754 EXPECT_TRUE(frame_out == NULL);
755
756 seq_num_++;
757 packet_->isFirstPacket = false;
758 packet_->markerBit = true;
759 packet_->seqNum = seq_num_;
760
philipel9d3ab612015-12-21 04:12:39 -0800761 EXPECT_EQ(kCompleteSession,
762 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000763
764 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000765 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000766 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000767 jitter_buffer_->ReleaseFrame(frame_out);
768
769 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000770 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000771 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000772 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000773}
774
philipel83f831a2016-03-12 03:30:23 -0800775TEST_P(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700776 packet_->frameType = kVideoFrameKey;
777 packet_->isFirstPacket = true;
778 packet_->markerBit = true;
779
780 // Send in an initial good packet/frame (Frame A) to start things off.
781 bool retransmitted = false;
782 EXPECT_EQ(kCompleteSession,
783 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
784 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
785 EXPECT_TRUE(frame_out != NULL);
786 jitter_buffer_->ReleaseFrame(frame_out);
787
788 // Now send in a complete delta frame (Frame C), but with a sequence number
789 // gap. No pic index either, so no temporal scalability cheating :)
790 packet_->frameType = kVideoFrameDelta;
791 // Leave a gap of 2 sequence numbers and two frames.
792 packet_->seqNum = seq_num_ + 3;
793 packet_->timestamp = timestamp_ + (66 * 90);
794 // Still isFirst = marker = true.
795 // Session should be complete (frame is complete), but there's nothing to
796 // decode yet.
797 EXPECT_EQ(kCompleteSession,
798 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
799 frame_out = DecodeCompleteFrame();
800 EXPECT_TRUE(frame_out == NULL);
801
802 // Now send in a complete delta frame (Frame B) that is continuous from A, but
803 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
804 packet_->seqNum = seq_num_ + 1;
805 packet_->timestamp = timestamp_ + (33 * 90);
806 // Still isFirst = marker = true.
807 EXPECT_EQ(kCompleteSession,
808 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
809 frame_out = DecodeCompleteFrame();
810 EXPECT_TRUE(frame_out != NULL);
811 jitter_buffer_->ReleaseFrame(frame_out);
812
813 // But Frame C isn't continuous yet.
814 frame_out = DecodeCompleteFrame();
815 EXPECT_TRUE(frame_out == NULL);
816
817 // Add in the padding. These are empty packets (data length is 0) with no
818 // marker bit and matching the timestamp of Frame B.
819 VCMPacket empty_packet(data_, 0, seq_num_ + 2, timestamp_ + (33 * 90), false);
820 EXPECT_EQ(kOldPacket,
821 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
822 empty_packet.seqNum += 1;
823 EXPECT_EQ(kOldPacket,
824 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
825
826 // But now Frame C should be ready!
827 frame_out = DecodeCompleteFrame();
828 EXPECT_TRUE(frame_out != NULL);
829 jitter_buffer_->ReleaseFrame(frame_out);
830}
831
philipel83f831a2016-03-12 03:30:23 -0800832TEST_P(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000833 packet_->frameType = kVideoFrameKey;
834 packet_->isFirstPacket = true;
835 packet_->markerBit = false;
836 packet_->seqNum = seq_num_;
837 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000838 EXPECT_EQ(0, jitter_buffer_->num_packets());
839 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000840
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000841 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800842 EXPECT_EQ(kIncomplete,
843 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844
845 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
846
847 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000848 EXPECT_EQ(1, jitter_buffer_->num_packets());
849 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000850
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000851 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800852 EXPECT_EQ(kDuplicatePacket,
853 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000854 EXPECT_EQ(2, jitter_buffer_->num_packets());
855 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000856
857 seq_num_++;
858 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000859 packet_->markerBit = true;
860 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000861
philipel9d3ab612015-12-21 04:12:39 -0800862 EXPECT_EQ(kCompleteSession,
863 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000864
865 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000866 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000867 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000868
869 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000870 EXPECT_EQ(3, jitter_buffer_->num_packets());
871 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000872 jitter_buffer_->ReleaseFrame(frame_out);
873}
874
philipel83f831a2016-03-12 03:30:23 -0800875TEST_P(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000876 packet_->frameType = kVideoFrameKey;
877 packet_->isFirstPacket = true;
878 packet_->markerBit = true;
879 packet_->seqNum = seq_num_;
880 packet_->timestamp = timestamp_;
881 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
882 EXPECT_EQ(0, jitter_buffer_->num_packets());
883 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
884
885 bool retransmitted = false;
886 // Insert first complete frame.
887 EXPECT_EQ(kCompleteSession,
888 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
889
890 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
891 ASSERT_TRUE(frame_out != NULL);
892 CheckOutFrame(frame_out, size_, false);
893 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
894 jitter_buffer_->ReleaseFrame(frame_out);
895
896 // Insert 3 delta frames.
897 for (uint16_t i = 1; i <= 3; ++i) {
898 packet_->seqNum = seq_num_ + i;
899 packet_->timestamp = timestamp_ + (i * 33) * 90;
900 packet_->frameType = kVideoFrameDelta;
901 EXPECT_EQ(kCompleteSession,
902 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
903 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
904 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
905 }
906
907 // Retransmit second delta frame.
908 packet_->seqNum = seq_num_ + 2;
909 packet_->timestamp = timestamp_ + 66 * 90;
910
911 EXPECT_EQ(kDuplicatePacket,
912 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
913
914 EXPECT_EQ(5, jitter_buffer_->num_packets());
915 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
916
917 // Should be able to decode 3 delta frames, key frame already decoded.
918 for (size_t i = 0; i < 3; ++i) {
919 frame_out = DecodeCompleteFrame();
920 ASSERT_TRUE(frame_out != NULL);
921 CheckOutFrame(frame_out, size_, false);
922 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
923 jitter_buffer_->ReleaseFrame(frame_out);
924 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000925}
926
philipel83f831a2016-03-12 03:30:23 -0800927TEST_P(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700928 // Verify that JB skips forward to next base layer frame.
929 // -------------------------------------------------
930 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
931 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
932 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
933 // | ss | x | x | x | |
934 // -------------------------------------------------
935 // |<----------tl0idx:200--------->|<---tl0idx:201---
936
937 bool re = false;
938 packet_->codec = kVideoCodecVP9;
939 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
940 packet_->isFirstPacket = true;
941 packet_->markerBit = true;
942 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
943 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
944 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
945 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700946 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
947
948 packet_->seqNum = 65485;
949 packet_->timestamp = 1000;
950 packet_->frameType = kVideoFrameKey;
951 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
952 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
asapersson394c5372015-11-05 06:07:03 -0800953 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700954 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
955 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
956 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
957 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
958
959 // Insert next temporal layer 0.
960 packet_->seqNum = 65489;
961 packet_->timestamp = 13000;
962 packet_->frameType = kVideoFrameDelta;
963 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9;
964 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201;
asapersson394c5372015-11-05 06:07:03 -0800965 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700966 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
967 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
968
969 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
970 EXPECT_EQ(1000U, frame_out->TimeStamp());
971 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
972 jitter_buffer_->ReleaseFrame(frame_out);
973
974 frame_out = DecodeCompleteFrame();
975 EXPECT_EQ(13000U, frame_out->TimeStamp());
976 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
977 jitter_buffer_->ReleaseFrame(frame_out);
978}
979
philipel83f831a2016-03-12 03:30:23 -0800980TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700981 // Verify that frames are updated with SS data when SS packet is reordered.
982 // --------------------------------
983 // | 65486 | 65487 | 65485 |...
984 // | pid:6 | pid:7 | pid:5 |...
985 // | tid:2 | tid:1 | tid:0 |...
986 // | | | ss |
987 // --------------------------------
988 // |<--------tl0idx:200--------->|
989
990 bool re = false;
991 packet_->codec = kVideoCodecVP9;
992 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
993 packet_->isFirstPacket = true;
994 packet_->markerBit = true;
995 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
996 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
997 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
998 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700999 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
1000
1001 packet_->seqNum = 65486;
1002 packet_->timestamp = 6000;
1003 packet_->frameType = kVideoFrameDelta;
1004 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001005 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 2;
1006 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001007 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1008
1009 packet_->seqNum = 65487;
1010 packet_->timestamp = 9000;
1011 packet_->frameType = kVideoFrameDelta;
1012 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7;
asapersson394c5372015-11-05 06:07:03 -08001013 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1014 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001015 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1016
1017 // Insert first frame with SS data.
1018 packet_->seqNum = 65485;
1019 packet_->timestamp = 3000;
1020 packet_->frameType = kVideoFrameKey;
1021 packet_->width = 352;
1022 packet_->height = 288;
1023 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001024 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1025 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001026 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1027 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1028 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1029 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1030
1031 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1032 EXPECT_EQ(3000U, frame_out->TimeStamp());
1033 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1034 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_FALSE(
1036 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1037 jitter_buffer_->ReleaseFrame(frame_out);
1038
1039 frame_out = DecodeCompleteFrame();
1040 EXPECT_EQ(6000U, frame_out->TimeStamp());
1041 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1042 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1043 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1044 jitter_buffer_->ReleaseFrame(frame_out);
1045
1046 frame_out = DecodeCompleteFrame();
1047 EXPECT_EQ(9000U, frame_out->TimeStamp());
1048 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1049 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1050 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1051 jitter_buffer_->ReleaseFrame(frame_out);
1052}
1053
philipel83f831a2016-03-12 03:30:23 -08001054TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001055 // Verify that frames are updated with SS data when SS packet is reordered.
1056 // -----------------------------------------
1057 // | 65486 | 65487 | 65485 | 65484 |...
1058 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1059 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1060 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1061 // | t:6000 | t:6000 | t:3000 | t:3000 |
1062 // | | | | ss |
1063 // -----------------------------------------
1064 // |<-----------tl0idx:200------------>|
1065
1066 bool re = false;
1067 packet_->codec = kVideoCodecVP9;
1068 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
1069 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
1070 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
1071 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001072 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
1073
1074 packet_->isFirstPacket = true;
1075 packet_->markerBit = false;
1076 packet_->seqNum = 65486;
1077 packet_->timestamp = 6000;
1078 packet_->frameType = kVideoFrameDelta;
1079 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1080 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001081 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1082 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001083 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1084
1085 packet_->isFirstPacket = false;
1086 packet_->markerBit = true;
1087 packet_->seqNum = 65487;
1088 packet_->frameType = kVideoFrameDelta;
1089 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1090 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001091 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1092 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001093 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1094
1095 packet_->isFirstPacket = false;
1096 packet_->markerBit = true;
1097 packet_->seqNum = 65485;
1098 packet_->timestamp = 3000;
1099 packet_->frameType = kVideoFrameKey;
1100 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1101 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001102 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1103 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001104 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1105
1106 // Insert first frame with SS data.
1107 packet_->isFirstPacket = true;
1108 packet_->markerBit = false;
1109 packet_->seqNum = 65484;
1110 packet_->frameType = kVideoFrameKey;
1111 packet_->width = 352;
1112 packet_->height = 288;
1113 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1114 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001115 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1116 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001117 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1118 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1119 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1120 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1121
1122 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1123 EXPECT_EQ(3000U, frame_out->TimeStamp());
1124 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1125 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1126 EXPECT_FALSE(
1127 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1128 jitter_buffer_->ReleaseFrame(frame_out);
1129
1130 frame_out = DecodeCompleteFrame();
1131 EXPECT_EQ(6000U, frame_out->TimeStamp());
1132 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1133 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1134 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1135 jitter_buffer_->ReleaseFrame(frame_out);
1136}
1137
philipel83f831a2016-03-12 03:30:23 -08001138TEST_P(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001139 packet_->frameType = kVideoFrameKey;
1140 packet_->isFirstPacket = true;
1141 packet_->markerBit = false;
1142 packet_->seqNum = seq_num_;
1143 packet_->timestamp = timestamp_;
1144 packet_->insertStartCode = true;
1145
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001146 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001147 EXPECT_EQ(kIncomplete,
1148 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001149
1150 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1151
1152 // Frame should not be complete.
1153 EXPECT_TRUE(frame_out == NULL);
1154
1155 seq_num_++;
1156 packet_->isFirstPacket = false;
1157 packet_->markerBit = true;
1158 packet_->seqNum = seq_num_;
1159
philipel9d3ab612015-12-21 04:12:39 -08001160 EXPECT_EQ(kCompleteSession,
1161 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001162
1163 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001164 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001165 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001166 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001167}
1168
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001169// Test threshold conditions of decodable state.
philipel83f831a2016-03-12 03:30:23 -08001170TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001171 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001172 // Always start with a key frame. Use 10 packets to test Decodable State
1173 // boundaries.
1174 packet_->frameType = kVideoFrameKey;
1175 packet_->isFirstPacket = true;
1176 packet_->markerBit = false;
1177 packet_->seqNum = seq_num_;
1178 packet_->timestamp = timestamp_;
1179
1180 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001181 EXPECT_EQ(kIncomplete,
1182 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001183 uint32_t timestamp = 0;
1184 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1185 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1186
1187 packet_->isFirstPacket = false;
1188 for (int i = 1; i < 9; ++i) {
1189 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001190 EXPECT_EQ(kIncomplete,
1191 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001192 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1193 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1194 }
1195
1196 // last packet
1197 packet_->markerBit = true;
1198 packet_->seqNum++;
1199
philipel9d3ab612015-12-21 04:12:39 -08001200 EXPECT_EQ(kCompleteSession,
1201 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001202 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1203 CheckOutFrame(frame_out, 10 * size_, false);
1204 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001205 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001206
1207 // An incomplete frame can only be decoded once a subsequent frame has begun
1208 // to arrive. Insert packet in distant frame for this purpose.
1209 packet_->frameType = kVideoFrameDelta;
1210 packet_->isFirstPacket = true;
1211 packet_->markerBit = false;
1212 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001213 packet_->timestamp += 33 * 90 * 8;
1214
philipel9d3ab612015-12-21 04:12:39 -08001215 EXPECT_EQ(kDecodableSession,
1216 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001217 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1218 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1219
1220 // Insert second frame
1221 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001222 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001223
philipel9d3ab612015-12-21 04:12:39 -08001224 EXPECT_EQ(kDecodableSession,
1225 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001226 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1227 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1228
1229 packet_->isFirstPacket = false;
1230 for (int i = 1; i < 8; ++i) {
1231 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001232 EXPECT_EQ(kDecodableSession,
1233 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001234 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1235 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1236 }
1237
1238 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001239 EXPECT_EQ(kDecodableSession,
1240 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001241 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1242 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1243
1244 frame_out = DecodeIncompleteFrame();
1245 ASSERT_FALSE(NULL == frame_out);
1246 CheckOutFrame(frame_out, 9 * size_, false);
1247 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001248 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001249
1250 packet_->markerBit = true;
1251 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001252 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001253}
1254
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001255// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001256TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001257 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1258 // Always start with a key frame.
1259 packet_->frameType = kVideoFrameKey;
1260 packet_->isFirstPacket = true;
1261 packet_->markerBit = true;
1262 packet_->seqNum = seq_num_;
1263 packet_->timestamp = timestamp_;
1264
1265 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001266 EXPECT_EQ(kCompleteSession,
1267 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001268 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1269 CheckOutFrame(frame_out, size_, false);
1270 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001271 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001272
1273 // An incomplete frame can only be decoded once a subsequent frame has begun
1274 // to arrive. Insert packet in distant frame for this purpose.
1275 packet_->frameType = kVideoFrameDelta;
1276 packet_->isFirstPacket = false;
1277 packet_->markerBit = false;
1278 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001279 packet_->timestamp += 33 * 90 * 8;
1280 EXPECT_EQ(kIncomplete,
1281 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001282 uint32_t timestamp;
1283 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1284 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1285
1286 // Insert second frame - an incomplete key frame.
1287 packet_->frameType = kVideoFrameKey;
1288 packet_->isFirstPacket = true;
1289 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001290 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001291
philipel9d3ab612015-12-21 04:12:39 -08001292 EXPECT_EQ(kIncomplete,
1293 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001294 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1295 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1296
1297 // Insert a few more packets. Make sure we're waiting for the key frame to be
1298 // complete.
1299 packet_->isFirstPacket = false;
1300 for (int i = 1; i < 5; ++i) {
1301 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001302 EXPECT_EQ(kIncomplete,
1303 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001304 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1305 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1306 }
1307
1308 // Complete key frame.
1309 packet_->markerBit = true;
1310 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001311 EXPECT_EQ(kCompleteSession,
1312 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001313 frame_out = DecodeCompleteFrame();
1314 CheckOutFrame(frame_out, 6 * size_, false);
1315 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001316 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001317}
1318
1319// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001320TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001321 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1322 // Always start with a key frame.
1323 packet_->frameType = kVideoFrameKey;
1324 packet_->isFirstPacket = true;
1325 packet_->markerBit = true;
1326 packet_->seqNum = seq_num_;
1327 packet_->timestamp = timestamp_;
1328
1329 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001330 EXPECT_EQ(kCompleteSession,
1331 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001332 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1333 CheckOutFrame(frame_out, size_, false);
1334 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001335 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001336
1337 // An incomplete frame can only be decoded once a subsequent frame has begun
1338 // to arrive. Insert packet in distant frame for this purpose.
1339 packet_->frameType = kVideoFrameDelta;
1340 packet_->isFirstPacket = false;
1341 packet_->markerBit = false;
1342 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001343 packet_->timestamp += 33 * 90 * 8;
1344 EXPECT_EQ(kIncomplete,
1345 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001346 uint32_t timestamp;
1347 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1348 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1349
1350 // Insert second frame with the first packet missing. Make sure we're waiting
1351 // for the key frame to be complete.
1352 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001353 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001354
philipel9d3ab612015-12-21 04:12:39 -08001355 EXPECT_EQ(kIncomplete,
1356 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1358 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1359
1360 for (int i = 0; i < 5; ++i) {
1361 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001362 EXPECT_EQ(kIncomplete,
1363 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001364 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1365 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1366 }
1367
1368 // Add first packet. Frame should now be decodable, but incomplete.
1369 packet_->isFirstPacket = true;
1370 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001371 EXPECT_EQ(kDecodableSession,
1372 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001373 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1374 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1375
1376 frame_out = DecodeIncompleteFrame();
1377 CheckOutFrame(frame_out, 7 * size_, false);
1378 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001379 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001380}
1381
philipel83f831a2016-03-12 03:30:23 -08001382TEST_P(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001383 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001384 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001385 packet_->frameType = kVideoFrameKey;
1386 packet_->isFirstPacket = true;
1387 packet_->markerBit = true;
1388 packet_->seqNum = seq_num_;
1389 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001390 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001391 EXPECT_EQ(kCompleteSession,
1392 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001393 uint32_t next_timestamp;
1394 EXPECT_TRUE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1395 EXPECT_EQ(packet_->timestamp, next_timestamp);
1396 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(next_timestamp);
1397 EXPECT_TRUE(frame != NULL);
1398 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001399
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001400 // Drop a complete frame.
1401 timestamp_ += 2 * 33 * 90;
1402 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001403 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001404 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001405 packet_->markerBit = false;
1406 packet_->seqNum = seq_num_;
1407 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001408 EXPECT_EQ(kDecodableSession,
1409 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001410 // Insert a packet (so the previous one will be released).
1411 timestamp_ += 33 * 90;
1412 seq_num_ += 2;
1413 packet_->frameType = kVideoFrameDelta;
1414 packet_->isFirstPacket = true;
1415 packet_->markerBit = false;
1416 packet_->seqNum = seq_num_;
1417 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kDecodableSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001420 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1421 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1422 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001423}
1424
philipel83f831a2016-03-12 03:30:23 -08001425TEST_P(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001426 // Verify missing packets statistics and not decodable packets statistics.
1427 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1428 // The last packet is an empty (non-media) packet.
1429
1430 // Select a start seqNum which triggers a difficult wrap situation
1431 // The JB will only output (incomplete)frames if the next one has started
1432 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001433 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001434 seq_num_ = 0xffff - 4;
1435 seq_num_++;
1436 packet_->frameType = kVideoFrameKey;
1437 packet_->isFirstPacket = true;
1438 packet_->markerBit = false;
1439 packet_->seqNum = seq_num_;
1440 packet_->timestamp = timestamp_;
1441 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001442
1443 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001444 EXPECT_EQ(kDecodableSession,
1445 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001446 for (int i = 0; i < 11; ++i) {
1447 webrtc::FrameType frametype = kVideoFrameDelta;
1448 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001449 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001450 packet_->frameType = frametype;
1451 packet_->isFirstPacket = true;
1452 packet_->markerBit = false;
1453 packet_->seqNum = seq_num_;
1454 packet_->timestamp = timestamp_;
1455 packet_->completeNALU = kNaluStart;
1456
philipel9d3ab612015-12-21 04:12:39 -08001457 EXPECT_EQ(kDecodableSession,
1458 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001459
1460 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1461
1462 // Should not be complete.
1463 EXPECT_TRUE(frame_out == NULL);
1464
1465 seq_num_ += 2;
1466 packet_->isFirstPacket = false;
1467 packet_->markerBit = true;
1468 packet_->seqNum = seq_num_;
1469 packet_->completeNALU = kNaluEnd;
1470
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001471 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1472 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001473
1474 // Insert an empty (non-media) packet.
1475 seq_num_++;
1476 packet_->isFirstPacket = false;
1477 packet_->markerBit = false;
1478 packet_->seqNum = seq_num_;
1479 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001480 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001481
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001482 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001483 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001484 frame_out = DecodeIncompleteFrame();
1485
1486 // One of the packets has been discarded by the jitter buffer.
1487 // Last frame can't be extracted yet.
1488 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001489 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490
1491 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001492 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001493 } else {
philipel9d3ab612015-12-21 04:12:39 -08001494 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001495 }
1496 EXPECT_FALSE(frame_out->Complete());
1497 EXPECT_FALSE(frame_out->MissingFrame());
1498 }
1499
1500 jitter_buffer_->ReleaseFrame(frame_out);
1501 }
1502
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 // Insert 3 old packets and verify that we have 3 discarded packets
1504 // Match value to actual latest timestamp decoded.
1505 timestamp_ -= 33 * 90;
1506 packet_->timestamp = timestamp_ - 1000;
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_ - 500;
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 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001515
philipel9d3ab612015-12-21 04:12:39 -08001516 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001517
1518 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1519
1520 jitter_buffer_->Flush();
1521
1522 // This statistic shouldn't be reset by a flush.
1523 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1524}
1525
philipel83f831a2016-03-12 03:30:23 -08001526TEST_P(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527 seq_num_ = 0xfff0;
1528 packet_->frameType = kVideoFrameKey;
1529 packet_->isFirstPacket = true;
1530 packet_->markerBit = false;
1531 packet_->seqNum = seq_num_;
1532 packet_->timestamp = timestamp_;
1533
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001534 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001535 EXPECT_EQ(kIncomplete,
1536 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001537
1538 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1539
1540 EXPECT_TRUE(frame_out == NULL);
1541
1542 int loop = 0;
1543 do {
1544 seq_num_++;
1545 packet_->isFirstPacket = false;
1546 packet_->markerBit = false;
1547 packet_->seqNum = seq_num_;
1548
philipel9d3ab612015-12-21 04:12:39 -08001549 EXPECT_EQ(kIncomplete,
1550 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001551
1552 frame_out = DecodeCompleteFrame();
1553
1554 EXPECT_TRUE(frame_out == NULL);
1555
1556 loop++;
1557 } while (loop < 98);
1558
1559 seq_num_++;
1560 packet_->isFirstPacket = false;
1561 packet_->markerBit = true;
1562 packet_->seqNum = seq_num_;
1563
philipel9d3ab612015-12-21 04:12:39 -08001564 EXPECT_EQ(kCompleteSession,
1565 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001566
1567 frame_out = DecodeCompleteFrame();
1568
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001569 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001570
1571 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001572 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001573}
1574
philipel83f831a2016-03-12 03:30:23 -08001575TEST_P(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576 // Insert "first" packet last seqnum.
1577 seq_num_ = 10;
1578 packet_->frameType = kVideoFrameKey;
1579 packet_->isFirstPacket = false;
1580 packet_->markerBit = true;
1581 packet_->seqNum = seq_num_;
1582
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001583 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001584 EXPECT_EQ(kIncomplete,
1585 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1587
1588 // Should not be complete.
1589 EXPECT_TRUE(frame_out == NULL);
1590
1591 // Insert 98 frames.
1592 int loop = 0;
1593 do {
1594 seq_num_--;
1595 packet_->isFirstPacket = false;
1596 packet_->markerBit = false;
1597 packet_->seqNum = seq_num_;
1598
philipel9d3ab612015-12-21 04:12:39 -08001599 EXPECT_EQ(kIncomplete,
1600 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001601
1602 frame_out = DecodeCompleteFrame();
1603
1604 EXPECT_TRUE(frame_out == NULL);
1605
1606 loop++;
1607 } while (loop < 98);
1608
1609 // Insert last packet.
1610 seq_num_--;
1611 packet_->isFirstPacket = true;
1612 packet_->markerBit = false;
1613 packet_->seqNum = seq_num_;
1614
philipel9d3ab612015-12-21 04:12:39 -08001615 EXPECT_EQ(kCompleteSession,
1616 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001617
1618 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001619 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001621 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001622}
1623
philipel83f831a2016-03-12 03:30:23 -08001624TEST_P(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001625 // ------- -------
1626 // | 2 | | 1 |
1627 // ------- -------
1628 // t = 3000 t = 2000
1629 seq_num_ = 2;
1630 timestamp_ = 3000;
1631 packet_->frameType = kVideoFrameKey;
1632 packet_->isFirstPacket = true;
1633 packet_->markerBit = true;
1634 packet_->timestamp = timestamp_;
1635 packet_->seqNum = seq_num_;
1636
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001637 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001638 EXPECT_EQ(kCompleteSession,
1639 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640
1641 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1642 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001643 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001644 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001645 jitter_buffer_->ReleaseFrame(frame_out);
1646
1647 seq_num_--;
1648 timestamp_ = 2000;
1649 packet_->frameType = kVideoFrameDelta;
1650 packet_->isFirstPacket = true;
1651 packet_->markerBit = true;
1652 packet_->seqNum = seq_num_;
1653 packet_->timestamp = timestamp_;
1654
philipel9d3ab612015-12-21 04:12:39 -08001655 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001656}
1657
philipel83f831a2016-03-12 03:30:23 -08001658TEST_P(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001659 // ------- -------
1660 // | 2 | | 1 |
1661 // ------- -------
1662 // t = 3000 t = 0xffffff00
1663
1664 seq_num_ = 2;
1665 timestamp_ = 3000;
1666 packet_->frameType = kVideoFrameKey;
1667 packet_->isFirstPacket = true;
1668 packet_->markerBit = true;
1669 packet_->seqNum = seq_num_;
1670 packet_->timestamp = timestamp_;
1671
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001672 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001673 EXPECT_EQ(kCompleteSession,
1674 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001675
1676 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1677 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1678
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001679 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001680
1681 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1682
1683 jitter_buffer_->ReleaseFrame(frame_out);
1684
1685 seq_num_--;
1686 timestamp_ = 0xffffff00;
1687 packet_->frameType = kVideoFrameDelta;
1688 packet_->isFirstPacket = true;
1689 packet_->markerBit = true;
1690 packet_->seqNum = seq_num_;
1691 packet_->timestamp = timestamp_;
1692
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001694 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001695}
1696
philipel83f831a2016-03-12 03:30:23 -08001697TEST_P(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001698 // --------------- ---------------
1699 // | 1 | 2 | | 3 | 4 |
1700 // --------------- ---------------
1701 // t = 0xffffff00 t = 33*90
1702
1703 timestamp_ = 0xffffff00;
1704 packet_->frameType = kVideoFrameKey;
1705 packet_->isFirstPacket = true;
1706 packet_->markerBit = false;
1707 packet_->seqNum = seq_num_;
1708 packet_->timestamp = timestamp_;
1709
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001710 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001711 EXPECT_EQ(kIncomplete,
1712 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001713
1714 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001715 EXPECT_TRUE(frame_out == NULL);
1716
1717 seq_num_++;
1718 packet_->isFirstPacket = false;
1719 packet_->markerBit = true;
1720 packet_->seqNum = seq_num_;
1721
philipel9d3ab612015-12-21 04:12:39 -08001722 EXPECT_EQ(kCompleteSession,
1723 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001724
1725 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001726 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001727 jitter_buffer_->ReleaseFrame(frame_out);
1728
1729 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001730 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001731 packet_->frameType = kVideoFrameDelta;
1732 packet_->isFirstPacket = true;
1733 packet_->markerBit = false;
1734 packet_->seqNum = seq_num_;
1735 packet_->timestamp = timestamp_;
1736
philipel9d3ab612015-12-21 04:12:39 -08001737 EXPECT_EQ(kIncomplete,
1738 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001739
1740 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001741 EXPECT_TRUE(frame_out == NULL);
1742
1743 seq_num_++;
1744 packet_->isFirstPacket = false;
1745 packet_->markerBit = true;
1746 packet_->seqNum = seq_num_;
1747
philipel9d3ab612015-12-21 04:12:39 -08001748 EXPECT_EQ(kCompleteSession,
1749 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001750
1751 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001752 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001753 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001754 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001755}
1756
philipel83f831a2016-03-12 03:30:23 -08001757TEST_P(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001758 // ------- -------
1759 // | 1 | | 2 |
1760 // ------- -------
1761 // t = 0xffffff00 t = 2700
1762
1763 timestamp_ = 0xffffff00;
1764 packet_->frameType = kVideoFrameKey;
1765 packet_->isFirstPacket = true;
1766 packet_->markerBit = true;
1767 packet_->timestamp = timestamp_;
1768
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001769 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001770 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001771 EXPECT_EQ(kCompleteSession,
1772 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001773
1774 // Insert next frame.
1775 seq_num_++;
1776 timestamp_ = 2700;
1777 packet_->frameType = kVideoFrameDelta;
1778 packet_->isFirstPacket = true;
1779 packet_->markerBit = true;
1780 packet_->seqNum = seq_num_;
1781 packet_->timestamp = timestamp_;
1782
philipel9d3ab612015-12-21 04:12:39 -08001783 EXPECT_EQ(kCompleteSession,
1784 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001785
1786 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1787 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001788 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001789 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001790 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001791
1792 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1793 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001794 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001796 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001797}
1798
philipel83f831a2016-03-12 03:30:23 -08001799TEST_P(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001800 // ------- -------
1801 // | 2 | | 1 |
1802 // ------- -------
1803 // t = 2700 t = 0xffffff00
1804
1805 seq_num_ = 2;
1806 timestamp_ = 2700;
1807 packet_->frameType = kVideoFrameDelta;
1808 packet_->isFirstPacket = true;
1809 packet_->markerBit = true;
1810 packet_->seqNum = seq_num_;
1811 packet_->timestamp = timestamp_;
1812
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001813 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001814 EXPECT_EQ(kCompleteSession,
1815 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001816
1817 // Insert second frame
1818 seq_num_--;
1819 timestamp_ = 0xffffff00;
1820 packet_->frameType = kVideoFrameKey;
1821 packet_->isFirstPacket = true;
1822 packet_->markerBit = true;
1823 packet_->seqNum = seq_num_;
1824 packet_->timestamp = timestamp_;
1825
philipel9d3ab612015-12-21 04:12:39 -08001826 EXPECT_EQ(kCompleteSession,
1827 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001828
1829 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1830 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001831 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001832 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001833 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834
1835 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1836 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001837 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001839 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001840}
1841
philipel83f831a2016-03-12 03:30:23 -08001842TEST_P(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001843 int loop = 0;
1844 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001845 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001846 // Insert kMaxPacketsInJitterBuffer into frame.
1847 do {
1848 seq_num_++;
1849 packet_->isFirstPacket = false;
1850 packet_->markerBit = false;
1851 packet_->seqNum = seq_num_;
1852
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001853 if (firstPacket) {
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 firstPacket = false;
1857 } else {
philipel9d3ab612015-12-21 04:12:39 -08001858 EXPECT_EQ(kIncomplete,
1859 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001860 }
1861
1862 loop++;
1863 } while (loop < kMaxPacketsInSession);
1864
1865 // Max number of packets inserted.
1866 // Insert one more packet.
1867 seq_num_++;
1868 packet_->isFirstPacket = false;
1869 packet_->markerBit = true;
1870 packet_->seqNum = seq_num_;
1871
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001872 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001873 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001874 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001875}
1876
philipel83f831a2016-03-12 03:30:23 -08001877TEST_P(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878 // TEST fill JB with more than max number of frame (50 delta frames +
1879 // 51 key frames) with wrap in seq_num_
1880 //
1881 // --------------------------------------------------------------
1882 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1883 // --------------------------------------------------------------
1884 // |<-----------delta frames------------->|<------key frames----->|
1885
jbauchdb81ffd2015-11-23 03:59:02 -08001886 // Make sure the jitter doesn't request a keyframe after too much non-
1887 // decodable frames.
1888 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001889 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001890
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001891 int loop = 0;
1892 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001893 uint32_t first_key_frame_timestamp = 0;
1894 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001895 // Insert MAX_NUMBER_OF_FRAMES frames.
1896 do {
philipel9d3ab612015-12-21 04:12:39 -08001897 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001898 seq_num_++;
1899 packet_->isFirstPacket = true;
1900 packet_->markerBit = true;
1901 packet_->seqNum = seq_num_;
1902 packet_->timestamp = timestamp_;
1903
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001904 if (loop == 50) {
1905 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001906 packet_->frameType = kVideoFrameKey;
1907 }
1908
1909 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001910 EXPECT_EQ(kCompleteSession,
1911 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912
1913 loop++;
1914 } while (loop < kMaxNumberOfFrames);
1915
1916 // Max number of frames inserted.
1917
1918 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001919 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920 seq_num_++;
1921 packet_->isFirstPacket = true;
1922 packet_->markerBit = true;
1923 packet_->seqNum = seq_num_;
1924 packet_->timestamp = timestamp_;
1925
1926 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001927 EXPECT_EQ(kFlushIndicator,
1928 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001930 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1931 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001932 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001933 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001934 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001935}
1936
philipel83f831a2016-03-12 03:30:23 -08001937TEST_P(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001938 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939 seq_num_ = 3;
1940 // Insert one empty packet per frame, should never return the last timestamp
1941 // inserted. Only return empty frames in the presence of subsequent frames.
1942 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001943 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944 for (int i = 0; i < maxSize + 10; i++) {
1945 timestamp_ += 33 * 90;
1946 seq_num_++;
1947 packet_->isFirstPacket = false;
1948 packet_->markerBit = false;
1949 packet_->seqNum = seq_num_;
1950 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001951 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001952
philipel9d3ab612015-12-21 04:12:39 -08001953 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001954 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1955 // Timestamp should never be the last TS inserted.
1956 if (testFrame != NULL) {
1957 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001958 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 }
1960 }
1961}
1962
philipel83f831a2016-03-12 03:30:23 -08001963TEST_P(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001964 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001965 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001966 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001967 timestamp_ += 33 * 90;
1968 int insertedLength = 0;
1969 packet_->seqNum = seq_num_;
1970 packet_->timestamp = timestamp_;
1971 packet_->frameType = kVideoFrameKey;
1972 packet_->isFirstPacket = true;
1973 packet_->completeNALU = kNaluStart;
1974 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001975 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976
philipel9d3ab612015-12-21 04:12:39 -08001977 EXPECT_EQ(kDecodableSession,
1978 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001979
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001980 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001981 packet_->seqNum = seq_num_;
1982 packet_->frameType = kVideoFrameKey;
1983 packet_->isFirstPacket = false;
1984 packet_->completeNALU = kNaluIncomplete;
1985 packet_->markerBit = false;
1986
philipel9d3ab612015-12-21 04:12:39 -08001987 EXPECT_EQ(kDecodableSession,
1988 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001989
1990 seq_num_++;
1991 packet_->seqNum = seq_num_;
1992 packet_->frameType = kVideoFrameKey;
1993 packet_->isFirstPacket = false;
1994 packet_->completeNALU = kNaluEnd;
1995 packet_->markerBit = false;
1996
philipel9d3ab612015-12-21 04:12:39 -08001997 EXPECT_EQ(kDecodableSession,
1998 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001999
2000 seq_num_++;
2001 packet_->seqNum = seq_num_;
2002 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002003 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002004 EXPECT_EQ(kDecodableSession,
2005 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002006 // The JB will only output (incomplete) frames if a packet belonging to a
2007 // subsequent frame was already inserted. Insert one packet of a subsequent
2008 // frame. place high timestamp so the JB would always have a next frame
2009 // (otherwise, for every inserted frame we need to take care of the next
2010 // frame as well).
2011 packet_->seqNum = 1;
2012 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2013 packet_->frameType = kVideoFrameDelta;
2014 packet_->isFirstPacket = false;
2015 packet_->completeNALU = kNaluStart;
2016 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002017
philipel9d3ab612015-12-21 04:12:39 -08002018 EXPECT_EQ(kDecodableSession,
2019 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002020
2021 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2022
2023 // We can decode everything from a NALU until a packet has been lost.
2024 // Thus we can decode the first packet of the first NALU and the second NALU
2025 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002026 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 jitter_buffer_->ReleaseFrame(frame_out);
2028
2029 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002030 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002031 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002032 insertedLength = 0;
2033
2034 packet_->seqNum = seq_num_;
2035 packet_->timestamp = timestamp_;
2036 packet_->frameType = kVideoFrameKey;
2037 packet_->isFirstPacket = false;
2038 packet_->completeNALU = kNaluEnd;
2039 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002040 EXPECT_EQ(kDecodableSession,
2041 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2042 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002043 seq_num_--;
2044 packet_->seqNum = seq_num_;
2045 packet_->timestamp = timestamp_;
2046 packet_->frameType = kVideoFrameKey;
2047 packet_->isFirstPacket = true;
2048 packet_->completeNALU = kNaluStart;
2049 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002050
philipel9d3ab612015-12-21 04:12:39 -08002051 EXPECT_EQ(kDecodableSession,
2052 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2054
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002055 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002056 packet_->seqNum = seq_num_;
2057 packet_->timestamp = timestamp_;
2058 packet_->frameType = kVideoFrameKey;
2059 packet_->isFirstPacket = false;
2060 packet_->completeNALU = kNaluComplete;
2061 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002062 EXPECT_EQ(kDecodableSession,
2063 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002064 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002065 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002066 packet_->seqNum = seq_num_;
2067 packet_->timestamp = timestamp_;
2068 packet_->frameType = kVideoFrameKey;
2069 packet_->isFirstPacket = false;
2070 packet_->completeNALU = kNaluStart;
2071 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002072 EXPECT_EQ(kDecodableSession,
2073 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002074 // This packet should be decoded since it's the beginning of a NAL.
2075 insertedLength += packet_->sizeBytes;
2076
2077 seq_num_ += 2;
2078 packet_->seqNum = seq_num_;
2079 packet_->timestamp = timestamp_;
2080 packet_->frameType = kVideoFrameKey;
2081 packet_->isFirstPacket = false;
2082 packet_->completeNALU = kNaluEnd;
2083 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002084 EXPECT_EQ(kDecodableSession,
2085 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002086 // This packet should not be decoded because it is an incomplete NAL if it
2087 // is the last.
2088 frame_out = DecodeIncompleteFrame();
2089 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002090 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002091 jitter_buffer_->ReleaseFrame(frame_out);
2092
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002093 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002094 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002095 timestamp_ += 33 * 90;
2096 VCMPacket emptypacket(data_, 0, seq_num_, timestamp_, true);
2097 emptypacket.seqNum = seq_num_;
2098 emptypacket.timestamp = timestamp_;
2099 emptypacket.frameType = kVideoFrameKey;
2100 emptypacket.isFirstPacket = true;
2101 emptypacket.completeNALU = kNaluComplete;
2102 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002103 EXPECT_EQ(kCompleteSession,
2104 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002105 // This packet should not be decoded because it is an incomplete NAL if it
2106 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002107
2108 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2109 // has arrived.
2110 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002111 EXPECT_TRUE(frame_out != NULL);
2112 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113
2114 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002115 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002116 timestamp_ += 33 * 90;
2117
2118 packet_->seqNum = seq_num_;
2119 packet_->timestamp = timestamp_;
2120 packet_->frameType = kVideoFrameKey;
2121 packet_->isFirstPacket = true;
2122 packet_->completeNALU = kNaluComplete;
2123 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002124
philipel9d3ab612015-12-21 04:12:39 -08002125 EXPECT_EQ(kDecodableSession,
2126 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002127
agalusza@google.comd177c102013-08-08 01:12:33 +00002128 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002129 emptypacket.seqNum = seq_num_;
2130 emptypacket.timestamp = timestamp_;
2131 emptypacket.frameType = kVideoFrameKey;
2132 emptypacket.isFirstPacket = true;
2133 emptypacket.completeNALU = kNaluComplete;
2134 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002135 EXPECT_EQ(kCompleteSession,
2136 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137
2138 frame_out = DecodeCompleteFrame();
2139 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002140 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002141 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002142}
2143
philipel83f831a2016-03-12 03:30:23 -08002144TEST_P(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002145 // Test that a we cannot get incomplete frames from the JB if we haven't
2146 // received the marker bit, unless we have received a packet from a later
2147 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002148 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002149 // Start with a complete key frame - insert and decode.
2150 packet_->frameType = kVideoFrameKey;
2151 packet_->isFirstPacket = true;
2152 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002153 bool retransmitted = false;
2154
philipel9d3ab612015-12-21 04:12:39 -08002155 EXPECT_EQ(kCompleteSession,
2156 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002157 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2158 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002159 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002160
2161 packet_->seqNum += 2;
2162 packet_->timestamp += 33 * 90;
2163 packet_->frameType = kVideoFrameDelta;
2164 packet_->isFirstPacket = false;
2165 packet_->markerBit = false;
2166
philipel9d3ab612015-12-21 04:12:39 -08002167 EXPECT_EQ(kDecodableSession,
2168 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002169
2170 frame_out = DecodeIncompleteFrame();
2171 EXPECT_TRUE(frame_out == NULL);
2172
2173 packet_->seqNum += 2;
2174 packet_->timestamp += 33 * 90;
2175 packet_->isFirstPacket = true;
2176
philipel9d3ab612015-12-21 04:12:39 -08002177 EXPECT_EQ(kDecodableSession,
2178 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002179
2180 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002181 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002182 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002183}
2184
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002185TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002186 // Make sure the jitter doesn't request a keyframe after too much non-
2187 // decodable frames.
2188 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002189 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002190 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002191 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002192 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002193 DropFrame(1);
2194 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002195 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002196 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002197 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002198 // This frame will make the jitter buffer recycle frames until a key frame.
2199 // Since none is found it will have to wait until the next key frame before
2200 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002201 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002202 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002203}
2204
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002205TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002206 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002207 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002208 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002209 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002210 // Insert empty packet.
2211 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002212 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002213 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002214 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002215 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002216 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002217 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002218 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002219 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002220 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002221 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002222 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002223}
2224
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002225TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002226 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2227 EXPECT_EQ(0, frame_stats.delta_frames);
2228 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002229
2230 uint32_t framerate = 0;
2231 uint32_t bitrate = 0;
2232 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2233 EXPECT_EQ(0u, framerate);
2234 EXPECT_EQ(0u, bitrate);
2235
2236 // Insert a couple of key and delta frames.
2237 InsertFrame(kVideoFrameKey);
2238 InsertFrame(kVideoFrameDelta);
2239 InsertFrame(kVideoFrameDelta);
2240 InsertFrame(kVideoFrameKey);
2241 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002242 // Decode some of them to make sure the statistics doesn't depend on frames
2243 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002244 EXPECT_TRUE(DecodeCompleteFrame());
2245 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002246 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002247 EXPECT_EQ(3, frame_stats.delta_frames);
2248 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002249
2250 // Insert 20 more frames to get estimates of bitrate and framerate over
2251 // 1 second.
2252 for (int i = 0; i < 20; ++i) {
2253 InsertFrame(kVideoFrameDelta);
2254 }
2255 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2256 // TODO(holmer): The current implementation returns the average of the last
2257 // two framerate calculations, which is why it takes two calls to reach the
2258 // actual framerate. This should be fixed.
2259 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2260 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2261 // Insert 25 more frames to get estimates of bitrate and framerate over
2262 // 2 seconds.
2263 for (int i = 0; i < 25; ++i) {
2264 InsertFrame(kVideoFrameDelta);
2265 }
2266 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2267 EXPECT_EQ(kDefaultFrameRate, framerate);
2268 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2269}
2270
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002271TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2272 // Insert delta frames.
2273 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2274 // Can't decode without a key frame.
2275 EXPECT_FALSE(DecodeCompleteFrame());
2276 InsertFrame(kVideoFrameKey);
2277 // Skip to the next key frame.
2278 EXPECT_TRUE(DecodeCompleteFrame());
2279}
2280
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002281TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2282 InsertFrame(kVideoFrameKey);
2283 EXPECT_TRUE(DecodeCompleteFrame());
2284 const int kNumDeltaFrames = 5;
2285 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2286 InsertFrame(kVideoFrameKey);
2287 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2288 EXPECT_TRUE(DecodeCompleteFrame());
2289 }
2290}
2291
2292TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2293 InsertFrame(kVideoFrameKey);
2294 EXPECT_TRUE(DecodeCompleteFrame());
2295 const int kNumDeltaFrames = 5;
2296 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2297 InsertFrame(kVideoFrameKey);
2298 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2299 InsertFrame(kVideoFrameKey);
2300 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2301 EXPECT_TRUE(DecodeCompleteFrame());
2302 }
2303}
2304
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002305TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2306 InsertFrame(kVideoFrameKey);
2307 EXPECT_TRUE(DecodeCompleteFrame());
2308 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2309 clock_->TimeInMilliseconds());
2310 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2311 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2312 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002313 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002314 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2315 EXPECT_FALSE(DecodeCompleteFrame());
2316 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2317 EXPECT_TRUE(DecodeCompleteFrame());
2318 EXPECT_TRUE(DecodeCompleteFrame());
2319}
2320
philipel83f831a2016-03-12 03:30:23 -08002321TEST_P(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002322 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002323 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002324 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002325 InsertFrame(kVideoFrameKey);
2326 EXPECT_TRUE(DecodeCompleteFrame());
2327}
2328
philipel83f831a2016-03-12 03:30:23 -08002329TEST_P(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002330 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002331 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002332 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002333
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002334 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2335 // old packet.
2336 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002337 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002338 EXPECT_EQ(kFlushIndicator,
2339 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002340 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002341
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002342 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002343 std::vector<uint16_t> nack_list =
2344 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002345 // No key frame will be requested since the jitter buffer is empty.
2346 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002347 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002348
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002349 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002350 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002351 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002352 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002353
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002354 // The next complete continuous frame isn't a key frame, but we're waiting
2355 // for one.
2356 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002357 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002358 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002359 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002360}
2361
philipel83f831a2016-03-12 03:30:23 -08002362TEST_P(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002363 // Insert a key frame and decode it.
2364 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2365 EXPECT_TRUE(DecodeCompleteFrame());
2366
2367 // Insert a frame which should trigger a recycle until the next key frame.
2368 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2369
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002370 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002371 std::vector<uint16_t> nack_list =
2372 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002373 // Verify that the jitter buffer does not request a key frame.
2374 EXPECT_FALSE(request_key_frame);
2375 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002376 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002377 // Verify that we can decode the next frame.
2378 EXPECT_TRUE(DecodeCompleteFrame());
2379}
2380
philipel83f831a2016-03-12 03:30:23 -08002381TEST_P(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002382 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002383 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002384 EXPECT_TRUE(DecodeCompleteFrame());
2385
2386 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002387 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002388 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002389 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002390 EXPECT_FALSE(DecodeCompleteFrame());
2391
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002392 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002393 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002394 // The jitter buffer is empty, so we won't request key frames until we get a
2395 // packet.
2396 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002397
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002398 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002399 // Now we have a packet in the jitter buffer, a key frame will be requested
2400 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002401 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002402 // The jitter buffer is empty, so we won't request key frames until we get a
2403 // packet.
2404 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002405 // The next complete continuous frame isn't a key frame, but we're waiting
2406 // for one.
2407 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002408 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002409 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002410 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002411 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002412}
2413
philipel83f831a2016-03-12 03:30:23 -08002414TEST_P(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002415 DropFrame(10);
2416 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002417 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002418 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002419 std::vector<uint16_t> nack_list =
2420 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002421 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002422 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002423 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002424}
2425
philipel83f831a2016-03-12 03:30:23 -08002426TEST_P(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002427 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002428 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002429 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002430 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002431 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002432 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002433 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002434 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002435 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002436 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2437 EXPECT_EQ(1u, nack_sent_.size());
2438 else
2439 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002440}
2441
philipel83f831a2016-03-12 03:30:23 -08002442TEST_P(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002443 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002444 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2445 clock_->TimeInMilliseconds());
2446 VCMPacket packet;
2447 stream_generator_->PopPacket(&packet, 0);
2448 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002449 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002450 EXPECT_FALSE(retransmitted);
2451 // Drop second packet.
2452 stream_generator_->PopPacket(&packet, 1);
2453 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2454 EXPECT_FALSE(retransmitted);
2455 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002456 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002457 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002458 uint16_t seq_num;
2459 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2460 EXPECT_EQ(1u, nack_sent_.size());
2461 seq_num = nack_sent_[0];
2462 } else {
2463 EXPECT_EQ(1u, nack_list.size());
2464 seq_num = nack_list[0];
2465 }
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002466 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002467 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002468 EXPECT_EQ(kCompleteSession,
2469 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002470 EXPECT_TRUE(retransmitted);
2471 EXPECT_TRUE(DecodeCompleteFrame());
2472}
2473
philipel83f831a2016-03-12 03:30:23 -08002474TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002475 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002476 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002477 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002478 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002479 // Drop second packet.
2480 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2481 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002482 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002483 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002484 uint16_t seq_num;
2485 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2486 ASSERT_EQ(1u, nack_sent_.size());
2487 seq_num = nack_sent_[0];
2488 } else {
2489 ASSERT_EQ(1u, nack_list.size());
2490 seq_num = nack_list[0];
2491 }
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002492 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002493 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002494 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002495}
2496
philipel83f831a2016-03-12 03:30:23 -08002497TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002498 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002499 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002500 // First frame is delta.
2501 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2502 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002503 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002504 // Drop second packet in frame.
2505 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2506 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2507 // Second frame is key.
2508 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2509 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002510 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002511 // Drop second packet in frame.
2512 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2513 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002514 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002515 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002516 uint16_t seq_num;
2517 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2518 ASSERT_EQ(2u, nack_sent_.size());
2519 seq_num = nack_sent_[1];
2520 } else {
2521 ASSERT_EQ(1u, nack_list.size());
2522 seq_num = nack_list[0];
2523 }
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002524 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002525 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002526}
2527
philipel83f831a2016-03-12 03:30:23 -08002528TEST_P(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002529 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002530 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002531
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002532 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002533 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002534
2535 // ----------------------------------------------------------------
2536 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2537 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002538 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002539 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002540 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002541 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002542 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002543 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002544 while (stream_generator_->PacketsRemaining() > 1) {
2545 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002546 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002547 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002548 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002549 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002550 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002551 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002552 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002553 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002554 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002555 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002556
2557 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002558 std::vector<uint16_t> nack_list =
2559 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002560 const size_t kExpectedNackSize = 9;
philipel83f831a2016-03-12 03:30:23 -08002561 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2562 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2563 else
2564 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002565 for (size_t i = 0; i < nack_list.size(); ++i)
2566 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002567}
2568
philipel83f831a2016-03-12 03:30:23 -08002569TEST_P(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002570 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002571 // ------- ------------------------------------------------------------
2572 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2573 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002574 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002575 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002576 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002577 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002578 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002579 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002580 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002581 while (stream_generator_->PacketsRemaining() > 1) {
2582 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002583 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002584 EXPECT_FALSE(request_key_frame);
2585 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002586 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002587 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002588 }
2589 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002590 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002591 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002592 EXPECT_FALSE(DecodeCompleteFrame());
2593 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002594 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002595 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002596 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002597 const size_t kExpectedNackSize = 10;
philipel83f831a2016-03-12 03:30:23 -08002598 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2599 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2600 for (size_t i = 0; i < nack_sent_.size(); ++i)
2601 EXPECT_EQ(i * 10, nack_sent_[i]);
2602 } else {
2603 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2604 for (size_t i = 0; i < nack_list.size(); ++i)
2605 EXPECT_EQ(i * 10, nack_list[i]);
2606 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002607}
2608
philipel83f831a2016-03-12 03:30:23 -08002609TEST_P(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002610 bool request_key_frame = false;
2611 // -----------------------------------
2612 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2613 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002614 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002615 InsertFrame(kVideoFrameKey);
2616 EXPECT_FALSE(request_key_frame);
2617 EXPECT_TRUE(DecodeCompleteFrame());
2618 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2619 clock_->TimeInMilliseconds());
2620 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2621 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002622 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002623 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002624 EXPECT_FALSE(request_key_frame);
2625 } else {
2626 stream_generator_->NextPacket(NULL); // Drop packet
2627 }
2628 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2629 clock_->TimeInMilliseconds());
2630 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2631 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002632 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002633 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002634 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002635 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002636 // Verify the NACK list.
philipel83f831a2016-03-12 03:30:23 -08002637 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2638 ASSERT_EQ(1u, nack_sent_.size());
2639 EXPECT_EQ(65535, nack_sent_[0]);
2640 } else {
2641 ASSERT_EQ(1u, nack_list.size());
2642 EXPECT_EQ(65535, nack_list[0]);
2643 }
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002644}
2645
philipel83f831a2016-03-12 03:30:23 -08002646TEST_P(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002647 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002648 InsertFrame(kVideoFrameKey);
2649 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002650 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002651 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2652 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002653
2654 // Far-into-the-future video frame, could be caused by resetting the encoder
2655 // or otherwise restarting. This should not fail when error when the packet is
2656 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002657 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002658 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2659 InsertFrame(kVideoFrameKey);
2660 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002661 nack_list = jitter_buffer_->GetNackList(&extended);
2662 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002663
2664 // Stream should be decodable from this point.
2665 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2666 InsertFrame(kVideoFrameDelta);
2667 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002668 nack_list = jitter_buffer_->GetNackList(&extended);
2669 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002670}
2671
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002672} // namespace webrtc