blob: c5384681b354e05478fcc0fbd2d650f4baa4ca4d [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
11#include <string.h>
12
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"
Henrik Kjellander2557b862015-11-18 22:00:21 +010017#include "webrtc/modules/video_coding/frame_buffer.h"
18#include "webrtc/modules/video_coding/jitter_buffer.h"
19#include "webrtc/modules/video_coding/media_opt_util.h"
20#include "webrtc/modules/video_coding/packet.h"
21#include "webrtc/modules/video_coding/test/stream_generator.h"
22#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010023#include "webrtc/system_wrappers/include/clock.h"
24#include "webrtc/system_wrappers/include/metrics.h"
Åsa Perssona96f02b2015-04-24 08:52:11 +020025#include "webrtc/test/histogram.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000026
27namespace webrtc {
28
asapersson9a4cd872015-10-23 00:27:14 -070029namespace {
philipel9d3ab612015-12-21 04:12:39 -080030const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070031} // namespace
32
33class Vp9SsMapTest : public ::testing::Test {
34 protected:
philipel9d3ab612015-12-21 04:12:39 -080035 Vp9SsMapTest() : packet_(data_, 1400, 1234, 1, true) {}
asapersson9a4cd872015-10-23 00:27:14 -070036
37 virtual void SetUp() {
38 packet_.isFirstPacket = true;
39 packet_.markerBit = true;
40 packet_.frameType = kVideoFrameKey;
41 packet_.codec = kVideoCodecVP9;
42 packet_.codecSpecificHeader.codec = kRtpVideoVp9;
43 packet_.codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
44 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
45 packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
46 packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
47 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
48 packet_.codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
49 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
50 }
51
52 Vp9SsMap map_;
53 uint8_t data_[1500];
54 VCMPacket packet_;
55};
56
57TEST_F(Vp9SsMapTest, Insert) {
58 EXPECT_TRUE(map_.Insert(packet_));
59}
60
61TEST_F(Vp9SsMapTest, Insert_NoSsData) {
62 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
63 EXPECT_FALSE(map_.Insert(packet_));
64}
65
66TEST_F(Vp9SsMapTest, Find) {
67 EXPECT_TRUE(map_.Insert(packet_));
68 Vp9SsMap::SsMap::iterator it;
69 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
70 EXPECT_EQ(packet_.timestamp, it->first);
71}
72
73TEST_F(Vp9SsMapTest, Find_WithWrap) {
74 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
75 const uint32_t kSsTimestamp2 = 100;
76 packet_.timestamp = kSsTimestamp1;
77 EXPECT_TRUE(map_.Insert(packet_));
78 packet_.timestamp = kSsTimestamp2;
79 EXPECT_TRUE(map_.Insert(packet_));
80 Vp9SsMap::SsMap::iterator it;
81 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
82 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
83 EXPECT_EQ(kSsTimestamp1, it->first);
84 EXPECT_TRUE(map_.Find(0, &it));
85 EXPECT_EQ(kSsTimestamp1, it->first);
86 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
87 EXPECT_EQ(kSsTimestamp1, it->first);
88 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
89 EXPECT_EQ(kSsTimestamp2, it->first);
90 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
91 EXPECT_EQ(kSsTimestamp2, it->first);
92}
93
94TEST_F(Vp9SsMapTest, Reset) {
95 EXPECT_TRUE(map_.Insert(packet_));
96 Vp9SsMap::SsMap::iterator it;
97 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
98 EXPECT_EQ(packet_.timestamp, it->first);
99
100 map_.Reset();
101 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
102}
103
104TEST_F(Vp9SsMapTest, RemoveOld) {
105 Vp9SsMap::SsMap::iterator it;
106 const uint32_t kSsTimestamp1 = 10000;
107 packet_.timestamp = kSsTimestamp1;
108 EXPECT_TRUE(map_.Insert(packet_));
109
110 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
111 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
112 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
113
114 map_.RemoveOld(kTimestamp);
115 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
116 EXPECT_TRUE(map_.Find(kTimestamp, &it));
117 EXPECT_EQ(kTimestamp, it->first);
118}
119
120TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
121 Vp9SsMap::SsMap::iterator it;
122 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
123 const uint32_t kSsTimestamp2 = 10;
124 const uint32_t kSsTimestamp3 = 1000;
125 packet_.timestamp = kSsTimestamp1;
126 EXPECT_TRUE(map_.Insert(packet_));
127 packet_.timestamp = kSsTimestamp2;
128 EXPECT_TRUE(map_.Insert(packet_));
129 packet_.timestamp = kSsTimestamp3;
130 EXPECT_TRUE(map_.Insert(packet_));
131
132 map_.RemoveOld(kSsTimestamp3);
133 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
134 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
135 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
136}
137
138TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
139 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
140 EXPECT_FALSE(map_.UpdatePacket(&packet_));
141}
142
143TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
144 EXPECT_TRUE(map_.Insert(packet_));
145 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = kNoGofIdx;
146 EXPECT_FALSE(map_.UpdatePacket(&packet_));
147}
148
149TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
150 EXPECT_TRUE(map_.Insert(packet_));
151 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 4;
152 EXPECT_FALSE(map_.UpdatePacket(&packet_));
153}
154
155TEST_F(Vp9SsMapTest, UpdatePacket) {
156 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
157
158 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0;
159 EXPECT_TRUE(map_.UpdatePacket(&packet_));
160 EXPECT_EQ(0, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
161 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
162 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
163 EXPECT_EQ(4, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
164
165 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 1;
166 EXPECT_TRUE(map_.UpdatePacket(&packet_));
167 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
168 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
169 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
170 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
171
172 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 2;
173 EXPECT_TRUE(map_.UpdatePacket(&packet_));
174 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
175 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
176 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
177 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
178
179 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 3;
180 EXPECT_TRUE(map_.UpdatePacket(&packet_));
181 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx);
182 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch);
183 EXPECT_EQ(2U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics);
184 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]);
185 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[1]);
186}
187
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000188class TestBasicJitterBuffer : public ::testing::Test {
189 protected:
190 virtual void SetUp() {
191 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700192 jitter_buffer_.reset(new VCMJitterBuffer(
193 clock_.get(),
kwiberg3f55dea2016-02-29 05:51:59 -0800194 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent())));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000195 jitter_buffer_->Start();
196 seq_num_ = 1234;
197 timestamp_ = 0;
198 size_ = 1400;
199 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
200 data_[0] = 0;
201 data_[1] = 0;
202 data_[2] = 0x80;
203 int count = 3;
204 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
205 data_[i] = count;
206 count++;
207 if (count == 10) {
208 data_[i + 1] = 0;
209 data_[i + 2] = 0;
210 data_[i + 3] = 0x80;
211 count = 3;
212 i += 3;
213 }
214 }
215 packet_.reset(new VCMPacket(data_, size_, seq_num_, timestamp_, true));
216 }
217
218 VCMEncodedFrame* DecodeCompleteFrame() {
219 uint32_t timestamp = 0;
220 bool found_frame = jitter_buffer_->NextCompleteTimestamp(10, &timestamp);
221 if (!found_frame)
222 return NULL;
223 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
224 return frame;
225 }
226
227 VCMEncodedFrame* DecodeIncompleteFrame() {
228 uint32_t timestamp = 0;
229 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
230 if (!found_frame)
231 return NULL;
232 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
233 return frame;
234 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000235
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000236 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800237 unsigned int size,
238 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000239 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000240
241 const uint8_t* outData = frame_out->Buffer();
242 unsigned int i = 0;
243
244 if (startCode) {
245 EXPECT_EQ(0, outData[0]);
246 EXPECT_EQ(0, outData[1]);
247 EXPECT_EQ(0, outData[2]);
248 EXPECT_EQ(1, outData[3]);
249 i += 4;
250 }
251
252 EXPECT_EQ(size, frame_out->Length());
253 int count = 3;
254 for (; i < size; i++) {
255 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
256 i += 2;
257 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
258 EXPECT_EQ(0, outData[0]);
259 EXPECT_EQ(0, outData[1]);
260 EXPECT_EQ(0, outData[2]);
261 EXPECT_EQ(1, outData[3]);
262 i += 3;
263 } else {
264 EXPECT_EQ(count, outData[i]);
265 count++;
266 if (count == 10) {
267 count = 3;
268 }
269 }
270 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000271 }
272
273 uint16_t seq_num_;
274 uint32_t timestamp_;
275 int size_;
276 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800277 std::unique_ptr<VCMPacket> packet_;
278 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000279 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800280 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000281};
282
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000283class TestRunningJitterBuffer : public ::testing::Test {
284 protected:
285 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000286
287 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000288 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000289 max_nack_list_size_ = 150;
290 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700291 jitter_buffer_ = new VCMJitterBuffer(
292 clock_.get(),
kwiberg3f55dea2016-02-29 05:51:59 -0800293 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()));
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700294 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000295 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800296 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
297 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000298 memset(data_buffer_, 0, kDataBufferSize);
299 }
300
301 virtual void TearDown() {
302 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000303 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000304 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000305 }
306
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000307 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000308 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000309 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000310 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000311 EXPECT_TRUE(packet_available);
312 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000313 return kGeneralError; // Return here to avoid crashes below.
314 bool retransmitted = false;
315 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000316 }
317
318 VCMFrameBufferEnum InsertPacket(int index) {
319 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000320 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000321 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000322 EXPECT_TRUE(packet_available);
323 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000324 return kGeneralError; // Return here to avoid crashes below.
325 bool retransmitted = false;
326 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000327 }
328
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000329 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700330 stream_generator_->GenerateFrame(
331 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
332 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000333 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000334 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000335 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000336 }
337
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000338 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
339 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000340 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000341 VCMFrameBufferEnum ret = InsertFrame(frame_type);
342 if (ret < kNoError) {
343 ret_for_all = ret;
344 } else if (ret_for_all >= kNoError) {
345 ret_for_all = ret;
346 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000347 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000348 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 }
350
351 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000352 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000353 clock_->TimeInMilliseconds());
354 for (int i = 0; i < num_packets; ++i)
355 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000356 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000357 }
358
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000359 bool DecodeCompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000360 uint32_t timestamp = 0;
361 bool found_frame = jitter_buffer_->NextCompleteTimestamp(0, &timestamp);
362 if (!found_frame)
363 return false;
364
365 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000366 bool ret = (frame != NULL);
367 jitter_buffer_->ReleaseFrame(frame);
368 return ret;
369 }
370
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000371 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000372 uint32_t timestamp = 0;
373 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
374 if (!found_frame)
375 return false;
376 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000377 bool ret = (frame != NULL);
378 jitter_buffer_->ReleaseFrame(frame);
379 return ret;
380 }
381
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000382 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000383 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800384 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000385 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000386 size_t max_nack_list_size_;
387 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000388 uint8_t data_buffer_[kDataBufferSize];
389};
390
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000391class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 protected:
393 virtual void SetUp() {
394 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000395 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000396 }
397
philipel9d3ab612015-12-21 04:12:39 -0800398 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000399};
400
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000401TEST_F(TestBasicJitterBuffer, StopRunning) {
402 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000403 EXPECT_TRUE(NULL == DecodeCompleteFrame());
404 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
405 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000406 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000407 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000408
409 // No packets inserted.
410 EXPECT_TRUE(NULL == DecodeCompleteFrame());
411 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
412
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000413 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000414 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000415
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000416 // No packets inserted.
417 EXPECT_TRUE(NULL == DecodeCompleteFrame());
418 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
419}
420
421TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000422 // Always start with a complete key frame when not allowing errors.
423 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000424 packet_->frameType = kVideoFrameKey;
425 packet_->isFirstPacket = true;
426 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000427 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000428
429 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000430 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800431 EXPECT_EQ(kCompleteSession,
432 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000433 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000434 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000435 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000436 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000437}
438
Åsa Perssona96f02b2015-04-24 08:52:11 +0200439TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
440 test::ClearHistograms();
441 // Always start with a complete key frame when not allowing errors.
442 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
443 packet_->frameType = kVideoFrameKey;
444 packet_->isFirstPacket = true;
445 packet_->markerBit = true;
446 packet_->timestamp += 123 * 90;
447
448 // Insert single packet frame to the jitter buffer and get a frame.
449 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800450 EXPECT_EQ(kCompleteSession,
451 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200452 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
453 CheckOutFrame(frame_out, size_, false);
454 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
455 jitter_buffer_->ReleaseFrame(frame_out);
456
457 // Verify that histograms are updated when the jitter buffer is stopped.
458 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
459 jitter_buffer_->Stop();
philipel9d3ab612015-12-21 04:12:39 -0800460 EXPECT_EQ(
461 0, test::LastHistogramSample("WebRTC.Video.DiscardedPacketsInPercent"));
462 EXPECT_EQ(
463 0, test::LastHistogramSample("WebRTC.Video.DuplicatedPacketsInPercent"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200464 EXPECT_NE(-1, test::LastHistogramSample(
philipel9d3ab612015-12-21 04:12:39 -0800465 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200466 EXPECT_EQ(1000, test::LastHistogramSample(
philipel9d3ab612015-12-21 04:12:39 -0800467 "WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200468
469 // Verify that histograms are not updated if stop is called again.
470 jitter_buffer_->Stop();
philipel9d3ab612015-12-21 04:12:39 -0800471 EXPECT_EQ(
472 1, test::NumHistogramSamples("WebRTC.Video.DiscardedPacketsInPercent"));
473 EXPECT_EQ(
474 1, test::NumHistogramSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200475 EXPECT_EQ(1, test::NumHistogramSamples(
philipel9d3ab612015-12-21 04:12:39 -0800476 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
477 EXPECT_EQ(
478 1, test::NumHistogramSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200479}
480
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
482 packet_->frameType = kVideoFrameKey;
483 packet_->isFirstPacket = true;
484 packet_->markerBit = false;
485
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000486 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800487 EXPECT_EQ(kIncomplete,
488 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000489 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
490 // Should not be complete.
491 EXPECT_TRUE(frame_out == NULL);
492
493 ++seq_num_;
494 packet_->isFirstPacket = false;
495 packet_->markerBit = true;
496 packet_->seqNum = seq_num_;
497
philipel9d3ab612015-12-21 04:12:39 -0800498 EXPECT_EQ(kCompleteSession,
499 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000500
501 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000502 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503
504 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000505 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000506}
507
508TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
509 packet_->frameType = kVideoFrameKey;
510 packet_->isFirstPacket = true;
511 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000512
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000513 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800514 EXPECT_EQ(kIncomplete,
515 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000516
517 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
518
519 // Frame should not be complete.
520 EXPECT_TRUE(frame_out == NULL);
521
522 // Insert 98 frames.
523 int loop = 0;
524 do {
525 seq_num_++;
526 packet_->isFirstPacket = false;
527 packet_->markerBit = false;
528 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000529
philipel9d3ab612015-12-21 04:12:39 -0800530 EXPECT_EQ(kIncomplete,
531 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000532 loop++;
533 } while (loop < 98);
534
535 // Insert last packet.
536 ++seq_num_;
537 packet_->isFirstPacket = false;
538 packet_->markerBit = true;
539 packet_->seqNum = seq_num_;
540
philipel9d3ab612015-12-21 04:12:39 -0800541 EXPECT_EQ(kCompleteSession,
542 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000543
544 frame_out = DecodeCompleteFrame();
545
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000546 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000547 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000548 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000549}
550
551TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
552 // Always start with a complete key frame.
553 packet_->frameType = kVideoFrameKey;
554 packet_->isFirstPacket = true;
555 packet_->markerBit = true;
556
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000557 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800558 EXPECT_EQ(kCompleteSession,
559 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
561 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000562 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000563
564 ++seq_num_;
565 packet_->seqNum = seq_num_;
566 packet_->markerBit = false;
567 packet_->frameType = kVideoFrameDelta;
568 packet_->timestamp += 33 * 90;
569
philipel9d3ab612015-12-21 04:12:39 -0800570 EXPECT_EQ(kIncomplete,
571 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000572
573 frame_out = DecodeCompleteFrame();
574
575 // Frame should not be complete.
576 EXPECT_TRUE(frame_out == NULL);
577
578 packet_->isFirstPacket = false;
579 // Insert 98 frames.
580 int loop = 0;
581 do {
582 ++seq_num_;
583 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000584
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000585 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800586 EXPECT_EQ(kIncomplete,
587 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588 loop++;
589 } while (loop < 98);
590
591 // Insert the last packet.
592 ++seq_num_;
593 packet_->isFirstPacket = false;
594 packet_->markerBit = true;
595 packet_->seqNum = seq_num_;
596
philipel9d3ab612015-12-21 04:12:39 -0800597 EXPECT_EQ(kCompleteSession,
598 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000599
600 frame_out = DecodeCompleteFrame();
601
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000602 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000603 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000604 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000605}
606
607TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
608 // Insert the "first" packet last.
609 seq_num_ += 100;
610 packet_->frameType = kVideoFrameKey;
611 packet_->isFirstPacket = false;
612 packet_->markerBit = true;
613 packet_->seqNum = seq_num_;
614 packet_->timestamp = timestamp_;
615
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000616 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800617 EXPECT_EQ(kIncomplete,
618 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000619
620 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
621
622 EXPECT_TRUE(frame_out == NULL);
623
624 // Insert 98 packets.
625 int loop = 0;
626 do {
627 seq_num_--;
628 packet_->isFirstPacket = false;
629 packet_->markerBit = false;
630 packet_->seqNum = seq_num_;
631
philipel9d3ab612015-12-21 04:12:39 -0800632 EXPECT_EQ(kIncomplete,
633 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000634 loop++;
635 } while (loop < 98);
636
637 // Insert the last packet.
638 seq_num_--;
639 packet_->isFirstPacket = true;
640 packet_->markerBit = false;
641 packet_->seqNum = seq_num_;
642
philipel9d3ab612015-12-21 04:12:39 -0800643 EXPECT_EQ(kCompleteSession,
644 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000645
philipel9d3ab612015-12-21 04:12:39 -0800646 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000647
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000648 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649
650 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000651 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000652}
653
654TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
655 packet_->frameType = kVideoFrameDelta;
656 packet_->isFirstPacket = true;
657 packet_->markerBit = false;
658
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000659 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800660 EXPECT_EQ(kIncomplete,
661 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000662
663 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
664
665 EXPECT_TRUE(frame_out == NULL);
666
667 seq_num_++;
668 packet_->isFirstPacket = false;
669 packet_->markerBit = true;
670 packet_->seqNum = seq_num_;
671
philipel9d3ab612015-12-21 04:12:39 -0800672 EXPECT_EQ(kCompleteSession,
673 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000674
675 // check that we fail to get frame since seqnum is not continuous
676 frame_out = DecodeCompleteFrame();
677 EXPECT_TRUE(frame_out == NULL);
678
679 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800680 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000681 packet_->frameType = kVideoFrameKey;
682 packet_->isFirstPacket = true;
683 packet_->markerBit = false;
684 packet_->seqNum = seq_num_;
685 packet_->timestamp = timestamp_;
686
philipel9d3ab612015-12-21 04:12:39 -0800687 EXPECT_EQ(kIncomplete,
688 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689
690 frame_out = DecodeCompleteFrame();
691
692 // It should not be complete.
693 EXPECT_TRUE(frame_out == NULL);
694
695 seq_num_++;
696 packet_->isFirstPacket = false;
697 packet_->markerBit = true;
698 packet_->seqNum = seq_num_;
699
philipel9d3ab612015-12-21 04:12:39 -0800700 EXPECT_EQ(kCompleteSession,
701 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702
703 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000704 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000706 jitter_buffer_->ReleaseFrame(frame_out);
707
708 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000709 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000711 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000712}
713
Noah Richardse4cb4e92015-05-22 14:03:00 -0700714TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
715 packet_->frameType = kVideoFrameKey;
716 packet_->isFirstPacket = true;
717 packet_->markerBit = true;
718
719 // Send in an initial good packet/frame (Frame A) to start things off.
720 bool retransmitted = false;
721 EXPECT_EQ(kCompleteSession,
722 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
723 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
724 EXPECT_TRUE(frame_out != NULL);
725 jitter_buffer_->ReleaseFrame(frame_out);
726
727 // Now send in a complete delta frame (Frame C), but with a sequence number
728 // gap. No pic index either, so no temporal scalability cheating :)
729 packet_->frameType = kVideoFrameDelta;
730 // Leave a gap of 2 sequence numbers and two frames.
731 packet_->seqNum = seq_num_ + 3;
732 packet_->timestamp = timestamp_ + (66 * 90);
733 // Still isFirst = marker = true.
734 // Session should be complete (frame is complete), but there's nothing to
735 // decode yet.
736 EXPECT_EQ(kCompleteSession,
737 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
738 frame_out = DecodeCompleteFrame();
739 EXPECT_TRUE(frame_out == NULL);
740
741 // Now send in a complete delta frame (Frame B) that is continuous from A, but
742 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
743 packet_->seqNum = seq_num_ + 1;
744 packet_->timestamp = timestamp_ + (33 * 90);
745 // Still isFirst = marker = true.
746 EXPECT_EQ(kCompleteSession,
747 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
748 frame_out = DecodeCompleteFrame();
749 EXPECT_TRUE(frame_out != NULL);
750 jitter_buffer_->ReleaseFrame(frame_out);
751
752 // But Frame C isn't continuous yet.
753 frame_out = DecodeCompleteFrame();
754 EXPECT_TRUE(frame_out == NULL);
755
756 // Add in the padding. These are empty packets (data length is 0) with no
757 // marker bit and matching the timestamp of Frame B.
758 VCMPacket empty_packet(data_, 0, seq_num_ + 2, timestamp_ + (33 * 90), false);
759 EXPECT_EQ(kOldPacket,
760 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
761 empty_packet.seqNum += 1;
762 EXPECT_EQ(kOldPacket,
763 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
764
765 // But now Frame C should be ready!
766 frame_out = DecodeCompleteFrame();
767 EXPECT_TRUE(frame_out != NULL);
768 jitter_buffer_->ReleaseFrame(frame_out);
769}
770
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000771TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
772 packet_->frameType = kVideoFrameKey;
773 packet_->isFirstPacket = true;
774 packet_->markerBit = false;
775 packet_->seqNum = seq_num_;
776 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000777 EXPECT_EQ(0, jitter_buffer_->num_packets());
778 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000779
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000780 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800781 EXPECT_EQ(kIncomplete,
782 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000783
784 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
785
786 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000787 EXPECT_EQ(1, jitter_buffer_->num_packets());
788 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000789
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000790 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800791 EXPECT_EQ(kDuplicatePacket,
792 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000793 EXPECT_EQ(2, jitter_buffer_->num_packets());
794 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000795
796 seq_num_++;
797 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000798 packet_->markerBit = true;
799 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000800
philipel9d3ab612015-12-21 04:12:39 -0800801 EXPECT_EQ(kCompleteSession,
802 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000803
804 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000805 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000806 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000807
808 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000809 EXPECT_EQ(3, jitter_buffer_->num_packets());
810 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000811 jitter_buffer_->ReleaseFrame(frame_out);
812}
813
814TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
815 packet_->frameType = kVideoFrameKey;
816 packet_->isFirstPacket = true;
817 packet_->markerBit = true;
818 packet_->seqNum = seq_num_;
819 packet_->timestamp = timestamp_;
820 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
821 EXPECT_EQ(0, jitter_buffer_->num_packets());
822 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
823
824 bool retransmitted = false;
825 // Insert first complete frame.
826 EXPECT_EQ(kCompleteSession,
827 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
828
829 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
830 ASSERT_TRUE(frame_out != NULL);
831 CheckOutFrame(frame_out, size_, false);
832 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
833 jitter_buffer_->ReleaseFrame(frame_out);
834
835 // Insert 3 delta frames.
836 for (uint16_t i = 1; i <= 3; ++i) {
837 packet_->seqNum = seq_num_ + i;
838 packet_->timestamp = timestamp_ + (i * 33) * 90;
839 packet_->frameType = kVideoFrameDelta;
840 EXPECT_EQ(kCompleteSession,
841 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
842 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
843 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
844 }
845
846 // Retransmit second delta frame.
847 packet_->seqNum = seq_num_ + 2;
848 packet_->timestamp = timestamp_ + 66 * 90;
849
850 EXPECT_EQ(kDuplicatePacket,
851 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
852
853 EXPECT_EQ(5, jitter_buffer_->num_packets());
854 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
855
856 // Should be able to decode 3 delta frames, key frame already decoded.
857 for (size_t i = 0; i < 3; ++i) {
858 frame_out = DecodeCompleteFrame();
859 ASSERT_TRUE(frame_out != NULL);
860 CheckOutFrame(frame_out, size_, false);
861 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
862 jitter_buffer_->ReleaseFrame(frame_out);
863 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000864}
865
asapersson9a4cd872015-10-23 00:27:14 -0700866TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
867 // Verify that JB skips forward to next base layer frame.
868 // -------------------------------------------------
869 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
870 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
871 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
872 // | ss | x | x | x | |
873 // -------------------------------------------------
874 // |<----------tl0idx:200--------->|<---tl0idx:201---
875
876 bool re = false;
877 packet_->codec = kVideoCodecVP9;
878 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
879 packet_->isFirstPacket = true;
880 packet_->markerBit = true;
881 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
882 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
883 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
884 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700885 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
886
887 packet_->seqNum = 65485;
888 packet_->timestamp = 1000;
889 packet_->frameType = kVideoFrameKey;
890 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
891 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
asapersson394c5372015-11-05 06:07:03 -0800892 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700893 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
894 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
895 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
896 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
897
898 // Insert next temporal layer 0.
899 packet_->seqNum = 65489;
900 packet_->timestamp = 13000;
901 packet_->frameType = kVideoFrameDelta;
902 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9;
903 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201;
asapersson394c5372015-11-05 06:07:03 -0800904 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700905 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
906 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
907
908 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
909 EXPECT_EQ(1000U, frame_out->TimeStamp());
910 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
911 jitter_buffer_->ReleaseFrame(frame_out);
912
913 frame_out = DecodeCompleteFrame();
914 EXPECT_EQ(13000U, frame_out->TimeStamp());
915 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
916 jitter_buffer_->ReleaseFrame(frame_out);
917}
918
919TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
920 // Verify that frames are updated with SS data when SS packet is reordered.
921 // --------------------------------
922 // | 65486 | 65487 | 65485 |...
923 // | pid:6 | pid:7 | pid:5 |...
924 // | tid:2 | tid:1 | tid:0 |...
925 // | | | ss |
926 // --------------------------------
927 // |<--------tl0idx:200--------->|
928
929 bool re = false;
930 packet_->codec = kVideoCodecVP9;
931 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
932 packet_->isFirstPacket = true;
933 packet_->markerBit = true;
934 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
935 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
936 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
937 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700938 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
939
940 packet_->seqNum = 65486;
941 packet_->timestamp = 6000;
942 packet_->frameType = kVideoFrameDelta;
943 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -0800944 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 2;
945 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700946 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
947
948 packet_->seqNum = 65487;
949 packet_->timestamp = 9000;
950 packet_->frameType = kVideoFrameDelta;
951 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7;
asapersson394c5372015-11-05 06:07:03 -0800952 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
953 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700954 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
955
956 // Insert first frame with SS data.
957 packet_->seqNum = 65485;
958 packet_->timestamp = 3000;
959 packet_->frameType = kVideoFrameKey;
960 packet_->width = 352;
961 packet_->height = 288;
962 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -0800963 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
964 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700965 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
966 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
967 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
968 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
969
970 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
971 EXPECT_EQ(3000U, frame_out->TimeStamp());
972 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
973 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
974 EXPECT_FALSE(
975 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
976 jitter_buffer_->ReleaseFrame(frame_out);
977
978 frame_out = DecodeCompleteFrame();
979 EXPECT_EQ(6000U, frame_out->TimeStamp());
980 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
981 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
982 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
983 jitter_buffer_->ReleaseFrame(frame_out);
984
985 frame_out = DecodeCompleteFrame();
986 EXPECT_EQ(9000U, frame_out->TimeStamp());
987 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
988 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
989 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
990 jitter_buffer_->ReleaseFrame(frame_out);
991}
992
993TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
994 // Verify that frames are updated with SS data when SS packet is reordered.
995 // -----------------------------------------
996 // | 65486 | 65487 | 65485 | 65484 |...
997 // | pid:6 | pid:6 | pid:5 | pid:5 |...
998 // | tid:1 | tid:1 | tid:0 | tid:0 |...
999 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1000 // | t:6000 | t:6000 | t:3000 | t:3000 |
1001 // | | | | ss |
1002 // -----------------------------------------
1003 // |<-----------tl0idx:200------------>|
1004
1005 bool re = false;
1006 packet_->codec = kVideoCodecVP9;
1007 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
1008 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
1009 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
1010 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001011 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
1012
1013 packet_->isFirstPacket = true;
1014 packet_->markerBit = false;
1015 packet_->seqNum = 65486;
1016 packet_->timestamp = 6000;
1017 packet_->frameType = kVideoFrameDelta;
1018 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1019 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001020 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1021 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001022 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1023
1024 packet_->isFirstPacket = false;
1025 packet_->markerBit = true;
1026 packet_->seqNum = 65487;
1027 packet_->frameType = kVideoFrameDelta;
1028 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1029 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001030 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1031 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001032 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1033
1034 packet_->isFirstPacket = false;
1035 packet_->markerBit = true;
1036 packet_->seqNum = 65485;
1037 packet_->timestamp = 3000;
1038 packet_->frameType = kVideoFrameKey;
1039 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1040 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001041 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1042 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001043 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1044
1045 // Insert first frame with SS data.
1046 packet_->isFirstPacket = true;
1047 packet_->markerBit = false;
1048 packet_->seqNum = 65484;
1049 packet_->frameType = kVideoFrameKey;
1050 packet_->width = 352;
1051 packet_->height = 288;
1052 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1053 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001054 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1055 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001056 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1057 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1058 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1059 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1060
1061 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1062 EXPECT_EQ(3000U, frame_out->TimeStamp());
1063 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1064 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1065 EXPECT_FALSE(
1066 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1067 jitter_buffer_->ReleaseFrame(frame_out);
1068
1069 frame_out = DecodeCompleteFrame();
1070 EXPECT_EQ(6000U, frame_out->TimeStamp());
1071 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1072 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1073 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1074 jitter_buffer_->ReleaseFrame(frame_out);
1075}
1076
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001077TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
1078 packet_->frameType = kVideoFrameKey;
1079 packet_->isFirstPacket = true;
1080 packet_->markerBit = false;
1081 packet_->seqNum = seq_num_;
1082 packet_->timestamp = timestamp_;
1083 packet_->insertStartCode = true;
1084
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001085 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001086 EXPECT_EQ(kIncomplete,
1087 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001088
1089 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1090
1091 // Frame should not be complete.
1092 EXPECT_TRUE(frame_out == NULL);
1093
1094 seq_num_++;
1095 packet_->isFirstPacket = false;
1096 packet_->markerBit = true;
1097 packet_->seqNum = seq_num_;
1098
philipel9d3ab612015-12-21 04:12:39 -08001099 EXPECT_EQ(kCompleteSession,
1100 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001101
1102 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001103 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001104 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001105 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001106}
1107
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001108// Test threshold conditions of decodable state.
1109TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
1110 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001111 // Always start with a key frame. Use 10 packets to test Decodable State
1112 // boundaries.
1113 packet_->frameType = kVideoFrameKey;
1114 packet_->isFirstPacket = true;
1115 packet_->markerBit = false;
1116 packet_->seqNum = seq_num_;
1117 packet_->timestamp = timestamp_;
1118
1119 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001120 EXPECT_EQ(kIncomplete,
1121 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001122 uint32_t timestamp = 0;
1123 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1124 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1125
1126 packet_->isFirstPacket = false;
1127 for (int i = 1; i < 9; ++i) {
1128 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001129 EXPECT_EQ(kIncomplete,
1130 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001131 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1132 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1133 }
1134
1135 // last packet
1136 packet_->markerBit = true;
1137 packet_->seqNum++;
1138
philipel9d3ab612015-12-21 04:12:39 -08001139 EXPECT_EQ(kCompleteSession,
1140 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001141 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1142 CheckOutFrame(frame_out, 10 * size_, false);
1143 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001144 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001145
1146 // An incomplete frame can only be decoded once a subsequent frame has begun
1147 // to arrive. Insert packet in distant frame for this purpose.
1148 packet_->frameType = kVideoFrameDelta;
1149 packet_->isFirstPacket = true;
1150 packet_->markerBit = false;
1151 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001152 packet_->timestamp += 33 * 90 * 8;
1153
philipel9d3ab612015-12-21 04:12:39 -08001154 EXPECT_EQ(kDecodableSession,
1155 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001156 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1157 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1158
1159 // Insert second frame
1160 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001161 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001162
philipel9d3ab612015-12-21 04:12:39 -08001163 EXPECT_EQ(kDecodableSession,
1164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001165 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1166 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1167
1168 packet_->isFirstPacket = false;
1169 for (int i = 1; i < 8; ++i) {
1170 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001171 EXPECT_EQ(kDecodableSession,
1172 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001173 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1174 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1175 }
1176
1177 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001178 EXPECT_EQ(kDecodableSession,
1179 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001180 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1181 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1182
1183 frame_out = DecodeIncompleteFrame();
1184 ASSERT_FALSE(NULL == frame_out);
1185 CheckOutFrame(frame_out, 9 * size_, false);
1186 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001187 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001188
1189 packet_->markerBit = true;
1190 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001191 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001192}
1193
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001194// Make sure first packet is present before a frame can be decoded.
1195TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
1196 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1197 // Always start with a key frame.
1198 packet_->frameType = kVideoFrameKey;
1199 packet_->isFirstPacket = true;
1200 packet_->markerBit = true;
1201 packet_->seqNum = seq_num_;
1202 packet_->timestamp = timestamp_;
1203
1204 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001205 EXPECT_EQ(kCompleteSession,
1206 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001207 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1208 CheckOutFrame(frame_out, size_, false);
1209 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001210 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001211
1212 // An incomplete frame can only be decoded once a subsequent frame has begun
1213 // to arrive. Insert packet in distant frame for this purpose.
1214 packet_->frameType = kVideoFrameDelta;
1215 packet_->isFirstPacket = false;
1216 packet_->markerBit = false;
1217 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001218 packet_->timestamp += 33 * 90 * 8;
1219 EXPECT_EQ(kIncomplete,
1220 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001221 uint32_t timestamp;
1222 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1223 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1224
1225 // Insert second frame - an incomplete key frame.
1226 packet_->frameType = kVideoFrameKey;
1227 packet_->isFirstPacket = true;
1228 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001229 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001230
philipel9d3ab612015-12-21 04:12:39 -08001231 EXPECT_EQ(kIncomplete,
1232 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001233 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1234 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1235
1236 // Insert a few more packets. Make sure we're waiting for the key frame to be
1237 // complete.
1238 packet_->isFirstPacket = false;
1239 for (int i = 1; i < 5; ++i) {
1240 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001241 EXPECT_EQ(kIncomplete,
1242 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001243 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1244 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1245 }
1246
1247 // Complete key frame.
1248 packet_->markerBit = true;
1249 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001250 EXPECT_EQ(kCompleteSession,
1251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001252 frame_out = DecodeCompleteFrame();
1253 CheckOutFrame(frame_out, 6 * size_, false);
1254 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001255 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001256}
1257
1258// Make sure first packet is present before a frame can be decoded.
1259TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
1260 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1261 // Always start with a key frame.
1262 packet_->frameType = kVideoFrameKey;
1263 packet_->isFirstPacket = true;
1264 packet_->markerBit = true;
1265 packet_->seqNum = seq_num_;
1266 packet_->timestamp = timestamp_;
1267
1268 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001269 EXPECT_EQ(kCompleteSession,
1270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001271 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1272 CheckOutFrame(frame_out, size_, false);
1273 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001274 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001275
1276 // An incomplete frame can only be decoded once a subsequent frame has begun
1277 // to arrive. Insert packet in distant frame for this purpose.
1278 packet_->frameType = kVideoFrameDelta;
1279 packet_->isFirstPacket = false;
1280 packet_->markerBit = false;
1281 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001282 packet_->timestamp += 33 * 90 * 8;
1283 EXPECT_EQ(kIncomplete,
1284 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001285 uint32_t timestamp;
1286 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1287 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1288
1289 // Insert second frame with the first packet missing. Make sure we're waiting
1290 // for the key frame to be complete.
1291 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001292 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001293
philipel9d3ab612015-12-21 04:12:39 -08001294 EXPECT_EQ(kIncomplete,
1295 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001296 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1297 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1298
1299 for (int i = 0; i < 5; ++i) {
1300 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001301 EXPECT_EQ(kIncomplete,
1302 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001303 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1304 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1305 }
1306
1307 // Add first packet. Frame should now be decodable, but incomplete.
1308 packet_->isFirstPacket = true;
1309 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001310 EXPECT_EQ(kDecodableSession,
1311 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001312 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1313 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1314
1315 frame_out = DecodeIncompleteFrame();
1316 CheckOutFrame(frame_out, 7 * size_, false);
1317 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001318 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001319}
1320
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001321TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
1322 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001323 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001324 packet_->frameType = kVideoFrameKey;
1325 packet_->isFirstPacket = true;
1326 packet_->markerBit = true;
1327 packet_->seqNum = seq_num_;
1328 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001329 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001330 EXPECT_EQ(kCompleteSession,
1331 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001332 uint32_t next_timestamp;
1333 EXPECT_TRUE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1334 EXPECT_EQ(packet_->timestamp, next_timestamp);
1335 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(next_timestamp);
1336 EXPECT_TRUE(frame != NULL);
1337 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001338
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001339 // Drop a complete frame.
1340 timestamp_ += 2 * 33 * 90;
1341 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001342 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001343 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001344 packet_->markerBit = false;
1345 packet_->seqNum = seq_num_;
1346 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001347 EXPECT_EQ(kDecodableSession,
1348 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001349 // Insert a packet (so the previous one will be released).
1350 timestamp_ += 33 * 90;
1351 seq_num_ += 2;
1352 packet_->frameType = kVideoFrameDelta;
1353 packet_->isFirstPacket = true;
1354 packet_->markerBit = false;
1355 packet_->seqNum = seq_num_;
1356 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001357 EXPECT_EQ(kDecodableSession,
1358 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001359 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1360 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1361 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001362}
1363
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001364TEST_F(TestBasicJitterBuffer, PacketLoss) {
1365 // Verify missing packets statistics and not decodable packets statistics.
1366 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1367 // The last packet is an empty (non-media) packet.
1368
1369 // Select a start seqNum which triggers a difficult wrap situation
1370 // The JB will only output (incomplete)frames if the next one has started
1371 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001372 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001373 seq_num_ = 0xffff - 4;
1374 seq_num_++;
1375 packet_->frameType = kVideoFrameKey;
1376 packet_->isFirstPacket = true;
1377 packet_->markerBit = false;
1378 packet_->seqNum = seq_num_;
1379 packet_->timestamp = timestamp_;
1380 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001381
1382 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001383 EXPECT_EQ(kDecodableSession,
1384 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001385 for (int i = 0; i < 11; ++i) {
1386 webrtc::FrameType frametype = kVideoFrameDelta;
1387 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001388 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001389 packet_->frameType = frametype;
1390 packet_->isFirstPacket = true;
1391 packet_->markerBit = false;
1392 packet_->seqNum = seq_num_;
1393 packet_->timestamp = timestamp_;
1394 packet_->completeNALU = kNaluStart;
1395
philipel9d3ab612015-12-21 04:12:39 -08001396 EXPECT_EQ(kDecodableSession,
1397 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001398
1399 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1400
1401 // Should not be complete.
1402 EXPECT_TRUE(frame_out == NULL);
1403
1404 seq_num_ += 2;
1405 packet_->isFirstPacket = false;
1406 packet_->markerBit = true;
1407 packet_->seqNum = seq_num_;
1408 packet_->completeNALU = kNaluEnd;
1409
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001410 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1411 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001412
1413 // Insert an empty (non-media) packet.
1414 seq_num_++;
1415 packet_->isFirstPacket = false;
1416 packet_->markerBit = false;
1417 packet_->seqNum = seq_num_;
1418 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001419 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001421 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001422 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001423 frame_out = DecodeIncompleteFrame();
1424
1425 // One of the packets has been discarded by the jitter buffer.
1426 // Last frame can't be extracted yet.
1427 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001428 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001429
1430 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001431 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001432 } else {
philipel9d3ab612015-12-21 04:12:39 -08001433 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001434 }
1435 EXPECT_FALSE(frame_out->Complete());
1436 EXPECT_FALSE(frame_out->MissingFrame());
1437 }
1438
1439 jitter_buffer_->ReleaseFrame(frame_out);
1440 }
1441
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001442 // Insert 3 old packets and verify that we have 3 discarded packets
1443 // Match value to actual latest timestamp decoded.
1444 timestamp_ -= 33 * 90;
1445 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001446
philipel9d3ab612015-12-21 04:12:39 -08001447 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001448
1449 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001450
philipel9d3ab612015-12-21 04:12:39 -08001451 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001452
1453 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001454
philipel9d3ab612015-12-21 04:12:39 -08001455 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001456
1457 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1458
1459 jitter_buffer_->Flush();
1460
1461 // This statistic shouldn't be reset by a flush.
1462 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1463}
1464
1465TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
1466 seq_num_ = 0xfff0;
1467 packet_->frameType = kVideoFrameKey;
1468 packet_->isFirstPacket = true;
1469 packet_->markerBit = false;
1470 packet_->seqNum = seq_num_;
1471 packet_->timestamp = timestamp_;
1472
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001473 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001474 EXPECT_EQ(kIncomplete,
1475 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476
1477 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1478
1479 EXPECT_TRUE(frame_out == NULL);
1480
1481 int loop = 0;
1482 do {
1483 seq_num_++;
1484 packet_->isFirstPacket = false;
1485 packet_->markerBit = false;
1486 packet_->seqNum = seq_num_;
1487
philipel9d3ab612015-12-21 04:12:39 -08001488 EXPECT_EQ(kIncomplete,
1489 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490
1491 frame_out = DecodeCompleteFrame();
1492
1493 EXPECT_TRUE(frame_out == NULL);
1494
1495 loop++;
1496 } while (loop < 98);
1497
1498 seq_num_++;
1499 packet_->isFirstPacket = false;
1500 packet_->markerBit = true;
1501 packet_->seqNum = seq_num_;
1502
philipel9d3ab612015-12-21 04:12:39 -08001503 EXPECT_EQ(kCompleteSession,
1504 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001505
1506 frame_out = DecodeCompleteFrame();
1507
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001508 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001509
1510 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001511 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001512}
1513
1514TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
1515 // Insert "first" packet last seqnum.
1516 seq_num_ = 10;
1517 packet_->frameType = kVideoFrameKey;
1518 packet_->isFirstPacket = false;
1519 packet_->markerBit = true;
1520 packet_->seqNum = seq_num_;
1521
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001522 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001523 EXPECT_EQ(kIncomplete,
1524 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001525 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1526
1527 // Should not be complete.
1528 EXPECT_TRUE(frame_out == NULL);
1529
1530 // Insert 98 frames.
1531 int loop = 0;
1532 do {
1533 seq_num_--;
1534 packet_->isFirstPacket = false;
1535 packet_->markerBit = false;
1536 packet_->seqNum = seq_num_;
1537
philipel9d3ab612015-12-21 04:12:39 -08001538 EXPECT_EQ(kIncomplete,
1539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540
1541 frame_out = DecodeCompleteFrame();
1542
1543 EXPECT_TRUE(frame_out == NULL);
1544
1545 loop++;
1546 } while (loop < 98);
1547
1548 // Insert last packet.
1549 seq_num_--;
1550 packet_->isFirstPacket = true;
1551 packet_->markerBit = false;
1552 packet_->seqNum = seq_num_;
1553
philipel9d3ab612015-12-21 04:12:39 -08001554 EXPECT_EQ(kCompleteSession,
1555 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001556
1557 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001558 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001560 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561}
1562
1563TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
1564 // ------- -------
1565 // | 2 | | 1 |
1566 // ------- -------
1567 // t = 3000 t = 2000
1568 seq_num_ = 2;
1569 timestamp_ = 3000;
1570 packet_->frameType = kVideoFrameKey;
1571 packet_->isFirstPacket = true;
1572 packet_->markerBit = true;
1573 packet_->timestamp = timestamp_;
1574 packet_->seqNum = seq_num_;
1575
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001576 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001577 EXPECT_EQ(kCompleteSession,
1578 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001579
1580 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1581 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001582 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001583 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001584 jitter_buffer_->ReleaseFrame(frame_out);
1585
1586 seq_num_--;
1587 timestamp_ = 2000;
1588 packet_->frameType = kVideoFrameDelta;
1589 packet_->isFirstPacket = true;
1590 packet_->markerBit = true;
1591 packet_->seqNum = seq_num_;
1592 packet_->timestamp = timestamp_;
1593
philipel9d3ab612015-12-21 04:12:39 -08001594 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001595}
1596
1597TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
1598 // ------- -------
1599 // | 2 | | 1 |
1600 // ------- -------
1601 // t = 3000 t = 0xffffff00
1602
1603 seq_num_ = 2;
1604 timestamp_ = 3000;
1605 packet_->frameType = kVideoFrameKey;
1606 packet_->isFirstPacket = true;
1607 packet_->markerBit = true;
1608 packet_->seqNum = seq_num_;
1609 packet_->timestamp = timestamp_;
1610
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001611 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001612 EXPECT_EQ(kCompleteSession,
1613 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001614
1615 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1616 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1617
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001618 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001619
1620 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1621
1622 jitter_buffer_->ReleaseFrame(frame_out);
1623
1624 seq_num_--;
1625 timestamp_ = 0xffffff00;
1626 packet_->frameType = kVideoFrameDelta;
1627 packet_->isFirstPacket = true;
1628 packet_->markerBit = true;
1629 packet_->seqNum = seq_num_;
1630 packet_->timestamp = timestamp_;
1631
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001632 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001633 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634}
1635
1636TEST_F(TestBasicJitterBuffer, TimestampWrap) {
1637 // --------------- ---------------
1638 // | 1 | 2 | | 3 | 4 |
1639 // --------------- ---------------
1640 // t = 0xffffff00 t = 33*90
1641
1642 timestamp_ = 0xffffff00;
1643 packet_->frameType = kVideoFrameKey;
1644 packet_->isFirstPacket = true;
1645 packet_->markerBit = false;
1646 packet_->seqNum = seq_num_;
1647 packet_->timestamp = timestamp_;
1648
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001649 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001650 EXPECT_EQ(kIncomplete,
1651 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001652
1653 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654 EXPECT_TRUE(frame_out == NULL);
1655
1656 seq_num_++;
1657 packet_->isFirstPacket = false;
1658 packet_->markerBit = true;
1659 packet_->seqNum = seq_num_;
1660
philipel9d3ab612015-12-21 04:12:39 -08001661 EXPECT_EQ(kCompleteSession,
1662 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001663
1664 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001665 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001666 jitter_buffer_->ReleaseFrame(frame_out);
1667
1668 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001669 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001670 packet_->frameType = kVideoFrameDelta;
1671 packet_->isFirstPacket = true;
1672 packet_->markerBit = false;
1673 packet_->seqNum = seq_num_;
1674 packet_->timestamp = timestamp_;
1675
philipel9d3ab612015-12-21 04:12:39 -08001676 EXPECT_EQ(kIncomplete,
1677 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001678
1679 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001680 EXPECT_TRUE(frame_out == NULL);
1681
1682 seq_num_++;
1683 packet_->isFirstPacket = false;
1684 packet_->markerBit = true;
1685 packet_->seqNum = seq_num_;
1686
philipel9d3ab612015-12-21 04:12:39 -08001687 EXPECT_EQ(kCompleteSession,
1688 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689
1690 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001691 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001692 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001693 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001694}
1695
1696TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
1697 // ------- -------
1698 // | 1 | | 2 |
1699 // ------- -------
1700 // t = 0xffffff00 t = 2700
1701
1702 timestamp_ = 0xffffff00;
1703 packet_->frameType = kVideoFrameKey;
1704 packet_->isFirstPacket = true;
1705 packet_->markerBit = true;
1706 packet_->timestamp = timestamp_;
1707
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001708 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001709 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001710 EXPECT_EQ(kCompleteSession,
1711 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001712
1713 // Insert next frame.
1714 seq_num_++;
1715 timestamp_ = 2700;
1716 packet_->frameType = kVideoFrameDelta;
1717 packet_->isFirstPacket = true;
1718 packet_->markerBit = true;
1719 packet_->seqNum = seq_num_;
1720 packet_->timestamp = timestamp_;
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 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1726 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001727 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001728 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001729 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001730
1731 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1732 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001733 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001735 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001736}
1737
1738TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
1739 // ------- -------
1740 // | 2 | | 1 |
1741 // ------- -------
1742 // t = 2700 t = 0xffffff00
1743
1744 seq_num_ = 2;
1745 timestamp_ = 2700;
1746 packet_->frameType = kVideoFrameDelta;
1747 packet_->isFirstPacket = true;
1748 packet_->markerBit = true;
1749 packet_->seqNum = seq_num_;
1750 packet_->timestamp = timestamp_;
1751
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001752 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001753 EXPECT_EQ(kCompleteSession,
1754 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001755
1756 // Insert second frame
1757 seq_num_--;
1758 timestamp_ = 0xffffff00;
1759 packet_->frameType = kVideoFrameKey;
1760 packet_->isFirstPacket = true;
1761 packet_->markerBit = true;
1762 packet_->seqNum = seq_num_;
1763 packet_->timestamp = timestamp_;
1764
philipel9d3ab612015-12-21 04:12:39 -08001765 EXPECT_EQ(kCompleteSession,
1766 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001767
1768 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1769 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001770 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001771 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001772 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001773
1774 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1775 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001776 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001777 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001778 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001779}
1780
1781TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
1782 int loop = 0;
1783 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001784 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001785 // Insert kMaxPacketsInJitterBuffer into frame.
1786 do {
1787 seq_num_++;
1788 packet_->isFirstPacket = false;
1789 packet_->markerBit = false;
1790 packet_->seqNum = seq_num_;
1791
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001792 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001793 EXPECT_EQ(kIncomplete,
1794 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 firstPacket = false;
1796 } else {
philipel9d3ab612015-12-21 04:12:39 -08001797 EXPECT_EQ(kIncomplete,
1798 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001799 }
1800
1801 loop++;
1802 } while (loop < kMaxPacketsInSession);
1803
1804 // Max number of packets inserted.
1805 // Insert one more packet.
1806 seq_num_++;
1807 packet_->isFirstPacket = false;
1808 packet_->markerBit = true;
1809 packet_->seqNum = seq_num_;
1810
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001812 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001813 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001814}
1815
1816TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
1817 // TEST fill JB with more than max number of frame (50 delta frames +
1818 // 51 key frames) with wrap in seq_num_
1819 //
1820 // --------------------------------------------------------------
1821 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1822 // --------------------------------------------------------------
1823 // |<-----------delta frames------------->|<------key frames----->|
1824
jbauchdb81ffd2015-11-23 03:59:02 -08001825 // Make sure the jitter doesn't request a keyframe after too much non-
1826 // decodable frames.
1827 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001828 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001829
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001830 int loop = 0;
1831 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001832 uint32_t first_key_frame_timestamp = 0;
1833 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 // Insert MAX_NUMBER_OF_FRAMES frames.
1835 do {
philipel9d3ab612015-12-21 04:12:39 -08001836 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001837 seq_num_++;
1838 packet_->isFirstPacket = true;
1839 packet_->markerBit = true;
1840 packet_->seqNum = seq_num_;
1841 packet_->timestamp = timestamp_;
1842
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001843 if (loop == 50) {
1844 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001845 packet_->frameType = kVideoFrameKey;
1846 }
1847
1848 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001849 EXPECT_EQ(kCompleteSession,
1850 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851
1852 loop++;
1853 } while (loop < kMaxNumberOfFrames);
1854
1855 // Max number of frames inserted.
1856
1857 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001858 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001859 seq_num_++;
1860 packet_->isFirstPacket = true;
1861 packet_->markerBit = true;
1862 packet_->seqNum = seq_num_;
1863 packet_->timestamp = timestamp_;
1864
1865 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001866 EXPECT_EQ(kFlushIndicator,
1867 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001868
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001869 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1870 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001871 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001872 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001873 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001874}
1875
1876TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001877 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878 seq_num_ = 3;
1879 // Insert one empty packet per frame, should never return the last timestamp
1880 // inserted. Only return empty frames in the presence of subsequent frames.
1881 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001882 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001883 for (int i = 0; i < maxSize + 10; i++) {
1884 timestamp_ += 33 * 90;
1885 seq_num_++;
1886 packet_->isFirstPacket = false;
1887 packet_->markerBit = false;
1888 packet_->seqNum = seq_num_;
1889 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001890 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001891
philipel9d3ab612015-12-21 04:12:39 -08001892 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001893 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1894 // Timestamp should never be the last TS inserted.
1895 if (testFrame != NULL) {
1896 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001897 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001898 }
1899 }
1900}
1901
1902TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
1903 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001904 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001905 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001906 timestamp_ += 33 * 90;
1907 int insertedLength = 0;
1908 packet_->seqNum = seq_num_;
1909 packet_->timestamp = timestamp_;
1910 packet_->frameType = kVideoFrameKey;
1911 packet_->isFirstPacket = true;
1912 packet_->completeNALU = kNaluStart;
1913 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001914 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915
philipel9d3ab612015-12-21 04:12:39 -08001916 EXPECT_EQ(kDecodableSession,
1917 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001918
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001919 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920 packet_->seqNum = seq_num_;
1921 packet_->frameType = kVideoFrameKey;
1922 packet_->isFirstPacket = false;
1923 packet_->completeNALU = kNaluIncomplete;
1924 packet_->markerBit = false;
1925
philipel9d3ab612015-12-21 04:12:39 -08001926 EXPECT_EQ(kDecodableSession,
1927 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928
1929 seq_num_++;
1930 packet_->seqNum = seq_num_;
1931 packet_->frameType = kVideoFrameKey;
1932 packet_->isFirstPacket = false;
1933 packet_->completeNALU = kNaluEnd;
1934 packet_->markerBit = false;
1935
philipel9d3ab612015-12-21 04:12:39 -08001936 EXPECT_EQ(kDecodableSession,
1937 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001938
1939 seq_num_++;
1940 packet_->seqNum = seq_num_;
1941 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001942 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08001943 EXPECT_EQ(kDecodableSession,
1944 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001945 // The JB will only output (incomplete) frames if a packet belonging to a
1946 // subsequent frame was already inserted. Insert one packet of a subsequent
1947 // frame. place high timestamp so the JB would always have a next frame
1948 // (otherwise, for every inserted frame we need to take care of the next
1949 // frame as well).
1950 packet_->seqNum = 1;
1951 packet_->timestamp = timestamp_ + 33 * 90 * 10;
1952 packet_->frameType = kVideoFrameDelta;
1953 packet_->isFirstPacket = false;
1954 packet_->completeNALU = kNaluStart;
1955 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001956
philipel9d3ab612015-12-21 04:12:39 -08001957 EXPECT_EQ(kDecodableSession,
1958 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959
1960 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
1961
1962 // We can decode everything from a NALU until a packet has been lost.
1963 // Thus we can decode the first packet of the first NALU and the second NALU
1964 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001965 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001966 jitter_buffer_->ReleaseFrame(frame_out);
1967
1968 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001969 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08001970 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001971 insertedLength = 0;
1972
1973 packet_->seqNum = seq_num_;
1974 packet_->timestamp = timestamp_;
1975 packet_->frameType = kVideoFrameKey;
1976 packet_->isFirstPacket = false;
1977 packet_->completeNALU = kNaluEnd;
1978 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08001979 EXPECT_EQ(kDecodableSession,
1980 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1981 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001982 seq_num_--;
1983 packet_->seqNum = seq_num_;
1984 packet_->timestamp = timestamp_;
1985 packet_->frameType = kVideoFrameKey;
1986 packet_->isFirstPacket = true;
1987 packet_->completeNALU = kNaluStart;
1988 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001989
philipel9d3ab612015-12-21 04:12:39 -08001990 EXPECT_EQ(kDecodableSession,
1991 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001992 insertedLength += packet_->sizeBytes; // This packet should be decoded.
1993
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001994 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001995 packet_->seqNum = seq_num_;
1996 packet_->timestamp = timestamp_;
1997 packet_->frameType = kVideoFrameKey;
1998 packet_->isFirstPacket = false;
1999 packet_->completeNALU = kNaluComplete;
2000 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002001 EXPECT_EQ(kDecodableSession,
2002 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002003 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002004 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002005 packet_->seqNum = seq_num_;
2006 packet_->timestamp = timestamp_;
2007 packet_->frameType = kVideoFrameKey;
2008 packet_->isFirstPacket = false;
2009 packet_->completeNALU = kNaluStart;
2010 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002011 EXPECT_EQ(kDecodableSession,
2012 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002013 // This packet should be decoded since it's the beginning of a NAL.
2014 insertedLength += packet_->sizeBytes;
2015
2016 seq_num_ += 2;
2017 packet_->seqNum = seq_num_;
2018 packet_->timestamp = timestamp_;
2019 packet_->frameType = kVideoFrameKey;
2020 packet_->isFirstPacket = false;
2021 packet_->completeNALU = kNaluEnd;
2022 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002023 EXPECT_EQ(kDecodableSession,
2024 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002025 // This packet should not be decoded because it is an incomplete NAL if it
2026 // is the last.
2027 frame_out = DecodeIncompleteFrame();
2028 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002029 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002030 jitter_buffer_->ReleaseFrame(frame_out);
2031
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002032 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002033 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002034 timestamp_ += 33 * 90;
2035 VCMPacket emptypacket(data_, 0, seq_num_, timestamp_, true);
2036 emptypacket.seqNum = seq_num_;
2037 emptypacket.timestamp = timestamp_;
2038 emptypacket.frameType = kVideoFrameKey;
2039 emptypacket.isFirstPacket = true;
2040 emptypacket.completeNALU = kNaluComplete;
2041 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002042 EXPECT_EQ(kCompleteSession,
2043 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002044 // This packet should not be decoded because it is an incomplete NAL if it
2045 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002046
2047 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2048 // has arrived.
2049 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002050 EXPECT_TRUE(frame_out != NULL);
2051 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002052
2053 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002054 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002055 timestamp_ += 33 * 90;
2056
2057 packet_->seqNum = seq_num_;
2058 packet_->timestamp = timestamp_;
2059 packet_->frameType = kVideoFrameKey;
2060 packet_->isFirstPacket = true;
2061 packet_->completeNALU = kNaluComplete;
2062 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002063
philipel9d3ab612015-12-21 04:12:39 -08002064 EXPECT_EQ(kDecodableSession,
2065 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002066
agalusza@google.comd177c102013-08-08 01:12:33 +00002067 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002068 emptypacket.seqNum = seq_num_;
2069 emptypacket.timestamp = timestamp_;
2070 emptypacket.frameType = kVideoFrameKey;
2071 emptypacket.isFirstPacket = true;
2072 emptypacket.completeNALU = kNaluComplete;
2073 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002074 EXPECT_EQ(kCompleteSession,
2075 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002076
2077 frame_out = DecodeCompleteFrame();
2078 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002079 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002080 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002081}
2082
2083TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
2084 // Test that a we cannot get incomplete frames from the JB if we haven't
2085 // received the marker bit, unless we have received a packet from a later
2086 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002087 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002088 // Start with a complete key frame - insert and decode.
2089 packet_->frameType = kVideoFrameKey;
2090 packet_->isFirstPacket = true;
2091 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002092 bool retransmitted = false;
2093
philipel9d3ab612015-12-21 04:12:39 -08002094 EXPECT_EQ(kCompleteSession,
2095 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2097 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002098 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002099
2100 packet_->seqNum += 2;
2101 packet_->timestamp += 33 * 90;
2102 packet_->frameType = kVideoFrameDelta;
2103 packet_->isFirstPacket = false;
2104 packet_->markerBit = false;
2105
philipel9d3ab612015-12-21 04:12:39 -08002106 EXPECT_EQ(kDecodableSession,
2107 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108
2109 frame_out = DecodeIncompleteFrame();
2110 EXPECT_TRUE(frame_out == NULL);
2111
2112 packet_->seqNum += 2;
2113 packet_->timestamp += 33 * 90;
2114 packet_->isFirstPacket = true;
2115
philipel9d3ab612015-12-21 04:12:39 -08002116 EXPECT_EQ(kDecodableSession,
2117 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002118
2119 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002120 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002121 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002122}
2123
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002124TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002125 // Make sure the jitter doesn't request a keyframe after too much non-
2126 // decodable frames.
2127 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002128 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002129 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002130 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002131 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002132 DropFrame(1);
2133 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002134 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002135 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002136 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002137 // This frame will make the jitter buffer recycle frames until a key frame.
2138 // Since none is found it will have to wait until the next key frame before
2139 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002140 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002141 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002142}
2143
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002144TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002145 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002146 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002147 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002148 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002149 // Insert empty packet.
2150 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002151 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002152 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002153 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002154 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002155 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002156 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002157 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002158 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002159 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002160 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002161 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002162}
2163
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002164TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002165 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2166 EXPECT_EQ(0, frame_stats.delta_frames);
2167 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002168
2169 uint32_t framerate = 0;
2170 uint32_t bitrate = 0;
2171 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2172 EXPECT_EQ(0u, framerate);
2173 EXPECT_EQ(0u, bitrate);
2174
2175 // Insert a couple of key and delta frames.
2176 InsertFrame(kVideoFrameKey);
2177 InsertFrame(kVideoFrameDelta);
2178 InsertFrame(kVideoFrameDelta);
2179 InsertFrame(kVideoFrameKey);
2180 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002181 // Decode some of them to make sure the statistics doesn't depend on frames
2182 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002183 EXPECT_TRUE(DecodeCompleteFrame());
2184 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002185 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002186 EXPECT_EQ(3, frame_stats.delta_frames);
2187 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002188
2189 // Insert 20 more frames to get estimates of bitrate and framerate over
2190 // 1 second.
2191 for (int i = 0; i < 20; ++i) {
2192 InsertFrame(kVideoFrameDelta);
2193 }
2194 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2195 // TODO(holmer): The current implementation returns the average of the last
2196 // two framerate calculations, which is why it takes two calls to reach the
2197 // actual framerate. This should be fixed.
2198 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2199 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2200 // Insert 25 more frames to get estimates of bitrate and framerate over
2201 // 2 seconds.
2202 for (int i = 0; i < 25; ++i) {
2203 InsertFrame(kVideoFrameDelta);
2204 }
2205 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2206 EXPECT_EQ(kDefaultFrameRate, framerate);
2207 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2208}
2209
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002210TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2211 // Insert delta frames.
2212 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2213 // Can't decode without a key frame.
2214 EXPECT_FALSE(DecodeCompleteFrame());
2215 InsertFrame(kVideoFrameKey);
2216 // Skip to the next key frame.
2217 EXPECT_TRUE(DecodeCompleteFrame());
2218}
2219
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002220TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2221 InsertFrame(kVideoFrameKey);
2222 EXPECT_TRUE(DecodeCompleteFrame());
2223 const int kNumDeltaFrames = 5;
2224 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2225 InsertFrame(kVideoFrameKey);
2226 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2227 EXPECT_TRUE(DecodeCompleteFrame());
2228 }
2229}
2230
2231TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2232 InsertFrame(kVideoFrameKey);
2233 EXPECT_TRUE(DecodeCompleteFrame());
2234 const int kNumDeltaFrames = 5;
2235 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2236 InsertFrame(kVideoFrameKey);
2237 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2238 InsertFrame(kVideoFrameKey);
2239 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2240 EXPECT_TRUE(DecodeCompleteFrame());
2241 }
2242}
2243
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002244TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2245 InsertFrame(kVideoFrameKey);
2246 EXPECT_TRUE(DecodeCompleteFrame());
2247 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2248 clock_->TimeInMilliseconds());
2249 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2250 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2251 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002252 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002253 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2254 EXPECT_FALSE(DecodeCompleteFrame());
2255 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2256 EXPECT_TRUE(DecodeCompleteFrame());
2257 EXPECT_TRUE(DecodeCompleteFrame());
2258}
2259
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002260TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002261 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002262 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002263 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002264 InsertFrame(kVideoFrameKey);
2265 EXPECT_TRUE(DecodeCompleteFrame());
2266}
2267
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002268TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002269 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002270 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002271 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002272
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002273 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2274 // old packet.
2275 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002276 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002277 EXPECT_EQ(kFlushIndicator,
2278 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002279 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002280
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002281 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002282 std::vector<uint16_t> nack_list =
2283 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002284 // No key frame will be requested since the jitter buffer is empty.
2285 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002286 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002287
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002288 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002289 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002290 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002291 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002292
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002293 // The next complete continuous frame isn't a key frame, but we're waiting
2294 // for one.
2295 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002296 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002297 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002298 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002299}
2300
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002301TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002302 // Insert a key frame and decode it.
2303 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2304 EXPECT_TRUE(DecodeCompleteFrame());
2305
2306 // Insert a frame which should trigger a recycle until the next key frame.
2307 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2308
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002309 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002310 std::vector<uint16_t> nack_list =
2311 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002312 // Verify that the jitter buffer does not request a key frame.
2313 EXPECT_FALSE(request_key_frame);
2314 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002315 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002316 // Verify that we can decode the next frame.
2317 EXPECT_TRUE(DecodeCompleteFrame());
2318}
2319
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002320TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002321 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002322 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002323 EXPECT_TRUE(DecodeCompleteFrame());
2324
2325 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002326 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002327 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002328 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002329 EXPECT_FALSE(DecodeCompleteFrame());
2330
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002331 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002332 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002333 // The jitter buffer is empty, so we won't request key frames until we get a
2334 // packet.
2335 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002336
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002337 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002338 // Now we have a packet in the jitter buffer, a key frame will be requested
2339 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002340 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002341 // The jitter buffer is empty, so we won't request key frames until we get a
2342 // packet.
2343 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002344 // The next complete continuous frame isn't a key frame, but we're waiting
2345 // for one.
2346 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002347 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002348 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002349 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002350 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002351}
2352
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002353TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002354 DropFrame(10);
2355 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002356 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002357 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002358 std::vector<uint16_t> nack_list =
2359 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002360 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002361 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002362 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002363}
2364
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002365TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002366 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002367 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002368 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002369 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002370 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002371 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002372 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002373 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002374 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2375 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002376}
2377
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002378TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002379 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002380 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2381 clock_->TimeInMilliseconds());
2382 VCMPacket packet;
2383 stream_generator_->PopPacket(&packet, 0);
2384 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002385 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002386 EXPECT_FALSE(retransmitted);
2387 // Drop second packet.
2388 stream_generator_->PopPacket(&packet, 1);
2389 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2390 EXPECT_FALSE(retransmitted);
2391 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002392 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002393 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2394 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002395 stream_generator_->PopPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002396 EXPECT_EQ(packet.seqNum, nack_list[0]);
philipel9d3ab612015-12-21 04:12:39 -08002397 EXPECT_EQ(kCompleteSession,
2398 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002399 EXPECT_TRUE(retransmitted);
2400 EXPECT_TRUE(DecodeCompleteFrame());
2401}
2402
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002403TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002404 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002405 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002406 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002407 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002408 // Drop second packet.
2409 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2410 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002411 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002412 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2413 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002414 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002415 stream_generator_->GetPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002416 EXPECT_EQ(packet.seqNum, nack_list[0]);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002417}
2418
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002419TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
2420 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002421 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002422 // First frame is delta.
2423 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2424 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002425 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002426 // Drop second packet in frame.
2427 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2428 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2429 // Second frame is key.
2430 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2431 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002432 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002433 // Drop second packet in frame.
2434 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2435 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002436 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002437 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2438 EXPECT_EQ(1u, nack_list.size());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002439 stream_generator_->GetPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002440 EXPECT_EQ(packet.seqNum, nack_list[0]);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002441}
2442
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002443TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002444 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002445 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002446
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002447 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002448 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002449
2450 // ----------------------------------------------------------------
2451 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2452 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002453 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002454 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002455 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002456 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002457 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002458 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002459 while (stream_generator_->PacketsRemaining() > 1) {
2460 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002461 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002462 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002463 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002464 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002465 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002466 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002467 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002468 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002469 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002470 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002471 std::vector<uint16_t> nack_list =
2472 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002473 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002474 const size_t kExpectedNackSize = 9;
2475 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2476 for (size_t i = 0; i < nack_list.size(); ++i)
2477 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002478}
2479
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002480TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002481 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002482 // ------- ------------------------------------------------------------
2483 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2484 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002485 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002486 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002487 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002488 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002489 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002490 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002491 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002492 while (stream_generator_->PacketsRemaining() > 1) {
2493 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002494 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002495 EXPECT_FALSE(request_key_frame);
2496 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002497 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002498 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002499 }
2500 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002501 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002502 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002503 EXPECT_FALSE(DecodeCompleteFrame());
2504 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002505 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002506 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002507 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002508 const size_t kExpectedNackSize = 10;
2509 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2510 for (size_t i = 0; i < nack_list.size(); ++i)
2511 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002512}
2513
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002514TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
2515 bool request_key_frame = false;
2516 // -----------------------------------
2517 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2518 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002519 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002520 InsertFrame(kVideoFrameKey);
2521 EXPECT_FALSE(request_key_frame);
2522 EXPECT_TRUE(DecodeCompleteFrame());
2523 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2524 clock_->TimeInMilliseconds());
2525 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2526 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002527 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002528 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002529 EXPECT_FALSE(request_key_frame);
2530 } else {
2531 stream_generator_->NextPacket(NULL); // Drop packet
2532 }
2533 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2534 clock_->TimeInMilliseconds());
2535 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2536 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002537 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002538 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002539 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002540 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002541 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002542 ASSERT_EQ(1u, nack_list.size());
2543 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002544}
2545
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002546TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002547 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002548 InsertFrame(kVideoFrameKey);
2549 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002550 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002551 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2552 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002553
2554 // Far-into-the-future video frame, could be caused by resetting the encoder
2555 // or otherwise restarting. This should not fail when error when the packet is
2556 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002557 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002558 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2559 InsertFrame(kVideoFrameKey);
2560 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002561 nack_list = jitter_buffer_->GetNackList(&extended);
2562 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002563
2564 // Stream should be decodable from this point.
2565 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2566 InsertFrame(kVideoFrameDelta);
2567 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002568 nack_list = jitter_buffer_->GetNackList(&extended);
2569 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002570}
2571
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002572} // namespace webrtc