blob: f83c1ca3994dcf1ba02b5612bcd921e84965c3b9 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000015
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000016#include "testing/gtest/include/gtest/gtest.h"
philipel83f831a2016-03-12 03:30:23 -080017#include "testing/gmock/include/gmock/gmock.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/frame_buffer.h"
19#include "webrtc/modules/video_coding/jitter_buffer.h"
20#include "webrtc/modules/video_coding/media_opt_util.h"
21#include "webrtc/modules/video_coding/packet.h"
22#include "webrtc/modules/video_coding/test/stream_generator.h"
23#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010024#include "webrtc/system_wrappers/include/clock.h"
philipel83f831a2016-03-12 03:30:23 -080025#include "webrtc/system_wrappers/include/field_trial.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010026#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070027#include "webrtc/system_wrappers/include/metrics_default.h"
philipel83f831a2016-03-12 03:30:23 -080028#include "webrtc/test/field_trial.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000029
30namespace webrtc {
31
asapersson9a4cd872015-10-23 00:27:14 -070032namespace {
philipel9d3ab612015-12-21 04:12:39 -080033const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070034} // namespace
35
36class Vp9SsMapTest : public ::testing::Test {
37 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020038 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070039
40 virtual void SetUp() {
41 packet_.isFirstPacket = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020042 packet_.dataPtr = data_;
43 packet_.sizeBytes = 1400;
44 packet_.seqNum = 1234;
45 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070046 packet_.markerBit = true;
47 packet_.frameType = kVideoFrameKey;
48 packet_.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -070049 packet_.video_header.codec = kRtpVideoVp9;
50 packet_.video_header.codecHeader.VP9.flexible_mode = false;
51 packet_.video_header.codecHeader.VP9.gof_idx = 0;
52 packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
53 packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
54 packet_.video_header.codecHeader.VP9.ss_data_available = true;
55 packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070056 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
57 }
58
59 Vp9SsMap map_;
60 uint8_t data_[1500];
61 VCMPacket packet_;
62};
63
64TEST_F(Vp9SsMapTest, Insert) {
65 EXPECT_TRUE(map_.Insert(packet_));
66}
67
68TEST_F(Vp9SsMapTest, Insert_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -070069 packet_.video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070070 EXPECT_FALSE(map_.Insert(packet_));
71}
72
73TEST_F(Vp9SsMapTest, Find) {
74 EXPECT_TRUE(map_.Insert(packet_));
75 Vp9SsMap::SsMap::iterator it;
76 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
77 EXPECT_EQ(packet_.timestamp, it->first);
78}
79
80TEST_F(Vp9SsMapTest, Find_WithWrap) {
81 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
82 const uint32_t kSsTimestamp2 = 100;
83 packet_.timestamp = kSsTimestamp1;
84 EXPECT_TRUE(map_.Insert(packet_));
85 packet_.timestamp = kSsTimestamp2;
86 EXPECT_TRUE(map_.Insert(packet_));
87 Vp9SsMap::SsMap::iterator it;
88 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
89 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
90 EXPECT_EQ(kSsTimestamp1, it->first);
91 EXPECT_TRUE(map_.Find(0, &it));
92 EXPECT_EQ(kSsTimestamp1, it->first);
93 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
96 EXPECT_EQ(kSsTimestamp2, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
98 EXPECT_EQ(kSsTimestamp2, it->first);
99}
100
101TEST_F(Vp9SsMapTest, Reset) {
102 EXPECT_TRUE(map_.Insert(packet_));
103 Vp9SsMap::SsMap::iterator it;
104 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
105 EXPECT_EQ(packet_.timestamp, it->first);
106
107 map_.Reset();
108 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
109}
110
111TEST_F(Vp9SsMapTest, RemoveOld) {
112 Vp9SsMap::SsMap::iterator it;
113 const uint32_t kSsTimestamp1 = 10000;
114 packet_.timestamp = kSsTimestamp1;
115 EXPECT_TRUE(map_.Insert(packet_));
116
117 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
118 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
119 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
120
121 map_.RemoveOld(kTimestamp);
122 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
123 EXPECT_TRUE(map_.Find(kTimestamp, &it));
124 EXPECT_EQ(kTimestamp, it->first);
125}
126
127TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
128 Vp9SsMap::SsMap::iterator it;
129 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
130 const uint32_t kSsTimestamp2 = 10;
131 const uint32_t kSsTimestamp3 = 1000;
132 packet_.timestamp = kSsTimestamp1;
133 EXPECT_TRUE(map_.Insert(packet_));
134 packet_.timestamp = kSsTimestamp2;
135 EXPECT_TRUE(map_.Insert(packet_));
136 packet_.timestamp = kSsTimestamp3;
137 EXPECT_TRUE(map_.Insert(packet_));
138
139 map_.RemoveOld(kSsTimestamp3);
140 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
141 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
142 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
143}
144
145TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -0700146 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700147 EXPECT_FALSE(map_.UpdatePacket(&packet_));
148}
149
150TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
151 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700152 packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700153 EXPECT_FALSE(map_.UpdatePacket(&packet_));
154}
155
156TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
157 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700158 packet_.video_header.codecHeader.VP9.gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700159 EXPECT_FALSE(map_.UpdatePacket(&packet_));
160}
161
162TEST_F(Vp9SsMapTest, UpdatePacket) {
163 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
164
isheriff6b4b5f32016-06-08 00:24:21 -0700165 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700166 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700167 EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
168 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
169 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
170 EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700171
isheriff6b4b5f32016-06-08 00:24:21 -0700172 packet_.video_header.codecHeader.VP9.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700173 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700174 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
175 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
176 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
177 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700178
isheriff6b4b5f32016-06-08 00:24:21 -0700179 packet_.video_header.codecHeader.VP9.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700180 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700181 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.temporal_idx);
182 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
183 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
184 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700185
isheriff6b4b5f32016-06-08 00:24:21 -0700186 packet_.video_header.codecHeader.VP9.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700187 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700188 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
189 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
190 EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
191 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
192 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
asapersson9a4cd872015-10-23 00:27:14 -0700193}
194
philipel83f831a2016-03-12 03:30:23 -0800195class ProcessThreadMock : public ProcessThread {
196 public:
197 MOCK_METHOD0(Start, void());
198 MOCK_METHOD0(Stop, void());
199 MOCK_METHOD1(WakeUp, void(Module* module));
200 MOCK_METHOD1(RegisterModule, void(Module* module));
201 MOCK_METHOD1(DeRegisterModule, void(Module* module));
tommi435f98b2016-05-28 14:57:15 -0700202 void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
philipel83f831a2016-03-12 03:30:23 -0800203};
204
205class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
206 public NackSender,
207 public KeyFrameRequestSender {
208 public:
209 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
210 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
211 sequence_numbers.end());
212 }
213
214 void RequestKeyFrame() override { ++keyframe_requests_; }
215
216 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
217 std::vector<uint16_t> nack_sent_;
218 int keyframe_requests_;
219
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 protected:
philipel83f831a2016-03-12 03:30:23 -0800221 TestBasicJitterBuffer() : scoped_field_trial_(GetParam()) {}
nisseef8b61e2016-04-29 06:09:15 -0700222 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700224 jitter_buffer_.reset(new VCMJitterBuffer(
225 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800226 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
227 this,
228 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000229 jitter_buffer_->Start();
230 seq_num_ = 1234;
231 timestamp_ = 0;
232 size_ = 1400;
233 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
234 data_[0] = 0;
235 data_[1] = 0;
236 data_[2] = 0x80;
237 int count = 3;
238 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
239 data_[i] = count;
240 count++;
241 if (count == 10) {
242 data_[i + 1] = 0;
243 data_[i + 2] = 0;
244 data_[i + 3] = 0x80;
245 count = 3;
246 i += 3;
247 }
248 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200249 WebRtcRTPHeader rtpHeader;
250 memset(&rtpHeader, 0, sizeof(rtpHeader));
251 rtpHeader.header.sequenceNumber = seq_num_;
252 rtpHeader.header.timestamp = timestamp_;
253 rtpHeader.header.markerBit = true;
254 rtpHeader.frameType = kVideoFrameDelta;
255 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 }
257
258 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700259 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000260 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700261 return nullptr;
262 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000263 }
264
265 VCMEncodedFrame* DecodeIncompleteFrame() {
266 uint32_t timestamp = 0;
267 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
268 if (!found_frame)
269 return NULL;
270 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
271 return frame;
272 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000273
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000274 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800275 unsigned int size,
276 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000277 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000278
279 const uint8_t* outData = frame_out->Buffer();
280 unsigned int i = 0;
281
282 if (startCode) {
283 EXPECT_EQ(0, outData[0]);
284 EXPECT_EQ(0, outData[1]);
285 EXPECT_EQ(0, outData[2]);
286 EXPECT_EQ(1, outData[3]);
287 i += 4;
288 }
289
290 EXPECT_EQ(size, frame_out->Length());
291 int count = 3;
292 for (; i < size; i++) {
293 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
294 i += 2;
295 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
296 EXPECT_EQ(0, outData[0]);
297 EXPECT_EQ(0, outData[1]);
298 EXPECT_EQ(0, outData[2]);
299 EXPECT_EQ(1, outData[3]);
300 i += 3;
301 } else {
302 EXPECT_EQ(count, outData[i]);
303 count++;
304 if (count == 10) {
305 count = 3;
306 }
307 }
308 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 }
310
311 uint16_t seq_num_;
312 uint32_t timestamp_;
313 int size_;
314 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800315 std::unique_ptr<VCMPacket> packet_;
316 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000317 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800318 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
philipel83f831a2016-03-12 03:30:23 -0800319 test::ScopedFieldTrials scoped_field_trial_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000320};
321
philipel83f831a2016-03-12 03:30:23 -0800322INSTANTIATE_TEST_CASE_P(
323 TestWithNackModule,
324 TestBasicJitterBuffer,
325 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
326 "WebRTC-NewVideoJitterBuffer/Disabled/"));
327
328class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
329 public NackSender,
330 public KeyFrameRequestSender {
331 public:
332 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
333 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
334 sequence_numbers.end());
335 }
336
337 void RequestKeyFrame() { ++keyframe_requests_; }
338
339 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
340 std::vector<uint16_t> nack_sent_;
341 int keyframe_requests_;
342
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000343 protected:
344 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000345
346 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000347 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000348 max_nack_list_size_ = 150;
349 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700350 jitter_buffer_ = new VCMJitterBuffer(
351 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800352 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
353 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700354 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000355 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800356 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
357 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000358 memset(data_buffer_, 0, kDataBufferSize);
359 }
360
361 virtual void TearDown() {
362 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000363 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000364 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000365 }
366
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000367 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000368 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000369 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000370 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000371 EXPECT_TRUE(packet_available);
372 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000373 return kGeneralError; // Return here to avoid crashes below.
374 bool retransmitted = false;
375 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000376 }
377
378 VCMFrameBufferEnum InsertPacket(int index) {
379 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000380 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000381 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000382 EXPECT_TRUE(packet_available);
383 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000384 return kGeneralError; // Return here to avoid crashes below.
385 bool retransmitted = false;
386 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000387 }
388
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000389 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700390 stream_generator_->GenerateFrame(
391 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
392 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000393 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000394 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000395 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000396 }
397
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000398 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
399 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000400 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000401 VCMFrameBufferEnum ret = InsertFrame(frame_type);
402 if (ret < kNoError) {
403 ret_for_all = ret;
404 } else if (ret_for_all >= kNoError) {
405 ret_for_all = ret;
406 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000407 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000408 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000409 }
410
411 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000412 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000413 clock_->TimeInMilliseconds());
414 for (int i = 0; i < num_packets; ++i)
415 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000416 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000417 }
418
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000419 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700420 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000421 if (!found_frame)
422 return false;
423
isheriff6b4b5f32016-06-08 00:24:21 -0700424 VCMEncodedFrame* frame =
425 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000426 bool ret = (frame != NULL);
427 jitter_buffer_->ReleaseFrame(frame);
428 return ret;
429 }
430
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000431 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000432 uint32_t timestamp = 0;
433 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
434 if (!found_frame)
435 return false;
436 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000437 bool ret = (frame != NULL);
438 jitter_buffer_->ReleaseFrame(frame);
439 return ret;
440 }
441
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000442 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000443 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800444 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000445 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000446 size_t max_nack_list_size_;
447 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000448 uint8_t data_buffer_[kDataBufferSize];
449};
450
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000451class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000452 protected:
philipel83f831a2016-03-12 03:30:23 -0800453 TestJitterBufferNack() : scoped_field_trial_(GetParam()) {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000454 virtual void SetUp() {
455 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000456 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000457 }
458
philipel9d3ab612015-12-21 04:12:39 -0800459 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
philipel83f831a2016-03-12 03:30:23 -0800460
461 test::ScopedFieldTrials scoped_field_trial_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000462};
463
philipel83f831a2016-03-12 03:30:23 -0800464INSTANTIATE_TEST_CASE_P(
465 TestWithNackModule,
466 TestJitterBufferNack,
467 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
468 "WebRTC-NewVideoJitterBuffer/Disabled/"));
469
470TEST_P(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000471 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000472 EXPECT_TRUE(NULL == DecodeCompleteFrame());
473 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
474 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000475 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000476 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000477
478 // No packets inserted.
479 EXPECT_TRUE(NULL == DecodeCompleteFrame());
480 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
481
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000482 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000483 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000484
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000485 // No packets inserted.
486 EXPECT_TRUE(NULL == DecodeCompleteFrame());
487 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
488}
489
philipel83f831a2016-03-12 03:30:23 -0800490TEST_P(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000491 // Always start with a complete key frame when not allowing errors.
492 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000493 packet_->frameType = kVideoFrameKey;
494 packet_->isFirstPacket = true;
495 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000496 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000497
498 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000499 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800500 EXPECT_EQ(kCompleteSession,
501 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000502 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000503 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000504 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000505 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000506}
507
philipel83f831a2016-03-12 03:30:23 -0800508TEST_P(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700509 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200510 // Always start with a complete key frame when not allowing errors.
511 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
512 packet_->frameType = kVideoFrameKey;
513 packet_->isFirstPacket = true;
514 packet_->markerBit = true;
515 packet_->timestamp += 123 * 90;
516
517 // Insert single packet frame to the jitter buffer and get a frame.
518 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800519 EXPECT_EQ(kCompleteSession,
520 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200521 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
522 CheckOutFrame(frame_out, size_, false);
523 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
524 jitter_buffer_->ReleaseFrame(frame_out);
525
526 // Verify that histograms are updated when the jitter buffer is stopped.
527 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
528 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700529 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
530 EXPECT_EQ(1,
531 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800532 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700533 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800534 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700535 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200536
537 // Verify that histograms are not updated if stop is called again.
538 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700539 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
540 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800541 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700542 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
543 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200544}
545
philipel83f831a2016-03-12 03:30:23 -0800546TEST_P(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000547 packet_->frameType = kVideoFrameKey;
548 packet_->isFirstPacket = true;
549 packet_->markerBit = false;
550
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000551 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800552 EXPECT_EQ(kIncomplete,
553 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000554 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
555 // Should not be complete.
556 EXPECT_TRUE(frame_out == NULL);
557
558 ++seq_num_;
559 packet_->isFirstPacket = false;
560 packet_->markerBit = true;
561 packet_->seqNum = seq_num_;
562
philipel9d3ab612015-12-21 04:12:39 -0800563 EXPECT_EQ(kCompleteSession,
564 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000565
566 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000567 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568
569 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000570 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000571}
572
philipel83f831a2016-03-12 03:30:23 -0800573TEST_P(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000574 packet_->frameType = kVideoFrameKey;
575 packet_->isFirstPacket = true;
576 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000578 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800579 EXPECT_EQ(kIncomplete,
580 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000581
582 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
583
584 // Frame should not be complete.
585 EXPECT_TRUE(frame_out == NULL);
586
587 // Insert 98 frames.
588 int loop = 0;
589 do {
590 seq_num_++;
591 packet_->isFirstPacket = false;
592 packet_->markerBit = false;
593 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000594
philipel9d3ab612015-12-21 04:12:39 -0800595 EXPECT_EQ(kIncomplete,
596 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000597 loop++;
598 } while (loop < 98);
599
600 // Insert last packet.
601 ++seq_num_;
602 packet_->isFirstPacket = false;
603 packet_->markerBit = true;
604 packet_->seqNum = seq_num_;
605
philipel9d3ab612015-12-21 04:12:39 -0800606 EXPECT_EQ(kCompleteSession,
607 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608
609 frame_out = DecodeCompleteFrame();
610
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000611 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000612 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000613 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000614}
615
philipel83f831a2016-03-12 03:30:23 -0800616TEST_P(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000617 // Always start with a complete key frame.
618 packet_->frameType = kVideoFrameKey;
619 packet_->isFirstPacket = true;
620 packet_->markerBit = true;
621
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000622 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800623 EXPECT_EQ(kCompleteSession,
624 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000625 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
626 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000627 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000628
629 ++seq_num_;
630 packet_->seqNum = seq_num_;
631 packet_->markerBit = false;
632 packet_->frameType = kVideoFrameDelta;
633 packet_->timestamp += 33 * 90;
634
philipel9d3ab612015-12-21 04:12:39 -0800635 EXPECT_EQ(kIncomplete,
636 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637
638 frame_out = DecodeCompleteFrame();
639
640 // Frame should not be complete.
641 EXPECT_TRUE(frame_out == NULL);
642
643 packet_->isFirstPacket = false;
644 // Insert 98 frames.
645 int loop = 0;
646 do {
647 ++seq_num_;
648 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000649
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000650 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800651 EXPECT_EQ(kIncomplete,
652 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653 loop++;
654 } while (loop < 98);
655
656 // Insert the last packet.
657 ++seq_num_;
658 packet_->isFirstPacket = false;
659 packet_->markerBit = true;
660 packet_->seqNum = seq_num_;
661
philipel9d3ab612015-12-21 04:12:39 -0800662 EXPECT_EQ(kCompleteSession,
663 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000664
665 frame_out = DecodeCompleteFrame();
666
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000667 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000668 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000669 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000670}
671
philipel83f831a2016-03-12 03:30:23 -0800672TEST_P(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000673 // Insert the "first" packet last.
674 seq_num_ += 100;
675 packet_->frameType = kVideoFrameKey;
676 packet_->isFirstPacket = false;
677 packet_->markerBit = true;
678 packet_->seqNum = seq_num_;
679 packet_->timestamp = timestamp_;
680
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000681 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800682 EXPECT_EQ(kIncomplete,
683 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000684
685 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
686
687 EXPECT_TRUE(frame_out == NULL);
688
689 // Insert 98 packets.
690 int loop = 0;
691 do {
692 seq_num_--;
693 packet_->isFirstPacket = false;
694 packet_->markerBit = false;
695 packet_->seqNum = seq_num_;
696
philipel9d3ab612015-12-21 04:12:39 -0800697 EXPECT_EQ(kIncomplete,
698 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000699 loop++;
700 } while (loop < 98);
701
702 // Insert the last packet.
703 seq_num_--;
704 packet_->isFirstPacket = true;
705 packet_->markerBit = false;
706 packet_->seqNum = seq_num_;
707
philipel9d3ab612015-12-21 04:12:39 -0800708 EXPECT_EQ(kCompleteSession,
709 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710
philipel9d3ab612015-12-21 04:12:39 -0800711 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000712
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000713 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000714
715 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000716 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000717}
718
philipel83f831a2016-03-12 03:30:23 -0800719TEST_P(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000720 packet_->frameType = kVideoFrameDelta;
721 packet_->isFirstPacket = true;
722 packet_->markerBit = false;
723
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000724 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800725 EXPECT_EQ(kIncomplete,
726 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000727
728 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
729
730 EXPECT_TRUE(frame_out == NULL);
731
732 seq_num_++;
733 packet_->isFirstPacket = false;
734 packet_->markerBit = true;
735 packet_->seqNum = seq_num_;
736
philipel9d3ab612015-12-21 04:12:39 -0800737 EXPECT_EQ(kCompleteSession,
738 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000739
740 // check that we fail to get frame since seqnum is not continuous
741 frame_out = DecodeCompleteFrame();
742 EXPECT_TRUE(frame_out == NULL);
743
744 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800745 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 packet_->frameType = kVideoFrameKey;
747 packet_->isFirstPacket = true;
748 packet_->markerBit = false;
749 packet_->seqNum = seq_num_;
750 packet_->timestamp = timestamp_;
751
philipel9d3ab612015-12-21 04:12:39 -0800752 EXPECT_EQ(kIncomplete,
753 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000754
755 frame_out = DecodeCompleteFrame();
756
757 // It should not be complete.
758 EXPECT_TRUE(frame_out == NULL);
759
760 seq_num_++;
761 packet_->isFirstPacket = false;
762 packet_->markerBit = true;
763 packet_->seqNum = seq_num_;
764
philipel9d3ab612015-12-21 04:12:39 -0800765 EXPECT_EQ(kCompleteSession,
766 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000767
768 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000769 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000770 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000771 jitter_buffer_->ReleaseFrame(frame_out);
772
773 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000774 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000775 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000776 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000777}
778
philipel83f831a2016-03-12 03:30:23 -0800779TEST_P(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700780 packet_->frameType = kVideoFrameKey;
781 packet_->isFirstPacket = true;
782 packet_->markerBit = true;
783
784 // Send in an initial good packet/frame (Frame A) to start things off.
785 bool retransmitted = false;
786 EXPECT_EQ(kCompleteSession,
787 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
788 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
789 EXPECT_TRUE(frame_out != NULL);
790 jitter_buffer_->ReleaseFrame(frame_out);
791
792 // Now send in a complete delta frame (Frame C), but with a sequence number
793 // gap. No pic index either, so no temporal scalability cheating :)
794 packet_->frameType = kVideoFrameDelta;
795 // Leave a gap of 2 sequence numbers and two frames.
796 packet_->seqNum = seq_num_ + 3;
797 packet_->timestamp = timestamp_ + (66 * 90);
798 // Still isFirst = marker = true.
799 // Session should be complete (frame is complete), but there's nothing to
800 // decode yet.
801 EXPECT_EQ(kCompleteSession,
802 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
803 frame_out = DecodeCompleteFrame();
804 EXPECT_TRUE(frame_out == NULL);
805
806 // Now send in a complete delta frame (Frame B) that is continuous from A, but
807 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
808 packet_->seqNum = seq_num_ + 1;
809 packet_->timestamp = timestamp_ + (33 * 90);
810 // Still isFirst = marker = true.
811 EXPECT_EQ(kCompleteSession,
812 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
813 frame_out = DecodeCompleteFrame();
814 EXPECT_TRUE(frame_out != NULL);
815 jitter_buffer_->ReleaseFrame(frame_out);
816
817 // But Frame C isn't continuous yet.
818 frame_out = DecodeCompleteFrame();
819 EXPECT_TRUE(frame_out == NULL);
820
821 // Add in the padding. These are empty packets (data length is 0) with no
822 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200823 WebRtcRTPHeader rtpHeader;
824 memset(&rtpHeader, 0, sizeof(rtpHeader));
825 rtpHeader.header.sequenceNumber = seq_num_ + 2;
826 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
827 rtpHeader.header.markerBit = false;
828 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700829 EXPECT_EQ(kOldPacket,
830 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
831 empty_packet.seqNum += 1;
832 EXPECT_EQ(kOldPacket,
833 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
834
835 // But now Frame C should be ready!
836 frame_out = DecodeCompleteFrame();
837 EXPECT_TRUE(frame_out != NULL);
838 jitter_buffer_->ReleaseFrame(frame_out);
839}
840
philipel83f831a2016-03-12 03:30:23 -0800841TEST_P(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000842 packet_->frameType = kVideoFrameKey;
843 packet_->isFirstPacket = true;
844 packet_->markerBit = false;
845 packet_->seqNum = seq_num_;
846 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000847 EXPECT_EQ(0, jitter_buffer_->num_packets());
848 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000849
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000850 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800851 EXPECT_EQ(kIncomplete,
852 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000853
854 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
855
856 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000857 EXPECT_EQ(1, jitter_buffer_->num_packets());
858 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000859
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000860 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800861 EXPECT_EQ(kDuplicatePacket,
862 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000863 EXPECT_EQ(2, jitter_buffer_->num_packets());
864 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000865
866 seq_num_++;
867 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000868 packet_->markerBit = true;
869 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000870
philipel9d3ab612015-12-21 04:12:39 -0800871 EXPECT_EQ(kCompleteSession,
872 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000873
874 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000875 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000876 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000877
878 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000879 EXPECT_EQ(3, jitter_buffer_->num_packets());
880 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000881 jitter_buffer_->ReleaseFrame(frame_out);
882}
883
philipel83f831a2016-03-12 03:30:23 -0800884TEST_P(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000885 packet_->frameType = kVideoFrameKey;
886 packet_->isFirstPacket = true;
887 packet_->markerBit = true;
888 packet_->seqNum = seq_num_;
889 packet_->timestamp = timestamp_;
890 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
891 EXPECT_EQ(0, jitter_buffer_->num_packets());
892 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
893
894 bool retransmitted = false;
895 // Insert first complete frame.
896 EXPECT_EQ(kCompleteSession,
897 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
898
899 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
900 ASSERT_TRUE(frame_out != NULL);
901 CheckOutFrame(frame_out, size_, false);
902 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
903 jitter_buffer_->ReleaseFrame(frame_out);
904
905 // Insert 3 delta frames.
906 for (uint16_t i = 1; i <= 3; ++i) {
907 packet_->seqNum = seq_num_ + i;
908 packet_->timestamp = timestamp_ + (i * 33) * 90;
909 packet_->frameType = kVideoFrameDelta;
910 EXPECT_EQ(kCompleteSession,
911 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
912 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
913 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
914 }
915
916 // Retransmit second delta frame.
917 packet_->seqNum = seq_num_ + 2;
918 packet_->timestamp = timestamp_ + 66 * 90;
919
920 EXPECT_EQ(kDuplicatePacket,
921 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
922
923 EXPECT_EQ(5, jitter_buffer_->num_packets());
924 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
925
926 // Should be able to decode 3 delta frames, key frame already decoded.
927 for (size_t i = 0; i < 3; ++i) {
928 frame_out = DecodeCompleteFrame();
929 ASSERT_TRUE(frame_out != NULL);
930 CheckOutFrame(frame_out, size_, false);
931 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
932 jitter_buffer_->ReleaseFrame(frame_out);
933 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000934}
935
philipel83f831a2016-03-12 03:30:23 -0800936TEST_P(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700937 // Verify that JB skips forward to next base layer frame.
938 // -------------------------------------------------
939 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
940 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
941 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
942 // | ss | x | x | x | |
943 // -------------------------------------------------
944 // |<----------tl0idx:200--------->|<---tl0idx:201---
945
946 bool re = false;
947 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700948 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700949 packet_->isFirstPacket = true;
950 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700951 packet_->video_header.codecHeader.VP9.flexible_mode = false;
952 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
953 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
954 packet_->video_header.codecHeader.VP9.end_of_frame = true;
955 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700956
957 packet_->seqNum = 65485;
958 packet_->timestamp = 1000;
959 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700960 packet_->video_header.codecHeader.VP9.picture_id = 5;
961 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
962 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
963 packet_->video_header.codecHeader.VP9.ss_data_available = true;
964 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700965 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
966 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
967
968 // Insert next temporal layer 0.
969 packet_->seqNum = 65489;
970 packet_->timestamp = 13000;
971 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700972 packet_->video_header.codecHeader.VP9.picture_id = 9;
973 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
974 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
975 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700976 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
977
978 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
979 EXPECT_EQ(1000U, frame_out->TimeStamp());
980 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
981 jitter_buffer_->ReleaseFrame(frame_out);
982
983 frame_out = DecodeCompleteFrame();
984 EXPECT_EQ(13000U, frame_out->TimeStamp());
985 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
986 jitter_buffer_->ReleaseFrame(frame_out);
987}
988
philipel83f831a2016-03-12 03:30:23 -0800989TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700990 // Verify that frames are updated with SS data when SS packet is reordered.
991 // --------------------------------
992 // | 65486 | 65487 | 65485 |...
993 // | pid:6 | pid:7 | pid:5 |...
994 // | tid:2 | tid:1 | tid:0 |...
995 // | | | ss |
996 // --------------------------------
997 // |<--------tl0idx:200--------->|
998
999 bool re = false;
1000 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001001 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -07001002 packet_->isFirstPacket = true;
1003 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -07001004 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1005 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1006 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1007 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1008 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001009
1010 packet_->seqNum = 65486;
1011 packet_->timestamp = 6000;
1012 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001013 packet_->video_header.codecHeader.VP9.picture_id = 6;
1014 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
1015 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001016 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1017
1018 packet_->seqNum = 65487;
1019 packet_->timestamp = 9000;
1020 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001021 packet_->video_header.codecHeader.VP9.picture_id = 7;
1022 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1023 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001024 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1025
1026 // Insert first frame with SS data.
1027 packet_->seqNum = 65485;
1028 packet_->timestamp = 3000;
1029 packet_->frameType = kVideoFrameKey;
1030 packet_->width = 352;
1031 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001032 packet_->video_header.codecHeader.VP9.picture_id = 5;
1033 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1034 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1035 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1036 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001037 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1038 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1039
1040 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1041 EXPECT_EQ(3000U, frame_out->TimeStamp());
1042 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1043 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1044 EXPECT_FALSE(
1045 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1046 jitter_buffer_->ReleaseFrame(frame_out);
1047
1048 frame_out = DecodeCompleteFrame();
1049 EXPECT_EQ(6000U, frame_out->TimeStamp());
1050 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1051 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1052 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1053 jitter_buffer_->ReleaseFrame(frame_out);
1054
1055 frame_out = DecodeCompleteFrame();
1056 EXPECT_EQ(9000U, frame_out->TimeStamp());
1057 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1058 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1059 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1060 jitter_buffer_->ReleaseFrame(frame_out);
1061}
1062
philipel83f831a2016-03-12 03:30:23 -08001063TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001064 // Verify that frames are updated with SS data when SS packet is reordered.
1065 // -----------------------------------------
1066 // | 65486 | 65487 | 65485 | 65484 |...
1067 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1068 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1069 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1070 // | t:6000 | t:6000 | t:3000 | t:3000 |
1071 // | | | | ss |
1072 // -----------------------------------------
1073 // |<-----------tl0idx:200------------>|
1074
1075 bool re = false;
1076 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001077 packet_->video_header.codec = kRtpVideoVp9;
1078 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1079 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1080 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1081 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001082
1083 packet_->isFirstPacket = true;
1084 packet_->markerBit = false;
1085 packet_->seqNum = 65486;
1086 packet_->timestamp = 6000;
1087 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001088 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1089 packet_->video_header.codecHeader.VP9.picture_id = 6;
1090 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1091 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001092 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1093
1094 packet_->isFirstPacket = false;
1095 packet_->markerBit = true;
1096 packet_->seqNum = 65487;
1097 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001098 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1099 packet_->video_header.codecHeader.VP9.picture_id = 6;
1100 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1101 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001102 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1103
1104 packet_->isFirstPacket = false;
1105 packet_->markerBit = true;
1106 packet_->seqNum = 65485;
1107 packet_->timestamp = 3000;
1108 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001109 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1110 packet_->video_header.codecHeader.VP9.picture_id = 5;
1111 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1112 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001113 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1114
1115 // Insert first frame with SS data.
1116 packet_->isFirstPacket = true;
1117 packet_->markerBit = false;
1118 packet_->seqNum = 65484;
1119 packet_->frameType = kVideoFrameKey;
1120 packet_->width = 352;
1121 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001122 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1123 packet_->video_header.codecHeader.VP9.picture_id = 5;
1124 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1125 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1126 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1127 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001128 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1129 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1130
1131 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1132 EXPECT_EQ(3000U, frame_out->TimeStamp());
1133 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1134 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1135 EXPECT_FALSE(
1136 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1137 jitter_buffer_->ReleaseFrame(frame_out);
1138
1139 frame_out = DecodeCompleteFrame();
1140 EXPECT_EQ(6000U, frame_out->TimeStamp());
1141 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1142 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1143 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1144 jitter_buffer_->ReleaseFrame(frame_out);
1145}
1146
philipel83f831a2016-03-12 03:30:23 -08001147TEST_P(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001148 packet_->frameType = kVideoFrameKey;
1149 packet_->isFirstPacket = true;
1150 packet_->markerBit = false;
1151 packet_->seqNum = seq_num_;
1152 packet_->timestamp = timestamp_;
1153 packet_->insertStartCode = true;
1154
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001155 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001156 EXPECT_EQ(kIncomplete,
1157 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001158
1159 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1160
1161 // Frame should not be complete.
1162 EXPECT_TRUE(frame_out == NULL);
1163
1164 seq_num_++;
1165 packet_->isFirstPacket = false;
1166 packet_->markerBit = true;
1167 packet_->seqNum = seq_num_;
1168
philipel9d3ab612015-12-21 04:12:39 -08001169 EXPECT_EQ(kCompleteSession,
1170 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001171
1172 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001173 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001174 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001175 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001176}
1177
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001178// Test threshold conditions of decodable state.
philipel83f831a2016-03-12 03:30:23 -08001179TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001180 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001181 // Always start with a key frame. Use 10 packets to test Decodable State
1182 // boundaries.
1183 packet_->frameType = kVideoFrameKey;
1184 packet_->isFirstPacket = true;
1185 packet_->markerBit = false;
1186 packet_->seqNum = seq_num_;
1187 packet_->timestamp = timestamp_;
1188
1189 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001190 EXPECT_EQ(kIncomplete,
1191 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001192 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001193 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001194 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1195
1196 packet_->isFirstPacket = false;
1197 for (int i = 1; i < 9; ++i) {
1198 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001199 EXPECT_EQ(kIncomplete,
1200 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001201 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001202 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1203 }
1204
1205 // last packet
1206 packet_->markerBit = true;
1207 packet_->seqNum++;
1208
philipel9d3ab612015-12-21 04:12:39 -08001209 EXPECT_EQ(kCompleteSession,
1210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001211 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1212 CheckOutFrame(frame_out, 10 * size_, false);
1213 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001214 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001215
1216 // An incomplete frame can only be decoded once a subsequent frame has begun
1217 // to arrive. Insert packet in distant frame for this purpose.
1218 packet_->frameType = kVideoFrameDelta;
1219 packet_->isFirstPacket = true;
1220 packet_->markerBit = false;
1221 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001222 packet_->timestamp += 33 * 90 * 8;
1223
philipel9d3ab612015-12-21 04:12:39 -08001224 EXPECT_EQ(kDecodableSession,
1225 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001226 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001227 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1228
1229 // Insert second frame
1230 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001231 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001232
philipel9d3ab612015-12-21 04:12:39 -08001233 EXPECT_EQ(kDecodableSession,
1234 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001235 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001236 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1237
1238 packet_->isFirstPacket = false;
1239 for (int i = 1; i < 8; ++i) {
1240 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001241 EXPECT_EQ(kDecodableSession,
1242 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001243 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001244 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1245 }
1246
1247 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001248 EXPECT_EQ(kDecodableSession,
1249 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001250 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001251 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1252
1253 frame_out = DecodeIncompleteFrame();
1254 ASSERT_FALSE(NULL == frame_out);
1255 CheckOutFrame(frame_out, 9 * size_, false);
1256 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001257 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001258
1259 packet_->markerBit = true;
1260 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001261 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001262}
1263
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001264// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001265TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001266 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1267 // Always start with a key frame.
1268 packet_->frameType = kVideoFrameKey;
1269 packet_->isFirstPacket = true;
1270 packet_->markerBit = true;
1271 packet_->seqNum = seq_num_;
1272 packet_->timestamp = timestamp_;
1273
1274 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001275 EXPECT_EQ(kCompleteSession,
1276 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001277 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1278 CheckOutFrame(frame_out, size_, false);
1279 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001280 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001281
1282 // An incomplete frame can only be decoded once a subsequent frame has begun
1283 // to arrive. Insert packet in distant frame for this purpose.
1284 packet_->frameType = kVideoFrameDelta;
1285 packet_->isFirstPacket = false;
1286 packet_->markerBit = false;
1287 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001288 packet_->timestamp += 33 * 90 * 8;
1289 EXPECT_EQ(kIncomplete,
1290 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001291 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001292 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001293 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1294
1295 // Insert second frame - an incomplete key frame.
1296 packet_->frameType = kVideoFrameKey;
1297 packet_->isFirstPacket = true;
1298 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001299 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001300
philipel9d3ab612015-12-21 04:12:39 -08001301 EXPECT_EQ(kIncomplete,
1302 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001303 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001304 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1305
1306 // Insert a few more packets. Make sure we're waiting for the key frame to be
1307 // complete.
1308 packet_->isFirstPacket = false;
1309 for (int i = 1; i < 5; ++i) {
1310 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001311 EXPECT_EQ(kIncomplete,
1312 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001313 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001314 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1315 }
1316
1317 // Complete key frame.
1318 packet_->markerBit = true;
1319 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001320 EXPECT_EQ(kCompleteSession,
1321 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001322 frame_out = DecodeCompleteFrame();
1323 CheckOutFrame(frame_out, 6 * size_, false);
1324 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001325 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001326}
1327
1328// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001329TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001330 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1331 // Always start with a key frame.
1332 packet_->frameType = kVideoFrameKey;
1333 packet_->isFirstPacket = true;
1334 packet_->markerBit = true;
1335 packet_->seqNum = seq_num_;
1336 packet_->timestamp = timestamp_;
1337
1338 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001339 EXPECT_EQ(kCompleteSession,
1340 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001341 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1342 CheckOutFrame(frame_out, size_, false);
1343 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001344 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001345
1346 // An incomplete frame can only be decoded once a subsequent frame has begun
1347 // to arrive. Insert packet in distant frame for this purpose.
1348 packet_->frameType = kVideoFrameDelta;
1349 packet_->isFirstPacket = false;
1350 packet_->markerBit = false;
1351 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001352 packet_->timestamp += 33 * 90 * 8;
1353 EXPECT_EQ(kIncomplete,
1354 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001355 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001356 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1358
1359 // Insert second frame with the first packet missing. Make sure we're waiting
1360 // for the key frame to be complete.
1361 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001362 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001363
philipel9d3ab612015-12-21 04:12:39 -08001364 EXPECT_EQ(kIncomplete,
1365 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001366 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001367 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1368
1369 for (int i = 0; i < 5; ++i) {
1370 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001371 EXPECT_EQ(kIncomplete,
1372 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001373 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001374 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1375 }
1376
1377 // Add first packet. Frame should now be decodable, but incomplete.
1378 packet_->isFirstPacket = true;
1379 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001380 EXPECT_EQ(kDecodableSession,
1381 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001382 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001383 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1384
1385 frame_out = DecodeIncompleteFrame();
1386 CheckOutFrame(frame_out, 7 * size_, false);
1387 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001388 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001389}
1390
philipel83f831a2016-03-12 03:30:23 -08001391TEST_P(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001392 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001394 packet_->frameType = kVideoFrameKey;
1395 packet_->isFirstPacket = true;
1396 packet_->markerBit = true;
1397 packet_->seqNum = seq_num_;
1398 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001399 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001400 EXPECT_EQ(kCompleteSession,
1401 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001402 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001403 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1404 EXPECT_NE(frame, nullptr);
1405 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1406 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001407 EXPECT_TRUE(frame != NULL);
1408 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001409
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001410 // Drop a complete frame.
1411 timestamp_ += 2 * 33 * 90;
1412 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001413 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001414 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001415 packet_->markerBit = false;
1416 packet_->seqNum = seq_num_;
1417 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kDecodableSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001420 // Insert a packet (so the previous one will be released).
1421 timestamp_ += 33 * 90;
1422 seq_num_ += 2;
1423 packet_->frameType = kVideoFrameDelta;
1424 packet_->isFirstPacket = true;
1425 packet_->markerBit = false;
1426 packet_->seqNum = seq_num_;
1427 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001428 EXPECT_EQ(kDecodableSession,
1429 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001430 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001431 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1432 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001433}
1434
philipel83f831a2016-03-12 03:30:23 -08001435TEST_P(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001436 // Verify missing packets statistics and not decodable packets statistics.
1437 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1438 // The last packet is an empty (non-media) packet.
1439
1440 // Select a start seqNum which triggers a difficult wrap situation
1441 // The JB will only output (incomplete)frames if the next one has started
1442 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001443 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001444 seq_num_ = 0xffff - 4;
1445 seq_num_++;
1446 packet_->frameType = kVideoFrameKey;
1447 packet_->isFirstPacket = true;
1448 packet_->markerBit = false;
1449 packet_->seqNum = seq_num_;
1450 packet_->timestamp = timestamp_;
1451 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001452
1453 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001454 EXPECT_EQ(kDecodableSession,
1455 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001456 for (int i = 0; i < 11; ++i) {
1457 webrtc::FrameType frametype = kVideoFrameDelta;
1458 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001459 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001460 packet_->frameType = frametype;
1461 packet_->isFirstPacket = true;
1462 packet_->markerBit = false;
1463 packet_->seqNum = seq_num_;
1464 packet_->timestamp = timestamp_;
1465 packet_->completeNALU = kNaluStart;
1466
philipel9d3ab612015-12-21 04:12:39 -08001467 EXPECT_EQ(kDecodableSession,
1468 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001469
1470 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1471
1472 // Should not be complete.
1473 EXPECT_TRUE(frame_out == NULL);
1474
1475 seq_num_ += 2;
1476 packet_->isFirstPacket = false;
1477 packet_->markerBit = true;
1478 packet_->seqNum = seq_num_;
1479 packet_->completeNALU = kNaluEnd;
1480
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001481 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1482 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001483
1484 // Insert an empty (non-media) packet.
1485 seq_num_++;
1486 packet_->isFirstPacket = false;
1487 packet_->markerBit = false;
1488 packet_->seqNum = seq_num_;
1489 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001490 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001491
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001492 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001493 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001494 frame_out = DecodeIncompleteFrame();
1495
1496 // One of the packets has been discarded by the jitter buffer.
1497 // Last frame can't be extracted yet.
1498 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001499 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001500
1501 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001502 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 } else {
philipel9d3ab612015-12-21 04:12:39 -08001504 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001505 }
1506 EXPECT_FALSE(frame_out->Complete());
1507 EXPECT_FALSE(frame_out->MissingFrame());
1508 }
1509
1510 jitter_buffer_->ReleaseFrame(frame_out);
1511 }
1512
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001513 // Insert 3 old packets and verify that we have 3 discarded packets
1514 // Match value to actual latest timestamp decoded.
1515 timestamp_ -= 33 * 90;
1516 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001517
philipel9d3ab612015-12-21 04:12:39 -08001518 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519
1520 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001521
philipel9d3ab612015-12-21 04:12:39 -08001522 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001523
1524 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001525
philipel9d3ab612015-12-21 04:12:39 -08001526 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527
1528 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1529
1530 jitter_buffer_->Flush();
1531
1532 // This statistic shouldn't be reset by a flush.
1533 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1534}
1535
philipel83f831a2016-03-12 03:30:23 -08001536TEST_P(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001537 seq_num_ = 0xfff0;
1538 packet_->frameType = kVideoFrameKey;
1539 packet_->isFirstPacket = true;
1540 packet_->markerBit = false;
1541 packet_->seqNum = seq_num_;
1542 packet_->timestamp = timestamp_;
1543
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001544 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001545 EXPECT_EQ(kIncomplete,
1546 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547
1548 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1549
1550 EXPECT_TRUE(frame_out == NULL);
1551
1552 int loop = 0;
1553 do {
1554 seq_num_++;
1555 packet_->isFirstPacket = false;
1556 packet_->markerBit = false;
1557 packet_->seqNum = seq_num_;
1558
philipel9d3ab612015-12-21 04:12:39 -08001559 EXPECT_EQ(kIncomplete,
1560 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561
1562 frame_out = DecodeCompleteFrame();
1563
1564 EXPECT_TRUE(frame_out == NULL);
1565
1566 loop++;
1567 } while (loop < 98);
1568
1569 seq_num_++;
1570 packet_->isFirstPacket = false;
1571 packet_->markerBit = true;
1572 packet_->seqNum = seq_num_;
1573
philipel9d3ab612015-12-21 04:12:39 -08001574 EXPECT_EQ(kCompleteSession,
1575 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576
1577 frame_out = DecodeCompleteFrame();
1578
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001579 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001580
1581 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001582 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001583}
1584
philipel83f831a2016-03-12 03:30:23 -08001585TEST_P(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586 // Insert "first" packet last seqnum.
1587 seq_num_ = 10;
1588 packet_->frameType = kVideoFrameKey;
1589 packet_->isFirstPacket = false;
1590 packet_->markerBit = true;
1591 packet_->seqNum = seq_num_;
1592
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001593 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001594 EXPECT_EQ(kIncomplete,
1595 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001596 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1597
1598 // Should not be complete.
1599 EXPECT_TRUE(frame_out == NULL);
1600
1601 // Insert 98 frames.
1602 int loop = 0;
1603 do {
1604 seq_num_--;
1605 packet_->isFirstPacket = false;
1606 packet_->markerBit = false;
1607 packet_->seqNum = seq_num_;
1608
philipel9d3ab612015-12-21 04:12:39 -08001609 EXPECT_EQ(kIncomplete,
1610 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001611
1612 frame_out = DecodeCompleteFrame();
1613
1614 EXPECT_TRUE(frame_out == NULL);
1615
1616 loop++;
1617 } while (loop < 98);
1618
1619 // Insert last packet.
1620 seq_num_--;
1621 packet_->isFirstPacket = true;
1622 packet_->markerBit = false;
1623 packet_->seqNum = seq_num_;
1624
philipel9d3ab612015-12-21 04:12:39 -08001625 EXPECT_EQ(kCompleteSession,
1626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627
1628 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001629 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001630 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001631 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001632}
1633
philipel83f831a2016-03-12 03:30:23 -08001634TEST_P(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001635 // ------- -------
1636 // | 2 | | 1 |
1637 // ------- -------
1638 // t = 3000 t = 2000
1639 seq_num_ = 2;
1640 timestamp_ = 3000;
1641 packet_->frameType = kVideoFrameKey;
1642 packet_->isFirstPacket = true;
1643 packet_->markerBit = true;
1644 packet_->timestamp = timestamp_;
1645 packet_->seqNum = seq_num_;
1646
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001647 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001648 EXPECT_EQ(kCompleteSession,
1649 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001650
1651 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1652 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001653 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655 jitter_buffer_->ReleaseFrame(frame_out);
1656
1657 seq_num_--;
1658 timestamp_ = 2000;
1659 packet_->frameType = kVideoFrameDelta;
1660 packet_->isFirstPacket = true;
1661 packet_->markerBit = true;
1662 packet_->seqNum = seq_num_;
1663 packet_->timestamp = timestamp_;
1664
philipel9d3ab612015-12-21 04:12:39 -08001665 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001666}
1667
philipel83f831a2016-03-12 03:30:23 -08001668TEST_P(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001669 // ------- -------
1670 // | 2 | | 1 |
1671 // ------- -------
1672 // t = 3000 t = 0xffffff00
1673
1674 seq_num_ = 2;
1675 timestamp_ = 3000;
1676 packet_->frameType = kVideoFrameKey;
1677 packet_->isFirstPacket = true;
1678 packet_->markerBit = true;
1679 packet_->seqNum = seq_num_;
1680 packet_->timestamp = timestamp_;
1681
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001682 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001683 EXPECT_EQ(kCompleteSession,
1684 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001685
1686 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1687 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1688
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001689 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690
1691 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1692
1693 jitter_buffer_->ReleaseFrame(frame_out);
1694
1695 seq_num_--;
1696 timestamp_ = 0xffffff00;
1697 packet_->frameType = kVideoFrameDelta;
1698 packet_->isFirstPacket = true;
1699 packet_->markerBit = true;
1700 packet_->seqNum = seq_num_;
1701 packet_->timestamp = timestamp_;
1702
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001703 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001704 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001705}
1706
philipel83f831a2016-03-12 03:30:23 -08001707TEST_P(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001708 // --------------- ---------------
1709 // | 1 | 2 | | 3 | 4 |
1710 // --------------- ---------------
1711 // t = 0xffffff00 t = 33*90
1712
1713 timestamp_ = 0xffffff00;
1714 packet_->frameType = kVideoFrameKey;
1715 packet_->isFirstPacket = true;
1716 packet_->markerBit = false;
1717 packet_->seqNum = seq_num_;
1718 packet_->timestamp = timestamp_;
1719
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001720 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001721 EXPECT_EQ(kIncomplete,
1722 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001723
1724 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725 EXPECT_TRUE(frame_out == NULL);
1726
1727 seq_num_++;
1728 packet_->isFirstPacket = false;
1729 packet_->markerBit = true;
1730 packet_->seqNum = seq_num_;
1731
philipel9d3ab612015-12-21 04:12:39 -08001732 EXPECT_EQ(kCompleteSession,
1733 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734
1735 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001736 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737 jitter_buffer_->ReleaseFrame(frame_out);
1738
1739 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001740 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001741 packet_->frameType = kVideoFrameDelta;
1742 packet_->isFirstPacket = true;
1743 packet_->markerBit = false;
1744 packet_->seqNum = seq_num_;
1745 packet_->timestamp = timestamp_;
1746
philipel9d3ab612015-12-21 04:12:39 -08001747 EXPECT_EQ(kIncomplete,
1748 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749
1750 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001751 EXPECT_TRUE(frame_out == NULL);
1752
1753 seq_num_++;
1754 packet_->isFirstPacket = false;
1755 packet_->markerBit = true;
1756 packet_->seqNum = seq_num_;
1757
philipel9d3ab612015-12-21 04:12:39 -08001758 EXPECT_EQ(kCompleteSession,
1759 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001760
1761 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001762 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001763 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001764 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765}
1766
philipel83f831a2016-03-12 03:30:23 -08001767TEST_P(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001768 // ------- -------
1769 // | 1 | | 2 |
1770 // ------- -------
1771 // t = 0xffffff00 t = 2700
1772
1773 timestamp_ = 0xffffff00;
1774 packet_->frameType = kVideoFrameKey;
1775 packet_->isFirstPacket = true;
1776 packet_->markerBit = true;
1777 packet_->timestamp = timestamp_;
1778
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001779 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001780 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001781 EXPECT_EQ(kCompleteSession,
1782 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001783
1784 // Insert next frame.
1785 seq_num_++;
1786 timestamp_ = 2700;
1787 packet_->frameType = kVideoFrameDelta;
1788 packet_->isFirstPacket = true;
1789 packet_->markerBit = true;
1790 packet_->seqNum = seq_num_;
1791 packet_->timestamp = timestamp_;
1792
philipel9d3ab612015-12-21 04:12:39 -08001793 EXPECT_EQ(kCompleteSession,
1794 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795
1796 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1797 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001798 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001799 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001800 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001801
1802 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1803 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001804 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001805 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001806 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001807}
1808
philipel83f831a2016-03-12 03:30:23 -08001809TEST_P(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001810 // ------- -------
1811 // | 2 | | 1 |
1812 // ------- -------
1813 // t = 2700 t = 0xffffff00
1814
1815 seq_num_ = 2;
1816 timestamp_ = 2700;
1817 packet_->frameType = kVideoFrameDelta;
1818 packet_->isFirstPacket = true;
1819 packet_->markerBit = true;
1820 packet_->seqNum = seq_num_;
1821 packet_->timestamp = timestamp_;
1822
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001823 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001824 EXPECT_EQ(kCompleteSession,
1825 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001826
1827 // Insert second frame
1828 seq_num_--;
1829 timestamp_ = 0xffffff00;
1830 packet_->frameType = kVideoFrameKey;
1831 packet_->isFirstPacket = true;
1832 packet_->markerBit = true;
1833 packet_->seqNum = seq_num_;
1834 packet_->timestamp = timestamp_;
1835
philipel9d3ab612015-12-21 04:12:39 -08001836 EXPECT_EQ(kCompleteSession,
1837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838
1839 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1840 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001841 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001843 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001844
1845 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1846 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001847 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001848 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001849 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001850}
1851
philipel83f831a2016-03-12 03:30:23 -08001852TEST_P(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001853 int loop = 0;
1854 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001855 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001856 // Insert kMaxPacketsInJitterBuffer into frame.
1857 do {
1858 seq_num_++;
1859 packet_->isFirstPacket = false;
1860 packet_->markerBit = false;
1861 packet_->seqNum = seq_num_;
1862
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001863 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001864 EXPECT_EQ(kIncomplete,
1865 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001866 firstPacket = false;
1867 } else {
philipel9d3ab612015-12-21 04:12:39 -08001868 EXPECT_EQ(kIncomplete,
1869 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870 }
1871
1872 loop++;
1873 } while (loop < kMaxPacketsInSession);
1874
1875 // Max number of packets inserted.
1876 // Insert one more packet.
1877 seq_num_++;
1878 packet_->isFirstPacket = false;
1879 packet_->markerBit = true;
1880 packet_->seqNum = seq_num_;
1881
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001882 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001883 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001884 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001885}
1886
philipel83f831a2016-03-12 03:30:23 -08001887TEST_P(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001888 // TEST fill JB with more than max number of frame (50 delta frames +
1889 // 51 key frames) with wrap in seq_num_
1890 //
1891 // --------------------------------------------------------------
1892 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1893 // --------------------------------------------------------------
1894 // |<-----------delta frames------------->|<------key frames----->|
1895
jbauchdb81ffd2015-11-23 03:59:02 -08001896 // Make sure the jitter doesn't request a keyframe after too much non-
1897 // decodable frames.
1898 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001899 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001900
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001901 int loop = 0;
1902 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001903 uint32_t first_key_frame_timestamp = 0;
1904 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001905 // Insert MAX_NUMBER_OF_FRAMES frames.
1906 do {
philipel9d3ab612015-12-21 04:12:39 -08001907 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001908 seq_num_++;
1909 packet_->isFirstPacket = true;
1910 packet_->markerBit = true;
1911 packet_->seqNum = seq_num_;
1912 packet_->timestamp = timestamp_;
1913
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001914 if (loop == 50) {
1915 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001916 packet_->frameType = kVideoFrameKey;
1917 }
1918
1919 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001920 EXPECT_EQ(kCompleteSession,
1921 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001922
1923 loop++;
1924 } while (loop < kMaxNumberOfFrames);
1925
1926 // Max number of frames inserted.
1927
1928 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001929 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001930 seq_num_++;
1931 packet_->isFirstPacket = true;
1932 packet_->markerBit = true;
1933 packet_->seqNum = seq_num_;
1934 packet_->timestamp = timestamp_;
1935
1936 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001937 EXPECT_EQ(kFlushIndicator,
1938 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001940 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1941 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001942 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001943 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001944 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001945}
1946
philipel83f831a2016-03-12 03:30:23 -08001947TEST_P(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001948 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001949 seq_num_ = 3;
1950 // Insert one empty packet per frame, should never return the last timestamp
1951 // inserted. Only return empty frames in the presence of subsequent frames.
1952 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001953 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001954 for (int i = 0; i < maxSize + 10; i++) {
1955 timestamp_ += 33 * 90;
1956 seq_num_++;
1957 packet_->isFirstPacket = false;
1958 packet_->markerBit = false;
1959 packet_->seqNum = seq_num_;
1960 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001961 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001962
philipel9d3ab612015-12-21 04:12:39 -08001963 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001964 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1965 // Timestamp should never be the last TS inserted.
1966 if (testFrame != NULL) {
1967 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001968 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001969 }
1970 }
1971}
1972
philipel83f831a2016-03-12 03:30:23 -08001973TEST_P(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001974 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001975 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001976 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001977 timestamp_ += 33 * 90;
1978 int insertedLength = 0;
1979 packet_->seqNum = seq_num_;
1980 packet_->timestamp = timestamp_;
1981 packet_->frameType = kVideoFrameKey;
1982 packet_->isFirstPacket = true;
1983 packet_->completeNALU = kNaluStart;
1984 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001985 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001986
philipel9d3ab612015-12-21 04:12:39 -08001987 EXPECT_EQ(kDecodableSession,
1988 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001989
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001990 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001991 packet_->seqNum = seq_num_;
1992 packet_->frameType = kVideoFrameKey;
1993 packet_->isFirstPacket = false;
1994 packet_->completeNALU = kNaluIncomplete;
1995 packet_->markerBit = false;
1996
philipel9d3ab612015-12-21 04:12:39 -08001997 EXPECT_EQ(kDecodableSession,
1998 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001999
2000 seq_num_++;
2001 packet_->seqNum = seq_num_;
2002 packet_->frameType = kVideoFrameKey;
2003 packet_->isFirstPacket = false;
2004 packet_->completeNALU = kNaluEnd;
2005 packet_->markerBit = false;
2006
philipel9d3ab612015-12-21 04:12:39 -08002007 EXPECT_EQ(kDecodableSession,
2008 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002009
2010 seq_num_++;
2011 packet_->seqNum = seq_num_;
2012 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002013 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002014 EXPECT_EQ(kDecodableSession,
2015 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016 // The JB will only output (incomplete) frames if a packet belonging to a
2017 // subsequent frame was already inserted. Insert one packet of a subsequent
2018 // frame. place high timestamp so the JB would always have a next frame
2019 // (otherwise, for every inserted frame we need to take care of the next
2020 // frame as well).
2021 packet_->seqNum = 1;
2022 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2023 packet_->frameType = kVideoFrameDelta;
2024 packet_->isFirstPacket = false;
2025 packet_->completeNALU = kNaluStart;
2026 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002027
philipel9d3ab612015-12-21 04:12:39 -08002028 EXPECT_EQ(kDecodableSession,
2029 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002030
2031 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2032
2033 // We can decode everything from a NALU until a packet has been lost.
2034 // Thus we can decode the first packet of the first NALU and the second NALU
2035 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002036 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002037 jitter_buffer_->ReleaseFrame(frame_out);
2038
2039 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002040 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002041 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002042 insertedLength = 0;
2043
2044 packet_->seqNum = seq_num_;
2045 packet_->timestamp = timestamp_;
2046 packet_->frameType = kVideoFrameKey;
2047 packet_->isFirstPacket = false;
2048 packet_->completeNALU = kNaluEnd;
2049 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002050 EXPECT_EQ(kDecodableSession,
2051 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2052 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 seq_num_--;
2054 packet_->seqNum = seq_num_;
2055 packet_->timestamp = timestamp_;
2056 packet_->frameType = kVideoFrameKey;
2057 packet_->isFirstPacket = true;
2058 packet_->completeNALU = kNaluStart;
2059 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002060
philipel9d3ab612015-12-21 04:12:39 -08002061 EXPECT_EQ(kDecodableSession,
2062 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002063 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2064
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002065 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002066 packet_->seqNum = seq_num_;
2067 packet_->timestamp = timestamp_;
2068 packet_->frameType = kVideoFrameKey;
2069 packet_->isFirstPacket = false;
2070 packet_->completeNALU = kNaluComplete;
2071 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002072 EXPECT_EQ(kDecodableSession,
2073 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002074 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002075 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002076 packet_->seqNum = seq_num_;
2077 packet_->timestamp = timestamp_;
2078 packet_->frameType = kVideoFrameKey;
2079 packet_->isFirstPacket = false;
2080 packet_->completeNALU = kNaluStart;
2081 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002082 EXPECT_EQ(kDecodableSession,
2083 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002084 // This packet should be decoded since it's the beginning of a NAL.
2085 insertedLength += packet_->sizeBytes;
2086
2087 seq_num_ += 2;
2088 packet_->seqNum = seq_num_;
2089 packet_->timestamp = timestamp_;
2090 packet_->frameType = kVideoFrameKey;
2091 packet_->isFirstPacket = false;
2092 packet_->completeNALU = kNaluEnd;
2093 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002094 EXPECT_EQ(kDecodableSession,
2095 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 // This packet should not be decoded because it is an incomplete NAL if it
2097 // is the last.
2098 frame_out = DecodeIncompleteFrame();
2099 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002100 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101 jitter_buffer_->ReleaseFrame(frame_out);
2102
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002103 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002104 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002105 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002106 WebRtcRTPHeader rtpHeader;
2107 memset(&rtpHeader, 0, sizeof(rtpHeader));
2108 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002109 emptypacket.seqNum = seq_num_;
2110 emptypacket.timestamp = timestamp_;
2111 emptypacket.frameType = kVideoFrameKey;
2112 emptypacket.isFirstPacket = true;
2113 emptypacket.completeNALU = kNaluComplete;
2114 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002115 EXPECT_EQ(kCompleteSession,
2116 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002117 // This packet should not be decoded because it is an incomplete NAL if it
2118 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002119
2120 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2121 // has arrived.
2122 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002123 EXPECT_TRUE(frame_out != NULL);
2124 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002125
2126 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002127 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002128 timestamp_ += 33 * 90;
2129
2130 packet_->seqNum = seq_num_;
2131 packet_->timestamp = timestamp_;
2132 packet_->frameType = kVideoFrameKey;
2133 packet_->isFirstPacket = true;
2134 packet_->completeNALU = kNaluComplete;
2135 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002136
philipel9d3ab612015-12-21 04:12:39 -08002137 EXPECT_EQ(kDecodableSession,
2138 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002139
agalusza@google.comd177c102013-08-08 01:12:33 +00002140 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002141 emptypacket.seqNum = seq_num_;
2142 emptypacket.timestamp = timestamp_;
2143 emptypacket.frameType = kVideoFrameKey;
2144 emptypacket.isFirstPacket = true;
2145 emptypacket.completeNALU = kNaluComplete;
2146 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002147 EXPECT_EQ(kCompleteSession,
2148 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002149
2150 frame_out = DecodeCompleteFrame();
2151 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002152 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002153 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154}
2155
philipel83f831a2016-03-12 03:30:23 -08002156TEST_P(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002157 // Test that a we cannot get incomplete frames from the JB if we haven't
2158 // received the marker bit, unless we have received a packet from a later
2159 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002160 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002161 // Start with a complete key frame - insert and decode.
2162 packet_->frameType = kVideoFrameKey;
2163 packet_->isFirstPacket = true;
2164 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002165 bool retransmitted = false;
2166
philipel9d3ab612015-12-21 04:12:39 -08002167 EXPECT_EQ(kCompleteSession,
2168 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002169 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2170 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002171 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002172
2173 packet_->seqNum += 2;
2174 packet_->timestamp += 33 * 90;
2175 packet_->frameType = kVideoFrameDelta;
2176 packet_->isFirstPacket = false;
2177 packet_->markerBit = false;
2178
philipel9d3ab612015-12-21 04:12:39 -08002179 EXPECT_EQ(kDecodableSession,
2180 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002181
2182 frame_out = DecodeIncompleteFrame();
2183 EXPECT_TRUE(frame_out == NULL);
2184
2185 packet_->seqNum += 2;
2186 packet_->timestamp += 33 * 90;
2187 packet_->isFirstPacket = true;
2188
philipel9d3ab612015-12-21 04:12:39 -08002189 EXPECT_EQ(kDecodableSession,
2190 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002191
2192 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002193 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002194 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002195}
2196
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002197TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002198 // Make sure the jitter doesn't request a keyframe after too much non-
2199 // decodable frames.
2200 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002201 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002202 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002203 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002204 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002205 DropFrame(1);
2206 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002207 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002208 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002209 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002210 // This frame will make the jitter buffer recycle frames until a key frame.
2211 // Since none is found it will have to wait until the next key frame before
2212 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002213 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002214 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002215}
2216
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002217TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002218 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002219 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002220 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002221 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002222 // Insert empty packet.
2223 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002224 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002225 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002226 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002227 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002228 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002229 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002230 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002231 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002232 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002233 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002234 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002235}
2236
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002237TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002238 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2239 EXPECT_EQ(0, frame_stats.delta_frames);
2240 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002241
2242 uint32_t framerate = 0;
2243 uint32_t bitrate = 0;
2244 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2245 EXPECT_EQ(0u, framerate);
2246 EXPECT_EQ(0u, bitrate);
2247
2248 // Insert a couple of key and delta frames.
2249 InsertFrame(kVideoFrameKey);
2250 InsertFrame(kVideoFrameDelta);
2251 InsertFrame(kVideoFrameDelta);
2252 InsertFrame(kVideoFrameKey);
2253 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002254 // Decode some of them to make sure the statistics doesn't depend on frames
2255 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002256 EXPECT_TRUE(DecodeCompleteFrame());
2257 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002258 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002259 EXPECT_EQ(3, frame_stats.delta_frames);
2260 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002261
2262 // Insert 20 more frames to get estimates of bitrate and framerate over
2263 // 1 second.
2264 for (int i = 0; i < 20; ++i) {
2265 InsertFrame(kVideoFrameDelta);
2266 }
2267 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2268 // TODO(holmer): The current implementation returns the average of the last
2269 // two framerate calculations, which is why it takes two calls to reach the
2270 // actual framerate. This should be fixed.
2271 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2272 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2273 // Insert 25 more frames to get estimates of bitrate and framerate over
2274 // 2 seconds.
2275 for (int i = 0; i < 25; ++i) {
2276 InsertFrame(kVideoFrameDelta);
2277 }
2278 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2279 EXPECT_EQ(kDefaultFrameRate, framerate);
2280 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2281}
2282
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002283TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2284 // Insert delta frames.
2285 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2286 // Can't decode without a key frame.
2287 EXPECT_FALSE(DecodeCompleteFrame());
2288 InsertFrame(kVideoFrameKey);
2289 // Skip to the next key frame.
2290 EXPECT_TRUE(DecodeCompleteFrame());
2291}
2292
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002293TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2294 InsertFrame(kVideoFrameKey);
2295 EXPECT_TRUE(DecodeCompleteFrame());
2296 const int kNumDeltaFrames = 5;
2297 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2298 InsertFrame(kVideoFrameKey);
2299 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2300 EXPECT_TRUE(DecodeCompleteFrame());
2301 }
2302}
2303
2304TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2305 InsertFrame(kVideoFrameKey);
2306 EXPECT_TRUE(DecodeCompleteFrame());
2307 const int kNumDeltaFrames = 5;
2308 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2309 InsertFrame(kVideoFrameKey);
2310 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2311 InsertFrame(kVideoFrameKey);
2312 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2313 EXPECT_TRUE(DecodeCompleteFrame());
2314 }
2315}
2316
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002317TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2318 InsertFrame(kVideoFrameKey);
2319 EXPECT_TRUE(DecodeCompleteFrame());
2320 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2321 clock_->TimeInMilliseconds());
2322 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2323 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2324 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002325 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002326 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2327 EXPECT_FALSE(DecodeCompleteFrame());
2328 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2329 EXPECT_TRUE(DecodeCompleteFrame());
2330 EXPECT_TRUE(DecodeCompleteFrame());
2331}
2332
philipel83f831a2016-03-12 03:30:23 -08002333TEST_P(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002334 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002335 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002336 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002337 InsertFrame(kVideoFrameKey);
2338 EXPECT_TRUE(DecodeCompleteFrame());
2339}
2340
philipel83f831a2016-03-12 03:30:23 -08002341TEST_P(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002342 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002343 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002344 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002345
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002346 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2347 // old packet.
2348 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002349 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002350 EXPECT_EQ(kFlushIndicator,
2351 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002352 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002353
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002354 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002355 std::vector<uint16_t> nack_list =
2356 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002357 // No key frame will be requested since the jitter buffer is empty.
2358 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002359 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002360
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002361 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002362 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002363 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002364 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002365
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002366 // The next complete continuous frame isn't a key frame, but we're waiting
2367 // for one.
2368 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002369 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002370 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002371 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002372}
2373
philipel83f831a2016-03-12 03:30:23 -08002374TEST_P(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002375 // Insert a key frame and decode it.
2376 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2377 EXPECT_TRUE(DecodeCompleteFrame());
2378
2379 // Insert a frame which should trigger a recycle until the next key frame.
2380 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2381
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002382 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002383 std::vector<uint16_t> nack_list =
2384 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002385 // Verify that the jitter buffer does not request a key frame.
2386 EXPECT_FALSE(request_key_frame);
2387 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002388 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002389 // Verify that we can decode the next frame.
2390 EXPECT_TRUE(DecodeCompleteFrame());
2391}
2392
philipel83f831a2016-03-12 03:30:23 -08002393TEST_P(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002394 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002395 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002396 EXPECT_TRUE(DecodeCompleteFrame());
2397
2398 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002399 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002400 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002401 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002402 EXPECT_FALSE(DecodeCompleteFrame());
2403
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002404 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002405 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002406 // The jitter buffer is empty, so we won't request key frames until we get a
2407 // packet.
2408 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002409
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002410 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002411 // Now we have a packet in the jitter buffer, a key frame will be requested
2412 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002413 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002414 // The jitter buffer is empty, so we won't request key frames until we get a
2415 // packet.
2416 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002417 // The next complete continuous frame isn't a key frame, but we're waiting
2418 // for one.
2419 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002420 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002421 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002422 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002423 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002424}
2425
philipel83f831a2016-03-12 03:30:23 -08002426TEST_P(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002427 DropFrame(10);
2428 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002429 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002430 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002431 std::vector<uint16_t> nack_list =
2432 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002433 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002434 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002435 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002436}
2437
philipel83f831a2016-03-12 03:30:23 -08002438TEST_P(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002439 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002440 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002441 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002442 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002443 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002444 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002445 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002446 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002447 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002448 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2449 EXPECT_EQ(1u, nack_sent_.size());
2450 else
2451 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002452}
2453
philipel83f831a2016-03-12 03:30:23 -08002454TEST_P(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002455 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002456 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2457 clock_->TimeInMilliseconds());
2458 VCMPacket packet;
2459 stream_generator_->PopPacket(&packet, 0);
2460 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002461 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002462 EXPECT_FALSE(retransmitted);
2463 // Drop second packet.
2464 stream_generator_->PopPacket(&packet, 1);
2465 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2466 EXPECT_FALSE(retransmitted);
2467 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002468 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002469 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002470 uint16_t seq_num;
2471 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2472 EXPECT_EQ(1u, nack_sent_.size());
2473 seq_num = nack_sent_[0];
2474 } else {
2475 EXPECT_EQ(1u, nack_list.size());
2476 seq_num = nack_list[0];
2477 }
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002478 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002479 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002480 EXPECT_EQ(kCompleteSession,
2481 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002482 EXPECT_TRUE(retransmitted);
2483 EXPECT_TRUE(DecodeCompleteFrame());
2484}
2485
philipel83f831a2016-03-12 03:30:23 -08002486TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002487 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002488 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002489 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002490 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002491 // Drop second packet.
2492 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2493 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002494 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002495 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002496 uint16_t seq_num;
2497 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2498 ASSERT_EQ(1u, nack_sent_.size());
2499 seq_num = nack_sent_[0];
2500 } else {
2501 ASSERT_EQ(1u, nack_list.size());
2502 seq_num = nack_list[0];
2503 }
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002504 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002505 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002506 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002507}
2508
philipel83f831a2016-03-12 03:30:23 -08002509TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002510 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002511 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002512 // First frame is delta.
2513 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2514 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002515 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002516 // Drop second packet in frame.
2517 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2518 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2519 // Second frame is key.
2520 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2521 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002522 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002523 // Drop second packet in frame.
2524 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2525 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002526 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002527 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002528 uint16_t seq_num;
2529 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2530 ASSERT_EQ(2u, nack_sent_.size());
2531 seq_num = nack_sent_[1];
2532 } else {
2533 ASSERT_EQ(1u, nack_list.size());
2534 seq_num = nack_list[0];
2535 }
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002536 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002537 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002538}
2539
philipel83f831a2016-03-12 03:30:23 -08002540TEST_P(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002541 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002542 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002543
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002544 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002545 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002546
2547 // ----------------------------------------------------------------
2548 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2549 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002550 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002551 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002552 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002553 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002554 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002555 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002556 while (stream_generator_->PacketsRemaining() > 1) {
2557 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002558 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002559 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002560 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002561 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002562 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002563 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002564 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002565 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002566 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002567 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002568
2569 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002570 std::vector<uint16_t> nack_list =
2571 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002572 const size_t kExpectedNackSize = 9;
philipel83f831a2016-03-12 03:30:23 -08002573 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2574 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2575 else
2576 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002577 for (size_t i = 0; i < nack_list.size(); ++i)
2578 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002579}
2580
philipel83f831a2016-03-12 03:30:23 -08002581TEST_P(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002582 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002583 // ------- ------------------------------------------------------------
2584 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2585 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002586 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002587 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002588 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002589 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002590 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002591 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002592 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002593 while (stream_generator_->PacketsRemaining() > 1) {
2594 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002595 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002596 EXPECT_FALSE(request_key_frame);
2597 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002598 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002599 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002600 }
2601 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002602 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002603 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002604 EXPECT_FALSE(DecodeCompleteFrame());
2605 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002606 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002607 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002608 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002609 const size_t kExpectedNackSize = 10;
philipel83f831a2016-03-12 03:30:23 -08002610 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2611 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2612 for (size_t i = 0; i < nack_sent_.size(); ++i)
2613 EXPECT_EQ(i * 10, nack_sent_[i]);
2614 } else {
2615 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2616 for (size_t i = 0; i < nack_list.size(); ++i)
2617 EXPECT_EQ(i * 10, nack_list[i]);
2618 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002619}
2620
philipel83f831a2016-03-12 03:30:23 -08002621TEST_P(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002622 bool request_key_frame = false;
2623 // -----------------------------------
2624 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2625 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002626 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002627 InsertFrame(kVideoFrameKey);
2628 EXPECT_FALSE(request_key_frame);
2629 EXPECT_TRUE(DecodeCompleteFrame());
2630 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2631 clock_->TimeInMilliseconds());
2632 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2633 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002634 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002635 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002636 EXPECT_FALSE(request_key_frame);
2637 } else {
2638 stream_generator_->NextPacket(NULL); // Drop packet
2639 }
2640 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2641 clock_->TimeInMilliseconds());
2642 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2643 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002644 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002645 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002646 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002647 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002648 // Verify the NACK list.
philipel83f831a2016-03-12 03:30:23 -08002649 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2650 ASSERT_EQ(1u, nack_sent_.size());
2651 EXPECT_EQ(65535, nack_sent_[0]);
2652 } else {
2653 ASSERT_EQ(1u, nack_list.size());
2654 EXPECT_EQ(65535, nack_list[0]);
2655 }
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002656}
2657
philipel83f831a2016-03-12 03:30:23 -08002658TEST_P(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002659 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002660 InsertFrame(kVideoFrameKey);
2661 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002662 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002663 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2664 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002665
2666 // Far-into-the-future video frame, could be caused by resetting the encoder
2667 // or otherwise restarting. This should not fail when error when the packet is
2668 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002669 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002670 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2671 InsertFrame(kVideoFrameKey);
2672 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002673 nack_list = jitter_buffer_->GetNackList(&extended);
2674 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002675
2676 // Stream should be decodable from this point.
2677 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2678 InsertFrame(kVideoFrameDelta);
2679 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002680 nack_list = jitter_buffer_->GetNackList(&extended);
2681 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002682}
2683
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002684} // namespace webrtc