blob: 425a4e9745839a8f6f03cdb570dcb5b6222380b1 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
stefana669a3a2016-10-06 05:04:52 -070017#include "webrtc/common_video/h264/h264_common.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/frame_buffer.h"
19#include "webrtc/modules/video_coding/jitter_buffer.h"
20#include "webrtc/modules/video_coding/media_opt_util.h"
21#include "webrtc/modules/video_coding/packet.h"
22#include "webrtc/modules/video_coding/test/stream_generator.h"
23#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010024#include "webrtc/system_wrappers/include/clock.h"
philipel83f831a2016-03-12 03:30:23 -080025#include "webrtc/system_wrappers/include/field_trial.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010026#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070027#include "webrtc/system_wrappers/include/metrics_default.h"
philipel83f831a2016-03-12 03:30:23 -080028#include "webrtc/test/field_trial.h"
kwibergac9f8762016-09-30 22:29:43 -070029#include "webrtc/test/gmock.h"
30#include "webrtc/test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000031
32namespace webrtc {
33
asapersson9a4cd872015-10-23 00:27:14 -070034namespace {
philipel9d3ab612015-12-21 04:12:39 -080035const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070036} // namespace
37
38class Vp9SsMapTest : public ::testing::Test {
39 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020040 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070041
42 virtual void SetUp() {
43 packet_.isFirstPacket = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020044 packet_.dataPtr = data_;
45 packet_.sizeBytes = 1400;
46 packet_.seqNum = 1234;
47 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070048 packet_.markerBit = true;
49 packet_.frameType = kVideoFrameKey;
50 packet_.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -070051 packet_.video_header.codec = kRtpVideoVp9;
52 packet_.video_header.codecHeader.VP9.flexible_mode = false;
53 packet_.video_header.codecHeader.VP9.gof_idx = 0;
54 packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
55 packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
56 packet_.video_header.codecHeader.VP9.ss_data_available = true;
57 packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070058 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
59 }
60
61 Vp9SsMap map_;
62 uint8_t data_[1500];
63 VCMPacket packet_;
64};
65
66TEST_F(Vp9SsMapTest, Insert) {
67 EXPECT_TRUE(map_.Insert(packet_));
68}
69
70TEST_F(Vp9SsMapTest, Insert_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -070071 packet_.video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070072 EXPECT_FALSE(map_.Insert(packet_));
73}
74
75TEST_F(Vp9SsMapTest, Find) {
76 EXPECT_TRUE(map_.Insert(packet_));
77 Vp9SsMap::SsMap::iterator it;
78 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
79 EXPECT_EQ(packet_.timestamp, it->first);
80}
81
82TEST_F(Vp9SsMapTest, Find_WithWrap) {
83 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
84 const uint32_t kSsTimestamp2 = 100;
85 packet_.timestamp = kSsTimestamp1;
86 EXPECT_TRUE(map_.Insert(packet_));
87 packet_.timestamp = kSsTimestamp2;
88 EXPECT_TRUE(map_.Insert(packet_));
89 Vp9SsMap::SsMap::iterator it;
90 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
91 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
92 EXPECT_EQ(kSsTimestamp1, it->first);
93 EXPECT_TRUE(map_.Find(0, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
98 EXPECT_EQ(kSsTimestamp2, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
100 EXPECT_EQ(kSsTimestamp2, it->first);
101}
102
103TEST_F(Vp9SsMapTest, Reset) {
104 EXPECT_TRUE(map_.Insert(packet_));
105 Vp9SsMap::SsMap::iterator it;
106 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
107 EXPECT_EQ(packet_.timestamp, it->first);
108
109 map_.Reset();
110 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
111}
112
113TEST_F(Vp9SsMapTest, RemoveOld) {
114 Vp9SsMap::SsMap::iterator it;
115 const uint32_t kSsTimestamp1 = 10000;
116 packet_.timestamp = kSsTimestamp1;
117 EXPECT_TRUE(map_.Insert(packet_));
118
119 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
120 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
121 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
122
123 map_.RemoveOld(kTimestamp);
124 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
125 EXPECT_TRUE(map_.Find(kTimestamp, &it));
126 EXPECT_EQ(kTimestamp, it->first);
127}
128
129TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
130 Vp9SsMap::SsMap::iterator it;
131 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
132 const uint32_t kSsTimestamp2 = 10;
133 const uint32_t kSsTimestamp3 = 1000;
134 packet_.timestamp = kSsTimestamp1;
135 EXPECT_TRUE(map_.Insert(packet_));
136 packet_.timestamp = kSsTimestamp2;
137 EXPECT_TRUE(map_.Insert(packet_));
138 packet_.timestamp = kSsTimestamp3;
139 EXPECT_TRUE(map_.Insert(packet_));
140
141 map_.RemoveOld(kSsTimestamp3);
142 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
143 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
144 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
145}
146
147TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -0700148 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700149 EXPECT_FALSE(map_.UpdatePacket(&packet_));
150}
151
152TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
153 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700154 packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700155 EXPECT_FALSE(map_.UpdatePacket(&packet_));
156}
157
158TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
159 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700160 packet_.video_header.codecHeader.VP9.gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700161 EXPECT_FALSE(map_.UpdatePacket(&packet_));
162}
163
164TEST_F(Vp9SsMapTest, UpdatePacket) {
165 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
166
isheriff6b4b5f32016-06-08 00:24:21 -0700167 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700168 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700169 EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
170 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
171 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
172 EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700173
isheriff6b4b5f32016-06-08 00:24:21 -0700174 packet_.video_header.codecHeader.VP9.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700175 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700176 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
177 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
178 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
179 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700180
isheriff6b4b5f32016-06-08 00:24:21 -0700181 packet_.video_header.codecHeader.VP9.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700182 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700183 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.temporal_idx);
184 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
185 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
186 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700187
isheriff6b4b5f32016-06-08 00:24:21 -0700188 packet_.video_header.codecHeader.VP9.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700189 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700190 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
191 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
192 EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
193 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
194 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
asapersson9a4cd872015-10-23 00:27:14 -0700195}
196
philipel83f831a2016-03-12 03:30:23 -0800197class ProcessThreadMock : public ProcessThread {
198 public:
199 MOCK_METHOD0(Start, void());
200 MOCK_METHOD0(Stop, void());
201 MOCK_METHOD1(WakeUp, void(Module* module));
202 MOCK_METHOD1(RegisterModule, void(Module* module));
203 MOCK_METHOD1(DeRegisterModule, void(Module* module));
tommi435f98b2016-05-28 14:57:15 -0700204 void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
philipel83f831a2016-03-12 03:30:23 -0800205};
206
207class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
208 public NackSender,
209 public KeyFrameRequestSender {
210 public:
211 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
212 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
213 sequence_numbers.end());
214 }
215
216 void RequestKeyFrame() override { ++keyframe_requests_; }
217
218 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
219 std::vector<uint16_t> nack_sent_;
220 int keyframe_requests_;
221
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000222 protected:
philipel85130292016-07-06 16:10:31 +0200223 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700224 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000225 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700226 jitter_buffer_.reset(new VCMJitterBuffer(
227 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800228 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
229 this,
230 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000231 jitter_buffer_->Start();
232 seq_num_ = 1234;
233 timestamp_ = 0;
234 size_ = 1400;
235 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
236 data_[0] = 0;
237 data_[1] = 0;
238 data_[2] = 0x80;
239 int count = 3;
240 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
241 data_[i] = count;
242 count++;
243 if (count == 10) {
244 data_[i + 1] = 0;
245 data_[i + 2] = 0;
246 data_[i + 3] = 0x80;
247 count = 3;
248 i += 3;
249 }
250 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200251 WebRtcRTPHeader rtpHeader;
252 memset(&rtpHeader, 0, sizeof(rtpHeader));
253 rtpHeader.header.sequenceNumber = seq_num_;
254 rtpHeader.header.timestamp = timestamp_;
255 rtpHeader.header.markerBit = true;
256 rtpHeader.frameType = kVideoFrameDelta;
257 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000258 }
259
260 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700261 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000262 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700263 return nullptr;
264 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000265 }
266
267 VCMEncodedFrame* DecodeIncompleteFrame() {
268 uint32_t timestamp = 0;
269 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
270 if (!found_frame)
271 return NULL;
272 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
273 return frame;
274 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000275
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000276 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800277 unsigned int size,
278 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000279 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000280
281 const uint8_t* outData = frame_out->Buffer();
282 unsigned int i = 0;
283
284 if (startCode) {
285 EXPECT_EQ(0, outData[0]);
286 EXPECT_EQ(0, outData[1]);
287 EXPECT_EQ(0, outData[2]);
288 EXPECT_EQ(1, outData[3]);
289 i += 4;
290 }
291
292 EXPECT_EQ(size, frame_out->Length());
293 int count = 3;
294 for (; i < size; i++) {
295 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
296 i += 2;
297 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
298 EXPECT_EQ(0, outData[0]);
299 EXPECT_EQ(0, outData[1]);
300 EXPECT_EQ(0, outData[2]);
301 EXPECT_EQ(1, outData[3]);
302 i += 3;
303 } else {
304 EXPECT_EQ(count, outData[i]);
305 count++;
306 if (count == 10) {
307 count = 3;
308 }
309 }
310 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000311 }
312
313 uint16_t seq_num_;
314 uint32_t timestamp_;
315 int size_;
316 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800317 std::unique_ptr<VCMPacket> packet_;
318 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000319 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800320 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000321};
322
philipel83f831a2016-03-12 03:30:23 -0800323class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
324 public NackSender,
325 public KeyFrameRequestSender {
326 public:
327 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
328 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
329 sequence_numbers.end());
330 }
331
332 void RequestKeyFrame() { ++keyframe_requests_; }
333
334 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
335 std::vector<uint16_t> nack_sent_;
336 int keyframe_requests_;
337
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000338 protected:
339 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000340
341 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000342 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000343 max_nack_list_size_ = 150;
344 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700345 jitter_buffer_ = new VCMJitterBuffer(
346 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800347 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
348 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700349 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000350 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800351 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
352 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000353 memset(data_buffer_, 0, kDataBufferSize);
354 }
355
356 virtual void TearDown() {
357 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000358 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000359 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000360 }
361
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000362 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000363 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000364 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000365 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000366 EXPECT_TRUE(packet_available);
367 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000368 return kGeneralError; // Return here to avoid crashes below.
369 bool retransmitted = false;
370 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000371 }
372
373 VCMFrameBufferEnum InsertPacket(int index) {
374 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000375 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000376 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000377 EXPECT_TRUE(packet_available);
378 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000379 return kGeneralError; // Return here to avoid crashes below.
380 bool retransmitted = false;
381 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000382 }
383
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000384 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700385 stream_generator_->GenerateFrame(
386 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
387 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000388 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000389 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000390 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000391 }
392
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000393 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
394 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000395 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000396 VCMFrameBufferEnum ret = InsertFrame(frame_type);
397 if (ret < kNoError) {
398 ret_for_all = ret;
399 } else if (ret_for_all >= kNoError) {
400 ret_for_all = ret;
401 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000402 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000403 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000404 }
405
406 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000407 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000408 clock_->TimeInMilliseconds());
409 for (int i = 0; i < num_packets; ++i)
410 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000411 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000412 }
413
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000414 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700415 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000416 if (!found_frame)
417 return false;
418
isheriff6b4b5f32016-06-08 00:24:21 -0700419 VCMEncodedFrame* frame =
420 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000421 bool ret = (frame != NULL);
422 jitter_buffer_->ReleaseFrame(frame);
423 return ret;
424 }
425
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000426 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000427 uint32_t timestamp = 0;
428 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
429 if (!found_frame)
430 return false;
431 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000432 bool ret = (frame != NULL);
433 jitter_buffer_->ReleaseFrame(frame);
434 return ret;
435 }
436
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000437 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000438 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800439 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000440 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000441 size_t max_nack_list_size_;
442 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000443 uint8_t data_buffer_[kDataBufferSize];
444};
445
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000446class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000447 protected:
philipel85130292016-07-06 16:10:31 +0200448 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000449 virtual void SetUp() {
450 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000451 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000452 }
453
philipel9d3ab612015-12-21 04:12:39 -0800454 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000455};
456
philipel85130292016-07-06 16:10:31 +0200457TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000458 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000459 EXPECT_TRUE(NULL == DecodeCompleteFrame());
460 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
461 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000462 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000463 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000464
465 // No packets inserted.
466 EXPECT_TRUE(NULL == DecodeCompleteFrame());
467 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
468
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000470 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000471
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000472 // No packets inserted.
473 EXPECT_TRUE(NULL == DecodeCompleteFrame());
474 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
475}
476
philipel85130292016-07-06 16:10:31 +0200477TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000478 // Always start with a complete key frame when not allowing errors.
479 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480 packet_->frameType = kVideoFrameKey;
481 packet_->isFirstPacket = true;
482 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000483 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000484
485 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000486 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800487 EXPECT_EQ(kCompleteSession,
488 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000489 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000490 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000491 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000492 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000493}
494
philipel85130292016-07-06 16:10:31 +0200495TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700496 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200497 // Always start with a complete key frame when not allowing errors.
498 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
499 packet_->frameType = kVideoFrameKey;
500 packet_->isFirstPacket = true;
501 packet_->markerBit = true;
502 packet_->timestamp += 123 * 90;
503
504 // Insert single packet frame to the jitter buffer and get a frame.
505 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800506 EXPECT_EQ(kCompleteSession,
507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200508 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
509 CheckOutFrame(frame_out, size_, false);
510 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
511 jitter_buffer_->ReleaseFrame(frame_out);
512
513 // Verify that histograms are updated when the jitter buffer is stopped.
514 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
515 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700516 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
517 EXPECT_EQ(1,
518 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800519 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700520 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800521 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700522 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200523
524 // Verify that histograms are not updated if stop is called again.
525 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700526 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
527 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800528 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700529 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
530 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200531}
532
philipel85130292016-07-06 16:10:31 +0200533TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000534 packet_->frameType = kVideoFrameKey;
535 packet_->isFirstPacket = true;
536 packet_->markerBit = false;
537
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000538 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800539 EXPECT_EQ(kIncomplete,
540 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000541 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
542 // Should not be complete.
543 EXPECT_TRUE(frame_out == NULL);
544
545 ++seq_num_;
546 packet_->isFirstPacket = false;
547 packet_->markerBit = true;
548 packet_->seqNum = seq_num_;
549
philipel9d3ab612015-12-21 04:12:39 -0800550 EXPECT_EQ(kCompleteSession,
551 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552
553 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000554 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000555
556 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000557 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000558}
559
philipel85130292016-07-06 16:10:31 +0200560TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561 packet_->frameType = kVideoFrameKey;
562 packet_->isFirstPacket = true;
563 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000565 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800566 EXPECT_EQ(kIncomplete,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568
569 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
570
571 // Frame should not be complete.
572 EXPECT_TRUE(frame_out == NULL);
573
574 // Insert 98 frames.
575 int loop = 0;
576 do {
577 seq_num_++;
578 packet_->isFirstPacket = false;
579 packet_->markerBit = false;
580 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000581
philipel9d3ab612015-12-21 04:12:39 -0800582 EXPECT_EQ(kIncomplete,
583 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000584 loop++;
585 } while (loop < 98);
586
587 // Insert last packet.
588 ++seq_num_;
589 packet_->isFirstPacket = false;
590 packet_->markerBit = true;
591 packet_->seqNum = seq_num_;
592
philipel9d3ab612015-12-21 04:12:39 -0800593 EXPECT_EQ(kCompleteSession,
594 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000595
596 frame_out = DecodeCompleteFrame();
597
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000598 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000599 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000600 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000601}
602
philipel85130292016-07-06 16:10:31 +0200603TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604 // Always start with a complete key frame.
605 packet_->frameType = kVideoFrameKey;
606 packet_->isFirstPacket = true;
607 packet_->markerBit = true;
608
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000609 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800610 EXPECT_EQ(kCompleteSession,
611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000612 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
613 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000614 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000615
616 ++seq_num_;
617 packet_->seqNum = seq_num_;
618 packet_->markerBit = false;
619 packet_->frameType = kVideoFrameDelta;
620 packet_->timestamp += 33 * 90;
621
philipel9d3ab612015-12-21 04:12:39 -0800622 EXPECT_EQ(kIncomplete,
623 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000624
625 frame_out = DecodeCompleteFrame();
626
627 // Frame should not be complete.
628 EXPECT_TRUE(frame_out == NULL);
629
630 packet_->isFirstPacket = false;
631 // Insert 98 frames.
632 int loop = 0;
633 do {
634 ++seq_num_;
635 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000636
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800638 EXPECT_EQ(kIncomplete,
639 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000640 loop++;
641 } while (loop < 98);
642
643 // Insert the last packet.
644 ++seq_num_;
645 packet_->isFirstPacket = false;
646 packet_->markerBit = true;
647 packet_->seqNum = seq_num_;
648
philipel9d3ab612015-12-21 04:12:39 -0800649 EXPECT_EQ(kCompleteSession,
650 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000651
652 frame_out = DecodeCompleteFrame();
653
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000654 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000656 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000657}
658
philipel85130292016-07-06 16:10:31 +0200659TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660 // Insert the "first" packet last.
661 seq_num_ += 100;
662 packet_->frameType = kVideoFrameKey;
663 packet_->isFirstPacket = false;
664 packet_->markerBit = true;
665 packet_->seqNum = seq_num_;
666 packet_->timestamp = timestamp_;
667
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000668 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800669 EXPECT_EQ(kIncomplete,
670 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000671
672 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
673
674 EXPECT_TRUE(frame_out == NULL);
675
676 // Insert 98 packets.
677 int loop = 0;
678 do {
679 seq_num_--;
680 packet_->isFirstPacket = false;
681 packet_->markerBit = false;
682 packet_->seqNum = seq_num_;
683
philipel9d3ab612015-12-21 04:12:39 -0800684 EXPECT_EQ(kIncomplete,
685 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000686 loop++;
687 } while (loop < 98);
688
689 // Insert the last packet.
690 seq_num_--;
691 packet_->isFirstPacket = true;
692 packet_->markerBit = false;
693 packet_->seqNum = seq_num_;
694
philipel9d3ab612015-12-21 04:12:39 -0800695 EXPECT_EQ(kCompleteSession,
696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697
philipel9d3ab612015-12-21 04:12:39 -0800698 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000699
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000700 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000701
702 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000703 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000704}
705
philipel85130292016-07-06 16:10:31 +0200706TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000707 packet_->frameType = kVideoFrameDelta;
708 packet_->isFirstPacket = true;
709 packet_->markerBit = false;
710
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000711 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800712 EXPECT_EQ(kIncomplete,
713 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000714
715 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
716
717 EXPECT_TRUE(frame_out == NULL);
718
719 seq_num_++;
720 packet_->isFirstPacket = false;
721 packet_->markerBit = true;
722 packet_->seqNum = seq_num_;
723
philipel9d3ab612015-12-21 04:12:39 -0800724 EXPECT_EQ(kCompleteSession,
725 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000726
727 // check that we fail to get frame since seqnum is not continuous
728 frame_out = DecodeCompleteFrame();
729 EXPECT_TRUE(frame_out == NULL);
730
731 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800732 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000733 packet_->frameType = kVideoFrameKey;
734 packet_->isFirstPacket = true;
735 packet_->markerBit = false;
736 packet_->seqNum = seq_num_;
737 packet_->timestamp = timestamp_;
738
philipel9d3ab612015-12-21 04:12:39 -0800739 EXPECT_EQ(kIncomplete,
740 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000741
742 frame_out = DecodeCompleteFrame();
743
744 // It should not be complete.
745 EXPECT_TRUE(frame_out == NULL);
746
747 seq_num_++;
748 packet_->isFirstPacket = false;
749 packet_->markerBit = true;
750 packet_->seqNum = seq_num_;
751
philipel9d3ab612015-12-21 04:12:39 -0800752 EXPECT_EQ(kCompleteSession,
753 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000754
755 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000756 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000757 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000758 jitter_buffer_->ReleaseFrame(frame_out);
759
760 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000761 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000762 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000763 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000764}
765
philipel85130292016-07-06 16:10:31 +0200766TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700767 packet_->frameType = kVideoFrameKey;
768 packet_->isFirstPacket = true;
769 packet_->markerBit = true;
770
771 // Send in an initial good packet/frame (Frame A) to start things off.
772 bool retransmitted = false;
773 EXPECT_EQ(kCompleteSession,
774 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
775 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
776 EXPECT_TRUE(frame_out != NULL);
777 jitter_buffer_->ReleaseFrame(frame_out);
778
779 // Now send in a complete delta frame (Frame C), but with a sequence number
780 // gap. No pic index either, so no temporal scalability cheating :)
781 packet_->frameType = kVideoFrameDelta;
782 // Leave a gap of 2 sequence numbers and two frames.
783 packet_->seqNum = seq_num_ + 3;
784 packet_->timestamp = timestamp_ + (66 * 90);
785 // Still isFirst = marker = true.
786 // Session should be complete (frame is complete), but there's nothing to
787 // decode yet.
788 EXPECT_EQ(kCompleteSession,
789 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
790 frame_out = DecodeCompleteFrame();
791 EXPECT_TRUE(frame_out == NULL);
792
793 // Now send in a complete delta frame (Frame B) that is continuous from A, but
794 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
795 packet_->seqNum = seq_num_ + 1;
796 packet_->timestamp = timestamp_ + (33 * 90);
797 // Still isFirst = marker = true.
798 EXPECT_EQ(kCompleteSession,
799 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
800 frame_out = DecodeCompleteFrame();
801 EXPECT_TRUE(frame_out != NULL);
802 jitter_buffer_->ReleaseFrame(frame_out);
803
804 // But Frame C isn't continuous yet.
805 frame_out = DecodeCompleteFrame();
806 EXPECT_TRUE(frame_out == NULL);
807
808 // Add in the padding. These are empty packets (data length is 0) with no
809 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200810 WebRtcRTPHeader rtpHeader;
811 memset(&rtpHeader, 0, sizeof(rtpHeader));
812 rtpHeader.header.sequenceNumber = seq_num_ + 2;
813 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
814 rtpHeader.header.markerBit = false;
815 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700816 EXPECT_EQ(kOldPacket,
817 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
818 empty_packet.seqNum += 1;
819 EXPECT_EQ(kOldPacket,
820 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
821
822 // But now Frame C should be ready!
823 frame_out = DecodeCompleteFrame();
824 EXPECT_TRUE(frame_out != NULL);
825 jitter_buffer_->ReleaseFrame(frame_out);
826}
827
philipel85130292016-07-06 16:10:31 +0200828TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000829 packet_->frameType = kVideoFrameKey;
830 packet_->isFirstPacket = true;
831 packet_->markerBit = false;
832 packet_->seqNum = seq_num_;
833 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000834 EXPECT_EQ(0, jitter_buffer_->num_packets());
835 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000836
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000837 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800838 EXPECT_EQ(kIncomplete,
839 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000840
841 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
842
843 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000844 EXPECT_EQ(1, jitter_buffer_->num_packets());
845 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000846
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000847 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800848 EXPECT_EQ(kDuplicatePacket,
849 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000850 EXPECT_EQ(2, jitter_buffer_->num_packets());
851 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000852
853 seq_num_++;
854 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000855 packet_->markerBit = true;
856 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000857
philipel9d3ab612015-12-21 04:12:39 -0800858 EXPECT_EQ(kCompleteSession,
859 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000860
861 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000862 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000863 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000864
865 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000866 EXPECT_EQ(3, jitter_buffer_->num_packets());
867 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000868 jitter_buffer_->ReleaseFrame(frame_out);
869}
870
philipel85130292016-07-06 16:10:31 +0200871TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000872 packet_->frameType = kVideoFrameKey;
873 packet_->isFirstPacket = true;
874 packet_->markerBit = true;
875 packet_->seqNum = seq_num_;
876 packet_->timestamp = timestamp_;
877 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
878 EXPECT_EQ(0, jitter_buffer_->num_packets());
879 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
880
881 bool retransmitted = false;
882 // Insert first complete frame.
883 EXPECT_EQ(kCompleteSession,
884 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
885
886 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
887 ASSERT_TRUE(frame_out != NULL);
888 CheckOutFrame(frame_out, size_, false);
889 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
890 jitter_buffer_->ReleaseFrame(frame_out);
891
892 // Insert 3 delta frames.
893 for (uint16_t i = 1; i <= 3; ++i) {
894 packet_->seqNum = seq_num_ + i;
895 packet_->timestamp = timestamp_ + (i * 33) * 90;
896 packet_->frameType = kVideoFrameDelta;
897 EXPECT_EQ(kCompleteSession,
898 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
899 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
900 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
901 }
902
903 // Retransmit second delta frame.
904 packet_->seqNum = seq_num_ + 2;
905 packet_->timestamp = timestamp_ + 66 * 90;
906
907 EXPECT_EQ(kDuplicatePacket,
908 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
909
910 EXPECT_EQ(5, jitter_buffer_->num_packets());
911 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
912
913 // Should be able to decode 3 delta frames, key frame already decoded.
914 for (size_t i = 0; i < 3; ++i) {
915 frame_out = DecodeCompleteFrame();
916 ASSERT_TRUE(frame_out != NULL);
917 CheckOutFrame(frame_out, size_, false);
918 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
919 jitter_buffer_->ReleaseFrame(frame_out);
920 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000921}
922
philipel85130292016-07-06 16:10:31 +0200923TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700924 // Verify that JB skips forward to next base layer frame.
925 // -------------------------------------------------
926 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
927 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
928 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
929 // | ss | x | x | x | |
930 // -------------------------------------------------
931 // |<----------tl0idx:200--------->|<---tl0idx:201---
932
933 bool re = false;
934 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700935 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700936 packet_->isFirstPacket = true;
937 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700938 packet_->video_header.codecHeader.VP9.flexible_mode = false;
939 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
940 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
941 packet_->video_header.codecHeader.VP9.end_of_frame = true;
942 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700943
944 packet_->seqNum = 65485;
945 packet_->timestamp = 1000;
946 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700947 packet_->video_header.codecHeader.VP9.picture_id = 5;
948 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
949 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
950 packet_->video_header.codecHeader.VP9.ss_data_available = true;
951 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700952 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
953 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
954
955 // Insert next temporal layer 0.
956 packet_->seqNum = 65489;
957 packet_->timestamp = 13000;
958 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700959 packet_->video_header.codecHeader.VP9.picture_id = 9;
960 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
961 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
962 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700963 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
964
965 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
966 EXPECT_EQ(1000U, frame_out->TimeStamp());
967 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
968 jitter_buffer_->ReleaseFrame(frame_out);
969
970 frame_out = DecodeCompleteFrame();
971 EXPECT_EQ(13000U, frame_out->TimeStamp());
972 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
973 jitter_buffer_->ReleaseFrame(frame_out);
974}
975
philipel85130292016-07-06 16:10:31 +0200976TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700977 // Verify that frames are updated with SS data when SS packet is reordered.
978 // --------------------------------
979 // | 65486 | 65487 | 65485 |...
980 // | pid:6 | pid:7 | pid:5 |...
981 // | tid:2 | tid:1 | tid:0 |...
982 // | | | ss |
983 // --------------------------------
984 // |<--------tl0idx:200--------->|
985
986 bool re = false;
987 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700988 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700989 packet_->isFirstPacket = true;
990 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700991 packet_->video_header.codecHeader.VP9.flexible_mode = false;
992 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
993 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
994 packet_->video_header.codecHeader.VP9.end_of_frame = true;
995 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700996
997 packet_->seqNum = 65486;
998 packet_->timestamp = 6000;
999 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001000 packet_->video_header.codecHeader.VP9.picture_id = 6;
1001 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
1002 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001003 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1004
1005 packet_->seqNum = 65487;
1006 packet_->timestamp = 9000;
1007 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001008 packet_->video_header.codecHeader.VP9.picture_id = 7;
1009 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1010 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001011 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1012
1013 // Insert first frame with SS data.
1014 packet_->seqNum = 65485;
1015 packet_->timestamp = 3000;
1016 packet_->frameType = kVideoFrameKey;
1017 packet_->width = 352;
1018 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001019 packet_->video_header.codecHeader.VP9.picture_id = 5;
1020 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1021 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1022 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1023 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001024 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1025 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1026
1027 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1028 EXPECT_EQ(3000U, frame_out->TimeStamp());
1029 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1030 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1031 EXPECT_FALSE(
1032 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1033 jitter_buffer_->ReleaseFrame(frame_out);
1034
1035 frame_out = DecodeCompleteFrame();
1036 EXPECT_EQ(6000U, frame_out->TimeStamp());
1037 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1038 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1039 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1040 jitter_buffer_->ReleaseFrame(frame_out);
1041
1042 frame_out = DecodeCompleteFrame();
1043 EXPECT_EQ(9000U, frame_out->TimeStamp());
1044 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1045 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1046 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1047 jitter_buffer_->ReleaseFrame(frame_out);
1048}
1049
philipel85130292016-07-06 16:10:31 +02001050TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001051 // Verify that frames are updated with SS data when SS packet is reordered.
1052 // -----------------------------------------
1053 // | 65486 | 65487 | 65485 | 65484 |...
1054 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1055 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1056 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1057 // | t:6000 | t:6000 | t:3000 | t:3000 |
1058 // | | | | ss |
1059 // -----------------------------------------
1060 // |<-----------tl0idx:200------------>|
1061
1062 bool re = false;
1063 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001064 packet_->video_header.codec = kRtpVideoVp9;
1065 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1066 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1067 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1068 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001069
1070 packet_->isFirstPacket = true;
1071 packet_->markerBit = false;
1072 packet_->seqNum = 65486;
1073 packet_->timestamp = 6000;
1074 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001075 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1076 packet_->video_header.codecHeader.VP9.picture_id = 6;
1077 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1078 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001079 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1080
1081 packet_->isFirstPacket = false;
1082 packet_->markerBit = true;
1083 packet_->seqNum = 65487;
1084 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001085 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1086 packet_->video_header.codecHeader.VP9.picture_id = 6;
1087 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1088 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001089 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1090
1091 packet_->isFirstPacket = false;
1092 packet_->markerBit = true;
1093 packet_->seqNum = 65485;
1094 packet_->timestamp = 3000;
1095 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001096 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1097 packet_->video_header.codecHeader.VP9.picture_id = 5;
1098 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1099 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001100 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1101
1102 // Insert first frame with SS data.
1103 packet_->isFirstPacket = true;
1104 packet_->markerBit = false;
1105 packet_->seqNum = 65484;
1106 packet_->frameType = kVideoFrameKey;
1107 packet_->width = 352;
1108 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001109 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1110 packet_->video_header.codecHeader.VP9.picture_id = 5;
1111 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1112 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1113 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1114 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001115 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1116 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1117
1118 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1119 EXPECT_EQ(3000U, frame_out->TimeStamp());
1120 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1121 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1122 EXPECT_FALSE(
1123 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1124 jitter_buffer_->ReleaseFrame(frame_out);
1125
1126 frame_out = DecodeCompleteFrame();
1127 EXPECT_EQ(6000U, frame_out->TimeStamp());
1128 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1129 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1130 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1131 jitter_buffer_->ReleaseFrame(frame_out);
1132}
1133
philipel85130292016-07-06 16:10:31 +02001134TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001135 packet_->frameType = kVideoFrameKey;
1136 packet_->isFirstPacket = true;
1137 packet_->markerBit = false;
1138 packet_->seqNum = seq_num_;
1139 packet_->timestamp = timestamp_;
1140 packet_->insertStartCode = true;
1141
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001142 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001143 EXPECT_EQ(kIncomplete,
1144 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001145
1146 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1147
1148 // Frame should not be complete.
1149 EXPECT_TRUE(frame_out == NULL);
1150
1151 seq_num_++;
1152 packet_->isFirstPacket = false;
1153 packet_->markerBit = true;
1154 packet_->seqNum = seq_num_;
1155
philipel9d3ab612015-12-21 04:12:39 -08001156 EXPECT_EQ(kCompleteSession,
1157 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001158
1159 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001160 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001161 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001162 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001163}
1164
stefana669a3a2016-10-06 05:04:52 -07001165TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1166 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1167
1168 packet_->timestamp = timestamp_;
1169 packet_->frameType = kVideoFrameKey;
1170 packet_->isFirstPacket = true;
1171 packet_->markerBit = true;
1172 packet_->codec = kVideoCodecH264;
1173 packet_->video_header.codec = kRtpVideoH264;
1174 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1175 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1176 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1177 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1178 packet_->video_header.codecHeader.H264.nalus_length = 1;
1179 bool retransmitted = false;
1180 EXPECT_EQ(kCompleteSession,
1181 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1182 // Not decodable since sps and pps are missing.
1183 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1184
1185 timestamp_ += 3000;
1186 packet_->timestamp = timestamp_;
1187 ++seq_num_;
1188 packet_->seqNum = seq_num_;
1189 packet_->frameType = kVideoFrameKey;
1190 packet_->isFirstPacket = true;
1191 packet_->markerBit = false;
1192 packet_->codec = kVideoCodecH264;
1193 packet_->video_header.codec = kRtpVideoH264;
1194 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
1195 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
1196 packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
1197 packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
1198 packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
1199 packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
1200 packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
1201 packet_->video_header.codecHeader.H264.nalus_length = 2;
1202 // Not complete since the marker bit hasn't been received.
1203 EXPECT_EQ(kIncomplete,
1204 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1205
1206 ++seq_num_;
1207 packet_->seqNum = seq_num_;
1208 packet_->frameType = kVideoFrameKey;
1209 packet_->isFirstPacket = false;
1210 packet_->markerBit = true;
1211 packet_->codec = kVideoCodecH264;
1212 packet_->video_header.codec = kRtpVideoH264;
1213 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1214 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1215 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1216 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1217 packet_->video_header.codecHeader.H264.nalus_length = 1;
1218 // Complete and decodable since the pps and sps are received in the first
1219 // packet of this frame.
1220 EXPECT_EQ(kCompleteSession,
1221 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1222 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1223 ASSERT_NE(nullptr, frame_out);
1224 jitter_buffer_->ReleaseFrame(frame_out);
1225
1226 timestamp_ += 3000;
1227 packet_->timestamp = timestamp_;
1228 ++seq_num_;
1229 packet_->seqNum = seq_num_;
1230 packet_->frameType = kVideoFrameDelta;
1231 packet_->isFirstPacket = true;
1232 packet_->markerBit = true;
1233 packet_->codec = kVideoCodecH264;
1234 packet_->video_header.codec = kRtpVideoH264;
1235 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
1236 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
1237 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1238 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1239 packet_->video_header.codecHeader.H264.nalus_length = 1;
1240 // Complete and decodable since sps, pps and key frame has been received.
1241 EXPECT_EQ(kCompleteSession,
1242 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1243 frame_out = DecodeCompleteFrame();
1244 ASSERT_NE(nullptr, frame_out);
1245 jitter_buffer_->ReleaseFrame(frame_out);
1246}
1247
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001248// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001249TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001250 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001251 // Always start with a key frame. Use 10 packets to test Decodable State
1252 // boundaries.
1253 packet_->frameType = kVideoFrameKey;
1254 packet_->isFirstPacket = true;
1255 packet_->markerBit = false;
1256 packet_->seqNum = seq_num_;
1257 packet_->timestamp = timestamp_;
1258
1259 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001260 EXPECT_EQ(kIncomplete,
1261 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001262 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001263 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001264 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1265
1266 packet_->isFirstPacket = false;
1267 for (int i = 1; i < 9; ++i) {
1268 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001269 EXPECT_EQ(kIncomplete,
1270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001271 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001272 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1273 }
1274
1275 // last packet
1276 packet_->markerBit = true;
1277 packet_->seqNum++;
1278
philipel9d3ab612015-12-21 04:12:39 -08001279 EXPECT_EQ(kCompleteSession,
1280 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001281 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1282 CheckOutFrame(frame_out, 10 * size_, false);
1283 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001284 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001285
1286 // An incomplete frame can only be decoded once a subsequent frame has begun
1287 // to arrive. Insert packet in distant frame for this purpose.
1288 packet_->frameType = kVideoFrameDelta;
1289 packet_->isFirstPacket = true;
1290 packet_->markerBit = false;
1291 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001292 packet_->timestamp += 33 * 90 * 8;
1293
philipel9d3ab612015-12-21 04:12:39 -08001294 EXPECT_EQ(kDecodableSession,
1295 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001296 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001297 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1298
1299 // Insert second frame
1300 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001301 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001302
philipel9d3ab612015-12-21 04:12:39 -08001303 EXPECT_EQ(kDecodableSession,
1304 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001305 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001306 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1307
1308 packet_->isFirstPacket = false;
1309 for (int i = 1; i < 8; ++i) {
1310 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001311 EXPECT_EQ(kDecodableSession,
1312 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001313 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001314 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1315 }
1316
1317 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001318 EXPECT_EQ(kDecodableSession,
1319 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001320 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001321 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1322
1323 frame_out = DecodeIncompleteFrame();
1324 ASSERT_FALSE(NULL == frame_out);
1325 CheckOutFrame(frame_out, 9 * size_, false);
1326 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001327 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001328
1329 packet_->markerBit = true;
1330 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001331 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001332}
1333
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001334// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001335TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001336 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1337 // Always start with a key frame.
1338 packet_->frameType = kVideoFrameKey;
1339 packet_->isFirstPacket = true;
1340 packet_->markerBit = true;
1341 packet_->seqNum = seq_num_;
1342 packet_->timestamp = timestamp_;
1343
1344 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001345 EXPECT_EQ(kCompleteSession,
1346 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001347 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1348 CheckOutFrame(frame_out, size_, false);
1349 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001350 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001351
1352 // An incomplete frame can only be decoded once a subsequent frame has begun
1353 // to arrive. Insert packet in distant frame for this purpose.
1354 packet_->frameType = kVideoFrameDelta;
1355 packet_->isFirstPacket = false;
1356 packet_->markerBit = false;
1357 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001358 packet_->timestamp += 33 * 90 * 8;
1359 EXPECT_EQ(kIncomplete,
1360 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001361 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001362 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001363 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1364
1365 // Insert second frame - an incomplete key frame.
1366 packet_->frameType = kVideoFrameKey;
1367 packet_->isFirstPacket = true;
1368 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001369 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001370
philipel9d3ab612015-12-21 04:12:39 -08001371 EXPECT_EQ(kIncomplete,
1372 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001373 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001374 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1375
1376 // Insert a few more packets. Make sure we're waiting for the key frame to be
1377 // complete.
1378 packet_->isFirstPacket = false;
1379 for (int i = 1; i < 5; ++i) {
1380 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001381 EXPECT_EQ(kIncomplete,
1382 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001383 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001384 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1385 }
1386
1387 // Complete key frame.
1388 packet_->markerBit = true;
1389 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001390 EXPECT_EQ(kCompleteSession,
1391 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001392 frame_out = DecodeCompleteFrame();
1393 CheckOutFrame(frame_out, 6 * size_, false);
1394 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001395 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001396}
1397
1398// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001399TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001400 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1401 // Always start with a key frame.
1402 packet_->frameType = kVideoFrameKey;
1403 packet_->isFirstPacket = true;
1404 packet_->markerBit = true;
1405 packet_->seqNum = seq_num_;
1406 packet_->timestamp = timestamp_;
1407
1408 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001409 EXPECT_EQ(kCompleteSession,
1410 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001411 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1412 CheckOutFrame(frame_out, size_, false);
1413 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001414 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001415
1416 // An incomplete frame can only be decoded once a subsequent frame has begun
1417 // to arrive. Insert packet in distant frame for this purpose.
1418 packet_->frameType = kVideoFrameDelta;
1419 packet_->isFirstPacket = false;
1420 packet_->markerBit = false;
1421 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001422 packet_->timestamp += 33 * 90 * 8;
1423 EXPECT_EQ(kIncomplete,
1424 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001425 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001426 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001427 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1428
1429 // Insert second frame with the first packet missing. Make sure we're waiting
1430 // for the key frame to be complete.
1431 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001432 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001433
philipel9d3ab612015-12-21 04:12:39 -08001434 EXPECT_EQ(kIncomplete,
1435 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001436 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001437 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1438
1439 for (int i = 0; i < 5; ++i) {
1440 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001441 EXPECT_EQ(kIncomplete,
1442 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001443 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001444 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1445 }
1446
1447 // Add first packet. Frame should now be decodable, but incomplete.
1448 packet_->isFirstPacket = true;
1449 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001450 EXPECT_EQ(kDecodableSession,
1451 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001452 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001453 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1454
1455 frame_out = DecodeIncompleteFrame();
1456 CheckOutFrame(frame_out, 7 * size_, false);
1457 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001458 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001459}
1460
philipel85130292016-07-06 16:10:31 +02001461TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001462 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001463 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001464 packet_->frameType = kVideoFrameKey;
1465 packet_->isFirstPacket = true;
1466 packet_->markerBit = true;
1467 packet_->seqNum = seq_num_;
1468 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001469 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001470 EXPECT_EQ(kCompleteSession,
1471 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001472 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001473 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1474 EXPECT_NE(frame, nullptr);
1475 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1476 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001477 EXPECT_TRUE(frame != NULL);
1478 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001479
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001480 // Drop a complete frame.
1481 timestamp_ += 2 * 33 * 90;
1482 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001483 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001484 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001485 packet_->markerBit = false;
1486 packet_->seqNum = seq_num_;
1487 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001488 EXPECT_EQ(kDecodableSession,
1489 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001490 // Insert a packet (so the previous one will be released).
1491 timestamp_ += 33 * 90;
1492 seq_num_ += 2;
1493 packet_->frameType = kVideoFrameDelta;
1494 packet_->isFirstPacket = true;
1495 packet_->markerBit = false;
1496 packet_->seqNum = seq_num_;
1497 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001498 EXPECT_EQ(kDecodableSession,
1499 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001500 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001501 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1502 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001503}
1504
philipel85130292016-07-06 16:10:31 +02001505TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001506 // Verify missing packets statistics and not decodable packets statistics.
1507 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1508 // The last packet is an empty (non-media) packet.
1509
1510 // Select a start seqNum which triggers a difficult wrap situation
1511 // The JB will only output (incomplete)frames if the next one has started
1512 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001513 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001514 seq_num_ = 0xffff - 4;
1515 seq_num_++;
1516 packet_->frameType = kVideoFrameKey;
1517 packet_->isFirstPacket = true;
1518 packet_->markerBit = false;
1519 packet_->seqNum = seq_num_;
1520 packet_->timestamp = timestamp_;
1521 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001522
1523 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001524 EXPECT_EQ(kDecodableSession,
1525 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001526 for (int i = 0; i < 11; ++i) {
1527 webrtc::FrameType frametype = kVideoFrameDelta;
1528 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001529 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001530 packet_->frameType = frametype;
1531 packet_->isFirstPacket = true;
1532 packet_->markerBit = false;
1533 packet_->seqNum = seq_num_;
1534 packet_->timestamp = timestamp_;
1535 packet_->completeNALU = kNaluStart;
1536
philipel9d3ab612015-12-21 04:12:39 -08001537 EXPECT_EQ(kDecodableSession,
1538 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001539
1540 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1541
1542 // Should not be complete.
1543 EXPECT_TRUE(frame_out == NULL);
1544
1545 seq_num_ += 2;
1546 packet_->isFirstPacket = false;
1547 packet_->markerBit = true;
1548 packet_->seqNum = seq_num_;
1549 packet_->completeNALU = kNaluEnd;
1550
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001551 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1552 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001553
1554 // Insert an empty (non-media) packet.
1555 seq_num_++;
1556 packet_->isFirstPacket = false;
1557 packet_->markerBit = false;
1558 packet_->seqNum = seq_num_;
1559 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001560 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001562 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001563 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001564 frame_out = DecodeIncompleteFrame();
1565
1566 // One of the packets has been discarded by the jitter buffer.
1567 // Last frame can't be extracted yet.
1568 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001569 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001570
1571 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001572 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001573 } else {
philipel9d3ab612015-12-21 04:12:39 -08001574 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001575 }
1576 EXPECT_FALSE(frame_out->Complete());
1577 EXPECT_FALSE(frame_out->MissingFrame());
1578 }
1579
1580 jitter_buffer_->ReleaseFrame(frame_out);
1581 }
1582
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001583 // Insert 3 old packets and verify that we have 3 discarded packets
1584 // Match value to actual latest timestamp decoded.
1585 timestamp_ -= 33 * 90;
1586 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001587
philipel9d3ab612015-12-21 04:12:39 -08001588 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001589
1590 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001591
philipel9d3ab612015-12-21 04:12:39 -08001592 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001593
1594 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001595
philipel9d3ab612015-12-21 04:12:39 -08001596 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001597
1598 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1599
1600 jitter_buffer_->Flush();
1601
1602 // This statistic shouldn't be reset by a flush.
1603 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1604}
1605
philipel85130292016-07-06 16:10:31 +02001606TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001607 seq_num_ = 0xfff0;
1608 packet_->frameType = kVideoFrameKey;
1609 packet_->isFirstPacket = true;
1610 packet_->markerBit = false;
1611 packet_->seqNum = seq_num_;
1612 packet_->timestamp = timestamp_;
1613
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001614 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001615 EXPECT_EQ(kIncomplete,
1616 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001617
1618 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1619
1620 EXPECT_TRUE(frame_out == NULL);
1621
1622 int loop = 0;
1623 do {
1624 seq_num_++;
1625 packet_->isFirstPacket = false;
1626 packet_->markerBit = false;
1627 packet_->seqNum = seq_num_;
1628
philipel9d3ab612015-12-21 04:12:39 -08001629 EXPECT_EQ(kIncomplete,
1630 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001631
1632 frame_out = DecodeCompleteFrame();
1633
1634 EXPECT_TRUE(frame_out == NULL);
1635
1636 loop++;
1637 } while (loop < 98);
1638
1639 seq_num_++;
1640 packet_->isFirstPacket = false;
1641 packet_->markerBit = true;
1642 packet_->seqNum = seq_num_;
1643
philipel9d3ab612015-12-21 04:12:39 -08001644 EXPECT_EQ(kCompleteSession,
1645 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001646
1647 frame_out = DecodeCompleteFrame();
1648
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001649 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001650
1651 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001652 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001653}
1654
philipel85130292016-07-06 16:10:31 +02001655TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001656 // Insert "first" packet last seqnum.
1657 seq_num_ = 10;
1658 packet_->frameType = kVideoFrameKey;
1659 packet_->isFirstPacket = false;
1660 packet_->markerBit = true;
1661 packet_->seqNum = seq_num_;
1662
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001663 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001664 EXPECT_EQ(kIncomplete,
1665 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001666 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1667
1668 // Should not be complete.
1669 EXPECT_TRUE(frame_out == NULL);
1670
1671 // Insert 98 frames.
1672 int loop = 0;
1673 do {
1674 seq_num_--;
1675 packet_->isFirstPacket = false;
1676 packet_->markerBit = false;
1677 packet_->seqNum = seq_num_;
1678
philipel9d3ab612015-12-21 04:12:39 -08001679 EXPECT_EQ(kIncomplete,
1680 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001681
1682 frame_out = DecodeCompleteFrame();
1683
1684 EXPECT_TRUE(frame_out == NULL);
1685
1686 loop++;
1687 } while (loop < 98);
1688
1689 // Insert last packet.
1690 seq_num_--;
1691 packet_->isFirstPacket = true;
1692 packet_->markerBit = false;
1693 packet_->seqNum = seq_num_;
1694
philipel9d3ab612015-12-21 04:12:39 -08001695 EXPECT_EQ(kCompleteSession,
1696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001697
1698 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001699 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001700 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001701 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001702}
1703
philipel85130292016-07-06 16:10:31 +02001704TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001705 // ------- -------
1706 // | 2 | | 1 |
1707 // ------- -------
1708 // t = 3000 t = 2000
1709 seq_num_ = 2;
1710 timestamp_ = 3000;
1711 packet_->frameType = kVideoFrameKey;
1712 packet_->isFirstPacket = true;
1713 packet_->markerBit = true;
1714 packet_->timestamp = timestamp_;
1715 packet_->seqNum = seq_num_;
1716
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001717 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001718 EXPECT_EQ(kCompleteSession,
1719 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001720
1721 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1722 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001723 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001724 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725 jitter_buffer_->ReleaseFrame(frame_out);
1726
1727 seq_num_--;
1728 timestamp_ = 2000;
1729 packet_->frameType = kVideoFrameDelta;
1730 packet_->isFirstPacket = true;
1731 packet_->markerBit = true;
1732 packet_->seqNum = seq_num_;
1733 packet_->timestamp = timestamp_;
1734
philipel9d3ab612015-12-21 04:12:39 -08001735 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001736}
1737
philipel85130292016-07-06 16:10:31 +02001738TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001739 // ------- -------
1740 // | 2 | | 1 |
1741 // ------- -------
1742 // t = 3000 t = 0xffffff00
1743
1744 seq_num_ = 2;
1745 timestamp_ = 3000;
1746 packet_->frameType = kVideoFrameKey;
1747 packet_->isFirstPacket = true;
1748 packet_->markerBit = true;
1749 packet_->seqNum = seq_num_;
1750 packet_->timestamp = timestamp_;
1751
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001752 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001753 EXPECT_EQ(kCompleteSession,
1754 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001755
1756 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1757 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1758
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001759 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001760
1761 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1762
1763 jitter_buffer_->ReleaseFrame(frame_out);
1764
1765 seq_num_--;
1766 timestamp_ = 0xffffff00;
1767 packet_->frameType = kVideoFrameDelta;
1768 packet_->isFirstPacket = true;
1769 packet_->markerBit = true;
1770 packet_->seqNum = seq_num_;
1771 packet_->timestamp = timestamp_;
1772
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001773 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001774 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001775}
1776
philipel85130292016-07-06 16:10:31 +02001777TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001778 // --------------- ---------------
1779 // | 1 | 2 | | 3 | 4 |
1780 // --------------- ---------------
1781 // t = 0xffffff00 t = 33*90
1782
1783 timestamp_ = 0xffffff00;
1784 packet_->frameType = kVideoFrameKey;
1785 packet_->isFirstPacket = true;
1786 packet_->markerBit = false;
1787 packet_->seqNum = seq_num_;
1788 packet_->timestamp = timestamp_;
1789
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001790 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001791 EXPECT_EQ(kIncomplete,
1792 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001793
1794 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 EXPECT_TRUE(frame_out == NULL);
1796
1797 seq_num_++;
1798 packet_->isFirstPacket = false;
1799 packet_->markerBit = true;
1800 packet_->seqNum = seq_num_;
1801
philipel9d3ab612015-12-21 04:12:39 -08001802 EXPECT_EQ(kCompleteSession,
1803 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001804
1805 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001806 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001807 jitter_buffer_->ReleaseFrame(frame_out);
1808
1809 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001810 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811 packet_->frameType = kVideoFrameDelta;
1812 packet_->isFirstPacket = true;
1813 packet_->markerBit = false;
1814 packet_->seqNum = seq_num_;
1815 packet_->timestamp = timestamp_;
1816
philipel9d3ab612015-12-21 04:12:39 -08001817 EXPECT_EQ(kIncomplete,
1818 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001819
1820 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001821 EXPECT_TRUE(frame_out == NULL);
1822
1823 seq_num_++;
1824 packet_->isFirstPacket = false;
1825 packet_->markerBit = true;
1826 packet_->seqNum = seq_num_;
1827
philipel9d3ab612015-12-21 04:12:39 -08001828 EXPECT_EQ(kCompleteSession,
1829 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001830
1831 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001832 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001833 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001834 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001835}
1836
philipel85130292016-07-06 16:10:31 +02001837TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 // ------- -------
1839 // | 1 | | 2 |
1840 // ------- -------
1841 // t = 0xffffff00 t = 2700
1842
1843 timestamp_ = 0xffffff00;
1844 packet_->frameType = kVideoFrameKey;
1845 packet_->isFirstPacket = true;
1846 packet_->markerBit = true;
1847 packet_->timestamp = timestamp_;
1848
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001849 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001850 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001851 EXPECT_EQ(kCompleteSession,
1852 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001853
1854 // Insert next frame.
1855 seq_num_++;
1856 timestamp_ = 2700;
1857 packet_->frameType = kVideoFrameDelta;
1858 packet_->isFirstPacket = true;
1859 packet_->markerBit = true;
1860 packet_->seqNum = seq_num_;
1861 packet_->timestamp = timestamp_;
1862
philipel9d3ab612015-12-21 04:12:39 -08001863 EXPECT_EQ(kCompleteSession,
1864 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001865
1866 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1867 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001868 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001870 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001871
1872 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1873 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001874 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001875 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001876 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001877}
1878
philipel85130292016-07-06 16:10:31 +02001879TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001880 // ------- -------
1881 // | 2 | | 1 |
1882 // ------- -------
1883 // t = 2700 t = 0xffffff00
1884
1885 seq_num_ = 2;
1886 timestamp_ = 2700;
1887 packet_->frameType = kVideoFrameDelta;
1888 packet_->isFirstPacket = true;
1889 packet_->markerBit = true;
1890 packet_->seqNum = seq_num_;
1891 packet_->timestamp = timestamp_;
1892
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001893 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001894 EXPECT_EQ(kCompleteSession,
1895 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001896
1897 // Insert second frame
1898 seq_num_--;
1899 timestamp_ = 0xffffff00;
1900 packet_->frameType = kVideoFrameKey;
1901 packet_->isFirstPacket = true;
1902 packet_->markerBit = true;
1903 packet_->seqNum = seq_num_;
1904 packet_->timestamp = timestamp_;
1905
philipel9d3ab612015-12-21 04:12:39 -08001906 EXPECT_EQ(kCompleteSession,
1907 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001908
1909 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1910 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001911 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001913 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001914
1915 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1916 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001917 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001918 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001919 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920}
1921
philipel85130292016-07-06 16:10:31 +02001922TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001923 int loop = 0;
1924 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001925 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001926 // Insert kMaxPacketsInJitterBuffer into frame.
1927 do {
1928 seq_num_++;
1929 packet_->isFirstPacket = false;
1930 packet_->markerBit = false;
1931 packet_->seqNum = seq_num_;
1932
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001933 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001934 EXPECT_EQ(kIncomplete,
1935 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001936 firstPacket = false;
1937 } else {
philipel9d3ab612015-12-21 04:12:39 -08001938 EXPECT_EQ(kIncomplete,
1939 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001940 }
1941
1942 loop++;
1943 } while (loop < kMaxPacketsInSession);
1944
1945 // Max number of packets inserted.
1946 // Insert one more packet.
1947 seq_num_++;
1948 packet_->isFirstPacket = false;
1949 packet_->markerBit = true;
1950 packet_->seqNum = seq_num_;
1951
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001952 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001953 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001954 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001955}
1956
philipel85130292016-07-06 16:10:31 +02001957TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001958 // TEST fill JB with more than max number of frame (50 delta frames +
1959 // 51 key frames) with wrap in seq_num_
1960 //
1961 // --------------------------------------------------------------
1962 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1963 // --------------------------------------------------------------
1964 // |<-----------delta frames------------->|<------key frames----->|
1965
jbauchdb81ffd2015-11-23 03:59:02 -08001966 // Make sure the jitter doesn't request a keyframe after too much non-
1967 // decodable frames.
1968 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001969 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001970
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001971 int loop = 0;
1972 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001973 uint32_t first_key_frame_timestamp = 0;
1974 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001975 // Insert MAX_NUMBER_OF_FRAMES frames.
1976 do {
philipel9d3ab612015-12-21 04:12:39 -08001977 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001978 seq_num_++;
1979 packet_->isFirstPacket = true;
1980 packet_->markerBit = true;
1981 packet_->seqNum = seq_num_;
1982 packet_->timestamp = timestamp_;
1983
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001984 if (loop == 50) {
1985 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001986 packet_->frameType = kVideoFrameKey;
1987 }
1988
1989 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001990 EXPECT_EQ(kCompleteSession,
1991 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001992
1993 loop++;
1994 } while (loop < kMaxNumberOfFrames);
1995
1996 // Max number of frames inserted.
1997
1998 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001999 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002000 seq_num_++;
2001 packet_->isFirstPacket = true;
2002 packet_->markerBit = true;
2003 packet_->seqNum = seq_num_;
2004 packet_->timestamp = timestamp_;
2005
2006 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002007 EXPECT_EQ(kFlushIndicator,
2008 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002009
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002010 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2011 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002012 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002013 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002014 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002015}
2016
philipel85130292016-07-06 16:10:31 +02002017TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002018 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002019 seq_num_ = 3;
2020 // Insert one empty packet per frame, should never return the last timestamp
2021 // inserted. Only return empty frames in the presence of subsequent frames.
2022 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002023 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002024 for (int i = 0; i < maxSize + 10; i++) {
2025 timestamp_ += 33 * 90;
2026 seq_num_++;
2027 packet_->isFirstPacket = false;
2028 packet_->markerBit = false;
2029 packet_->seqNum = seq_num_;
2030 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002031 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002032
philipel9d3ab612015-12-21 04:12:39 -08002033 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002034 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2035 // Timestamp should never be the last TS inserted.
2036 if (testFrame != NULL) {
2037 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002038 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002039 }
2040 }
2041}
2042
philipel85130292016-07-06 16:10:31 +02002043TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002044 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002045 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002046 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002047 timestamp_ += 33 * 90;
2048 int insertedLength = 0;
2049 packet_->seqNum = seq_num_;
2050 packet_->timestamp = timestamp_;
2051 packet_->frameType = kVideoFrameKey;
2052 packet_->isFirstPacket = true;
2053 packet_->completeNALU = kNaluStart;
2054 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002055 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002056
philipel9d3ab612015-12-21 04:12:39 -08002057 EXPECT_EQ(kDecodableSession,
2058 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002059
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002060 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002061 packet_->seqNum = seq_num_;
2062 packet_->frameType = kVideoFrameKey;
2063 packet_->isFirstPacket = false;
2064 packet_->completeNALU = kNaluIncomplete;
2065 packet_->markerBit = false;
2066
philipel9d3ab612015-12-21 04:12:39 -08002067 EXPECT_EQ(kDecodableSession,
2068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069
2070 seq_num_++;
2071 packet_->seqNum = seq_num_;
2072 packet_->frameType = kVideoFrameKey;
2073 packet_->isFirstPacket = false;
2074 packet_->completeNALU = kNaluEnd;
2075 packet_->markerBit = false;
2076
philipel9d3ab612015-12-21 04:12:39 -08002077 EXPECT_EQ(kDecodableSession,
2078 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002079
2080 seq_num_++;
2081 packet_->seqNum = seq_num_;
2082 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002083 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002084 EXPECT_EQ(kDecodableSession,
2085 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002086 // The JB will only output (incomplete) frames if a packet belonging to a
2087 // subsequent frame was already inserted. Insert one packet of a subsequent
2088 // frame. place high timestamp so the JB would always have a next frame
2089 // (otherwise, for every inserted frame we need to take care of the next
2090 // frame as well).
2091 packet_->seqNum = 1;
2092 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2093 packet_->frameType = kVideoFrameDelta;
2094 packet_->isFirstPacket = false;
2095 packet_->completeNALU = kNaluStart;
2096 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002097
philipel9d3ab612015-12-21 04:12:39 -08002098 EXPECT_EQ(kDecodableSession,
2099 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002100
2101 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2102
2103 // We can decode everything from a NALU until a packet has been lost.
2104 // Thus we can decode the first packet of the first NALU and the second NALU
2105 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002106 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002107 jitter_buffer_->ReleaseFrame(frame_out);
2108
2109 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002110 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002111 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002112 insertedLength = 0;
2113
2114 packet_->seqNum = seq_num_;
2115 packet_->timestamp = timestamp_;
2116 packet_->frameType = kVideoFrameKey;
2117 packet_->isFirstPacket = false;
2118 packet_->completeNALU = kNaluEnd;
2119 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002120 EXPECT_EQ(kDecodableSession,
2121 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2122 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002123 seq_num_--;
2124 packet_->seqNum = seq_num_;
2125 packet_->timestamp = timestamp_;
2126 packet_->frameType = kVideoFrameKey;
2127 packet_->isFirstPacket = true;
2128 packet_->completeNALU = kNaluStart;
2129 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002130
philipel9d3ab612015-12-21 04:12:39 -08002131 EXPECT_EQ(kDecodableSession,
2132 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002133 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2134
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002135 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002136 packet_->seqNum = seq_num_;
2137 packet_->timestamp = timestamp_;
2138 packet_->frameType = kVideoFrameKey;
2139 packet_->isFirstPacket = false;
2140 packet_->completeNALU = kNaluComplete;
2141 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002142 EXPECT_EQ(kDecodableSession,
2143 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002144 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002145 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002146 packet_->seqNum = seq_num_;
2147 packet_->timestamp = timestamp_;
2148 packet_->frameType = kVideoFrameKey;
2149 packet_->isFirstPacket = false;
2150 packet_->completeNALU = kNaluStart;
2151 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002152 EXPECT_EQ(kDecodableSession,
2153 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154 // This packet should be decoded since it's the beginning of a NAL.
2155 insertedLength += packet_->sizeBytes;
2156
2157 seq_num_ += 2;
2158 packet_->seqNum = seq_num_;
2159 packet_->timestamp = timestamp_;
2160 packet_->frameType = kVideoFrameKey;
2161 packet_->isFirstPacket = false;
2162 packet_->completeNALU = kNaluEnd;
2163 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002164 EXPECT_EQ(kDecodableSession,
2165 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002166 // This packet should not be decoded because it is an incomplete NAL if it
2167 // is the last.
2168 frame_out = DecodeIncompleteFrame();
2169 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002170 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002171 jitter_buffer_->ReleaseFrame(frame_out);
2172
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002173 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002174 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002175 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002176 WebRtcRTPHeader rtpHeader;
2177 memset(&rtpHeader, 0, sizeof(rtpHeader));
2178 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002179 emptypacket.seqNum = seq_num_;
2180 emptypacket.timestamp = timestamp_;
2181 emptypacket.frameType = kVideoFrameKey;
2182 emptypacket.isFirstPacket = true;
2183 emptypacket.completeNALU = kNaluComplete;
2184 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002185 EXPECT_EQ(kCompleteSession,
2186 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002187 // This packet should not be decoded because it is an incomplete NAL if it
2188 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002189
2190 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2191 // has arrived.
2192 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002193 EXPECT_TRUE(frame_out != NULL);
2194 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002195
2196 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002197 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002198 timestamp_ += 33 * 90;
2199
2200 packet_->seqNum = seq_num_;
2201 packet_->timestamp = timestamp_;
2202 packet_->frameType = kVideoFrameKey;
2203 packet_->isFirstPacket = true;
2204 packet_->completeNALU = kNaluComplete;
2205 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002206
philipel9d3ab612015-12-21 04:12:39 -08002207 EXPECT_EQ(kDecodableSession,
2208 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002209
agalusza@google.comd177c102013-08-08 01:12:33 +00002210 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002211 emptypacket.seqNum = seq_num_;
2212 emptypacket.timestamp = timestamp_;
2213 emptypacket.frameType = kVideoFrameKey;
2214 emptypacket.isFirstPacket = true;
2215 emptypacket.completeNALU = kNaluComplete;
2216 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002217 EXPECT_EQ(kCompleteSession,
2218 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002219
2220 frame_out = DecodeCompleteFrame();
2221 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002222 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002223 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002224}
2225
philipel85130292016-07-06 16:10:31 +02002226TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002227 // Test that a we cannot get incomplete frames from the JB if we haven't
2228 // received the marker bit, unless we have received a packet from a later
2229 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002230 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002231 // Start with a complete key frame - insert and decode.
2232 packet_->frameType = kVideoFrameKey;
2233 packet_->isFirstPacket = true;
2234 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002235 bool retransmitted = false;
2236
philipel9d3ab612015-12-21 04:12:39 -08002237 EXPECT_EQ(kCompleteSession,
2238 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002239 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2240 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002241 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002242
2243 packet_->seqNum += 2;
2244 packet_->timestamp += 33 * 90;
2245 packet_->frameType = kVideoFrameDelta;
2246 packet_->isFirstPacket = false;
2247 packet_->markerBit = false;
2248
philipel9d3ab612015-12-21 04:12:39 -08002249 EXPECT_EQ(kDecodableSession,
2250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002251
2252 frame_out = DecodeIncompleteFrame();
2253 EXPECT_TRUE(frame_out == NULL);
2254
2255 packet_->seqNum += 2;
2256 packet_->timestamp += 33 * 90;
2257 packet_->isFirstPacket = true;
2258
philipel9d3ab612015-12-21 04:12:39 -08002259 EXPECT_EQ(kDecodableSession,
2260 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002261
2262 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002263 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002264 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002265}
2266
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002267TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002268 // Make sure the jitter doesn't request a keyframe after too much non-
2269 // decodable frames.
2270 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002271 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002272 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002273 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002274 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002275 DropFrame(1);
2276 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002277 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002278 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002279 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002280 // This frame will make the jitter buffer recycle frames until a key frame.
2281 // Since none is found it will have to wait until the next key frame before
2282 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002283 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002284 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002285}
2286
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002287TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002288 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002289 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002290 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002291 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002292 // Insert empty packet.
2293 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002294 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002295 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002296 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002297 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002298 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002299 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002300 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002301 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002302 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002303 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002304 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002305}
2306
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002307TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002308 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2309 EXPECT_EQ(0, frame_stats.delta_frames);
2310 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002311
2312 uint32_t framerate = 0;
2313 uint32_t bitrate = 0;
2314 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2315 EXPECT_EQ(0u, framerate);
2316 EXPECT_EQ(0u, bitrate);
2317
2318 // Insert a couple of key and delta frames.
2319 InsertFrame(kVideoFrameKey);
2320 InsertFrame(kVideoFrameDelta);
2321 InsertFrame(kVideoFrameDelta);
2322 InsertFrame(kVideoFrameKey);
2323 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002324 // Decode some of them to make sure the statistics doesn't depend on frames
2325 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002326 EXPECT_TRUE(DecodeCompleteFrame());
2327 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002328 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002329 EXPECT_EQ(3, frame_stats.delta_frames);
2330 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002331
2332 // Insert 20 more frames to get estimates of bitrate and framerate over
2333 // 1 second.
2334 for (int i = 0; i < 20; ++i) {
2335 InsertFrame(kVideoFrameDelta);
2336 }
2337 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2338 // TODO(holmer): The current implementation returns the average of the last
2339 // two framerate calculations, which is why it takes two calls to reach the
2340 // actual framerate. This should be fixed.
2341 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2342 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2343 // Insert 25 more frames to get estimates of bitrate and framerate over
2344 // 2 seconds.
2345 for (int i = 0; i < 25; ++i) {
2346 InsertFrame(kVideoFrameDelta);
2347 }
2348 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2349 EXPECT_EQ(kDefaultFrameRate, framerate);
2350 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2351}
2352
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002353TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2354 // Insert delta frames.
2355 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2356 // Can't decode without a key frame.
2357 EXPECT_FALSE(DecodeCompleteFrame());
2358 InsertFrame(kVideoFrameKey);
2359 // Skip to the next key frame.
2360 EXPECT_TRUE(DecodeCompleteFrame());
2361}
2362
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002363TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2364 InsertFrame(kVideoFrameKey);
2365 EXPECT_TRUE(DecodeCompleteFrame());
2366 const int kNumDeltaFrames = 5;
2367 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2368 InsertFrame(kVideoFrameKey);
2369 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2370 EXPECT_TRUE(DecodeCompleteFrame());
2371 }
2372}
2373
2374TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2375 InsertFrame(kVideoFrameKey);
2376 EXPECT_TRUE(DecodeCompleteFrame());
2377 const int kNumDeltaFrames = 5;
2378 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2379 InsertFrame(kVideoFrameKey);
2380 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2381 InsertFrame(kVideoFrameKey);
2382 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2383 EXPECT_TRUE(DecodeCompleteFrame());
2384 }
2385}
2386
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002387TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2388 InsertFrame(kVideoFrameKey);
2389 EXPECT_TRUE(DecodeCompleteFrame());
2390 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2391 clock_->TimeInMilliseconds());
2392 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2393 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2394 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002395 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002396 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2397 EXPECT_FALSE(DecodeCompleteFrame());
2398 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2399 EXPECT_TRUE(DecodeCompleteFrame());
2400 EXPECT_TRUE(DecodeCompleteFrame());
2401}
2402
philipel85130292016-07-06 16:10:31 +02002403TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002404 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002405 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002406 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002407 InsertFrame(kVideoFrameKey);
2408 EXPECT_TRUE(DecodeCompleteFrame());
2409}
2410
philipel85130292016-07-06 16:10:31 +02002411TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002412 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002413 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002414 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002415
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002416 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2417 // old packet.
2418 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002419 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002420 EXPECT_EQ(kFlushIndicator,
2421 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002422 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002423
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002424 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002425 std::vector<uint16_t> nack_list =
2426 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002427 // No key frame will be requested since the jitter buffer is empty.
2428 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002429 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002430
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002431 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002432 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002433 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002434 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002435
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002436 // The next complete continuous frame isn't a key frame, but we're waiting
2437 // for one.
2438 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002439 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002440 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002441 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002442}
2443
philipel85130292016-07-06 16:10:31 +02002444TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002445 // Insert a key frame and decode it.
2446 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2447 EXPECT_TRUE(DecodeCompleteFrame());
2448
2449 // Insert a frame which should trigger a recycle until the next key frame.
2450 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2451
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002452 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002453 std::vector<uint16_t> nack_list =
2454 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002455 // Verify that the jitter buffer does not request a key frame.
2456 EXPECT_FALSE(request_key_frame);
2457 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002458 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002459 // Verify that we can decode the next frame.
2460 EXPECT_TRUE(DecodeCompleteFrame());
2461}
2462
philipel85130292016-07-06 16:10:31 +02002463TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002464 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002465 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002466 EXPECT_TRUE(DecodeCompleteFrame());
2467
2468 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002469 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002470 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002471 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002472 EXPECT_FALSE(DecodeCompleteFrame());
2473
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002474 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002475 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002476 // The jitter buffer is empty, so we won't request key frames until we get a
2477 // packet.
2478 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002479
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002480 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002481 // Now we have a packet in the jitter buffer, a key frame will be requested
2482 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002483 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002484 // The jitter buffer is empty, so we won't request key frames until we get a
2485 // packet.
2486 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002487 // The next complete continuous frame isn't a key frame, but we're waiting
2488 // for one.
2489 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002490 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002491 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002492 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002493 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002494}
2495
philipel85130292016-07-06 16:10:31 +02002496TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002497 DropFrame(10);
2498 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002499 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002500 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002501 std::vector<uint16_t> nack_list =
2502 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002503 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002504 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002505 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002506}
2507
philipel85130292016-07-06 16:10:31 +02002508TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002509 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002510 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002511 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002512 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002513 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002514 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002515 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002516 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002517 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002518 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002519}
2520
philipel85130292016-07-06 16:10:31 +02002521TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002522 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002523 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2524 clock_->TimeInMilliseconds());
2525 VCMPacket packet;
2526 stream_generator_->PopPacket(&packet, 0);
2527 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002528 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002529 EXPECT_FALSE(retransmitted);
2530 // Drop second packet.
2531 stream_generator_->PopPacket(&packet, 1);
2532 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2533 EXPECT_FALSE(retransmitted);
2534 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002535 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002536 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002537 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002538 EXPECT_EQ(1u, nack_list.size());
2539 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002540 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002541 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002542 EXPECT_EQ(kCompleteSession,
2543 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002544 EXPECT_TRUE(retransmitted);
2545 EXPECT_TRUE(DecodeCompleteFrame());
2546}
2547
philipel85130292016-07-06 16:10:31 +02002548TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002549 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002550 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002551 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002552 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002553 // Drop second packet.
2554 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2555 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002556 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002557 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002558 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002559 ASSERT_EQ(1u, nack_list.size());
2560 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002561 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002562 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002563 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002564}
2565
philipel85130292016-07-06 16:10:31 +02002566TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002567 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002568 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002569 // First frame is delta.
2570 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2571 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002572 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002573 // Drop second packet in frame.
2574 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2575 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2576 // Second frame is key.
2577 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2578 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002579 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002580 // Drop second packet in frame.
2581 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2582 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002583 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002584 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002585 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002586 ASSERT_EQ(1u, nack_list.size());
2587 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002588 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002589 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002590}
2591
philipel85130292016-07-06 16:10:31 +02002592TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002593 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002594 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002595
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002596 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002597 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002598
2599 // ----------------------------------------------------------------
2600 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2601 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002602 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002603 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002604 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002605 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002606 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002607 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002608 while (stream_generator_->PacketsRemaining() > 1) {
2609 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002610 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002611 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002612 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002613 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002614 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002615 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002616 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002617 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002618 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002619 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002620
2621 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002622 std::vector<uint16_t> nack_list =
2623 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002624 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002625 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002626 for (size_t i = 0; i < nack_list.size(); ++i)
2627 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002628}
2629
philipel85130292016-07-06 16:10:31 +02002630TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002631 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002632 // ------- ------------------------------------------------------------
2633 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2634 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002635 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002636 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002637 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002638 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002639 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002640 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002641 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002642 while (stream_generator_->PacketsRemaining() > 1) {
2643 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002644 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002645 EXPECT_FALSE(request_key_frame);
2646 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002647 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002648 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002649 }
2650 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002651 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002652 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002653 EXPECT_FALSE(DecodeCompleteFrame());
2654 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002655 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002656 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002657 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002658 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002659 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2660 for (size_t i = 0; i < nack_list.size(); ++i)
2661 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002662}
2663
philipel85130292016-07-06 16:10:31 +02002664TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002665 bool request_key_frame = false;
2666 // -----------------------------------
2667 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2668 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002669 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002670 InsertFrame(kVideoFrameKey);
2671 EXPECT_FALSE(request_key_frame);
2672 EXPECT_TRUE(DecodeCompleteFrame());
2673 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2674 clock_->TimeInMilliseconds());
2675 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2676 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002677 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002678 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002679 EXPECT_FALSE(request_key_frame);
2680 } else {
2681 stream_generator_->NextPacket(NULL); // Drop packet
2682 }
2683 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2684 clock_->TimeInMilliseconds());
2685 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2686 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002687 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002688 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002689 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002690 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002691 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002692 ASSERT_EQ(1u, nack_list.size());
2693 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002694}
2695
philipel85130292016-07-06 16:10:31 +02002696TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002697 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002698 InsertFrame(kVideoFrameKey);
2699 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002700 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002701 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2702 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002703
2704 // Far-into-the-future video frame, could be caused by resetting the encoder
2705 // or otherwise restarting. This should not fail when error when the packet is
2706 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002707 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002708 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2709 InsertFrame(kVideoFrameKey);
2710 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002711 nack_list = jitter_buffer_->GetNackList(&extended);
2712 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002713
2714 // Stream should be decodable from this point.
2715 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2716 InsertFrame(kVideoFrameDelta);
2717 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002718 nack_list = jitter_buffer_->GetNackList(&extended);
2719 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002720}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002721} // namespace webrtc