blob: 451dcf5203d86ed12e7efcc4de7071e8c800cd41 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
23#include "modules/video_coding/test/test_util.h"
24#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
28#include "system_wrappers/include/metrics_default.h"
29#include "test/field_trial.h"
30#include "test/gmock.h"
31#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000032
33namespace webrtc {
34
asapersson9a4cd872015-10-23 00:27:14 -070035namespace {
philipel9d3ab612015-12-21 04:12:39 -080036const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070037} // namespace
38
39class Vp9SsMapTest : public ::testing::Test {
40 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020041 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070042
43 virtual void SetUp() {
johan0d1b2b62017-01-10 04:21:35 -080044 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
51 packet_.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -070052 packet_.video_header.codec = kRtpVideoVp9;
53 packet_.video_header.codecHeader.VP9.flexible_mode = false;
54 packet_.video_header.codecHeader.VP9.gof_idx = 0;
55 packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
56 packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
57 packet_.video_header.codecHeader.VP9.ss_data_available = true;
58 packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -070072 packet_.video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070073 EXPECT_FALSE(map_.Insert(packet_));
74}
75
76TEST_F(Vp9SsMapTest, Find) {
77 EXPECT_TRUE(map_.Insert(packet_));
78 Vp9SsMap::SsMap::iterator it;
79 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
80 EXPECT_EQ(packet_.timestamp, it->first);
81}
82
83TEST_F(Vp9SsMapTest, Find_WithWrap) {
84 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
85 const uint32_t kSsTimestamp2 = 100;
86 packet_.timestamp = kSsTimestamp1;
87 EXPECT_TRUE(map_.Insert(packet_));
88 packet_.timestamp = kSsTimestamp2;
89 EXPECT_TRUE(map_.Insert(packet_));
90 Vp9SsMap::SsMap::iterator it;
91 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
92 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
93 EXPECT_EQ(kSsTimestamp1, it->first);
94 EXPECT_TRUE(map_.Find(0, &it));
95 EXPECT_EQ(kSsTimestamp1, it->first);
96 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
97 EXPECT_EQ(kSsTimestamp1, it->first);
98 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
99 EXPECT_EQ(kSsTimestamp2, it->first);
100 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
101 EXPECT_EQ(kSsTimestamp2, it->first);
102}
103
104TEST_F(Vp9SsMapTest, Reset) {
105 EXPECT_TRUE(map_.Insert(packet_));
106 Vp9SsMap::SsMap::iterator it;
107 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
108 EXPECT_EQ(packet_.timestamp, it->first);
109
110 map_.Reset();
111 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
112}
113
114TEST_F(Vp9SsMapTest, RemoveOld) {
115 Vp9SsMap::SsMap::iterator it;
116 const uint32_t kSsTimestamp1 = 10000;
117 packet_.timestamp = kSsTimestamp1;
118 EXPECT_TRUE(map_.Insert(packet_));
119
120 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
121 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
122 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
123
124 map_.RemoveOld(kTimestamp);
125 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
126 EXPECT_TRUE(map_.Find(kTimestamp, &it));
127 EXPECT_EQ(kTimestamp, it->first);
128}
129
130TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
131 Vp9SsMap::SsMap::iterator it;
132 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
133 const uint32_t kSsTimestamp2 = 10;
134 const uint32_t kSsTimestamp3 = 1000;
135 packet_.timestamp = kSsTimestamp1;
136 EXPECT_TRUE(map_.Insert(packet_));
137 packet_.timestamp = kSsTimestamp2;
138 EXPECT_TRUE(map_.Insert(packet_));
139 packet_.timestamp = kSsTimestamp3;
140 EXPECT_TRUE(map_.Insert(packet_));
141
142 map_.RemoveOld(kSsTimestamp3);
143 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
144 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
145 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
146}
147
148TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -0700149 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700150 EXPECT_FALSE(map_.UpdatePacket(&packet_));
151}
152
153TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
154 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700155 packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700156 EXPECT_FALSE(map_.UpdatePacket(&packet_));
157}
158
159TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
160 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700161 packet_.video_header.codecHeader.VP9.gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700162 EXPECT_FALSE(map_.UpdatePacket(&packet_));
163}
164
165TEST_F(Vp9SsMapTest, UpdatePacket) {
166 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
167
isheriff6b4b5f32016-06-08 00:24:21 -0700168 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700169 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700170 EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
171 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
172 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
173 EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700174
isheriff6b4b5f32016-06-08 00:24:21 -0700175 packet_.video_header.codecHeader.VP9.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700177 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
178 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
179 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
180 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700181
isheriff6b4b5f32016-06-08 00:24:21 -0700182 packet_.video_header.codecHeader.VP9.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700184 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.temporal_idx);
185 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
186 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
187 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700188
isheriff6b4b5f32016-06-08 00:24:21 -0700189 packet_.video_header.codecHeader.VP9.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700190 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700191 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
192 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
193 EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
194 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
195 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
asapersson9a4cd872015-10-23 00:27:14 -0700196}
197
philipel83f831a2016-03-12 03:30:23 -0800198class ProcessThreadMock : public ProcessThread {
199 public:
200 MOCK_METHOD0(Start, void());
201 MOCK_METHOD0(Stop, void());
202 MOCK_METHOD1(WakeUp, void(Module* module));
tommidea489f2017-03-03 03:20:24 -0800203 MOCK_METHOD2(RegisterModule, void(Module* module, const rtc::Location&));
philipel83f831a2016-03-12 03:30:23 -0800204 MOCK_METHOD1(DeRegisterModule, void(Module* module));
tommi435f98b2016-05-28 14:57:15 -0700205 void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
philipel83f831a2016-03-12 03:30:23 -0800206};
207
208class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
209 public NackSender,
210 public KeyFrameRequestSender {
211 public:
212 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
213 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
214 sequence_numbers.end());
215 }
216
217 void RequestKeyFrame() override { ++keyframe_requests_; }
218
219 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
220 std::vector<uint16_t> nack_sent_;
221 int keyframe_requests_;
222
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 protected:
philipel85130292016-07-06 16:10:31 +0200224 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700225 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000226 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700227 jitter_buffer_.reset(new VCMJitterBuffer(
228 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800229 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
230 this,
231 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000232 jitter_buffer_->Start();
233 seq_num_ = 1234;
234 timestamp_ = 0;
235 size_ = 1400;
236 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
237 data_[0] = 0;
238 data_[1] = 0;
239 data_[2] = 0x80;
240 int count = 3;
241 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
242 data_[i] = count;
243 count++;
244 if (count == 10) {
245 data_[i + 1] = 0;
246 data_[i + 2] = 0;
247 data_[i + 3] = 0x80;
248 count = 3;
249 i += 3;
250 }
251 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200252 WebRtcRTPHeader rtpHeader;
253 memset(&rtpHeader, 0, sizeof(rtpHeader));
254 rtpHeader.header.sequenceNumber = seq_num_;
255 rtpHeader.header.timestamp = timestamp_;
256 rtpHeader.header.markerBit = true;
257 rtpHeader.frameType = kVideoFrameDelta;
258 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000259 }
260
261 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700262 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000263 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700264 return nullptr;
265 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000266 }
267
268 VCMEncodedFrame* DecodeIncompleteFrame() {
269 uint32_t timestamp = 0;
270 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
271 if (!found_frame)
272 return NULL;
273 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
274 return frame;
275 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000276
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000277 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800278 unsigned int size,
279 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000280 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000281
282 const uint8_t* outData = frame_out->Buffer();
283 unsigned int i = 0;
284
285 if (startCode) {
286 EXPECT_EQ(0, outData[0]);
287 EXPECT_EQ(0, outData[1]);
288 EXPECT_EQ(0, outData[2]);
289 EXPECT_EQ(1, outData[3]);
290 i += 4;
291 }
292
293 EXPECT_EQ(size, frame_out->Length());
294 int count = 3;
295 for (; i < size; i++) {
296 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
297 i += 2;
298 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
299 EXPECT_EQ(0, outData[0]);
300 EXPECT_EQ(0, outData[1]);
301 EXPECT_EQ(0, outData[2]);
302 EXPECT_EQ(1, outData[3]);
303 i += 3;
304 } else {
305 EXPECT_EQ(count, outData[i]);
306 count++;
307 if (count == 10) {
308 count = 3;
309 }
310 }
311 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000312 }
313
314 uint16_t seq_num_;
315 uint32_t timestamp_;
316 int size_;
317 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800318 std::unique_ptr<VCMPacket> packet_;
319 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000320 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800321 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000322};
323
philipel83f831a2016-03-12 03:30:23 -0800324class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
325 public NackSender,
326 public KeyFrameRequestSender {
327 public:
328 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
329 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
330 sequence_numbers.end());
331 }
332
333 void RequestKeyFrame() { ++keyframe_requests_; }
334
335 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
336 std::vector<uint16_t> nack_sent_;
337 int keyframe_requests_;
338
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000339 protected:
340 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000341
342 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000343 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000344 max_nack_list_size_ = 150;
345 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700346 jitter_buffer_ = new VCMJitterBuffer(
347 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800348 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
349 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700350 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000351 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800352 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
353 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000354 memset(data_buffer_, 0, kDataBufferSize);
355 }
356
357 virtual void TearDown() {
358 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000359 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000360 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000361 }
362
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000363 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000364 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000365 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000366 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000367 EXPECT_TRUE(packet_available);
368 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000369 return kGeneralError; // Return here to avoid crashes below.
370 bool retransmitted = false;
371 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000372 }
373
374 VCMFrameBufferEnum InsertPacket(int index) {
375 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000376 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000377 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000378 EXPECT_TRUE(packet_available);
379 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000380 return kGeneralError; // Return here to avoid crashes below.
381 bool retransmitted = false;
382 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000383 }
384
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700386 stream_generator_->GenerateFrame(
387 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
388 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000389 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000390 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000391 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 }
393
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000394 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
395 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000396 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000397 VCMFrameBufferEnum ret = InsertFrame(frame_type);
398 if (ret < kNoError) {
399 ret_for_all = ret;
400 } else if (ret_for_all >= kNoError) {
401 ret_for_all = ret;
402 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000403 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000404 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000405 }
406
407 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000408 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000409 clock_->TimeInMilliseconds());
410 for (int i = 0; i < num_packets; ++i)
411 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000412 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000413 }
414
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000415 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700416 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000417 if (!found_frame)
418 return false;
419
isheriff6b4b5f32016-06-08 00:24:21 -0700420 VCMEncodedFrame* frame =
421 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000422 bool ret = (frame != NULL);
423 jitter_buffer_->ReleaseFrame(frame);
424 return ret;
425 }
426
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000427 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000428 uint32_t timestamp = 0;
429 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
430 if (!found_frame)
431 return false;
432 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000433 bool ret = (frame != NULL);
434 jitter_buffer_->ReleaseFrame(frame);
435 return ret;
436 }
437
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000438 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000439 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800440 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000441 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000442 size_t max_nack_list_size_;
443 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444 uint8_t data_buffer_[kDataBufferSize];
445};
446
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000447class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000448 protected:
philipel85130292016-07-06 16:10:31 +0200449 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000450 virtual void SetUp() {
451 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000452 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000453 }
454
philipel9d3ab612015-12-21 04:12:39 -0800455 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000456};
457
philipel85130292016-07-06 16:10:31 +0200458TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000459 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460 EXPECT_TRUE(NULL == DecodeCompleteFrame());
461 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
462 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000463 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000464 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000465
466 // No packets inserted.
467 EXPECT_TRUE(NULL == DecodeCompleteFrame());
468 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
469
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000470 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000471 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000472
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000473 // No packets inserted.
474 EXPECT_TRUE(NULL == DecodeCompleteFrame());
475 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
476}
477
philipel85130292016-07-06 16:10:31 +0200478TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000479 // Always start with a complete key frame when not allowing errors.
480 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800482 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000483 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000484 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000485
486 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000487 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800488 EXPECT_EQ(kCompleteSession,
489 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000490 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000491 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000492 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000493 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000494}
495
philipel85130292016-07-06 16:10:31 +0200496TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700497 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200498 // Always start with a complete key frame when not allowing errors.
499 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
500 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800501 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200502 packet_->markerBit = true;
503 packet_->timestamp += 123 * 90;
504
505 // Insert single packet frame to the jitter buffer and get a frame.
506 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800507 EXPECT_EQ(kCompleteSession,
508 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200509 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
510 CheckOutFrame(frame_out, size_, false);
511 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
512 jitter_buffer_->ReleaseFrame(frame_out);
513
514 // Verify that histograms are updated when the jitter buffer is stopped.
515 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
516 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700517 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
518 EXPECT_EQ(1,
519 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800520 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700521 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800522 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700523 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200524
525 // Verify that histograms are not updated if stop is called again.
526 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700527 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
528 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800529 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700530 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
531 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200532}
533
philipel85130292016-07-06 16:10:31 +0200534TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000535 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800536 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537 packet_->markerBit = false;
538
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000539 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800540 EXPECT_EQ(kIncomplete,
541 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000542 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
543 // Should not be complete.
544 EXPECT_TRUE(frame_out == NULL);
545
546 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800547 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000548 packet_->markerBit = true;
549 packet_->seqNum = seq_num_;
550
philipel9d3ab612015-12-21 04:12:39 -0800551 EXPECT_EQ(kCompleteSession,
552 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553
554 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000555 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000556
557 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000558 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000559}
560
philipel85130292016-07-06 16:10:31 +0200561TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000562 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800563 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000565
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000566 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800567 EXPECT_EQ(kIncomplete,
568 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000569
570 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
571
572 // Frame should not be complete.
573 EXPECT_TRUE(frame_out == NULL);
574
575 // Insert 98 frames.
576 int loop = 0;
577 do {
578 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800579 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000580 packet_->markerBit = false;
581 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000582
philipel9d3ab612015-12-21 04:12:39 -0800583 EXPECT_EQ(kIncomplete,
584 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000585 loop++;
586 } while (loop < 98);
587
588 // Insert last packet.
589 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800590 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000591 packet_->markerBit = true;
592 packet_->seqNum = seq_num_;
593
philipel9d3ab612015-12-21 04:12:39 -0800594 EXPECT_EQ(kCompleteSession,
595 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596
597 frame_out = DecodeCompleteFrame();
598
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000599 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000600 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000601 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602}
603
philipel85130292016-07-06 16:10:31 +0200604TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000605 // Always start with a complete key frame.
606 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800607 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608 packet_->markerBit = true;
609
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000610 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800611 EXPECT_EQ(kCompleteSession,
612 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
614 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000615 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000616
617 ++seq_num_;
618 packet_->seqNum = seq_num_;
619 packet_->markerBit = false;
620 packet_->frameType = kVideoFrameDelta;
621 packet_->timestamp += 33 * 90;
622
philipel9d3ab612015-12-21 04:12:39 -0800623 EXPECT_EQ(kIncomplete,
624 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000625
626 frame_out = DecodeCompleteFrame();
627
628 // Frame should not be complete.
629 EXPECT_TRUE(frame_out == NULL);
630
johan0d1b2b62017-01-10 04:21:35 -0800631 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000632 // Insert 98 frames.
633 int loop = 0;
634 do {
635 ++seq_num_;
636 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000637
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000638 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800639 EXPECT_EQ(kIncomplete,
640 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000641 loop++;
642 } while (loop < 98);
643
644 // Insert the last packet.
645 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800646 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000647 packet_->markerBit = true;
648 packet_->seqNum = seq_num_;
649
philipel9d3ab612015-12-21 04:12:39 -0800650 EXPECT_EQ(kCompleteSession,
651 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000652
653 frame_out = DecodeCompleteFrame();
654
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000655 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000656 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000657 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000658}
659
philipel85130292016-07-06 16:10:31 +0200660TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000661 // Insert the "first" packet last.
662 seq_num_ += 100;
663 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800664 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000665 packet_->markerBit = true;
666 packet_->seqNum = seq_num_;
667 packet_->timestamp = timestamp_;
668
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000669 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800670 EXPECT_EQ(kIncomplete,
671 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000672
673 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
674
675 EXPECT_TRUE(frame_out == NULL);
676
677 // Insert 98 packets.
678 int loop = 0;
679 do {
680 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800681 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000682 packet_->markerBit = false;
683 packet_->seqNum = seq_num_;
684
philipel9d3ab612015-12-21 04:12:39 -0800685 EXPECT_EQ(kIncomplete,
686 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000687 loop++;
688 } while (loop < 98);
689
690 // Insert the last packet.
691 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800692 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000693 packet_->markerBit = false;
694 packet_->seqNum = seq_num_;
695
philipel9d3ab612015-12-21 04:12:39 -0800696 EXPECT_EQ(kCompleteSession,
697 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000698
philipel9d3ab612015-12-21 04:12:39 -0800699 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000700
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000701 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702
703 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000704 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705}
706
philipel85130292016-07-06 16:10:31 +0200707TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000708 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800709 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710 packet_->markerBit = false;
711
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000712 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800713 EXPECT_EQ(kIncomplete,
714 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000715
716 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
717
718 EXPECT_TRUE(frame_out == NULL);
719
720 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800721 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000722 packet_->markerBit = true;
723 packet_->seqNum = seq_num_;
724
philipel9d3ab612015-12-21 04:12:39 -0800725 EXPECT_EQ(kCompleteSession,
726 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000727
728 // check that we fail to get frame since seqnum is not continuous
729 frame_out = DecodeCompleteFrame();
730 EXPECT_TRUE(frame_out == NULL);
731
732 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800733 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000734 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800735 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000736 packet_->markerBit = false;
737 packet_->seqNum = seq_num_;
738 packet_->timestamp = timestamp_;
739
philipel9d3ab612015-12-21 04:12:39 -0800740 EXPECT_EQ(kIncomplete,
741 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000742
743 frame_out = DecodeCompleteFrame();
744
745 // It should not be complete.
746 EXPECT_TRUE(frame_out == NULL);
747
748 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800749 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000750 packet_->markerBit = true;
751 packet_->seqNum = seq_num_;
752
philipel9d3ab612015-12-21 04:12:39 -0800753 EXPECT_EQ(kCompleteSession,
754 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000755
756 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000757 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000758 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000759 jitter_buffer_->ReleaseFrame(frame_out);
760
761 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000762 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000763 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000764 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000765}
766
philipel85130292016-07-06 16:10:31 +0200767TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700768 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800769 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700770 packet_->markerBit = true;
771
772 // Send in an initial good packet/frame (Frame A) to start things off.
773 bool retransmitted = false;
774 EXPECT_EQ(kCompleteSession,
775 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
776 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
777 EXPECT_TRUE(frame_out != NULL);
778 jitter_buffer_->ReleaseFrame(frame_out);
779
780 // Now send in a complete delta frame (Frame C), but with a sequence number
781 // gap. No pic index either, so no temporal scalability cheating :)
782 packet_->frameType = kVideoFrameDelta;
783 // Leave a gap of 2 sequence numbers and two frames.
784 packet_->seqNum = seq_num_ + 3;
785 packet_->timestamp = timestamp_ + (66 * 90);
786 // Still isFirst = marker = true.
787 // Session should be complete (frame is complete), but there's nothing to
788 // decode yet.
789 EXPECT_EQ(kCompleteSession,
790 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
791 frame_out = DecodeCompleteFrame();
792 EXPECT_TRUE(frame_out == NULL);
793
794 // Now send in a complete delta frame (Frame B) that is continuous from A, but
795 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
796 packet_->seqNum = seq_num_ + 1;
797 packet_->timestamp = timestamp_ + (33 * 90);
798 // Still isFirst = marker = true.
799 EXPECT_EQ(kCompleteSession,
800 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
801 frame_out = DecodeCompleteFrame();
802 EXPECT_TRUE(frame_out != NULL);
803 jitter_buffer_->ReleaseFrame(frame_out);
804
805 // But Frame C isn't continuous yet.
806 frame_out = DecodeCompleteFrame();
807 EXPECT_TRUE(frame_out == NULL);
808
809 // Add in the padding. These are empty packets (data length is 0) with no
810 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200811 WebRtcRTPHeader rtpHeader;
812 memset(&rtpHeader, 0, sizeof(rtpHeader));
813 rtpHeader.header.sequenceNumber = seq_num_ + 2;
814 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
815 rtpHeader.header.markerBit = false;
816 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700817 EXPECT_EQ(kOldPacket,
818 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
819 empty_packet.seqNum += 1;
820 EXPECT_EQ(kOldPacket,
821 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
822
823 // But now Frame C should be ready!
824 frame_out = DecodeCompleteFrame();
825 EXPECT_TRUE(frame_out != NULL);
826 jitter_buffer_->ReleaseFrame(frame_out);
827}
828
philipel85130292016-07-06 16:10:31 +0200829TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000830 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800831 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000832 packet_->markerBit = false;
833 packet_->seqNum = seq_num_;
834 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000835 EXPECT_EQ(0, jitter_buffer_->num_packets());
836 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000837
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000838 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800839 EXPECT_EQ(kIncomplete,
840 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000841
842 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
843
844 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000845 EXPECT_EQ(1, jitter_buffer_->num_packets());
846 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000847
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000848 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800849 EXPECT_EQ(kDuplicatePacket,
850 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000851 EXPECT_EQ(2, jitter_buffer_->num_packets());
852 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000853
854 seq_num_++;
855 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000856 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800857 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000858
philipel9d3ab612015-12-21 04:12:39 -0800859 EXPECT_EQ(kCompleteSession,
860 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000861
862 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000863 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000864 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000865
866 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000867 EXPECT_EQ(3, jitter_buffer_->num_packets());
868 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000869 jitter_buffer_->ReleaseFrame(frame_out);
870}
871
philipel85130292016-07-06 16:10:31 +0200872TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000873 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800874 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000875 packet_->markerBit = true;
876 packet_->seqNum = seq_num_;
877 packet_->timestamp = timestamp_;
878 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
879 EXPECT_EQ(0, jitter_buffer_->num_packets());
880 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
881
882 bool retransmitted = false;
883 // Insert first complete frame.
884 EXPECT_EQ(kCompleteSession,
885 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
886
887 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
888 ASSERT_TRUE(frame_out != NULL);
889 CheckOutFrame(frame_out, size_, false);
890 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
891 jitter_buffer_->ReleaseFrame(frame_out);
892
893 // Insert 3 delta frames.
894 for (uint16_t i = 1; i <= 3; ++i) {
895 packet_->seqNum = seq_num_ + i;
896 packet_->timestamp = timestamp_ + (i * 33) * 90;
897 packet_->frameType = kVideoFrameDelta;
898 EXPECT_EQ(kCompleteSession,
899 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
900 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
901 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
902 }
903
904 // Retransmit second delta frame.
905 packet_->seqNum = seq_num_ + 2;
906 packet_->timestamp = timestamp_ + 66 * 90;
907
908 EXPECT_EQ(kDuplicatePacket,
909 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
910
911 EXPECT_EQ(5, jitter_buffer_->num_packets());
912 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
913
914 // Should be able to decode 3 delta frames, key frame already decoded.
915 for (size_t i = 0; i < 3; ++i) {
916 frame_out = DecodeCompleteFrame();
917 ASSERT_TRUE(frame_out != NULL);
918 CheckOutFrame(frame_out, size_, false);
919 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
920 jitter_buffer_->ReleaseFrame(frame_out);
921 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000922}
923
philipel85130292016-07-06 16:10:31 +0200924TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700925 // Verify that JB skips forward to next base layer frame.
926 // -------------------------------------------------
927 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
928 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
929 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
930 // | ss | x | x | x | |
931 // -------------------------------------------------
932 // |<----------tl0idx:200--------->|<---tl0idx:201---
933
934 bool re = false;
935 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700936 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800937 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700938 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700939 packet_->video_header.codecHeader.VP9.flexible_mode = false;
940 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
941 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
942 packet_->video_header.codecHeader.VP9.end_of_frame = true;
943 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700944
945 packet_->seqNum = 65485;
946 packet_->timestamp = 1000;
947 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700948 packet_->video_header.codecHeader.VP9.picture_id = 5;
949 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
950 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
951 packet_->video_header.codecHeader.VP9.ss_data_available = true;
952 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700953 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
954 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
955
956 // Insert next temporal layer 0.
957 packet_->seqNum = 65489;
958 packet_->timestamp = 13000;
959 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700960 packet_->video_header.codecHeader.VP9.picture_id = 9;
961 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
962 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
963 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700964 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
965
966 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
967 EXPECT_EQ(1000U, frame_out->TimeStamp());
968 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
969 jitter_buffer_->ReleaseFrame(frame_out);
970
971 frame_out = DecodeCompleteFrame();
972 EXPECT_EQ(13000U, frame_out->TimeStamp());
973 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
974 jitter_buffer_->ReleaseFrame(frame_out);
975}
976
philipel85130292016-07-06 16:10:31 +0200977TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700978 // Verify that frames are updated with SS data when SS packet is reordered.
979 // --------------------------------
980 // | 65486 | 65487 | 65485 |...
981 // | pid:6 | pid:7 | pid:5 |...
982 // | tid:2 | tid:1 | tid:0 |...
983 // | | | ss |
984 // --------------------------------
985 // |<--------tl0idx:200--------->|
986
987 bool re = false;
988 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700989 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800990 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700991 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700992 packet_->video_header.codecHeader.VP9.flexible_mode = false;
993 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
994 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
995 packet_->video_header.codecHeader.VP9.end_of_frame = true;
996 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700997
998 packet_->seqNum = 65486;
999 packet_->timestamp = 6000;
1000 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001001 packet_->video_header.codecHeader.VP9.picture_id = 6;
1002 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
1003 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001004 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1005
1006 packet_->seqNum = 65487;
1007 packet_->timestamp = 9000;
1008 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001009 packet_->video_header.codecHeader.VP9.picture_id = 7;
1010 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1011 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001012 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1013
1014 // Insert first frame with SS data.
1015 packet_->seqNum = 65485;
1016 packet_->timestamp = 3000;
1017 packet_->frameType = kVideoFrameKey;
1018 packet_->width = 352;
1019 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001020 packet_->video_header.codecHeader.VP9.picture_id = 5;
1021 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1022 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1023 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1024 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001025 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1026 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1027
1028 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1029 EXPECT_EQ(3000U, frame_out->TimeStamp());
1030 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1031 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1032 EXPECT_FALSE(
1033 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1034 jitter_buffer_->ReleaseFrame(frame_out);
1035
1036 frame_out = DecodeCompleteFrame();
1037 EXPECT_EQ(6000U, frame_out->TimeStamp());
1038 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1039 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1040 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1041 jitter_buffer_->ReleaseFrame(frame_out);
1042
1043 frame_out = DecodeCompleteFrame();
1044 EXPECT_EQ(9000U, frame_out->TimeStamp());
1045 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1046 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1047 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1048 jitter_buffer_->ReleaseFrame(frame_out);
1049}
1050
philipel85130292016-07-06 16:10:31 +02001051TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001052 // Verify that frames are updated with SS data when SS packet is reordered.
1053 // -----------------------------------------
1054 // | 65486 | 65487 | 65485 | 65484 |...
1055 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1056 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1057 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1058 // | t:6000 | t:6000 | t:3000 | t:3000 |
1059 // | | | | ss |
1060 // -----------------------------------------
1061 // |<-----------tl0idx:200------------>|
1062
1063 bool re = false;
1064 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001065 packet_->video_header.codec = kRtpVideoVp9;
1066 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1067 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1068 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1069 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001070
johan0d1b2b62017-01-10 04:21:35 -08001071 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001072 packet_->markerBit = false;
1073 packet_->seqNum = 65486;
1074 packet_->timestamp = 6000;
1075 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001076 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1077 packet_->video_header.codecHeader.VP9.picture_id = 6;
1078 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1079 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001080 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1081
johan0d1b2b62017-01-10 04:21:35 -08001082 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001083 packet_->markerBit = true;
1084 packet_->seqNum = 65487;
1085 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001086 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1087 packet_->video_header.codecHeader.VP9.picture_id = 6;
1088 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1089 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001090 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1091
johan0d1b2b62017-01-10 04:21:35 -08001092 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001093 packet_->markerBit = true;
1094 packet_->seqNum = 65485;
1095 packet_->timestamp = 3000;
1096 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001097 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1098 packet_->video_header.codecHeader.VP9.picture_id = 5;
1099 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1100 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001101 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1102
1103 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001104 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001105 packet_->markerBit = false;
1106 packet_->seqNum = 65484;
1107 packet_->frameType = kVideoFrameKey;
1108 packet_->width = 352;
1109 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001110 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1111 packet_->video_header.codecHeader.VP9.picture_id = 5;
1112 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1113 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1114 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1115 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001116 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1117 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1118
1119 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1120 EXPECT_EQ(3000U, frame_out->TimeStamp());
1121 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1122 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1123 EXPECT_FALSE(
1124 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1125 jitter_buffer_->ReleaseFrame(frame_out);
1126
1127 frame_out = DecodeCompleteFrame();
1128 EXPECT_EQ(6000U, frame_out->TimeStamp());
1129 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1130 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1131 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1132 jitter_buffer_->ReleaseFrame(frame_out);
1133}
1134
philipel85130292016-07-06 16:10:31 +02001135TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001136 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001137 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001138 packet_->markerBit = false;
1139 packet_->seqNum = seq_num_;
1140 packet_->timestamp = timestamp_;
1141 packet_->insertStartCode = true;
1142
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001143 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001144 EXPECT_EQ(kIncomplete,
1145 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001146
1147 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1148
1149 // Frame should not be complete.
1150 EXPECT_TRUE(frame_out == NULL);
1151
1152 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001153 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001154 packet_->markerBit = true;
1155 packet_->seqNum = seq_num_;
1156
philipel9d3ab612015-12-21 04:12:39 -08001157 EXPECT_EQ(kCompleteSession,
1158 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159
1160 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001161 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001162 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001163 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001164}
1165
stefana669a3a2016-10-06 05:04:52 -07001166TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1167 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1168
1169 packet_->timestamp = timestamp_;
1170 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001171 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001172 packet_->markerBit = true;
1173 packet_->codec = kVideoCodecH264;
1174 packet_->video_header.codec = kRtpVideoH264;
1175 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1176 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1177 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1178 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1179 packet_->video_header.codecHeader.H264.nalus_length = 1;
1180 bool retransmitted = false;
1181 EXPECT_EQ(kCompleteSession,
1182 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1183 // Not decodable since sps and pps are missing.
1184 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1185
1186 timestamp_ += 3000;
1187 packet_->timestamp = timestamp_;
1188 ++seq_num_;
1189 packet_->seqNum = seq_num_;
1190 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001191 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001192 packet_->markerBit = false;
1193 packet_->codec = kVideoCodecH264;
1194 packet_->video_header.codec = kRtpVideoH264;
1195 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
1196 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
1197 packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
1198 packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
1199 packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
1200 packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
1201 packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
1202 packet_->video_header.codecHeader.H264.nalus_length = 2;
1203 // Not complete since the marker bit hasn't been received.
1204 EXPECT_EQ(kIncomplete,
1205 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1206
1207 ++seq_num_;
1208 packet_->seqNum = seq_num_;
1209 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001210 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001211 packet_->markerBit = true;
1212 packet_->codec = kVideoCodecH264;
1213 packet_->video_header.codec = kRtpVideoH264;
1214 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1215 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1216 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1217 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1218 packet_->video_header.codecHeader.H264.nalus_length = 1;
1219 // Complete and decodable since the pps and sps are received in the first
1220 // packet of this frame.
1221 EXPECT_EQ(kCompleteSession,
1222 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1223 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1224 ASSERT_NE(nullptr, frame_out);
1225 jitter_buffer_->ReleaseFrame(frame_out);
1226
1227 timestamp_ += 3000;
1228 packet_->timestamp = timestamp_;
1229 ++seq_num_;
1230 packet_->seqNum = seq_num_;
1231 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001232 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001233 packet_->markerBit = true;
1234 packet_->codec = kVideoCodecH264;
1235 packet_->video_header.codec = kRtpVideoH264;
1236 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
1237 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
1238 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1239 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1240 packet_->video_header.codecHeader.H264.nalus_length = 1;
1241 // Complete and decodable since sps, pps and key frame has been received.
1242 EXPECT_EQ(kCompleteSession,
1243 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1244 frame_out = DecodeCompleteFrame();
1245 ASSERT_NE(nullptr, frame_out);
1246 jitter_buffer_->ReleaseFrame(frame_out);
1247}
1248
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001249// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001250TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001251 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001252 // Always start with a key frame. Use 10 packets to test Decodable State
1253 // boundaries.
1254 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001255 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001256 packet_->markerBit = false;
1257 packet_->seqNum = seq_num_;
1258 packet_->timestamp = timestamp_;
1259
1260 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001261 EXPECT_EQ(kIncomplete,
1262 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001263 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001264 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001265 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1266
johan0d1b2b62017-01-10 04:21:35 -08001267 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001268 for (int i = 1; i < 9; ++i) {
1269 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001270 EXPECT_EQ(kIncomplete,
1271 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001272 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001273 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1274 }
1275
1276 // last packet
1277 packet_->markerBit = true;
1278 packet_->seqNum++;
1279
philipel9d3ab612015-12-21 04:12:39 -08001280 EXPECT_EQ(kCompleteSession,
1281 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001282 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1283 CheckOutFrame(frame_out, 10 * size_, false);
1284 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001285 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001286
1287 // An incomplete frame can only be decoded once a subsequent frame has begun
1288 // to arrive. Insert packet in distant frame for this purpose.
1289 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001290 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001291 packet_->markerBit = false;
1292 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001293 packet_->timestamp += 33 * 90 * 8;
1294
philipel9d3ab612015-12-21 04:12:39 -08001295 EXPECT_EQ(kDecodableSession,
1296 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001297 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001298 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1299
1300 // Insert second frame
1301 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001302 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001303
philipel9d3ab612015-12-21 04:12:39 -08001304 EXPECT_EQ(kDecodableSession,
1305 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001306 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001307 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1308
johan0d1b2b62017-01-10 04:21:35 -08001309 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001310 for (int i = 1; i < 8; ++i) {
1311 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001312 EXPECT_EQ(kDecodableSession,
1313 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001314 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001315 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1316 }
1317
1318 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001319 EXPECT_EQ(kDecodableSession,
1320 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001321 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001322 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1323
1324 frame_out = DecodeIncompleteFrame();
1325 ASSERT_FALSE(NULL == frame_out);
1326 CheckOutFrame(frame_out, 9 * size_, false);
1327 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001328 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001329
1330 packet_->markerBit = true;
1331 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001332 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001333}
1334
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001335// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001336TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001337 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1338 // Always start with a key frame.
1339 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001340 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001341 packet_->markerBit = true;
1342 packet_->seqNum = seq_num_;
1343 packet_->timestamp = timestamp_;
1344
1345 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001346 EXPECT_EQ(kCompleteSession,
1347 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1349 CheckOutFrame(frame_out, size_, false);
1350 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001351 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001352
1353 // An incomplete frame can only be decoded once a subsequent frame has begun
1354 // to arrive. Insert packet in distant frame for this purpose.
1355 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001356 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 packet_->markerBit = false;
1358 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001359 packet_->timestamp += 33 * 90 * 8;
1360 EXPECT_EQ(kIncomplete,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001362 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001363 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001364 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1365
1366 // Insert second frame - an incomplete key frame.
1367 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001368 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001369 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001370 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001371
philipel9d3ab612015-12-21 04:12:39 -08001372 EXPECT_EQ(kIncomplete,
1373 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001374 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001375 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1376
1377 // Insert a few more packets. Make sure we're waiting for the key frame to be
1378 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001379 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001380 for (int i = 1; i < 5; ++i) {
1381 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001382 EXPECT_EQ(kIncomplete,
1383 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001384 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001385 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1386 }
1387
1388 // Complete key frame.
1389 packet_->markerBit = true;
1390 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001391 EXPECT_EQ(kCompleteSession,
1392 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 frame_out = DecodeCompleteFrame();
1394 CheckOutFrame(frame_out, 6 * size_, false);
1395 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001396 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001397}
1398
1399// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001400TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001401 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1402 // Always start with a key frame.
1403 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001404 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001405 packet_->markerBit = true;
1406 packet_->seqNum = seq_num_;
1407 packet_->timestamp = timestamp_;
1408
1409 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001410 EXPECT_EQ(kCompleteSession,
1411 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001412 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1413 CheckOutFrame(frame_out, size_, false);
1414 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001415 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001416
1417 // An incomplete frame can only be decoded once a subsequent frame has begun
1418 // to arrive. Insert packet in distant frame for this purpose.
1419 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001420 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001421 packet_->markerBit = false;
1422 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001423 packet_->timestamp += 33 * 90 * 8;
1424 EXPECT_EQ(kIncomplete,
1425 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001426 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001427 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001428 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1429
1430 // Insert second frame with the first packet missing. Make sure we're waiting
1431 // for the key frame to be complete.
1432 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001433 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001434
philipel9d3ab612015-12-21 04:12:39 -08001435 EXPECT_EQ(kIncomplete,
1436 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001437 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001438 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1439
1440 for (int i = 0; i < 5; ++i) {
1441 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001442 EXPECT_EQ(kIncomplete,
1443 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001444 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001445 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1446 }
1447
1448 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001449 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001450 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001451 EXPECT_EQ(kDecodableSession,
1452 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001453 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001454 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1455
1456 frame_out = DecodeIncompleteFrame();
1457 CheckOutFrame(frame_out, 7 * size_, false);
1458 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001459 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001460}
1461
philipel85130292016-07-06 16:10:31 +02001462TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001463 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001464 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001465 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001466 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001467 packet_->markerBit = true;
1468 packet_->seqNum = seq_num_;
1469 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001470 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001471 EXPECT_EQ(kCompleteSession,
1472 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001473 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001474 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1475 EXPECT_NE(frame, nullptr);
1476 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1477 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001478 EXPECT_TRUE(frame != NULL);
1479 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001480
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001481 // Drop a complete frame.
1482 timestamp_ += 2 * 33 * 90;
1483 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001484 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001485 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001486 packet_->markerBit = false;
1487 packet_->seqNum = seq_num_;
1488 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001489 EXPECT_EQ(kDecodableSession,
1490 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001491 // Insert a packet (so the previous one will be released).
1492 timestamp_ += 33 * 90;
1493 seq_num_ += 2;
1494 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001495 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001496 packet_->markerBit = false;
1497 packet_->seqNum = seq_num_;
1498 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001499 EXPECT_EQ(kDecodableSession,
1500 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001501 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001502 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1503 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001504}
1505
philipel85130292016-07-06 16:10:31 +02001506TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001507 // Verify missing packets statistics and not decodable packets statistics.
1508 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1509 // The last packet is an empty (non-media) packet.
1510
1511 // Select a start seqNum which triggers a difficult wrap situation
1512 // The JB will only output (incomplete)frames if the next one has started
1513 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001514 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515 seq_num_ = 0xffff - 4;
1516 seq_num_++;
1517 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001518 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 packet_->markerBit = false;
1520 packet_->seqNum = seq_num_;
1521 packet_->timestamp = timestamp_;
1522 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001523
1524 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001525 EXPECT_EQ(kDecodableSession,
1526 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527 for (int i = 0; i < 11; ++i) {
1528 webrtc::FrameType frametype = kVideoFrameDelta;
1529 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001530 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001531 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001532 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001533 packet_->markerBit = false;
1534 packet_->seqNum = seq_num_;
1535 packet_->timestamp = timestamp_;
1536 packet_->completeNALU = kNaluStart;
1537
philipel9d3ab612015-12-21 04:12:39 -08001538 EXPECT_EQ(kDecodableSession,
1539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540
1541 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1542
1543 // Should not be complete.
1544 EXPECT_TRUE(frame_out == NULL);
1545
1546 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001547 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001548 packet_->markerBit = true;
1549 packet_->seqNum = seq_num_;
1550 packet_->completeNALU = kNaluEnd;
1551
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001552 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1553 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001554
1555 // Insert an empty (non-media) packet.
1556 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001557 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001558 packet_->markerBit = false;
1559 packet_->seqNum = seq_num_;
1560 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001561 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001563 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001564 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 frame_out = DecodeIncompleteFrame();
1566
1567 // One of the packets has been discarded by the jitter buffer.
1568 // Last frame can't be extracted yet.
1569 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001570 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571
1572 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001573 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001574 } else {
philipel9d3ab612015-12-21 04:12:39 -08001575 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576 }
1577 EXPECT_FALSE(frame_out->Complete());
1578 EXPECT_FALSE(frame_out->MissingFrame());
1579 }
1580
1581 jitter_buffer_->ReleaseFrame(frame_out);
1582 }
1583
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001584 // Insert 3 old packets and verify that we have 3 discarded packets
1585 // Match value to actual latest timestamp decoded.
1586 timestamp_ -= 33 * 90;
1587 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001588
philipel9d3ab612015-12-21 04:12:39 -08001589 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001590
1591 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001592
philipel9d3ab612015-12-21 04:12:39 -08001593 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001594
1595 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001596
philipel9d3ab612015-12-21 04:12:39 -08001597 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001598
1599 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1600
1601 jitter_buffer_->Flush();
1602
1603 // This statistic shouldn't be reset by a flush.
1604 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1605}
1606
philipel85130292016-07-06 16:10:31 +02001607TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001608 seq_num_ = 0xfff0;
1609 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001610 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001611 packet_->markerBit = false;
1612 packet_->seqNum = seq_num_;
1613 packet_->timestamp = timestamp_;
1614
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001615 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001616 EXPECT_EQ(kIncomplete,
1617 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618
1619 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1620
1621 EXPECT_TRUE(frame_out == NULL);
1622
1623 int loop = 0;
1624 do {
1625 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001626 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627 packet_->markerBit = false;
1628 packet_->seqNum = seq_num_;
1629
philipel9d3ab612015-12-21 04:12:39 -08001630 EXPECT_EQ(kIncomplete,
1631 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001632
1633 frame_out = DecodeCompleteFrame();
1634
1635 EXPECT_TRUE(frame_out == NULL);
1636
1637 loop++;
1638 } while (loop < 98);
1639
1640 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001641 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001642 packet_->markerBit = true;
1643 packet_->seqNum = seq_num_;
1644
philipel9d3ab612015-12-21 04:12:39 -08001645 EXPECT_EQ(kCompleteSession,
1646 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001647
1648 frame_out = DecodeCompleteFrame();
1649
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001650 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001651
1652 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001653 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654}
1655
philipel85130292016-07-06 16:10:31 +02001656TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001657 // Insert "first" packet last seqnum.
1658 seq_num_ = 10;
1659 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001660 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001661 packet_->markerBit = true;
1662 packet_->seqNum = seq_num_;
1663
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001664 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001665 EXPECT_EQ(kIncomplete,
1666 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001667 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1668
1669 // Should not be complete.
1670 EXPECT_TRUE(frame_out == NULL);
1671
1672 // Insert 98 frames.
1673 int loop = 0;
1674 do {
1675 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001676 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001677 packet_->markerBit = false;
1678 packet_->seqNum = seq_num_;
1679
philipel9d3ab612015-12-21 04:12:39 -08001680 EXPECT_EQ(kIncomplete,
1681 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001682
1683 frame_out = DecodeCompleteFrame();
1684
1685 EXPECT_TRUE(frame_out == NULL);
1686
1687 loop++;
1688 } while (loop < 98);
1689
1690 // Insert last packet.
1691 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001692 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 packet_->markerBit = false;
1694 packet_->seqNum = seq_num_;
1695
philipel9d3ab612015-12-21 04:12:39 -08001696 EXPECT_EQ(kCompleteSession,
1697 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001698
1699 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001700 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001701 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001702 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001703}
1704
philipel85130292016-07-06 16:10:31 +02001705TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001706 // ------- -------
1707 // | 2 | | 1 |
1708 // ------- -------
1709 // t = 3000 t = 2000
1710 seq_num_ = 2;
1711 timestamp_ = 3000;
1712 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001713 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 packet_->markerBit = true;
1715 packet_->timestamp = timestamp_;
1716 packet_->seqNum = seq_num_;
1717
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001718 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001719 EXPECT_EQ(kCompleteSession,
1720 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001721
1722 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1723 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001724 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001726 jitter_buffer_->ReleaseFrame(frame_out);
1727
1728 seq_num_--;
1729 timestamp_ = 2000;
1730 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001731 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001732 packet_->markerBit = true;
1733 packet_->seqNum = seq_num_;
1734 packet_->timestamp = timestamp_;
1735
philipel9d3ab612015-12-21 04:12:39 -08001736 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737}
1738
philipel85130292016-07-06 16:10:31 +02001739TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001740 // ------- -------
1741 // | 2 | | 1 |
1742 // ------- -------
1743 // t = 3000 t = 0xffffff00
1744
1745 seq_num_ = 2;
1746 timestamp_ = 3000;
1747 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001748 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749 packet_->markerBit = true;
1750 packet_->seqNum = seq_num_;
1751 packet_->timestamp = timestamp_;
1752
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001753 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001754 EXPECT_EQ(kCompleteSession,
1755 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001756
1757 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1758 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1759
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001760 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001761
1762 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1763
1764 jitter_buffer_->ReleaseFrame(frame_out);
1765
1766 seq_num_--;
1767 timestamp_ = 0xffffff00;
1768 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001769 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001770 packet_->markerBit = true;
1771 packet_->seqNum = seq_num_;
1772 packet_->timestamp = timestamp_;
1773
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001774 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001775 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001776}
1777
philipel85130292016-07-06 16:10:31 +02001778TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001779 // --------------- ---------------
1780 // | 1 | 2 | | 3 | 4 |
1781 // --------------- ---------------
1782 // t = 0xffffff00 t = 33*90
1783
1784 timestamp_ = 0xffffff00;
1785 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001786 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 packet_->markerBit = false;
1788 packet_->seqNum = seq_num_;
1789 packet_->timestamp = timestamp_;
1790
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001791 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001792 EXPECT_EQ(kIncomplete,
1793 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001794
1795 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796 EXPECT_TRUE(frame_out == NULL);
1797
1798 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001799 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001800 packet_->markerBit = true;
1801 packet_->seqNum = seq_num_;
1802
philipel9d3ab612015-12-21 04:12:39 -08001803 EXPECT_EQ(kCompleteSession,
1804 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001805
1806 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001807 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001808 jitter_buffer_->ReleaseFrame(frame_out);
1809
1810 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001811 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001812 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001813 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001814 packet_->markerBit = false;
1815 packet_->seqNum = seq_num_;
1816 packet_->timestamp = timestamp_;
1817
philipel9d3ab612015-12-21 04:12:39 -08001818 EXPECT_EQ(kIncomplete,
1819 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001820
1821 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822 EXPECT_TRUE(frame_out == NULL);
1823
1824 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001825 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001826 packet_->markerBit = true;
1827 packet_->seqNum = seq_num_;
1828
philipel9d3ab612015-12-21 04:12:39 -08001829 EXPECT_EQ(kCompleteSession,
1830 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001831
1832 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001833 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001835 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001836}
1837
philipel85130292016-07-06 16:10:31 +02001838TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839 // ------- -------
1840 // | 1 | | 2 |
1841 // ------- -------
1842 // t = 0xffffff00 t = 2700
1843
1844 timestamp_ = 0xffffff00;
1845 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001846 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001847 packet_->markerBit = true;
1848 packet_->timestamp = timestamp_;
1849
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001850 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001852 EXPECT_EQ(kCompleteSession,
1853 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001854
1855 // Insert next frame.
1856 seq_num_++;
1857 timestamp_ = 2700;
1858 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001859 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001860 packet_->markerBit = true;
1861 packet_->seqNum = seq_num_;
1862 packet_->timestamp = timestamp_;
1863
philipel9d3ab612015-12-21 04:12:39 -08001864 EXPECT_EQ(kCompleteSession,
1865 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001866
1867 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1868 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001869 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001871 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001872
1873 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1874 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001875 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001876 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001877 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878}
1879
philipel85130292016-07-06 16:10:31 +02001880TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001881 // ------- -------
1882 // | 2 | | 1 |
1883 // ------- -------
1884 // t = 2700 t = 0xffffff00
1885
1886 seq_num_ = 2;
1887 timestamp_ = 2700;
1888 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001889 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001890 packet_->markerBit = true;
1891 packet_->seqNum = seq_num_;
1892 packet_->timestamp = timestamp_;
1893
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001894 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001895 EXPECT_EQ(kCompleteSession,
1896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001897
1898 // Insert second frame
1899 seq_num_--;
1900 timestamp_ = 0xffffff00;
1901 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001902 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001903 packet_->markerBit = true;
1904 packet_->seqNum = seq_num_;
1905 packet_->timestamp = timestamp_;
1906
philipel9d3ab612015-12-21 04:12:39 -08001907 EXPECT_EQ(kCompleteSession,
1908 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001909
1910 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1911 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001912 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001913 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001914 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915
1916 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1917 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001918 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001919 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001920 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001921}
1922
philipel85130292016-07-06 16:10:31 +02001923TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001924 int loop = 0;
1925 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001926 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001927 // Insert kMaxPacketsInJitterBuffer into frame.
1928 do {
1929 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001930 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001931 packet_->markerBit = false;
1932 packet_->seqNum = seq_num_;
1933
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001935 EXPECT_EQ(kIncomplete,
1936 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001937 firstPacket = false;
1938 } else {
philipel9d3ab612015-12-21 04:12:39 -08001939 EXPECT_EQ(kIncomplete,
1940 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 }
1942
1943 loop++;
1944 } while (loop < kMaxPacketsInSession);
1945
1946 // Max number of packets inserted.
1947 // Insert one more packet.
1948 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001949 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001950 packet_->markerBit = true;
1951 packet_->seqNum = seq_num_;
1952
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001953 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001954 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001955 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001956}
1957
philipel85130292016-07-06 16:10:31 +02001958TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 // TEST fill JB with more than max number of frame (50 delta frames +
1960 // 51 key frames) with wrap in seq_num_
1961 //
1962 // --------------------------------------------------------------
1963 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1964 // --------------------------------------------------------------
1965 // |<-----------delta frames------------->|<------key frames----->|
1966
jbauchdb81ffd2015-11-23 03:59:02 -08001967 // Make sure the jitter doesn't request a keyframe after too much non-
1968 // decodable frames.
1969 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001970 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001971
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001972 int loop = 0;
1973 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001974 uint32_t first_key_frame_timestamp = 0;
1975 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976 // Insert MAX_NUMBER_OF_FRAMES frames.
1977 do {
philipel9d3ab612015-12-21 04:12:39 -08001978 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001979 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001980 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001981 packet_->markerBit = true;
1982 packet_->seqNum = seq_num_;
1983 packet_->timestamp = timestamp_;
1984
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001985 if (loop == 50) {
1986 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001987 packet_->frameType = kVideoFrameKey;
1988 }
1989
1990 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001991 EXPECT_EQ(kCompleteSession,
1992 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001993
1994 loop++;
1995 } while (loop < kMaxNumberOfFrames);
1996
1997 // Max number of frames inserted.
1998
1999 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08002000 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002002 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002003 packet_->markerBit = true;
2004 packet_->seqNum = seq_num_;
2005 packet_->timestamp = timestamp_;
2006
2007 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002008 EXPECT_EQ(kFlushIndicator,
2009 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002010
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002011 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2012 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002013 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002014 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002015 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016}
2017
philipel85130292016-07-06 16:10:31 +02002018TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002019 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002020 seq_num_ = 3;
2021 // Insert one empty packet per frame, should never return the last timestamp
2022 // inserted. Only return empty frames in the presence of subsequent frames.
2023 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002024 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002025 for (int i = 0; i < maxSize + 10; i++) {
2026 timestamp_ += 33 * 90;
2027 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002028 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002029 packet_->markerBit = false;
2030 packet_->seqNum = seq_num_;
2031 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002032 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002033
philipel9d3ab612015-12-21 04:12:39 -08002034 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002035 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2036 // Timestamp should never be the last TS inserted.
2037 if (testFrame != NULL) {
2038 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002039 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002040 }
2041 }
2042}
2043
philipel85130292016-07-06 16:10:31 +02002044TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002045 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002046 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002047 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048 timestamp_ += 33 * 90;
2049 int insertedLength = 0;
2050 packet_->seqNum = seq_num_;
2051 packet_->timestamp = timestamp_;
2052 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002053 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002054 packet_->completeNALU = kNaluStart;
2055 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002056 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002057
philipel9d3ab612015-12-21 04:12:39 -08002058 EXPECT_EQ(kDecodableSession,
2059 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002060
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002061 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002062 packet_->seqNum = seq_num_;
2063 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002064 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002065 packet_->completeNALU = kNaluIncomplete;
2066 packet_->markerBit = false;
2067
philipel9d3ab612015-12-21 04:12:39 -08002068 EXPECT_EQ(kDecodableSession,
2069 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002070
2071 seq_num_++;
2072 packet_->seqNum = seq_num_;
2073 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002074 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002075 packet_->completeNALU = kNaluEnd;
2076 packet_->markerBit = false;
2077
philipel9d3ab612015-12-21 04:12:39 -08002078 EXPECT_EQ(kDecodableSession,
2079 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002080
2081 seq_num_++;
2082 packet_->seqNum = seq_num_;
2083 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002084 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002085 EXPECT_EQ(kDecodableSession,
2086 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002087 // The JB will only output (incomplete) frames if a packet belonging to a
2088 // subsequent frame was already inserted. Insert one packet of a subsequent
2089 // frame. place high timestamp so the JB would always have a next frame
2090 // (otherwise, for every inserted frame we need to take care of the next
2091 // frame as well).
2092 packet_->seqNum = 1;
2093 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2094 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002095 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 packet_->completeNALU = kNaluStart;
2097 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002098
philipel9d3ab612015-12-21 04:12:39 -08002099 EXPECT_EQ(kDecodableSession,
2100 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101
2102 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2103
2104 // We can decode everything from a NALU until a packet has been lost.
2105 // Thus we can decode the first packet of the first NALU and the second NALU
2106 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002107 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108 jitter_buffer_->ReleaseFrame(frame_out);
2109
2110 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002111 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002112 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113 insertedLength = 0;
2114
2115 packet_->seqNum = seq_num_;
2116 packet_->timestamp = timestamp_;
2117 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002118 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002119 packet_->completeNALU = kNaluEnd;
2120 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002121 EXPECT_EQ(kDecodableSession,
2122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2123 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002124 seq_num_--;
2125 packet_->seqNum = seq_num_;
2126 packet_->timestamp = timestamp_;
2127 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002128 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002129 packet_->completeNALU = kNaluStart;
2130 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002131
philipel9d3ab612015-12-21 04:12:39 -08002132 EXPECT_EQ(kDecodableSession,
2133 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002134 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2135
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002136 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137 packet_->seqNum = seq_num_;
2138 packet_->timestamp = timestamp_;
2139 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002140 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002141 packet_->completeNALU = kNaluComplete;
2142 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002143 EXPECT_EQ(kDecodableSession,
2144 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002145 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002146 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002147 packet_->seqNum = seq_num_;
2148 packet_->timestamp = timestamp_;
2149 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002150 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002151 packet_->completeNALU = kNaluStart;
2152 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002153 EXPECT_EQ(kDecodableSession,
2154 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155 // This packet should be decoded since it's the beginning of a NAL.
2156 insertedLength += packet_->sizeBytes;
2157
2158 seq_num_ += 2;
2159 packet_->seqNum = seq_num_;
2160 packet_->timestamp = timestamp_;
2161 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002162 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 packet_->completeNALU = kNaluEnd;
2164 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002165 EXPECT_EQ(kDecodableSession,
2166 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002167 // This packet should not be decoded because it is an incomplete NAL if it
2168 // is the last.
2169 frame_out = DecodeIncompleteFrame();
2170 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002171 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002172 jitter_buffer_->ReleaseFrame(frame_out);
2173
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002174 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002175 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002176 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002177 WebRtcRTPHeader rtpHeader;
2178 memset(&rtpHeader, 0, sizeof(rtpHeader));
2179 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002180 emptypacket.seqNum = seq_num_;
2181 emptypacket.timestamp = timestamp_;
2182 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002183 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002184 emptypacket.completeNALU = kNaluComplete;
2185 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002186 EXPECT_EQ(kCompleteSession,
2187 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002188 // This packet should not be decoded because it is an incomplete NAL if it
2189 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002190
2191 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2192 // has arrived.
2193 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002194 EXPECT_TRUE(frame_out != NULL);
2195 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002196
2197 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002198 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002199 timestamp_ += 33 * 90;
2200
2201 packet_->seqNum = seq_num_;
2202 packet_->timestamp = timestamp_;
2203 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002204 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002205 packet_->completeNALU = kNaluComplete;
2206 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002207
philipel9d3ab612015-12-21 04:12:39 -08002208 EXPECT_EQ(kDecodableSession,
2209 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002210
agalusza@google.comd177c102013-08-08 01:12:33 +00002211 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002212 emptypacket.seqNum = seq_num_;
2213 emptypacket.timestamp = timestamp_;
2214 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002215 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002216 emptypacket.completeNALU = kNaluComplete;
2217 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002218 EXPECT_EQ(kCompleteSession,
2219 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002220
2221 frame_out = DecodeCompleteFrame();
2222 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002223 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002224 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002225}
2226
philipel85130292016-07-06 16:10:31 +02002227TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002228 // Test that a we cannot get incomplete frames from the JB if we haven't
2229 // received the marker bit, unless we have received a packet from a later
2230 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002231 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002232 // Start with a complete key frame - insert and decode.
2233 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002234 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002235 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002236 bool retransmitted = false;
2237
philipel9d3ab612015-12-21 04:12:39 -08002238 EXPECT_EQ(kCompleteSession,
2239 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002240 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2241 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002242 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002243
2244 packet_->seqNum += 2;
2245 packet_->timestamp += 33 * 90;
2246 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002247 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002248 packet_->markerBit = false;
2249
philipel9d3ab612015-12-21 04:12:39 -08002250 EXPECT_EQ(kDecodableSession,
2251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002252
2253 frame_out = DecodeIncompleteFrame();
2254 EXPECT_TRUE(frame_out == NULL);
2255
2256 packet_->seqNum += 2;
2257 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002258 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002259
philipel9d3ab612015-12-21 04:12:39 -08002260 EXPECT_EQ(kDecodableSession,
2261 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002262
2263 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002264 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002265 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002266}
2267
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002268TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002269 // Make sure the jitter doesn't request a keyframe after too much non-
2270 // decodable frames.
2271 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002272 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002273 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002274 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002275 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002276 DropFrame(1);
2277 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002278 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002279 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002280 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002281 // This frame will make the jitter buffer recycle frames until a key frame.
2282 // Since none is found it will have to wait until the next key frame before
2283 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002284 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002285 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002286}
2287
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002288TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002289 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002290 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002291 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002292 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002293 // Insert empty packet.
2294 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002295 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002296 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002297 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002298 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002299 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002300 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002301 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002302 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002303 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002304 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002305 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002306}
2307
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002308TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002309 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2310 EXPECT_EQ(0, frame_stats.delta_frames);
2311 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002312
2313 uint32_t framerate = 0;
2314 uint32_t bitrate = 0;
2315 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2316 EXPECT_EQ(0u, framerate);
2317 EXPECT_EQ(0u, bitrate);
2318
2319 // Insert a couple of key and delta frames.
2320 InsertFrame(kVideoFrameKey);
2321 InsertFrame(kVideoFrameDelta);
2322 InsertFrame(kVideoFrameDelta);
2323 InsertFrame(kVideoFrameKey);
2324 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002325 // Decode some of them to make sure the statistics doesn't depend on frames
2326 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002327 EXPECT_TRUE(DecodeCompleteFrame());
2328 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002329 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002330 EXPECT_EQ(3, frame_stats.delta_frames);
2331 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002332
2333 // Insert 20 more frames to get estimates of bitrate and framerate over
2334 // 1 second.
2335 for (int i = 0; i < 20; ++i) {
2336 InsertFrame(kVideoFrameDelta);
2337 }
2338 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2339 // TODO(holmer): The current implementation returns the average of the last
2340 // two framerate calculations, which is why it takes two calls to reach the
2341 // actual framerate. This should be fixed.
2342 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2343 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2344 // Insert 25 more frames to get estimates of bitrate and framerate over
2345 // 2 seconds.
2346 for (int i = 0; i < 25; ++i) {
2347 InsertFrame(kVideoFrameDelta);
2348 }
2349 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2350 EXPECT_EQ(kDefaultFrameRate, framerate);
2351 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2352}
2353
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002354TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2355 // Insert delta frames.
2356 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2357 // Can't decode without a key frame.
2358 EXPECT_FALSE(DecodeCompleteFrame());
2359 InsertFrame(kVideoFrameKey);
2360 // Skip to the next key frame.
2361 EXPECT_TRUE(DecodeCompleteFrame());
2362}
2363
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002364TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2365 InsertFrame(kVideoFrameKey);
2366 EXPECT_TRUE(DecodeCompleteFrame());
2367 const int kNumDeltaFrames = 5;
2368 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2369 InsertFrame(kVideoFrameKey);
2370 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2371 EXPECT_TRUE(DecodeCompleteFrame());
2372 }
2373}
2374
2375TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2376 InsertFrame(kVideoFrameKey);
2377 EXPECT_TRUE(DecodeCompleteFrame());
2378 const int kNumDeltaFrames = 5;
2379 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2380 InsertFrame(kVideoFrameKey);
2381 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2382 InsertFrame(kVideoFrameKey);
2383 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2384 EXPECT_TRUE(DecodeCompleteFrame());
2385 }
2386}
2387
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002388TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2389 InsertFrame(kVideoFrameKey);
2390 EXPECT_TRUE(DecodeCompleteFrame());
2391 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2392 clock_->TimeInMilliseconds());
2393 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2394 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2395 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002396 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002397 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2398 EXPECT_FALSE(DecodeCompleteFrame());
2399 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2400 EXPECT_TRUE(DecodeCompleteFrame());
2401 EXPECT_TRUE(DecodeCompleteFrame());
2402}
2403
philipel85130292016-07-06 16:10:31 +02002404TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002405 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002406 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002407 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002408 InsertFrame(kVideoFrameKey);
2409 EXPECT_TRUE(DecodeCompleteFrame());
2410}
2411
philipel85130292016-07-06 16:10:31 +02002412TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002413 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002414 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002415 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002416
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002417 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2418 // old packet.
2419 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002420 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002421 EXPECT_EQ(kFlushIndicator,
2422 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002423 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002424
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002425 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002426 std::vector<uint16_t> nack_list =
2427 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002428 // No key frame will be requested since the jitter buffer is empty.
2429 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002430 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002431
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002432 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002433 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002434 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002435 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002436
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002437 // The next complete continuous frame isn't a key frame, but we're waiting
2438 // for one.
2439 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002440 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002441 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002442 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002443}
2444
philipel85130292016-07-06 16:10:31 +02002445TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002446 // Insert a key frame and decode it.
2447 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2448 EXPECT_TRUE(DecodeCompleteFrame());
2449
2450 // Insert a frame which should trigger a recycle until the next key frame.
2451 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2452
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002453 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002454 std::vector<uint16_t> nack_list =
2455 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002456 // Verify that the jitter buffer does not request a key frame.
2457 EXPECT_FALSE(request_key_frame);
2458 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002459 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002460 // Verify that we can decode the next frame.
2461 EXPECT_TRUE(DecodeCompleteFrame());
2462}
2463
philipel85130292016-07-06 16:10:31 +02002464TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002465 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002466 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002467 EXPECT_TRUE(DecodeCompleteFrame());
2468
2469 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002470 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002471 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002472 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002473 EXPECT_FALSE(DecodeCompleteFrame());
2474
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002475 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002476 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002477 // The jitter buffer is empty, so we won't request key frames until we get a
2478 // packet.
2479 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002480
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002481 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002482 // Now we have a packet in the jitter buffer, a key frame will be requested
2483 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002484 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002485 // The jitter buffer is empty, so we won't request key frames until we get a
2486 // packet.
2487 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002488 // The next complete continuous frame isn't a key frame, but we're waiting
2489 // for one.
2490 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002491 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002492 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002493 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002494 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002495}
2496
philipel85130292016-07-06 16:10:31 +02002497TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002498 DropFrame(10);
2499 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002500 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002501 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002502 std::vector<uint16_t> nack_list =
2503 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002504 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002505 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002506 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002507}
2508
philipel85130292016-07-06 16:10:31 +02002509TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002510 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002511 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002512 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002513 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002514 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002515 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002516 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002517 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002518 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002519 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002520}
2521
philipel85130292016-07-06 16:10:31 +02002522TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002523 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002524 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2525 clock_->TimeInMilliseconds());
2526 VCMPacket packet;
2527 stream_generator_->PopPacket(&packet, 0);
2528 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002529 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002530 EXPECT_FALSE(retransmitted);
2531 // Drop second packet.
2532 stream_generator_->PopPacket(&packet, 1);
2533 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2534 EXPECT_FALSE(retransmitted);
2535 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002536 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002537 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002538 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002539 EXPECT_EQ(1u, nack_list.size());
2540 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002541 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002542 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002543 EXPECT_EQ(kCompleteSession,
2544 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002545 EXPECT_TRUE(retransmitted);
2546 EXPECT_TRUE(DecodeCompleteFrame());
2547}
2548
philipel85130292016-07-06 16:10:31 +02002549TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002550 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002551 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002552 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002553 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002554 // Drop second packet.
2555 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2556 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002557 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002558 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002559 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002560 ASSERT_EQ(1u, nack_list.size());
2561 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002562 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002563 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002564 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002565}
2566
philipel85130292016-07-06 16:10:31 +02002567TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002568 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002569 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002570 // First frame is delta.
2571 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2572 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002573 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002574 // Drop second packet in frame.
2575 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2576 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2577 // Second frame is key.
2578 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2579 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002580 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002581 // Drop second packet in frame.
2582 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2583 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002584 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002585 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002586 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002587 ASSERT_EQ(1u, nack_list.size());
2588 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002589 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002590 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002591}
2592
philipel85130292016-07-06 16:10:31 +02002593TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002594 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002595 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002596
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002597 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002598 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002599
2600 // ----------------------------------------------------------------
2601 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2602 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002603 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002604 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002605 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002606 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002607 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002608 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002609 while (stream_generator_->PacketsRemaining() > 1) {
2610 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002611 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002612 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002613 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002614 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002615 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002616 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002617 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002618 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002619 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002620 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002621
2622 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002623 std::vector<uint16_t> nack_list =
2624 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002625 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002626 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002627 for (size_t i = 0; i < nack_list.size(); ++i)
2628 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002629}
2630
philipel85130292016-07-06 16:10:31 +02002631TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002632 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002633 // ------- ------------------------------------------------------------
2634 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2635 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002636 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002637 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002638 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002639 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002640 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002641 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002642 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002643 while (stream_generator_->PacketsRemaining() > 1) {
2644 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002645 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002646 EXPECT_FALSE(request_key_frame);
2647 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002648 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002649 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002650 }
2651 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002652 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002653 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002654 EXPECT_FALSE(DecodeCompleteFrame());
2655 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002656 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002657 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002658 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002659 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002660 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2661 for (size_t i = 0; i < nack_list.size(); ++i)
2662 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002663}
2664
philipel85130292016-07-06 16:10:31 +02002665TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002666 bool request_key_frame = false;
2667 // -----------------------------------
2668 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2669 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002670 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002671 InsertFrame(kVideoFrameKey);
2672 EXPECT_FALSE(request_key_frame);
2673 EXPECT_TRUE(DecodeCompleteFrame());
2674 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2675 clock_->TimeInMilliseconds());
2676 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2677 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002678 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002679 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002680 EXPECT_FALSE(request_key_frame);
2681 } else {
2682 stream_generator_->NextPacket(NULL); // Drop packet
2683 }
2684 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2685 clock_->TimeInMilliseconds());
2686 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2687 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002688 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002689 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002690 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002691 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002692 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002693 ASSERT_EQ(1u, nack_list.size());
2694 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002695}
2696
philipel85130292016-07-06 16:10:31 +02002697TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002698 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002699 InsertFrame(kVideoFrameKey);
2700 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002701 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002702 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2703 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002704
2705 // Far-into-the-future video frame, could be caused by resetting the encoder
2706 // or otherwise restarting. This should not fail when error when the packet is
2707 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002708 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002709 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2710 InsertFrame(kVideoFrameKey);
2711 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002712 nack_list = jitter_buffer_->GetNackList(&extended);
2713 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002714
2715 // Stream should be decodable from this point.
2716 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2717 InsertFrame(kVideoFrameDelta);
2718 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002719 nack_list = jitter_buffer_->GetNackList(&extended);
2720 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002721}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002722} // namespace webrtc