blob: 116bf088c1db5984705f3e7b37e549370d4c7764 [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>
14
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000015#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010016#include "webrtc/modules/video_coding/frame_buffer.h"
17#include "webrtc/modules/video_coding/jitter_buffer.h"
18#include "webrtc/modules/video_coding/media_opt_util.h"
19#include "webrtc/modules/video_coding/packet.h"
20#include "webrtc/modules/video_coding/test/stream_generator.h"
21#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010022#include "webrtc/system_wrappers/include/clock.h"
23#include "webrtc/system_wrappers/include/metrics.h"
Åsa Perssona96f02b2015-04-24 08:52:11 +020024#include "webrtc/test/histogram.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000025
26namespace webrtc {
27
asapersson9a4cd872015-10-23 00:27:14 -070028namespace {
29 const uint32_t kProcessIntervalSec = 60;
30} // namespace
31
32class Vp9SsMapTest : public ::testing::Test {
33 protected:
34 Vp9SsMapTest()
35 : packet_(data_, 1400, 1234, 1, true) {}
36
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(),
194 rtc::scoped_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,
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000237 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];
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000277 rtc::scoped_ptr<VCMPacket> packet_;
278 rtc::scoped_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000279 NullEventFactory event_factory_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000280 rtc::scoped_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000281};
282
283
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000284class TestRunningJitterBuffer : public ::testing::Test {
285 protected:
286 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000287
288 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000289 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000290 max_nack_list_size_ = 150;
291 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700292 jitter_buffer_ = new VCMJitterBuffer(
293 clock_.get(),
294 rtc::scoped_ptr<EventWrapper>(event_factory_.CreateEvent()));
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700295 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000296 jitter_buffer_->Start();
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000297 jitter_buffer_->SetNackSettings(max_nack_list_size_,
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000298 oldest_packet_to_nack_, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000299 memset(data_buffer_, 0, kDataBufferSize);
300 }
301
302 virtual void TearDown() {
303 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000304 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000305 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000306 }
307
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000308 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000309 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000310 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000311 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000312 EXPECT_TRUE(packet_available);
313 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000314 return kGeneralError; // Return here to avoid crashes below.
315 bool retransmitted = false;
316 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000317 }
318
319 VCMFrameBufferEnum InsertPacket(int index) {
320 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000321 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000322 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000323 EXPECT_TRUE(packet_available);
324 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000325 return kGeneralError; // Return here to avoid crashes below.
326 bool retransmitted = false;
327 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000328 }
329
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000330 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700331 stream_generator_->GenerateFrame(
332 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
333 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000334 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000335 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000336 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000337 }
338
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000339 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
340 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000341 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000342 VCMFrameBufferEnum ret = InsertFrame(frame_type);
343 if (ret < kNoError) {
344 ret_for_all = ret;
345 } else if (ret_for_all >= kNoError) {
346 ret_for_all = ret;
347 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000349 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000350 }
351
352 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000353 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000354 clock_->TimeInMilliseconds());
355 for (int i = 0; i < num_packets; ++i)
356 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000357 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000358 }
359
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000360 bool DecodeCompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000361 uint32_t timestamp = 0;
362 bool found_frame = jitter_buffer_->NextCompleteTimestamp(0, &timestamp);
363 if (!found_frame)
364 return false;
365
366 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000367 bool ret = (frame != NULL);
368 jitter_buffer_->ReleaseFrame(frame);
369 return ret;
370 }
371
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000372 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000373 uint32_t timestamp = 0;
374 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
375 if (!found_frame)
376 return false;
377 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000378 bool ret = (frame != NULL);
379 jitter_buffer_->ReleaseFrame(frame);
380 return ret;
381 }
382
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000383 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000384 StreamGenerator* stream_generator_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000385 rtc::scoped_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000386 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000387 size_t max_nack_list_size_;
388 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000389 uint8_t data_buffer_[kDataBufferSize];
390};
391
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000392class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000393 protected:
394 virtual void SetUp() {
395 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000396 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000397 }
398
399 virtual void TearDown() {
400 TestRunningJitterBuffer::TearDown();
401 }
402};
403
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000404TEST_F(TestBasicJitterBuffer, StopRunning) {
405 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000406 EXPECT_TRUE(NULL == DecodeCompleteFrame());
407 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
408 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000409 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000410 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000411
412 // No packets inserted.
413 EXPECT_TRUE(NULL == DecodeCompleteFrame());
414 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
415
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000416 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000417 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000418
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000419 // No packets inserted.
420 EXPECT_TRUE(NULL == DecodeCompleteFrame());
421 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
422}
423
424TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000425 // Always start with a complete key frame when not allowing errors.
426 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000427 packet_->frameType = kVideoFrameKey;
428 packet_->isFirstPacket = true;
429 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000430 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000431
432 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000433 bool retransmitted = false;
434 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
435 &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000436 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000437 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000438 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000439 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000440}
441
Åsa Perssona96f02b2015-04-24 08:52:11 +0200442TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
443 test::ClearHistograms();
444 // Always start with a complete key frame when not allowing errors.
445 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
446 packet_->frameType = kVideoFrameKey;
447 packet_->isFirstPacket = true;
448 packet_->markerBit = true;
449 packet_->timestamp += 123 * 90;
450
451 // Insert single packet frame to the jitter buffer and get a frame.
452 bool retransmitted = false;
453 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
454 &retransmitted));
455 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
456 CheckOutFrame(frame_out, size_, false);
457 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
458 jitter_buffer_->ReleaseFrame(frame_out);
459
460 // Verify that histograms are updated when the jitter buffer is stopped.
461 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
462 jitter_buffer_->Stop();
463 EXPECT_EQ(0, test::LastHistogramSample(
464 "WebRTC.Video.DiscardedPacketsInPercent"));
465 EXPECT_EQ(0, test::LastHistogramSample(
466 "WebRTC.Video.DuplicatedPacketsInPercent"));
467 EXPECT_NE(-1, test::LastHistogramSample(
468 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
469 EXPECT_EQ(1000, test::LastHistogramSample(
470 "WebRTC.Video.KeyFramesReceivedInPermille"));
471
472 // Verify that histograms are not updated if stop is called again.
473 jitter_buffer_->Stop();
474 EXPECT_EQ(1, test::NumHistogramSamples(
475 "WebRTC.Video.DiscardedPacketsInPercent"));
476 EXPECT_EQ(1, test::NumHistogramSamples(
477 "WebRTC.Video.DuplicatedPacketsInPercent"));
478 EXPECT_EQ(1, test::NumHistogramSamples(
479 "WebRTC.Video.CompleteFramesReceivedPerSecond"));
480 EXPECT_EQ(1, test::NumHistogramSamples(
481 "WebRTC.Video.KeyFramesReceivedInPermille"));
482}
483
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000484TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
485 packet_->frameType = kVideoFrameKey;
486 packet_->isFirstPacket = true;
487 packet_->markerBit = false;
488
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000489 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000490 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000491 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000492 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
493 // Should not be complete.
494 EXPECT_TRUE(frame_out == NULL);
495
496 ++seq_num_;
497 packet_->isFirstPacket = false;
498 packet_->markerBit = true;
499 packet_->seqNum = seq_num_;
500
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000501 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
502 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503
504 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000505 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000506
507 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000508 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000509}
510
511TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
512 packet_->frameType = kVideoFrameKey;
513 packet_->isFirstPacket = true;
514 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000515
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000516 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000517 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000518 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000519
520 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
521
522 // Frame should not be complete.
523 EXPECT_TRUE(frame_out == NULL);
524
525 // Insert 98 frames.
526 int loop = 0;
527 do {
528 seq_num_++;
529 packet_->isFirstPacket = false;
530 packet_->markerBit = false;
531 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000532
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000533 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
534 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000535 loop++;
536 } while (loop < 98);
537
538 // Insert last packet.
539 ++seq_num_;
540 packet_->isFirstPacket = false;
541 packet_->markerBit = true;
542 packet_->seqNum = seq_num_;
543
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000544 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
545 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546
547 frame_out = DecodeCompleteFrame();
548
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000549 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000550 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000551 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552}
553
554TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
555 // Always start with a complete key frame.
556 packet_->frameType = kVideoFrameKey;
557 packet_->isFirstPacket = true;
558 packet_->markerBit = true;
559
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000560 bool retransmitted = false;
561 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
562 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000563 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
564 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000565 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000566
567 ++seq_num_;
568 packet_->seqNum = seq_num_;
569 packet_->markerBit = false;
570 packet_->frameType = kVideoFrameDelta;
571 packet_->timestamp += 33 * 90;
572
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000573 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000574 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000575
576 frame_out = DecodeCompleteFrame();
577
578 // Frame should not be complete.
579 EXPECT_TRUE(frame_out == NULL);
580
581 packet_->isFirstPacket = false;
582 // Insert 98 frames.
583 int loop = 0;
584 do {
585 ++seq_num_;
586 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000587
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588 // Insert a packet into a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000589 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
590 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000591 loop++;
592 } while (loop < 98);
593
594 // Insert the last packet.
595 ++seq_num_;
596 packet_->isFirstPacket = false;
597 packet_->markerBit = true;
598 packet_->seqNum = seq_num_;
599
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000600 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
601 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602
603 frame_out = DecodeCompleteFrame();
604
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000605 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000606 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000607 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608}
609
610TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
611 // Insert the "first" packet last.
612 seq_num_ += 100;
613 packet_->frameType = kVideoFrameKey;
614 packet_->isFirstPacket = false;
615 packet_->markerBit = true;
616 packet_->seqNum = seq_num_;
617 packet_->timestamp = timestamp_;
618
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000619 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000620 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000621 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000622
623 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
624
625 EXPECT_TRUE(frame_out == NULL);
626
627 // Insert 98 packets.
628 int loop = 0;
629 do {
630 seq_num_--;
631 packet_->isFirstPacket = false;
632 packet_->markerBit = false;
633 packet_->seqNum = seq_num_;
634
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000635 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
636 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637 loop++;
638 } while (loop < 98);
639
640 // Insert the last packet.
641 seq_num_--;
642 packet_->isFirstPacket = true;
643 packet_->markerBit = false;
644 packet_->seqNum = seq_num_;
645
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000646 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
647 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648
649 frame_out = DecodeCompleteFrame();;
650
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000651 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000652
653 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000654 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655}
656
657TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
658 packet_->frameType = kVideoFrameDelta;
659 packet_->isFirstPacket = true;
660 packet_->markerBit = false;
661
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000662 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000663 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000664 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000665
666 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
667
668 EXPECT_TRUE(frame_out == NULL);
669
670 seq_num_++;
671 packet_->isFirstPacket = false;
672 packet_->markerBit = true;
673 packet_->seqNum = seq_num_;
674
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000675 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
676 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000677
678 // check that we fail to get frame since seqnum is not continuous
679 frame_out = DecodeCompleteFrame();
680 EXPECT_TRUE(frame_out == NULL);
681
682 seq_num_ -= 3;
683 timestamp_ -= 33*90;
684 packet_->frameType = kVideoFrameKey;
685 packet_->isFirstPacket = true;
686 packet_->markerBit = false;
687 packet_->seqNum = seq_num_;
688 packet_->timestamp = timestamp_;
689
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000690 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000691 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000692
693 frame_out = DecodeCompleteFrame();
694
695 // It should not be complete.
696 EXPECT_TRUE(frame_out == NULL);
697
698 seq_num_++;
699 packet_->isFirstPacket = false;
700 packet_->markerBit = true;
701 packet_->seqNum = seq_num_;
702
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000703 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
704 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705
706 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000707 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000708 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000709 jitter_buffer_->ReleaseFrame(frame_out);
710
711 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000712 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000713 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000714 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000715}
716
Noah Richardse4cb4e92015-05-22 14:03:00 -0700717TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
718 packet_->frameType = kVideoFrameKey;
719 packet_->isFirstPacket = true;
720 packet_->markerBit = true;
721
722 // Send in an initial good packet/frame (Frame A) to start things off.
723 bool retransmitted = false;
724 EXPECT_EQ(kCompleteSession,
725 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
726 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
727 EXPECT_TRUE(frame_out != NULL);
728 jitter_buffer_->ReleaseFrame(frame_out);
729
730 // Now send in a complete delta frame (Frame C), but with a sequence number
731 // gap. No pic index either, so no temporal scalability cheating :)
732 packet_->frameType = kVideoFrameDelta;
733 // Leave a gap of 2 sequence numbers and two frames.
734 packet_->seqNum = seq_num_ + 3;
735 packet_->timestamp = timestamp_ + (66 * 90);
736 // Still isFirst = marker = true.
737 // Session should be complete (frame is complete), but there's nothing to
738 // decode yet.
739 EXPECT_EQ(kCompleteSession,
740 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
741 frame_out = DecodeCompleteFrame();
742 EXPECT_TRUE(frame_out == NULL);
743
744 // Now send in a complete delta frame (Frame B) that is continuous from A, but
745 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
746 packet_->seqNum = seq_num_ + 1;
747 packet_->timestamp = timestamp_ + (33 * 90);
748 // Still isFirst = marker = true.
749 EXPECT_EQ(kCompleteSession,
750 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
751 frame_out = DecodeCompleteFrame();
752 EXPECT_TRUE(frame_out != NULL);
753 jitter_buffer_->ReleaseFrame(frame_out);
754
755 // But Frame C isn't continuous yet.
756 frame_out = DecodeCompleteFrame();
757 EXPECT_TRUE(frame_out == NULL);
758
759 // Add in the padding. These are empty packets (data length is 0) with no
760 // marker bit and matching the timestamp of Frame B.
761 VCMPacket empty_packet(data_, 0, seq_num_ + 2, timestamp_ + (33 * 90), false);
762 EXPECT_EQ(kOldPacket,
763 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
764 empty_packet.seqNum += 1;
765 EXPECT_EQ(kOldPacket,
766 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
767
768 // But now Frame C should be ready!
769 frame_out = DecodeCompleteFrame();
770 EXPECT_TRUE(frame_out != NULL);
771 jitter_buffer_->ReleaseFrame(frame_out);
772}
773
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000774TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
775 packet_->frameType = kVideoFrameKey;
776 packet_->isFirstPacket = true;
777 packet_->markerBit = false;
778 packet_->seqNum = seq_num_;
779 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000780 EXPECT_EQ(0, jitter_buffer_->num_packets());
781 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000782
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000783 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000784 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000785 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000786
787 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
788
789 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000790 EXPECT_EQ(1, jitter_buffer_->num_packets());
791 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000792
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000793 // Insert a packet into a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000794 EXPECT_EQ(kDuplicatePacket, jitter_buffer_->InsertPacket(*packet_,
795 &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000796 EXPECT_EQ(2, jitter_buffer_->num_packets());
797 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000798
799 seq_num_++;
800 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000801 packet_->markerBit = true;
802 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000803
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000804 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
805 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000806
807 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000808 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000809 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000810
811 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000812 EXPECT_EQ(3, jitter_buffer_->num_packets());
813 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000814 jitter_buffer_->ReleaseFrame(frame_out);
815}
816
817TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
818 packet_->frameType = kVideoFrameKey;
819 packet_->isFirstPacket = true;
820 packet_->markerBit = true;
821 packet_->seqNum = seq_num_;
822 packet_->timestamp = timestamp_;
823 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
824 EXPECT_EQ(0, jitter_buffer_->num_packets());
825 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
826
827 bool retransmitted = false;
828 // Insert first complete frame.
829 EXPECT_EQ(kCompleteSession,
830 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
831
832 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
833 ASSERT_TRUE(frame_out != NULL);
834 CheckOutFrame(frame_out, size_, false);
835 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
836 jitter_buffer_->ReleaseFrame(frame_out);
837
838 // Insert 3 delta frames.
839 for (uint16_t i = 1; i <= 3; ++i) {
840 packet_->seqNum = seq_num_ + i;
841 packet_->timestamp = timestamp_ + (i * 33) * 90;
842 packet_->frameType = kVideoFrameDelta;
843 EXPECT_EQ(kCompleteSession,
844 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
845 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
846 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
847 }
848
849 // Retransmit second delta frame.
850 packet_->seqNum = seq_num_ + 2;
851 packet_->timestamp = timestamp_ + 66 * 90;
852
853 EXPECT_EQ(kDuplicatePacket,
854 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
855
856 EXPECT_EQ(5, jitter_buffer_->num_packets());
857 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
858
859 // Should be able to decode 3 delta frames, key frame already decoded.
860 for (size_t i = 0; i < 3; ++i) {
861 frame_out = DecodeCompleteFrame();
862 ASSERT_TRUE(frame_out != NULL);
863 CheckOutFrame(frame_out, size_, false);
864 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
865 jitter_buffer_->ReleaseFrame(frame_out);
866 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000867}
868
asapersson9a4cd872015-10-23 00:27:14 -0700869TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
870 // Verify that JB skips forward to next base layer frame.
871 // -------------------------------------------------
872 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
873 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
874 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
875 // | ss | x | x | x | |
876 // -------------------------------------------------
877 // |<----------tl0idx:200--------->|<---tl0idx:201---
878
879 bool re = false;
880 packet_->codec = kVideoCodecVP9;
881 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
882 packet_->isFirstPacket = true;
883 packet_->markerBit = true;
884 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
885 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
886 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
887 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700888 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
889
890 packet_->seqNum = 65485;
891 packet_->timestamp = 1000;
892 packet_->frameType = kVideoFrameKey;
893 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
894 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
asapersson394c5372015-11-05 06:07:03 -0800895 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700896 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
897 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
898 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
899 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
900
901 // Insert next temporal layer 0.
902 packet_->seqNum = 65489;
903 packet_->timestamp = 13000;
904 packet_->frameType = kVideoFrameDelta;
905 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9;
906 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201;
asapersson394c5372015-11-05 06:07:03 -0800907 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700908 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false;
909 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
910
911 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
912 EXPECT_EQ(1000U, frame_out->TimeStamp());
913 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
914 jitter_buffer_->ReleaseFrame(frame_out);
915
916 frame_out = DecodeCompleteFrame();
917 EXPECT_EQ(13000U, frame_out->TimeStamp());
918 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
919 jitter_buffer_->ReleaseFrame(frame_out);
920}
921
922TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
923 // Verify that frames are updated with SS data when SS packet is reordered.
924 // --------------------------------
925 // | 65486 | 65487 | 65485 |...
926 // | pid:6 | pid:7 | pid:5 |...
927 // | tid:2 | tid:1 | tid:0 |...
928 // | | | ss |
929 // --------------------------------
930 // |<--------tl0idx:200--------->|
931
932 bool re = false;
933 packet_->codec = kVideoCodecVP9;
934 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
935 packet_->isFirstPacket = true;
936 packet_->markerBit = true;
937 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
938 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
939 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
940 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700941 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
942
943 packet_->seqNum = 65486;
944 packet_->timestamp = 6000;
945 packet_->frameType = kVideoFrameDelta;
946 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -0800947 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 2;
948 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700949 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
950
951 packet_->seqNum = 65487;
952 packet_->timestamp = 9000;
953 packet_->frameType = kVideoFrameDelta;
954 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7;
asapersson394c5372015-11-05 06:07:03 -0800955 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
956 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700957 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
958
959 // Insert first frame with SS data.
960 packet_->seqNum = 65485;
961 packet_->timestamp = 3000;
962 packet_->frameType = kVideoFrameKey;
963 packet_->width = 352;
964 packet_->height = 288;
965 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -0800966 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
967 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700968 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
969 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
970 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
971 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
972
973 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
974 EXPECT_EQ(3000U, frame_out->TimeStamp());
975 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
976 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
977 EXPECT_FALSE(
978 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
979 jitter_buffer_->ReleaseFrame(frame_out);
980
981 frame_out = DecodeCompleteFrame();
982 EXPECT_EQ(6000U, frame_out->TimeStamp());
983 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
984 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
985 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
986 jitter_buffer_->ReleaseFrame(frame_out);
987
988 frame_out = DecodeCompleteFrame();
989 EXPECT_EQ(9000U, frame_out->TimeStamp());
990 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
991 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
992 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
993 jitter_buffer_->ReleaseFrame(frame_out);
994}
995
996TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
997 // Verify that frames are updated with SS data when SS packet is reordered.
998 // -----------------------------------------
999 // | 65486 | 65487 | 65485 | 65484 |...
1000 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1001 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1002 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1003 // | t:6000 | t:6000 | t:3000 | t:3000 |
1004 // | | | | ss |
1005 // -----------------------------------------
1006 // |<-----------tl0idx:200------------>|
1007
1008 bool re = false;
1009 packet_->codec = kVideoCodecVP9;
1010 packet_->codecSpecificHeader.codec = kRtpVideoVp9;
1011 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
1012 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true;
1013 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001014 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200;
1015
1016 packet_->isFirstPacket = true;
1017 packet_->markerBit = false;
1018 packet_->seqNum = 65486;
1019 packet_->timestamp = 6000;
1020 packet_->frameType = kVideoFrameDelta;
1021 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1022 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001023 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1024 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001025 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1026
1027 packet_->isFirstPacket = false;
1028 packet_->markerBit = true;
1029 packet_->seqNum = 65487;
1030 packet_->frameType = kVideoFrameDelta;
1031 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1032 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6;
asapersson394c5372015-11-05 06:07:03 -08001033 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 1;
1034 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001035 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1036
1037 packet_->isFirstPacket = false;
1038 packet_->markerBit = true;
1039 packet_->seqNum = 65485;
1040 packet_->timestamp = 3000;
1041 packet_->frameType = kVideoFrameKey;
1042 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1;
1043 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001044 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1045 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001046 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1047
1048 // Insert first frame with SS data.
1049 packet_->isFirstPacket = true;
1050 packet_->markerBit = false;
1051 packet_->seqNum = 65484;
1052 packet_->frameType = kVideoFrameKey;
1053 packet_->width = 352;
1054 packet_->height = 288;
1055 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0;
1056 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5;
asapersson394c5372015-11-05 06:07:03 -08001057 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = 0;
1058 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001059 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
1060 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9(
1061 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1062 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1063
1064 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1065 EXPECT_EQ(3000U, frame_out->TimeStamp());
1066 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1067 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1068 EXPECT_FALSE(
1069 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1070 jitter_buffer_->ReleaseFrame(frame_out);
1071
1072 frame_out = DecodeCompleteFrame();
1073 EXPECT_EQ(6000U, frame_out->TimeStamp());
1074 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1075 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1076 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1077 jitter_buffer_->ReleaseFrame(frame_out);
1078}
1079
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001080TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
1081 packet_->frameType = kVideoFrameKey;
1082 packet_->isFirstPacket = true;
1083 packet_->markerBit = false;
1084 packet_->seqNum = seq_num_;
1085 packet_->timestamp = timestamp_;
1086 packet_->insertStartCode = true;
1087
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001088 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001089 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001090 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001091
1092 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1093
1094 // Frame should not be complete.
1095 EXPECT_TRUE(frame_out == NULL);
1096
1097 seq_num_++;
1098 packet_->isFirstPacket = false;
1099 packet_->markerBit = true;
1100 packet_->seqNum = seq_num_;
1101
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001102 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1103 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001104
1105 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001106 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001107 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001108 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001109}
1110
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001111// Test threshold conditions of decodable state.
1112TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
1113 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001114 // Always start with a key frame. Use 10 packets to test Decodable State
1115 // boundaries.
1116 packet_->frameType = kVideoFrameKey;
1117 packet_->isFirstPacket = true;
1118 packet_->markerBit = false;
1119 packet_->seqNum = seq_num_;
1120 packet_->timestamp = timestamp_;
1121
1122 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001123 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00001124 &retransmitted));
1125 uint32_t timestamp = 0;
1126 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1127 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1128
1129 packet_->isFirstPacket = false;
1130 for (int i = 1; i < 9; ++i) {
1131 packet_->seqNum++;
1132 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1133 &retransmitted));
1134 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1135 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1136 }
1137
1138 // last packet
1139 packet_->markerBit = true;
1140 packet_->seqNum++;
1141
1142 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1143 &retransmitted));
1144 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1145 CheckOutFrame(frame_out, 10 * size_, false);
1146 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001147 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001148
1149 // An incomplete frame can only be decoded once a subsequent frame has begun
1150 // to arrive. Insert packet in distant frame for this purpose.
1151 packet_->frameType = kVideoFrameDelta;
1152 packet_->isFirstPacket = true;
1153 packet_->markerBit = false;
1154 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001155 packet_->timestamp += 33 * 90 * 8;
1156
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001157 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00001158 &retransmitted));
1159 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1160 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1161
1162 // Insert second frame
1163 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001164 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001165
1166 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1167 &retransmitted));
1168 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1169 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1170
1171 packet_->isFirstPacket = false;
1172 for (int i = 1; i < 8; ++i) {
1173 packet_->seqNum++;
1174 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1175 &retransmitted));
1176 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1177 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1178 }
1179
1180 packet_->seqNum++;
1181 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1182 &retransmitted));
1183 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1184 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1185
1186 frame_out = DecodeIncompleteFrame();
1187 ASSERT_FALSE(NULL == frame_out);
1188 CheckOutFrame(frame_out, 9 * size_, false);
1189 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001190 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001191
1192 packet_->markerBit = true;
1193 packet_->seqNum++;
1194 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1195 &retransmitted));
1196}
1197
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001198// Make sure first packet is present before a frame can be decoded.
1199TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
1200 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1201 // Always start with a key frame.
1202 packet_->frameType = kVideoFrameKey;
1203 packet_->isFirstPacket = true;
1204 packet_->markerBit = true;
1205 packet_->seqNum = seq_num_;
1206 packet_->timestamp = timestamp_;
1207
1208 bool retransmitted = false;
1209 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1210 &retransmitted));
1211 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1212 CheckOutFrame(frame_out, size_, false);
1213 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001214 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001215
1216 // An incomplete frame can only be decoded once a subsequent frame has begun
1217 // to arrive. Insert packet in distant frame for this purpose.
1218 packet_->frameType = kVideoFrameDelta;
1219 packet_->isFirstPacket = false;
1220 packet_->markerBit = false;
1221 packet_->seqNum += 100;
1222 packet_->timestamp += 33*90*8;
1223 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1224 &retransmitted));
1225 uint32_t timestamp;
1226 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1227 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1228
1229 // Insert second frame - an incomplete key frame.
1230 packet_->frameType = kVideoFrameKey;
1231 packet_->isFirstPacket = true;
1232 packet_->seqNum -= 99;
1233 packet_->timestamp -= 33*90*7;
1234
1235 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1236 &retransmitted));
1237 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1238 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1239
1240 // Insert a few more packets. Make sure we're waiting for the key frame to be
1241 // complete.
1242 packet_->isFirstPacket = false;
1243 for (int i = 1; i < 5; ++i) {
1244 packet_->seqNum++;
1245 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1246 &retransmitted));
1247 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1248 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1249 }
1250
1251 // Complete key frame.
1252 packet_->markerBit = true;
1253 packet_->seqNum++;
1254 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1255 &retransmitted));
1256 frame_out = DecodeCompleteFrame();
1257 CheckOutFrame(frame_out, 6 * size_, false);
1258 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001259 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001260}
1261
1262// Make sure first packet is present before a frame can be decoded.
1263TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
1264 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1265 // Always start with a key frame.
1266 packet_->frameType = kVideoFrameKey;
1267 packet_->isFirstPacket = true;
1268 packet_->markerBit = true;
1269 packet_->seqNum = seq_num_;
1270 packet_->timestamp = timestamp_;
1271
1272 bool retransmitted = false;
1273 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1274 &retransmitted));
1275 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1276 CheckOutFrame(frame_out, size_, false);
1277 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001278 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001279
1280 // An incomplete frame can only be decoded once a subsequent frame has begun
1281 // to arrive. Insert packet in distant frame for this purpose.
1282 packet_->frameType = kVideoFrameDelta;
1283 packet_->isFirstPacket = false;
1284 packet_->markerBit = false;
1285 packet_->seqNum += 100;
1286 packet_->timestamp += 33*90*8;
1287 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1288 &retransmitted));
1289 uint32_t timestamp;
1290 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1291 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1292
1293 // Insert second frame with the first packet missing. Make sure we're waiting
1294 // for the key frame to be complete.
1295 packet_->seqNum -= 98;
1296 packet_->timestamp -= 33*90*7;
1297
1298 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1299 &retransmitted));
1300 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1301 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1302
1303 for (int i = 0; i < 5; ++i) {
1304 packet_->seqNum++;
1305 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1306 &retransmitted));
1307 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1308 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1309 }
1310
1311 // Add first packet. Frame should now be decodable, but incomplete.
1312 packet_->isFirstPacket = true;
1313 packet_->seqNum -= 6;
1314 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1315 &retransmitted));
1316 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &timestamp));
1317 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1318
1319 frame_out = DecodeIncompleteFrame();
1320 CheckOutFrame(frame_out, 7 * size_, false);
1321 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001322 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001323}
1324
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001325TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
1326 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001327 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001328 packet_->frameType = kVideoFrameKey;
1329 packet_->isFirstPacket = true;
1330 packet_->markerBit = true;
1331 packet_->seqNum = seq_num_;
1332 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001333 bool retransmitted = false;
1334 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1335 &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001336 uint32_t next_timestamp;
1337 EXPECT_TRUE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1338 EXPECT_EQ(packet_->timestamp, next_timestamp);
1339 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(next_timestamp);
1340 EXPECT_TRUE(frame != NULL);
1341 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001342
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001343 // Drop a complete frame.
1344 timestamp_ += 2 * 33 * 90;
1345 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001346 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001347 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001348 packet_->markerBit = false;
1349 packet_->seqNum = seq_num_;
1350 packet_->timestamp = timestamp_;
1351 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1352 &retransmitted));
1353 // Insert a packet (so the previous one will be released).
1354 timestamp_ += 33 * 90;
1355 seq_num_ += 2;
1356 packet_->frameType = kVideoFrameDelta;
1357 packet_->isFirstPacket = true;
1358 packet_->markerBit = false;
1359 packet_->seqNum = seq_num_;
1360 packet_->timestamp = timestamp_;
1361 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1362 &retransmitted));
1363 EXPECT_FALSE(jitter_buffer_->NextCompleteTimestamp(0, &next_timestamp));
1364 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1365 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001366}
1367
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001368TEST_F(TestBasicJitterBuffer, PacketLoss) {
1369 // Verify missing packets statistics and not decodable packets statistics.
1370 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1371 // The last packet is an empty (non-media) packet.
1372
1373 // Select a start seqNum which triggers a difficult wrap situation
1374 // The JB will only output (incomplete)frames if the next one has started
1375 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001376 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001377 seq_num_ = 0xffff - 4;
1378 seq_num_++;
1379 packet_->frameType = kVideoFrameKey;
1380 packet_->isFirstPacket = true;
1381 packet_->markerBit = false;
1382 packet_->seqNum = seq_num_;
1383 packet_->timestamp = timestamp_;
1384 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001385
1386 bool retransmitted = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001387 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1388 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001389 for (int i = 0; i < 11; ++i) {
1390 webrtc::FrameType frametype = kVideoFrameDelta;
1391 seq_num_++;
1392 timestamp_ += 33*90;
1393 packet_->frameType = frametype;
1394 packet_->isFirstPacket = true;
1395 packet_->markerBit = false;
1396 packet_->seqNum = seq_num_;
1397 packet_->timestamp = timestamp_;
1398 packet_->completeNALU = kNaluStart;
1399
agalusza@google.comd177c102013-08-08 01:12:33 +00001400 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1401 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001402
1403 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1404
1405 // Should not be complete.
1406 EXPECT_TRUE(frame_out == NULL);
1407
1408 seq_num_ += 2;
1409 packet_->isFirstPacket = false;
1410 packet_->markerBit = true;
1411 packet_->seqNum = seq_num_;
1412 packet_->completeNALU = kNaluEnd;
1413
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001414 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1415 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001416
1417 // Insert an empty (non-media) packet.
1418 seq_num_++;
1419 packet_->isFirstPacket = false;
1420 packet_->markerBit = false;
1421 packet_->seqNum = seq_num_;
1422 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001423 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001424
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001425 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001426 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001427 frame_out = DecodeIncompleteFrame();
1428
1429 // One of the packets has been discarded by the jitter buffer.
1430 // Last frame can't be extracted yet.
1431 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001432 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001433
1434 if (i == 0) {
1435 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1436 } else {
1437 EXPECT_EQ(frametype, frame_out->FrameType());
1438 }
1439 EXPECT_FALSE(frame_out->Complete());
1440 EXPECT_FALSE(frame_out->MissingFrame());
1441 }
1442
1443 jitter_buffer_->ReleaseFrame(frame_out);
1444 }
1445
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001446 // Insert 3 old packets and verify that we have 3 discarded packets
1447 // Match value to actual latest timestamp decoded.
1448 timestamp_ -= 33 * 90;
1449 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001450
1451 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1452 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001453
1454 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001455
1456 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1457 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001458
1459 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001460
1461 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1462 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001463
1464 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1465
1466 jitter_buffer_->Flush();
1467
1468 // This statistic shouldn't be reset by a flush.
1469 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1470}
1471
1472TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
1473 seq_num_ = 0xfff0;
1474 packet_->frameType = kVideoFrameKey;
1475 packet_->isFirstPacket = true;
1476 packet_->markerBit = false;
1477 packet_->seqNum = seq_num_;
1478 packet_->timestamp = timestamp_;
1479
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001480 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001481 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001482 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001483
1484 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1485
1486 EXPECT_TRUE(frame_out == NULL);
1487
1488 int loop = 0;
1489 do {
1490 seq_num_++;
1491 packet_->isFirstPacket = false;
1492 packet_->markerBit = false;
1493 packet_->seqNum = seq_num_;
1494
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001495 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1496 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001497
1498 frame_out = DecodeCompleteFrame();
1499
1500 EXPECT_TRUE(frame_out == NULL);
1501
1502 loop++;
1503 } while (loop < 98);
1504
1505 seq_num_++;
1506 packet_->isFirstPacket = false;
1507 packet_->markerBit = true;
1508 packet_->seqNum = seq_num_;
1509
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001510 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1511 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001512
1513 frame_out = DecodeCompleteFrame();
1514
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001515 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001516
1517 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001518 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519}
1520
1521TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
1522 // Insert "first" packet last seqnum.
1523 seq_num_ = 10;
1524 packet_->frameType = kVideoFrameKey;
1525 packet_->isFirstPacket = false;
1526 packet_->markerBit = true;
1527 packet_->seqNum = seq_num_;
1528
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001529 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001530 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001531 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001532 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1533
1534 // Should not be complete.
1535 EXPECT_TRUE(frame_out == NULL);
1536
1537 // Insert 98 frames.
1538 int loop = 0;
1539 do {
1540 seq_num_--;
1541 packet_->isFirstPacket = false;
1542 packet_->markerBit = false;
1543 packet_->seqNum = seq_num_;
1544
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001545 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1546 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547
1548 frame_out = DecodeCompleteFrame();
1549
1550 EXPECT_TRUE(frame_out == NULL);
1551
1552 loop++;
1553 } while (loop < 98);
1554
1555 // Insert last packet.
1556 seq_num_--;
1557 packet_->isFirstPacket = true;
1558 packet_->markerBit = false;
1559 packet_->seqNum = seq_num_;
1560
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001561 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1562 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001563
1564 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001565 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001566 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001567 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001568}
1569
1570TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
1571 // ------- -------
1572 // | 2 | | 1 |
1573 // ------- -------
1574 // t = 3000 t = 2000
1575 seq_num_ = 2;
1576 timestamp_ = 3000;
1577 packet_->frameType = kVideoFrameKey;
1578 packet_->isFirstPacket = true;
1579 packet_->markerBit = true;
1580 packet_->timestamp = timestamp_;
1581 packet_->seqNum = seq_num_;
1582
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001583 bool retransmitted = false;
1584 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1585 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586
1587 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1588 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001589 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001590 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001591 jitter_buffer_->ReleaseFrame(frame_out);
1592
1593 seq_num_--;
1594 timestamp_ = 2000;
1595 packet_->frameType = kVideoFrameDelta;
1596 packet_->isFirstPacket = true;
1597 packet_->markerBit = true;
1598 packet_->seqNum = seq_num_;
1599 packet_->timestamp = timestamp_;
1600
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001601 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1602 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001603}
1604
1605TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
1606 // ------- -------
1607 // | 2 | | 1 |
1608 // ------- -------
1609 // t = 3000 t = 0xffffff00
1610
1611 seq_num_ = 2;
1612 timestamp_ = 3000;
1613 packet_->frameType = kVideoFrameKey;
1614 packet_->isFirstPacket = true;
1615 packet_->markerBit = true;
1616 packet_->seqNum = seq_num_;
1617 packet_->timestamp = timestamp_;
1618
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001619 bool retransmitted = false;
1620 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1621 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001622
1623 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1624 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1625
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001626 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627
1628 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1629
1630 jitter_buffer_->ReleaseFrame(frame_out);
1631
1632 seq_num_--;
1633 timestamp_ = 0xffffff00;
1634 packet_->frameType = kVideoFrameDelta;
1635 packet_->isFirstPacket = true;
1636 packet_->markerBit = true;
1637 packet_->seqNum = seq_num_;
1638 packet_->timestamp = timestamp_;
1639
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001640
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001641 // This timestamp is old.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001642 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
1643 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001644}
1645
1646TEST_F(TestBasicJitterBuffer, TimestampWrap) {
1647 // --------------- ---------------
1648 // | 1 | 2 | | 3 | 4 |
1649 // --------------- ---------------
1650 // t = 0xffffff00 t = 33*90
1651
1652 timestamp_ = 0xffffff00;
1653 packet_->frameType = kVideoFrameKey;
1654 packet_->isFirstPacket = true;
1655 packet_->markerBit = false;
1656 packet_->seqNum = seq_num_;
1657 packet_->timestamp = timestamp_;
1658
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001659 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001660 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001661 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001662
1663 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001664 EXPECT_TRUE(frame_out == NULL);
1665
1666 seq_num_++;
1667 packet_->isFirstPacket = false;
1668 packet_->markerBit = true;
1669 packet_->seqNum = seq_num_;
1670
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001671 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1672 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001673
1674 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001675 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001676 jitter_buffer_->ReleaseFrame(frame_out);
1677
1678 seq_num_++;
1679 timestamp_ += 33*90;
1680 packet_->frameType = kVideoFrameDelta;
1681 packet_->isFirstPacket = true;
1682 packet_->markerBit = false;
1683 packet_->seqNum = seq_num_;
1684 packet_->timestamp = timestamp_;
1685
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001686 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001687 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001688
1689 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690 EXPECT_TRUE(frame_out == NULL);
1691
1692 seq_num_++;
1693 packet_->isFirstPacket = false;
1694 packet_->markerBit = true;
1695 packet_->seqNum = seq_num_;
1696
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001697 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1698 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001699
1700 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001701 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001702 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001703 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001704}
1705
1706TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
1707 // ------- -------
1708 // | 1 | | 2 |
1709 // ------- -------
1710 // t = 0xffffff00 t = 2700
1711
1712 timestamp_ = 0xffffff00;
1713 packet_->frameType = kVideoFrameKey;
1714 packet_->isFirstPacket = true;
1715 packet_->markerBit = true;
1716 packet_->timestamp = timestamp_;
1717
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001718 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001719 // Insert first frame (session will be complete).
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001720 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1721 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001722
1723 // Insert next frame.
1724 seq_num_++;
1725 timestamp_ = 2700;
1726 packet_->frameType = kVideoFrameDelta;
1727 packet_->isFirstPacket = true;
1728 packet_->markerBit = true;
1729 packet_->seqNum = seq_num_;
1730 packet_->timestamp = timestamp_;
1731
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001732 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1733 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734
1735 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1736 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001737 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001738 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001739 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001740
1741 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1742 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001743 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001744 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001745 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001746}
1747
1748TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
1749 // ------- -------
1750 // | 2 | | 1 |
1751 // ------- -------
1752 // t = 2700 t = 0xffffff00
1753
1754 seq_num_ = 2;
1755 timestamp_ = 2700;
1756 packet_->frameType = kVideoFrameDelta;
1757 packet_->isFirstPacket = true;
1758 packet_->markerBit = true;
1759 packet_->seqNum = seq_num_;
1760 packet_->timestamp = timestamp_;
1761
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001762 bool retransmitted = false;
1763 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1764 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765
1766 // Insert second frame
1767 seq_num_--;
1768 timestamp_ = 0xffffff00;
1769 packet_->frameType = kVideoFrameKey;
1770 packet_->isFirstPacket = true;
1771 packet_->markerBit = true;
1772 packet_->seqNum = seq_num_;
1773 packet_->timestamp = timestamp_;
1774
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001775 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1776 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001777
1778 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1779 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001780 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001781 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001782 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001783
1784 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1785 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001786 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001788 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001789}
1790
1791TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
1792 int loop = 0;
1793 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001794 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 // Insert kMaxPacketsInJitterBuffer into frame.
1796 do {
1797 seq_num_++;
1798 packet_->isFirstPacket = false;
1799 packet_->markerBit = false;
1800 packet_->seqNum = seq_num_;
1801
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001802 if (firstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001803 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001804 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001805 firstPacket = false;
1806 } else {
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001807 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
1808 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001809 }
1810
1811 loop++;
1812 } while (loop < kMaxPacketsInSession);
1813
1814 // Max number of packets inserted.
1815 // Insert one more packet.
1816 seq_num_++;
1817 packet_->isFirstPacket = false;
1818 packet_->markerBit = true;
1819 packet_->seqNum = seq_num_;
1820
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001821 // Insert the packet -> frame recycled.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001822 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_,
1823 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001824 EXPECT_TRUE(NULL == DecodeCompleteFrame());
1825
1826}
1827
1828TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
1829 // TEST fill JB with more than max number of frame (50 delta frames +
1830 // 51 key frames) with wrap in seq_num_
1831 //
1832 // --------------------------------------------------------------
1833 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1834 // --------------------------------------------------------------
1835 // |<-----------delta frames------------->|<------key frames----->|
1836
jbauchdb81ffd2015-11-23 03:59:02 -08001837 // Make sure the jitter doesn't request a keyframe after too much non-
1838 // decodable frames.
1839 jitter_buffer_->SetNackMode(kNack, -1, -1);
1840 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames,
1841 kMaxNumberOfFrames, 0);
1842
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001843 int loop = 0;
1844 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001845 uint32_t first_key_frame_timestamp = 0;
1846 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001847 // Insert MAX_NUMBER_OF_FRAMES frames.
1848 do {
1849 timestamp_ += 33*90;
1850 seq_num_++;
1851 packet_->isFirstPacket = true;
1852 packet_->markerBit = true;
1853 packet_->seqNum = seq_num_;
1854 packet_->timestamp = timestamp_;
1855
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001856 if (loop == 50) {
1857 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001858 packet_->frameType = kVideoFrameKey;
1859 }
1860
1861 // Insert frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001862 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
1863 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001864
1865 loop++;
1866 } while (loop < kMaxNumberOfFrames);
1867
1868 // Max number of frames inserted.
1869
1870 // Insert one more frame.
1871 timestamp_ += 33*90;
1872 seq_num_++;
1873 packet_->isFirstPacket = true;
1874 packet_->markerBit = true;
1875 packet_->seqNum = seq_num_;
1876 packet_->timestamp = timestamp_;
1877
1878 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001879 EXPECT_EQ(kFlushIndicator,
1880 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001881
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001882 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1883 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001884 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001885 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001886 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001887}
1888
1889TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001890 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001891 seq_num_ = 3;
1892 // Insert one empty packet per frame, should never return the last timestamp
1893 // inserted. Only return empty frames in the presence of subsequent frames.
1894 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001895 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001896 for (int i = 0; i < maxSize + 10; i++) {
1897 timestamp_ += 33 * 90;
1898 seq_num_++;
1899 packet_->isFirstPacket = false;
1900 packet_->markerBit = false;
1901 packet_->seqNum = seq_num_;
1902 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001903 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001904
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001905 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_,
1906 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001907 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1908 // Timestamp should never be the last TS inserted.
1909 if (testFrame != NULL) {
1910 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001911 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912 }
1913 }
1914}
1915
1916TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
1917 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001918 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001919 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920 timestamp_ += 33 * 90;
1921 int insertedLength = 0;
1922 packet_->seqNum = seq_num_;
1923 packet_->timestamp = timestamp_;
1924 packet_->frameType = kVideoFrameKey;
1925 packet_->isFirstPacket = true;
1926 packet_->completeNALU = kNaluStart;
1927 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001928 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929
agalusza@google.comd177c102013-08-08 01:12:33 +00001930 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1931 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001932
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001933 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 packet_->seqNum = seq_num_;
1935 packet_->frameType = kVideoFrameKey;
1936 packet_->isFirstPacket = false;
1937 packet_->completeNALU = kNaluIncomplete;
1938 packet_->markerBit = false;
1939
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001940 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00001941 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001942
1943 seq_num_++;
1944 packet_->seqNum = seq_num_;
1945 packet_->frameType = kVideoFrameKey;
1946 packet_->isFirstPacket = false;
1947 packet_->completeNALU = kNaluEnd;
1948 packet_->markerBit = false;
1949
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001950 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00001951 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001952
1953 seq_num_++;
1954 packet_->seqNum = seq_num_;
1955 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001956 packet_->markerBit = true; // Last packet.
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001957 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00001958 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 // The JB will only output (incomplete) frames if a packet belonging to a
1960 // subsequent frame was already inserted. Insert one packet of a subsequent
1961 // frame. place high timestamp so the JB would always have a next frame
1962 // (otherwise, for every inserted frame we need to take care of the next
1963 // frame as well).
1964 packet_->seqNum = 1;
1965 packet_->timestamp = timestamp_ + 33 * 90 * 10;
1966 packet_->frameType = kVideoFrameDelta;
1967 packet_->isFirstPacket = false;
1968 packet_->completeNALU = kNaluStart;
1969 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001970
agalusza@google.comd177c102013-08-08 01:12:33 +00001971 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1972 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001973
1974 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
1975
1976 // We can decode everything from a NALU until a packet has been lost.
1977 // Thus we can decode the first packet of the first NALU and the second NALU
1978 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001979 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001980 jitter_buffer_->ReleaseFrame(frame_out);
1981
1982 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001983 seq_num_ += 2; // Re-order 1 frame.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001984 timestamp_ += 33*90;
1985 insertedLength = 0;
1986
1987 packet_->seqNum = seq_num_;
1988 packet_->timestamp = timestamp_;
1989 packet_->frameType = kVideoFrameKey;
1990 packet_->isFirstPacket = false;
1991 packet_->completeNALU = kNaluEnd;
1992 packet_->markerBit = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001993 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
1994 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001995 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001996 seq_num_--;
1997 packet_->seqNum = seq_num_;
1998 packet_->timestamp = timestamp_;
1999 packet_->frameType = kVideoFrameKey;
2000 packet_->isFirstPacket = true;
2001 packet_->completeNALU = kNaluStart;
2002 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002003
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002004 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00002005 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002006 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2007
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002008 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002009 packet_->seqNum = seq_num_;
2010 packet_->timestamp = timestamp_;
2011 packet_->frameType = kVideoFrameKey;
2012 packet_->isFirstPacket = false;
2013 packet_->completeNALU = kNaluComplete;
2014 packet_->markerBit = false;
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002015 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00002016 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002017 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002018 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002019 packet_->seqNum = seq_num_;
2020 packet_->timestamp = timestamp_;
2021 packet_->frameType = kVideoFrameKey;
2022 packet_->isFirstPacket = false;
2023 packet_->completeNALU = kNaluStart;
2024 packet_->markerBit = false;
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002025 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00002026 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 // This packet should be decoded since it's the beginning of a NAL.
2028 insertedLength += packet_->sizeBytes;
2029
2030 seq_num_ += 2;
2031 packet_->seqNum = seq_num_;
2032 packet_->timestamp = timestamp_;
2033 packet_->frameType = kVideoFrameKey;
2034 packet_->isFirstPacket = false;
2035 packet_->completeNALU = kNaluEnd;
2036 packet_->markerBit = true;
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002037 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
agalusza@google.comd177c102013-08-08 01:12:33 +00002038 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002039 // This packet should not be decoded because it is an incomplete NAL if it
2040 // is the last.
2041 frame_out = DecodeIncompleteFrame();
2042 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002043 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002044 jitter_buffer_->ReleaseFrame(frame_out);
2045
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002046 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002047 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048 timestamp_ += 33 * 90;
2049 VCMPacket emptypacket(data_, 0, seq_num_, timestamp_, true);
2050 emptypacket.seqNum = seq_num_;
2051 emptypacket.timestamp = timestamp_;
2052 emptypacket.frameType = kVideoFrameKey;
2053 emptypacket.isFirstPacket = true;
2054 emptypacket.completeNALU = kNaluComplete;
2055 emptypacket.markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002056 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(emptypacket,
2057 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002058 // This packet should not be decoded because it is an incomplete NAL if it
2059 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002060
2061 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2062 // has arrived.
2063 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002064 EXPECT_TRUE(frame_out != NULL);
2065 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002066
2067 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002068 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069 timestamp_ += 33 * 90;
2070
2071 packet_->seqNum = seq_num_;
2072 packet_->timestamp = timestamp_;
2073 packet_->frameType = kVideoFrameKey;
2074 packet_->isFirstPacket = true;
2075 packet_->completeNALU = kNaluComplete;
2076 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002077
agalusza@google.comd177c102013-08-08 01:12:33 +00002078 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
2079 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002080
agalusza@google.comd177c102013-08-08 01:12:33 +00002081 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002082 emptypacket.seqNum = seq_num_;
2083 emptypacket.timestamp = timestamp_;
2084 emptypacket.frameType = kVideoFrameKey;
2085 emptypacket.isFirstPacket = true;
2086 emptypacket.completeNALU = kNaluComplete;
2087 emptypacket.markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002088 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(emptypacket,
2089 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002090
2091 frame_out = DecodeCompleteFrame();
2092 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002093 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002094 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002095}
2096
2097TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
2098 // Test that a we cannot get incomplete frames from the JB if we haven't
2099 // received the marker bit, unless we have received a packet from a later
2100 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002101 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002102 // Start with a complete key frame - insert and decode.
2103 packet_->frameType = kVideoFrameKey;
2104 packet_->isFirstPacket = true;
2105 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002106 bool retransmitted = false;
2107
2108 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
2109 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002110 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2111 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002112 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113
2114 packet_->seqNum += 2;
2115 packet_->timestamp += 33 * 90;
2116 packet_->frameType = kVideoFrameDelta;
2117 packet_->isFirstPacket = false;
2118 packet_->markerBit = false;
2119
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002120
agalusza@google.comd177c102013-08-08 01:12:33 +00002121 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
2122 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002123
2124 frame_out = DecodeIncompleteFrame();
2125 EXPECT_TRUE(frame_out == NULL);
2126
2127 packet_->seqNum += 2;
2128 packet_->timestamp += 33 * 90;
2129 packet_->isFirstPacket = true;
2130
agalusza@google.comd177c102013-08-08 01:12:33 +00002131 EXPECT_EQ(kDecodableSession, jitter_buffer_->InsertPacket(*packet_,
2132 &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002133
2134 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002135 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002136 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137}
2138
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002139TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002140 // Make sure the jitter doesn't request a keyframe after too much non-
2141 // decodable frames.
2142 jitter_buffer_->SetNackMode(kNack, -1, -1);
2143 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames,
2144 kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002145 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002146 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002147 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002148 DropFrame(1);
2149 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002150 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002151 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002152 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002153 // This frame will make the jitter buffer recycle frames until a key frame.
2154 // Since none is found it will have to wait until the next key frame before
2155 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002156 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002157 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002158}
2159
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002160TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002161 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002162 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002163 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002164 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002165 // Insert empty packet.
2166 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002167 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002168 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002169 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002170 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002171 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002172 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002173 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002174 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002175 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002176 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002177 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002178}
2179
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002180TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002181 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2182 EXPECT_EQ(0, frame_stats.delta_frames);
2183 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002184
2185 uint32_t framerate = 0;
2186 uint32_t bitrate = 0;
2187 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2188 EXPECT_EQ(0u, framerate);
2189 EXPECT_EQ(0u, bitrate);
2190
2191 // Insert a couple of key and delta frames.
2192 InsertFrame(kVideoFrameKey);
2193 InsertFrame(kVideoFrameDelta);
2194 InsertFrame(kVideoFrameDelta);
2195 InsertFrame(kVideoFrameKey);
2196 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002197 // Decode some of them to make sure the statistics doesn't depend on frames
2198 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002199 EXPECT_TRUE(DecodeCompleteFrame());
2200 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002201 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002202 EXPECT_EQ(3, frame_stats.delta_frames);
2203 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002204
2205 // Insert 20 more frames to get estimates of bitrate and framerate over
2206 // 1 second.
2207 for (int i = 0; i < 20; ++i) {
2208 InsertFrame(kVideoFrameDelta);
2209 }
2210 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2211 // TODO(holmer): The current implementation returns the average of the last
2212 // two framerate calculations, which is why it takes two calls to reach the
2213 // actual framerate. This should be fixed.
2214 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2215 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2216 // Insert 25 more frames to get estimates of bitrate and framerate over
2217 // 2 seconds.
2218 for (int i = 0; i < 25; ++i) {
2219 InsertFrame(kVideoFrameDelta);
2220 }
2221 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2222 EXPECT_EQ(kDefaultFrameRate, framerate);
2223 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2224}
2225
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002226TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2227 // Insert delta frames.
2228 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2229 // Can't decode without a key frame.
2230 EXPECT_FALSE(DecodeCompleteFrame());
2231 InsertFrame(kVideoFrameKey);
2232 // Skip to the next key frame.
2233 EXPECT_TRUE(DecodeCompleteFrame());
2234}
2235
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002236TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2237 InsertFrame(kVideoFrameKey);
2238 EXPECT_TRUE(DecodeCompleteFrame());
2239 const int kNumDeltaFrames = 5;
2240 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2241 InsertFrame(kVideoFrameKey);
2242 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2243 EXPECT_TRUE(DecodeCompleteFrame());
2244 }
2245}
2246
2247TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2248 InsertFrame(kVideoFrameKey);
2249 EXPECT_TRUE(DecodeCompleteFrame());
2250 const int kNumDeltaFrames = 5;
2251 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2252 InsertFrame(kVideoFrameKey);
2253 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2254 InsertFrame(kVideoFrameKey);
2255 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2256 EXPECT_TRUE(DecodeCompleteFrame());
2257 }
2258}
2259
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002260TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2261 InsertFrame(kVideoFrameKey);
2262 EXPECT_TRUE(DecodeCompleteFrame());
2263 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2264 clock_->TimeInMilliseconds());
2265 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2266 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2267 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002268 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002269 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2270 EXPECT_FALSE(DecodeCompleteFrame());
2271 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2272 EXPECT_TRUE(DecodeCompleteFrame());
2273 EXPECT_TRUE(DecodeCompleteFrame());
2274}
2275
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002276TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002277 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002278 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002279 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002280 InsertFrame(kVideoFrameKey);
2281 EXPECT_TRUE(DecodeCompleteFrame());
2282}
2283
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002284TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002285 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002286 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002287 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002288
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002289 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2290 // old packet.
2291 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002292 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002293 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002294 kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002295 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002296
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002297 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002298 std::vector<uint16_t> nack_list =
2299 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002300 // No key frame will be requested since the jitter buffer is empty.
2301 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002302 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002303
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002304 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002305 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002306 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002307 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002308
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002309 // The next complete continuous frame isn't a key frame, but we're waiting
2310 // for one.
2311 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002312 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002313 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002314 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002315}
2316
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002317TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002318 // Insert a key frame and decode it.
2319 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2320 EXPECT_TRUE(DecodeCompleteFrame());
2321
2322 // Insert a frame which should trigger a recycle until the next key frame.
2323 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2324
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002325 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002326 std::vector<uint16_t> nack_list =
2327 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002328 // Verify that the jitter buffer does not request a key frame.
2329 EXPECT_FALSE(request_key_frame);
2330 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002331 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002332 // Verify that we can decode the next frame.
2333 EXPECT_TRUE(DecodeCompleteFrame());
2334}
2335
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002336TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002337 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002338 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002339 EXPECT_TRUE(DecodeCompleteFrame());
2340
2341 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002342 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002343 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002344 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002345 EXPECT_FALSE(DecodeCompleteFrame());
2346
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002347 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002348 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002349 // The jitter buffer is empty, so we won't request key frames until we get a
2350 // packet.
2351 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002352
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002353 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002354 // Now we have a packet in the jitter buffer, a key frame will be requested
2355 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002356 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002357 // The jitter buffer is empty, so we won't request key frames until we get a
2358 // packet.
2359 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002360 // The next complete continuous frame isn't a key frame, but we're waiting
2361 // for one.
2362 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002363 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002364 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002365 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002366 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002367}
2368
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002369TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002370 DropFrame(10);
2371 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002372 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002373 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002374 std::vector<uint16_t> nack_list =
2375 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002376 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002377 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002378 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002379}
2380
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002381TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002382 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002383 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002384 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002385 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002386 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002387 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002388 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002389 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002390 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2391 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002392}
2393
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002394TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002395 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002396 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2397 clock_->TimeInMilliseconds());
2398 VCMPacket packet;
2399 stream_generator_->PopPacket(&packet, 0);
2400 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002401 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002402 EXPECT_FALSE(retransmitted);
2403 // Drop second packet.
2404 stream_generator_->PopPacket(&packet, 1);
2405 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2406 EXPECT_FALSE(retransmitted);
2407 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002408 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002409 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2410 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002411 stream_generator_->PopPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002412 EXPECT_EQ(packet.seqNum, nack_list[0]);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002413 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(packet,
2414 &retransmitted));
2415 EXPECT_TRUE(retransmitted);
2416 EXPECT_TRUE(DecodeCompleteFrame());
2417}
2418
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002419TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002420 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002421 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002422 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002423 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002424 // Drop second packet.
2425 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2426 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002427 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002428 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2429 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002430 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002431 stream_generator_->GetPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002432 EXPECT_EQ(packet.seqNum, nack_list[0]);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002433}
2434
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002435TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
2436 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002437 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002438 // First frame is delta.
2439 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2440 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002441 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002442 // Drop second packet in frame.
2443 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2444 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2445 // Second frame is key.
2446 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2447 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002448 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002449 // Drop second packet in frame.
2450 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2451 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002452 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002453 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2454 EXPECT_EQ(1u, nack_list.size());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002455 stream_generator_->GetPacket(&packet, 0);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002456 EXPECT_EQ(packet.seqNum, nack_list[0]);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002457}
2458
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002459TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002460 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002461 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002462
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002463 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002464 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002465
2466 // ----------------------------------------------------------------
2467 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2468 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002469 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002470 clock_->TimeInMilliseconds());
2471 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002472 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002473 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002474 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002475 while (stream_generator_->PacketsRemaining() > 1) {
2476 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002477 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002478 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002479 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002480 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002481 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002482 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002483 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002484 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002485 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002486 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002487 std::vector<uint16_t> nack_list =
2488 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002489 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002490 const size_t kExpectedNackSize = 9;
2491 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2492 for (size_t i = 0; i < nack_list.size(); ++i)
2493 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002494}
2495
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002496TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002497 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002498 // ------- ------------------------------------------------------------
2499 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2500 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002501 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002502 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002503 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002504 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002505 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002506 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002507 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002508 while (stream_generator_->PacketsRemaining() > 1) {
2509 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002510 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002511 EXPECT_FALSE(request_key_frame);
2512 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002513 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002514 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002515 }
2516 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002517 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002518 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002519 EXPECT_FALSE(DecodeCompleteFrame());
2520 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002521 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002522 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002523 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002524 const size_t kExpectedNackSize = 10;
2525 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2526 for (size_t i = 0; i < nack_list.size(); ++i)
2527 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002528}
2529
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002530TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
2531 bool request_key_frame = false;
2532 // -----------------------------------
2533 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2534 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002535 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002536 InsertFrame(kVideoFrameKey);
2537 EXPECT_FALSE(request_key_frame);
2538 EXPECT_TRUE(DecodeCompleteFrame());
2539 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2540 clock_->TimeInMilliseconds());
2541 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2542 for (int i = 0; i < 5; ++i) {
2543 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002544 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002545 EXPECT_FALSE(request_key_frame);
2546 } else {
2547 stream_generator_->NextPacket(NULL); // Drop packet
2548 }
2549 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2550 clock_->TimeInMilliseconds());
2551 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2552 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002553 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002554 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002555 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002556 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002557 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002558 ASSERT_EQ(1u, nack_list.size());
2559 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002560}
2561
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002562TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002563 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002564 InsertFrame(kVideoFrameKey);
2565 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002566 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002567 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2568 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002569
2570 // Far-into-the-future video frame, could be caused by resetting the encoder
2571 // or otherwise restarting. This should not fail when error when the packet is
2572 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002573 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002574 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2575 InsertFrame(kVideoFrameKey);
2576 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002577 nack_list = jitter_buffer_->GetNackList(&extended);
2578 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002579
2580 // Stream should be decodable from this point.
2581 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2582 InsertFrame(kVideoFrameDelta);
2583 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002584 nack_list = jitter_buffer_->GetNackList(&extended);
2585 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002586}
2587
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002588} // namespace webrtc