blob: f2e5f10deb04391e38d980fc21284a150e40da6c [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
Henrik Kjellander2557b862015-11-18 22:00:21 +010016#include "webrtc/modules/video_coding/frame_buffer.h"
17#include "webrtc/modules/video_coding/jitter_buffer.h"
18#include "webrtc/modules/video_coding/media_opt_util.h"
19#include "webrtc/modules/video_coding/packet.h"
20#include "webrtc/modules/video_coding/test/stream_generator.h"
21#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010022#include "webrtc/system_wrappers/include/clock.h"
philipel83f831a2016-03-12 03:30:23 -080023#include "webrtc/system_wrappers/include/field_trial.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010024#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070025#include "webrtc/system_wrappers/include/metrics_default.h"
philipel83f831a2016-03-12 03:30:23 -080026#include "webrtc/test/field_trial.h"
kwibergac9f8762016-09-30 22:29:43 -070027#include "webrtc/test/gmock.h"
28#include "webrtc/test/gtest.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:
philipel85130292016-07-06 16:10:31 +0200221 TestBasicJitterBuffer() {}
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_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000319};
320
philipel83f831a2016-03-12 03:30:23 -0800321class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
322 public NackSender,
323 public KeyFrameRequestSender {
324 public:
325 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
326 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
327 sequence_numbers.end());
328 }
329
330 void RequestKeyFrame() { ++keyframe_requests_; }
331
332 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
333 std::vector<uint16_t> nack_sent_;
334 int keyframe_requests_;
335
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000336 protected:
337 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000338
339 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000340 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000341 max_nack_list_size_ = 150;
342 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700343 jitter_buffer_ = new VCMJitterBuffer(
344 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800345 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
346 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700347 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800349 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
350 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000351 memset(data_buffer_, 0, kDataBufferSize);
352 }
353
354 virtual void TearDown() {
355 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000356 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000357 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000358 }
359
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000360 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000361 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000362 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000363 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000364 EXPECT_TRUE(packet_available);
365 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000366 return kGeneralError; // Return here to avoid crashes below.
367 bool retransmitted = false;
368 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000369 }
370
371 VCMFrameBufferEnum InsertPacket(int index) {
372 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000373 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000374 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000375 EXPECT_TRUE(packet_available);
376 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000377 return kGeneralError; // Return here to avoid crashes below.
378 bool retransmitted = false;
379 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000380 }
381
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000382 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700383 stream_generator_->GenerateFrame(
384 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
385 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000386 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000387 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000388 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000389 }
390
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000391 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
392 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000393 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000394 VCMFrameBufferEnum ret = InsertFrame(frame_type);
395 if (ret < kNoError) {
396 ret_for_all = ret;
397 } else if (ret_for_all >= kNoError) {
398 ret_for_all = ret;
399 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000400 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000401 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000402 }
403
404 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000405 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000406 clock_->TimeInMilliseconds());
407 for (int i = 0; i < num_packets; ++i)
408 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000409 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000410 }
411
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000412 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700413 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000414 if (!found_frame)
415 return false;
416
isheriff6b4b5f32016-06-08 00:24:21 -0700417 VCMEncodedFrame* frame =
418 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000419 bool ret = (frame != NULL);
420 jitter_buffer_->ReleaseFrame(frame);
421 return ret;
422 }
423
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000424 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000425 uint32_t timestamp = 0;
426 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
427 if (!found_frame)
428 return false;
429 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000430 bool ret = (frame != NULL);
431 jitter_buffer_->ReleaseFrame(frame);
432 return ret;
433 }
434
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000435 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000436 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800437 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000438 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000439 size_t max_nack_list_size_;
440 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000441 uint8_t data_buffer_[kDataBufferSize];
442};
443
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000444class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000445 protected:
philipel85130292016-07-06 16:10:31 +0200446 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000447 virtual void SetUp() {
448 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000449 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000450 }
451
philipel9d3ab612015-12-21 04:12:39 -0800452 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000453};
454
philipel85130292016-07-06 16:10:31 +0200455TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000456 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000457 EXPECT_TRUE(NULL == DecodeCompleteFrame());
458 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
459 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000460 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000461 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000462
463 // No packets inserted.
464 EXPECT_TRUE(NULL == DecodeCompleteFrame());
465 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
466
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000467 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000468 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000470 // No packets inserted.
471 EXPECT_TRUE(NULL == DecodeCompleteFrame());
472 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
473}
474
philipel85130292016-07-06 16:10:31 +0200475TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000476 // Always start with a complete key frame when not allowing errors.
477 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000478 packet_->frameType = kVideoFrameKey;
479 packet_->isFirstPacket = true;
480 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000481 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000482
483 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000484 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800485 EXPECT_EQ(kCompleteSession,
486 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000487 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000488 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000489 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000490 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000491}
492
philipel85130292016-07-06 16:10:31 +0200493TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700494 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200495 // Always start with a complete key frame when not allowing errors.
496 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
497 packet_->frameType = kVideoFrameKey;
498 packet_->isFirstPacket = true;
499 packet_->markerBit = true;
500 packet_->timestamp += 123 * 90;
501
502 // Insert single packet frame to the jitter buffer and get a frame.
503 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800504 EXPECT_EQ(kCompleteSession,
505 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200506 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
507 CheckOutFrame(frame_out, size_, false);
508 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
509 jitter_buffer_->ReleaseFrame(frame_out);
510
511 // Verify that histograms are updated when the jitter buffer is stopped.
512 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
513 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700514 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
515 EXPECT_EQ(1,
516 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800517 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700518 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800519 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700520 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200521
522 // Verify that histograms are not updated if stop is called again.
523 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700524 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
525 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800526 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700527 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
528 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200529}
530
philipel85130292016-07-06 16:10:31 +0200531TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000532 packet_->frameType = kVideoFrameKey;
533 packet_->isFirstPacket = true;
534 packet_->markerBit = false;
535
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000536 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800537 EXPECT_EQ(kIncomplete,
538 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000539 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
540 // Should not be complete.
541 EXPECT_TRUE(frame_out == NULL);
542
543 ++seq_num_;
544 packet_->isFirstPacket = false;
545 packet_->markerBit = true;
546 packet_->seqNum = seq_num_;
547
philipel9d3ab612015-12-21 04:12:39 -0800548 EXPECT_EQ(kCompleteSession,
549 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000550
551 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000552 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553
554 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000555 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000556}
557
philipel85130292016-07-06 16:10:31 +0200558TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000559 packet_->frameType = kVideoFrameKey;
560 packet_->isFirstPacket = true;
561 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000562
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000563 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800564 EXPECT_EQ(kIncomplete,
565 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000566
567 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
568
569 // Frame should not be complete.
570 EXPECT_TRUE(frame_out == NULL);
571
572 // Insert 98 frames.
573 int loop = 0;
574 do {
575 seq_num_++;
576 packet_->isFirstPacket = false;
577 packet_->markerBit = false;
578 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000579
philipel9d3ab612015-12-21 04:12:39 -0800580 EXPECT_EQ(kIncomplete,
581 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000582 loop++;
583 } while (loop < 98);
584
585 // Insert last packet.
586 ++seq_num_;
587 packet_->isFirstPacket = false;
588 packet_->markerBit = true;
589 packet_->seqNum = seq_num_;
590
philipel9d3ab612015-12-21 04:12:39 -0800591 EXPECT_EQ(kCompleteSession,
592 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593
594 frame_out = DecodeCompleteFrame();
595
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000596 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000597 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000598 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000599}
600
philipel85130292016-07-06 16:10:31 +0200601TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602 // Always start with a complete key frame.
603 packet_->frameType = kVideoFrameKey;
604 packet_->isFirstPacket = true;
605 packet_->markerBit = true;
606
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000607 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800608 EXPECT_EQ(kCompleteSession,
609 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000610 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
611 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000612 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613
614 ++seq_num_;
615 packet_->seqNum = seq_num_;
616 packet_->markerBit = false;
617 packet_->frameType = kVideoFrameDelta;
618 packet_->timestamp += 33 * 90;
619
philipel9d3ab612015-12-21 04:12:39 -0800620 EXPECT_EQ(kIncomplete,
621 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000622
623 frame_out = DecodeCompleteFrame();
624
625 // Frame should not be complete.
626 EXPECT_TRUE(frame_out == NULL);
627
628 packet_->isFirstPacket = false;
629 // Insert 98 frames.
630 int loop = 0;
631 do {
632 ++seq_num_;
633 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000634
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000635 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800636 EXPECT_EQ(kIncomplete,
637 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000638 loop++;
639 } while (loop < 98);
640
641 // Insert the last packet.
642 ++seq_num_;
643 packet_->isFirstPacket = false;
644 packet_->markerBit = true;
645 packet_->seqNum = seq_num_;
646
philipel9d3ab612015-12-21 04:12:39 -0800647 EXPECT_EQ(kCompleteSession,
648 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649
650 frame_out = DecodeCompleteFrame();
651
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000652 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000654 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655}
656
philipel85130292016-07-06 16:10:31 +0200657TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000658 // Insert the "first" packet last.
659 seq_num_ += 100;
660 packet_->frameType = kVideoFrameKey;
661 packet_->isFirstPacket = false;
662 packet_->markerBit = true;
663 packet_->seqNum = seq_num_;
664 packet_->timestamp = timestamp_;
665
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000666 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800667 EXPECT_EQ(kIncomplete,
668 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000669
670 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
671
672 EXPECT_TRUE(frame_out == NULL);
673
674 // Insert 98 packets.
675 int loop = 0;
676 do {
677 seq_num_--;
678 packet_->isFirstPacket = false;
679 packet_->markerBit = false;
680 packet_->seqNum = seq_num_;
681
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 loop++;
685 } while (loop < 98);
686
687 // Insert the last packet.
688 seq_num_--;
689 packet_->isFirstPacket = true;
690 packet_->markerBit = false;
691 packet_->seqNum = seq_num_;
692
philipel9d3ab612015-12-21 04:12:39 -0800693 EXPECT_EQ(kCompleteSession,
694 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000695
philipel9d3ab612015-12-21 04:12:39 -0800696 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000698 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000699
700 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000701 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702}
703
philipel85130292016-07-06 16:10:31 +0200704TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705 packet_->frameType = kVideoFrameDelta;
706 packet_->isFirstPacket = true;
707 packet_->markerBit = false;
708
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000709 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800710 EXPECT_EQ(kIncomplete,
711 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000712
713 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
714
715 EXPECT_TRUE(frame_out == NULL);
716
717 seq_num_++;
718 packet_->isFirstPacket = false;
719 packet_->markerBit = true;
720 packet_->seqNum = seq_num_;
721
philipel9d3ab612015-12-21 04:12:39 -0800722 EXPECT_EQ(kCompleteSession,
723 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000724
725 // check that we fail to get frame since seqnum is not continuous
726 frame_out = DecodeCompleteFrame();
727 EXPECT_TRUE(frame_out == NULL);
728
729 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800730 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000731 packet_->frameType = kVideoFrameKey;
732 packet_->isFirstPacket = true;
733 packet_->markerBit = false;
734 packet_->seqNum = seq_num_;
735 packet_->timestamp = timestamp_;
736
philipel9d3ab612015-12-21 04:12:39 -0800737 EXPECT_EQ(kIncomplete,
738 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000739
740 frame_out = DecodeCompleteFrame();
741
742 // It should not be complete.
743 EXPECT_TRUE(frame_out == NULL);
744
745 seq_num_++;
746 packet_->isFirstPacket = false;
747 packet_->markerBit = true;
748 packet_->seqNum = seq_num_;
749
philipel9d3ab612015-12-21 04:12:39 -0800750 EXPECT_EQ(kCompleteSession,
751 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000752
753 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000754 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000755 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000756 jitter_buffer_->ReleaseFrame(frame_out);
757
758 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000759 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000760 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000761 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000762}
763
philipel85130292016-07-06 16:10:31 +0200764TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700765 packet_->frameType = kVideoFrameKey;
766 packet_->isFirstPacket = true;
767 packet_->markerBit = true;
768
769 // Send in an initial good packet/frame (Frame A) to start things off.
770 bool retransmitted = false;
771 EXPECT_EQ(kCompleteSession,
772 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
773 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
774 EXPECT_TRUE(frame_out != NULL);
775 jitter_buffer_->ReleaseFrame(frame_out);
776
777 // Now send in a complete delta frame (Frame C), but with a sequence number
778 // gap. No pic index either, so no temporal scalability cheating :)
779 packet_->frameType = kVideoFrameDelta;
780 // Leave a gap of 2 sequence numbers and two frames.
781 packet_->seqNum = seq_num_ + 3;
782 packet_->timestamp = timestamp_ + (66 * 90);
783 // Still isFirst = marker = true.
784 // Session should be complete (frame is complete), but there's nothing to
785 // decode yet.
786 EXPECT_EQ(kCompleteSession,
787 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
788 frame_out = DecodeCompleteFrame();
789 EXPECT_TRUE(frame_out == NULL);
790
791 // Now send in a complete delta frame (Frame B) that is continuous from A, but
792 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
793 packet_->seqNum = seq_num_ + 1;
794 packet_->timestamp = timestamp_ + (33 * 90);
795 // Still isFirst = marker = true.
796 EXPECT_EQ(kCompleteSession,
797 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
798 frame_out = DecodeCompleteFrame();
799 EXPECT_TRUE(frame_out != NULL);
800 jitter_buffer_->ReleaseFrame(frame_out);
801
802 // But Frame C isn't continuous yet.
803 frame_out = DecodeCompleteFrame();
804 EXPECT_TRUE(frame_out == NULL);
805
806 // Add in the padding. These are empty packets (data length is 0) with no
807 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200808 WebRtcRTPHeader rtpHeader;
809 memset(&rtpHeader, 0, sizeof(rtpHeader));
810 rtpHeader.header.sequenceNumber = seq_num_ + 2;
811 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
812 rtpHeader.header.markerBit = false;
813 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700814 EXPECT_EQ(kOldPacket,
815 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
816 empty_packet.seqNum += 1;
817 EXPECT_EQ(kOldPacket,
818 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
819
820 // But now Frame C should be ready!
821 frame_out = DecodeCompleteFrame();
822 EXPECT_TRUE(frame_out != NULL);
823 jitter_buffer_->ReleaseFrame(frame_out);
824}
825
philipel85130292016-07-06 16:10:31 +0200826TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000827 packet_->frameType = kVideoFrameKey;
828 packet_->isFirstPacket = true;
829 packet_->markerBit = false;
830 packet_->seqNum = seq_num_;
831 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000832 EXPECT_EQ(0, jitter_buffer_->num_packets());
833 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000834
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000835 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800836 EXPECT_EQ(kIncomplete,
837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000838
839 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
840
841 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000842 EXPECT_EQ(1, jitter_buffer_->num_packets());
843 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000845 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800846 EXPECT_EQ(kDuplicatePacket,
847 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000848 EXPECT_EQ(2, jitter_buffer_->num_packets());
849 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000850
851 seq_num_++;
852 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000853 packet_->markerBit = true;
854 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000855
philipel9d3ab612015-12-21 04:12:39 -0800856 EXPECT_EQ(kCompleteSession,
857 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000858
859 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000860 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000861 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000862
863 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000864 EXPECT_EQ(3, jitter_buffer_->num_packets());
865 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000866 jitter_buffer_->ReleaseFrame(frame_out);
867}
868
philipel85130292016-07-06 16:10:31 +0200869TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000870 packet_->frameType = kVideoFrameKey;
871 packet_->isFirstPacket = true;
872 packet_->markerBit = true;
873 packet_->seqNum = seq_num_;
874 packet_->timestamp = timestamp_;
875 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
876 EXPECT_EQ(0, jitter_buffer_->num_packets());
877 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
878
879 bool retransmitted = false;
880 // Insert first complete frame.
881 EXPECT_EQ(kCompleteSession,
882 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
883
884 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
885 ASSERT_TRUE(frame_out != NULL);
886 CheckOutFrame(frame_out, size_, false);
887 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
888 jitter_buffer_->ReleaseFrame(frame_out);
889
890 // Insert 3 delta frames.
891 for (uint16_t i = 1; i <= 3; ++i) {
892 packet_->seqNum = seq_num_ + i;
893 packet_->timestamp = timestamp_ + (i * 33) * 90;
894 packet_->frameType = kVideoFrameDelta;
895 EXPECT_EQ(kCompleteSession,
896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
897 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
898 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
899 }
900
901 // Retransmit second delta frame.
902 packet_->seqNum = seq_num_ + 2;
903 packet_->timestamp = timestamp_ + 66 * 90;
904
905 EXPECT_EQ(kDuplicatePacket,
906 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
907
908 EXPECT_EQ(5, jitter_buffer_->num_packets());
909 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
910
911 // Should be able to decode 3 delta frames, key frame already decoded.
912 for (size_t i = 0; i < 3; ++i) {
913 frame_out = DecodeCompleteFrame();
914 ASSERT_TRUE(frame_out != NULL);
915 CheckOutFrame(frame_out, size_, false);
916 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
917 jitter_buffer_->ReleaseFrame(frame_out);
918 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000919}
920
philipel85130292016-07-06 16:10:31 +0200921TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700922 // Verify that JB skips forward to next base layer frame.
923 // -------------------------------------------------
924 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
925 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
926 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
927 // | ss | x | x | x | |
928 // -------------------------------------------------
929 // |<----------tl0idx:200--------->|<---tl0idx:201---
930
931 bool re = false;
932 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700933 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700934 packet_->isFirstPacket = true;
935 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700936 packet_->video_header.codecHeader.VP9.flexible_mode = false;
937 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
938 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
939 packet_->video_header.codecHeader.VP9.end_of_frame = true;
940 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700941
942 packet_->seqNum = 65485;
943 packet_->timestamp = 1000;
944 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700945 packet_->video_header.codecHeader.VP9.picture_id = 5;
946 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
947 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
948 packet_->video_header.codecHeader.VP9.ss_data_available = true;
949 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700950 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
951 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
952
953 // Insert next temporal layer 0.
954 packet_->seqNum = 65489;
955 packet_->timestamp = 13000;
956 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700957 packet_->video_header.codecHeader.VP9.picture_id = 9;
958 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
959 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
960 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700961 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
962
963 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
964 EXPECT_EQ(1000U, frame_out->TimeStamp());
965 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
966 jitter_buffer_->ReleaseFrame(frame_out);
967
968 frame_out = DecodeCompleteFrame();
969 EXPECT_EQ(13000U, frame_out->TimeStamp());
970 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
971 jitter_buffer_->ReleaseFrame(frame_out);
972}
973
philipel85130292016-07-06 16:10:31 +0200974TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700975 // Verify that frames are updated with SS data when SS packet is reordered.
976 // --------------------------------
977 // | 65486 | 65487 | 65485 |...
978 // | pid:6 | pid:7 | pid:5 |...
979 // | tid:2 | tid:1 | tid:0 |...
980 // | | | ss |
981 // --------------------------------
982 // |<--------tl0idx:200--------->|
983
984 bool re = false;
985 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700986 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700987 packet_->isFirstPacket = true;
988 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700989 packet_->video_header.codecHeader.VP9.flexible_mode = false;
990 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
991 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
992 packet_->video_header.codecHeader.VP9.end_of_frame = true;
993 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700994
995 packet_->seqNum = 65486;
996 packet_->timestamp = 6000;
997 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700998 packet_->video_header.codecHeader.VP9.picture_id = 6;
999 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
1000 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001001 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1002
1003 packet_->seqNum = 65487;
1004 packet_->timestamp = 9000;
1005 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001006 packet_->video_header.codecHeader.VP9.picture_id = 7;
1007 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1008 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001009 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1010
1011 // Insert first frame with SS data.
1012 packet_->seqNum = 65485;
1013 packet_->timestamp = 3000;
1014 packet_->frameType = kVideoFrameKey;
1015 packet_->width = 352;
1016 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001017 packet_->video_header.codecHeader.VP9.picture_id = 5;
1018 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1019 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1020 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1021 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001022 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1023 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1024
1025 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1026 EXPECT_EQ(3000U, frame_out->TimeStamp());
1027 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1028 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1029 EXPECT_FALSE(
1030 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1031 jitter_buffer_->ReleaseFrame(frame_out);
1032
1033 frame_out = DecodeCompleteFrame();
1034 EXPECT_EQ(6000U, frame_out->TimeStamp());
1035 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1036 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1037 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1038 jitter_buffer_->ReleaseFrame(frame_out);
1039
1040 frame_out = DecodeCompleteFrame();
1041 EXPECT_EQ(9000U, frame_out->TimeStamp());
1042 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1043 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1044 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1045 jitter_buffer_->ReleaseFrame(frame_out);
1046}
1047
philipel85130292016-07-06 16:10:31 +02001048TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001049 // Verify that frames are updated with SS data when SS packet is reordered.
1050 // -----------------------------------------
1051 // | 65486 | 65487 | 65485 | 65484 |...
1052 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1053 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1054 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1055 // | t:6000 | t:6000 | t:3000 | t:3000 |
1056 // | | | | ss |
1057 // -----------------------------------------
1058 // |<-----------tl0idx:200------------>|
1059
1060 bool re = false;
1061 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001062 packet_->video_header.codec = kRtpVideoVp9;
1063 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1064 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1065 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1066 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001067
1068 packet_->isFirstPacket = true;
1069 packet_->markerBit = false;
1070 packet_->seqNum = 65486;
1071 packet_->timestamp = 6000;
1072 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001073 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1074 packet_->video_header.codecHeader.VP9.picture_id = 6;
1075 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1076 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001077 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1078
1079 packet_->isFirstPacket = false;
1080 packet_->markerBit = true;
1081 packet_->seqNum = 65487;
1082 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001083 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1084 packet_->video_header.codecHeader.VP9.picture_id = 6;
1085 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1086 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001087 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1088
1089 packet_->isFirstPacket = false;
1090 packet_->markerBit = true;
1091 packet_->seqNum = 65485;
1092 packet_->timestamp = 3000;
1093 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001094 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1095 packet_->video_header.codecHeader.VP9.picture_id = 5;
1096 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1097 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001098 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1099
1100 // Insert first frame with SS data.
1101 packet_->isFirstPacket = true;
1102 packet_->markerBit = false;
1103 packet_->seqNum = 65484;
1104 packet_->frameType = kVideoFrameKey;
1105 packet_->width = 352;
1106 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001107 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1108 packet_->video_header.codecHeader.VP9.picture_id = 5;
1109 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1110 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1111 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1112 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001113 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1114 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1115
1116 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1117 EXPECT_EQ(3000U, frame_out->TimeStamp());
1118 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1119 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1120 EXPECT_FALSE(
1121 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1122 jitter_buffer_->ReleaseFrame(frame_out);
1123
1124 frame_out = DecodeCompleteFrame();
1125 EXPECT_EQ(6000U, frame_out->TimeStamp());
1126 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1127 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1128 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1129 jitter_buffer_->ReleaseFrame(frame_out);
1130}
1131
philipel85130292016-07-06 16:10:31 +02001132TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001133 packet_->frameType = kVideoFrameKey;
1134 packet_->isFirstPacket = true;
1135 packet_->markerBit = false;
1136 packet_->seqNum = seq_num_;
1137 packet_->timestamp = timestamp_;
1138 packet_->insertStartCode = true;
1139
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001140 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001141 EXPECT_EQ(kIncomplete,
1142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001143
1144 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1145
1146 // Frame should not be complete.
1147 EXPECT_TRUE(frame_out == NULL);
1148
1149 seq_num_++;
1150 packet_->isFirstPacket = false;
1151 packet_->markerBit = true;
1152 packet_->seqNum = seq_num_;
1153
philipel9d3ab612015-12-21 04:12:39 -08001154 EXPECT_EQ(kCompleteSession,
1155 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001156
1157 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001158 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001160 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001161}
1162
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001163// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001164TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001165 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001166 // Always start with a key frame. Use 10 packets to test Decodable State
1167 // boundaries.
1168 packet_->frameType = kVideoFrameKey;
1169 packet_->isFirstPacket = true;
1170 packet_->markerBit = false;
1171 packet_->seqNum = seq_num_;
1172 packet_->timestamp = timestamp_;
1173
1174 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001175 EXPECT_EQ(kIncomplete,
1176 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001177 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001178 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001179 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1180
1181 packet_->isFirstPacket = false;
1182 for (int i = 1; i < 9; ++i) {
1183 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001184 EXPECT_EQ(kIncomplete,
1185 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001186 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001187 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1188 }
1189
1190 // last packet
1191 packet_->markerBit = true;
1192 packet_->seqNum++;
1193
philipel9d3ab612015-12-21 04:12:39 -08001194 EXPECT_EQ(kCompleteSession,
1195 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001196 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1197 CheckOutFrame(frame_out, 10 * size_, false);
1198 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001199 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001200
1201 // An incomplete frame can only be decoded once a subsequent frame has begun
1202 // to arrive. Insert packet in distant frame for this purpose.
1203 packet_->frameType = kVideoFrameDelta;
1204 packet_->isFirstPacket = true;
1205 packet_->markerBit = false;
1206 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001207 packet_->timestamp += 33 * 90 * 8;
1208
philipel9d3ab612015-12-21 04:12:39 -08001209 EXPECT_EQ(kDecodableSession,
1210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001211 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001212 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1213
1214 // Insert second frame
1215 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001216 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001217
philipel9d3ab612015-12-21 04:12:39 -08001218 EXPECT_EQ(kDecodableSession,
1219 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001220 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001221 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1222
1223 packet_->isFirstPacket = false;
1224 for (int i = 1; i < 8; ++i) {
1225 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001226 EXPECT_EQ(kDecodableSession,
1227 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001228 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001229 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1230 }
1231
1232 packet_->seqNum++;
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 frame_out = DecodeIncompleteFrame();
1239 ASSERT_FALSE(NULL == frame_out);
1240 CheckOutFrame(frame_out, 9 * size_, false);
1241 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001242 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001243
1244 packet_->markerBit = true;
1245 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001246 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001247}
1248
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001249// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001250TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001251 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1252 // Always start with a key frame.
1253 packet_->frameType = kVideoFrameKey;
1254 packet_->isFirstPacket = true;
1255 packet_->markerBit = true;
1256 packet_->seqNum = seq_num_;
1257 packet_->timestamp = timestamp_;
1258
1259 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001260 EXPECT_EQ(kCompleteSession,
1261 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001262 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1263 CheckOutFrame(frame_out, size_, false);
1264 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001265 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001266
1267 // An incomplete frame can only be decoded once a subsequent frame has begun
1268 // to arrive. Insert packet in distant frame for this purpose.
1269 packet_->frameType = kVideoFrameDelta;
1270 packet_->isFirstPacket = false;
1271 packet_->markerBit = false;
1272 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001273 packet_->timestamp += 33 * 90 * 8;
1274 EXPECT_EQ(kIncomplete,
1275 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001276 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001277 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001278 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1279
1280 // Insert second frame - an incomplete key frame.
1281 packet_->frameType = kVideoFrameKey;
1282 packet_->isFirstPacket = true;
1283 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001284 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001285
philipel9d3ab612015-12-21 04:12:39 -08001286 EXPECT_EQ(kIncomplete,
1287 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001288 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001289 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1290
1291 // Insert a few more packets. Make sure we're waiting for the key frame to be
1292 // complete.
1293 packet_->isFirstPacket = false;
1294 for (int i = 1; i < 5; ++i) {
1295 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001296 EXPECT_EQ(kIncomplete,
1297 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001298 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001299 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1300 }
1301
1302 // Complete key frame.
1303 packet_->markerBit = true;
1304 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001305 EXPECT_EQ(kCompleteSession,
1306 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001307 frame_out = DecodeCompleteFrame();
1308 CheckOutFrame(frame_out, 6 * size_, false);
1309 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001310 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001311}
1312
1313// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001314TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001315 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1316 // Always start with a key frame.
1317 packet_->frameType = kVideoFrameKey;
1318 packet_->isFirstPacket = true;
1319 packet_->markerBit = true;
1320 packet_->seqNum = seq_num_;
1321 packet_->timestamp = timestamp_;
1322
1323 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001324 EXPECT_EQ(kCompleteSession,
1325 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001326 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1327 CheckOutFrame(frame_out, size_, false);
1328 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001329 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001330
1331 // An incomplete frame can only be decoded once a subsequent frame has begun
1332 // to arrive. Insert packet in distant frame for this purpose.
1333 packet_->frameType = kVideoFrameDelta;
1334 packet_->isFirstPacket = false;
1335 packet_->markerBit = false;
1336 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001337 packet_->timestamp += 33 * 90 * 8;
1338 EXPECT_EQ(kIncomplete,
1339 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001340 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001341 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001342 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1343
1344 // Insert second frame with the first packet missing. Make sure we're waiting
1345 // for the key frame to be complete.
1346 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001347 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348
philipel9d3ab612015-12-21 04:12:39 -08001349 EXPECT_EQ(kIncomplete,
1350 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001351 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001352 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1353
1354 for (int i = 0; i < 5; ++i) {
1355 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001356 EXPECT_EQ(kIncomplete,
1357 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001358 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001359 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1360 }
1361
1362 // Add first packet. Frame should now be decodable, but incomplete.
1363 packet_->isFirstPacket = true;
1364 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001365 EXPECT_EQ(kDecodableSession,
1366 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001367 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001368 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1369
1370 frame_out = DecodeIncompleteFrame();
1371 CheckOutFrame(frame_out, 7 * size_, false);
1372 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001373 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001374}
1375
philipel85130292016-07-06 16:10:31 +02001376TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001377 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001378 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001379 packet_->frameType = kVideoFrameKey;
1380 packet_->isFirstPacket = true;
1381 packet_->markerBit = true;
1382 packet_->seqNum = seq_num_;
1383 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001384 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001385 EXPECT_EQ(kCompleteSession,
1386 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001387 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001388 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1389 EXPECT_NE(frame, nullptr);
1390 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1391 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001392 EXPECT_TRUE(frame != NULL);
1393 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001394
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001395 // Drop a complete frame.
1396 timestamp_ += 2 * 33 * 90;
1397 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001398 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001399 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001400 packet_->markerBit = false;
1401 packet_->seqNum = seq_num_;
1402 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001403 EXPECT_EQ(kDecodableSession,
1404 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001405 // Insert a packet (so the previous one will be released).
1406 timestamp_ += 33 * 90;
1407 seq_num_ += 2;
1408 packet_->frameType = kVideoFrameDelta;
1409 packet_->isFirstPacket = true;
1410 packet_->markerBit = false;
1411 packet_->seqNum = seq_num_;
1412 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001413 EXPECT_EQ(kDecodableSession,
1414 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001415 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001416 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1417 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001418}
1419
philipel85130292016-07-06 16:10:31 +02001420TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001421 // Verify missing packets statistics and not decodable packets statistics.
1422 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1423 // The last packet is an empty (non-media) packet.
1424
1425 // Select a start seqNum which triggers a difficult wrap situation
1426 // The JB will only output (incomplete)frames if the next one has started
1427 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001428 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001429 seq_num_ = 0xffff - 4;
1430 seq_num_++;
1431 packet_->frameType = kVideoFrameKey;
1432 packet_->isFirstPacket = true;
1433 packet_->markerBit = false;
1434 packet_->seqNum = seq_num_;
1435 packet_->timestamp = timestamp_;
1436 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001437
1438 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001439 EXPECT_EQ(kDecodableSession,
1440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001441 for (int i = 0; i < 11; ++i) {
1442 webrtc::FrameType frametype = kVideoFrameDelta;
1443 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001444 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001445 packet_->frameType = frametype;
1446 packet_->isFirstPacket = true;
1447 packet_->markerBit = false;
1448 packet_->seqNum = seq_num_;
1449 packet_->timestamp = timestamp_;
1450 packet_->completeNALU = kNaluStart;
1451
philipel9d3ab612015-12-21 04:12:39 -08001452 EXPECT_EQ(kDecodableSession,
1453 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001454
1455 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1456
1457 // Should not be complete.
1458 EXPECT_TRUE(frame_out == NULL);
1459
1460 seq_num_ += 2;
1461 packet_->isFirstPacket = false;
1462 packet_->markerBit = true;
1463 packet_->seqNum = seq_num_;
1464 packet_->completeNALU = kNaluEnd;
1465
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001466 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1467 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001468
1469 // Insert an empty (non-media) packet.
1470 seq_num_++;
1471 packet_->isFirstPacket = false;
1472 packet_->markerBit = false;
1473 packet_->seqNum = seq_num_;
1474 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001475 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001477 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001478 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001479 frame_out = DecodeIncompleteFrame();
1480
1481 // One of the packets has been discarded by the jitter buffer.
1482 // Last frame can't be extracted yet.
1483 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001484 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001485
1486 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001487 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001488 } else {
philipel9d3ab612015-12-21 04:12:39 -08001489 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490 }
1491 EXPECT_FALSE(frame_out->Complete());
1492 EXPECT_FALSE(frame_out->MissingFrame());
1493 }
1494
1495 jitter_buffer_->ReleaseFrame(frame_out);
1496 }
1497
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001498 // Insert 3 old packets and verify that we have 3 discarded packets
1499 // Match value to actual latest timestamp decoded.
1500 timestamp_ -= 33 * 90;
1501 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001502
philipel9d3ab612015-12-21 04:12:39 -08001503 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001504
1505 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001506
philipel9d3ab612015-12-21 04:12:39 -08001507 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001508
1509 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001510
philipel9d3ab612015-12-21 04:12:39 -08001511 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001512
1513 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1514
1515 jitter_buffer_->Flush();
1516
1517 // This statistic shouldn't be reset by a flush.
1518 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1519}
1520
philipel85130292016-07-06 16:10:31 +02001521TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 seq_num_ = 0xfff0;
1523 packet_->frameType = kVideoFrameKey;
1524 packet_->isFirstPacket = true;
1525 packet_->markerBit = false;
1526 packet_->seqNum = seq_num_;
1527 packet_->timestamp = timestamp_;
1528
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001529 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001530 EXPECT_EQ(kIncomplete,
1531 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001532
1533 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1534
1535 EXPECT_TRUE(frame_out == NULL);
1536
1537 int loop = 0;
1538 do {
1539 seq_num_++;
1540 packet_->isFirstPacket = false;
1541 packet_->markerBit = false;
1542 packet_->seqNum = seq_num_;
1543
philipel9d3ab612015-12-21 04:12:39 -08001544 EXPECT_EQ(kIncomplete,
1545 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001546
1547 frame_out = DecodeCompleteFrame();
1548
1549 EXPECT_TRUE(frame_out == NULL);
1550
1551 loop++;
1552 } while (loop < 98);
1553
1554 seq_num_++;
1555 packet_->isFirstPacket = false;
1556 packet_->markerBit = true;
1557 packet_->seqNum = seq_num_;
1558
philipel9d3ab612015-12-21 04:12:39 -08001559 EXPECT_EQ(kCompleteSession,
1560 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561
1562 frame_out = DecodeCompleteFrame();
1563
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001564 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565
1566 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001567 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001568}
1569
philipel85130292016-07-06 16:10:31 +02001570TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571 // Insert "first" packet last seqnum.
1572 seq_num_ = 10;
1573 packet_->frameType = kVideoFrameKey;
1574 packet_->isFirstPacket = false;
1575 packet_->markerBit = true;
1576 packet_->seqNum = seq_num_;
1577
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001578 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001579 EXPECT_EQ(kIncomplete,
1580 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1582
1583 // Should not be complete.
1584 EXPECT_TRUE(frame_out == NULL);
1585
1586 // Insert 98 frames.
1587 int loop = 0;
1588 do {
1589 seq_num_--;
1590 packet_->isFirstPacket = false;
1591 packet_->markerBit = false;
1592 packet_->seqNum = seq_num_;
1593
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
1597 frame_out = DecodeCompleteFrame();
1598
1599 EXPECT_TRUE(frame_out == NULL);
1600
1601 loop++;
1602 } while (loop < 98);
1603
1604 // Insert last packet.
1605 seq_num_--;
1606 packet_->isFirstPacket = true;
1607 packet_->markerBit = false;
1608 packet_->seqNum = seq_num_;
1609
philipel9d3ab612015-12-21 04:12:39 -08001610 EXPECT_EQ(kCompleteSession,
1611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001612
1613 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001614 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001616 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001617}
1618
philipel85130292016-07-06 16:10:31 +02001619TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620 // ------- -------
1621 // | 2 | | 1 |
1622 // ------- -------
1623 // t = 3000 t = 2000
1624 seq_num_ = 2;
1625 timestamp_ = 3000;
1626 packet_->frameType = kVideoFrameKey;
1627 packet_->isFirstPacket = true;
1628 packet_->markerBit = true;
1629 packet_->timestamp = timestamp_;
1630 packet_->seqNum = seq_num_;
1631
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001632 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001633 EXPECT_EQ(kCompleteSession,
1634 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001635
1636 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1637 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001638 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001639 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640 jitter_buffer_->ReleaseFrame(frame_out);
1641
1642 seq_num_--;
1643 timestamp_ = 2000;
1644 packet_->frameType = kVideoFrameDelta;
1645 packet_->isFirstPacket = true;
1646 packet_->markerBit = true;
1647 packet_->seqNum = seq_num_;
1648 packet_->timestamp = timestamp_;
1649
philipel9d3ab612015-12-21 04:12:39 -08001650 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001651}
1652
philipel85130292016-07-06 16:10:31 +02001653TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654 // ------- -------
1655 // | 2 | | 1 |
1656 // ------- -------
1657 // t = 3000 t = 0xffffff00
1658
1659 seq_num_ = 2;
1660 timestamp_ = 3000;
1661 packet_->frameType = kVideoFrameKey;
1662 packet_->isFirstPacket = true;
1663 packet_->markerBit = true;
1664 packet_->seqNum = seq_num_;
1665 packet_->timestamp = timestamp_;
1666
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001667 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001668 EXPECT_EQ(kCompleteSession,
1669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001670
1671 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1672 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1673
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001674 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001675
1676 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1677
1678 jitter_buffer_->ReleaseFrame(frame_out);
1679
1680 seq_num_--;
1681 timestamp_ = 0xffffff00;
1682 packet_->frameType = kVideoFrameDelta;
1683 packet_->isFirstPacket = true;
1684 packet_->markerBit = true;
1685 packet_->seqNum = seq_num_;
1686 packet_->timestamp = timestamp_;
1687
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001688 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001689 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690}
1691
philipel85130292016-07-06 16:10:31 +02001692TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 // --------------- ---------------
1694 // | 1 | 2 | | 3 | 4 |
1695 // --------------- ---------------
1696 // t = 0xffffff00 t = 33*90
1697
1698 timestamp_ = 0xffffff00;
1699 packet_->frameType = kVideoFrameKey;
1700 packet_->isFirstPacket = true;
1701 packet_->markerBit = false;
1702 packet_->seqNum = seq_num_;
1703 packet_->timestamp = timestamp_;
1704
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001705 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001706 EXPECT_EQ(kIncomplete,
1707 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001708
1709 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001710 EXPECT_TRUE(frame_out == NULL);
1711
1712 seq_num_++;
1713 packet_->isFirstPacket = false;
1714 packet_->markerBit = true;
1715 packet_->seqNum = seq_num_;
1716
philipel9d3ab612015-12-21 04:12:39 -08001717 EXPECT_EQ(kCompleteSession,
1718 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001719
1720 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001721 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001722 jitter_buffer_->ReleaseFrame(frame_out);
1723
1724 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001725 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001726 packet_->frameType = kVideoFrameDelta;
1727 packet_->isFirstPacket = true;
1728 packet_->markerBit = false;
1729 packet_->seqNum = seq_num_;
1730 packet_->timestamp = timestamp_;
1731
philipel9d3ab612015-12-21 04:12:39 -08001732 EXPECT_EQ(kIncomplete,
1733 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734
1735 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001736 EXPECT_TRUE(frame_out == NULL);
1737
1738 seq_num_++;
1739 packet_->isFirstPacket = false;
1740 packet_->markerBit = true;
1741 packet_->seqNum = seq_num_;
1742
philipel9d3ab612015-12-21 04:12:39 -08001743 EXPECT_EQ(kCompleteSession,
1744 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001745
1746 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001747 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001748 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001749 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001750}
1751
philipel85130292016-07-06 16:10:31 +02001752TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001753 // ------- -------
1754 // | 1 | | 2 |
1755 // ------- -------
1756 // t = 0xffffff00 t = 2700
1757
1758 timestamp_ = 0xffffff00;
1759 packet_->frameType = kVideoFrameKey;
1760 packet_->isFirstPacket = true;
1761 packet_->markerBit = true;
1762 packet_->timestamp = timestamp_;
1763
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001764 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001766 EXPECT_EQ(kCompleteSession,
1767 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001768
1769 // Insert next frame.
1770 seq_num_++;
1771 timestamp_ = 2700;
1772 packet_->frameType = kVideoFrameDelta;
1773 packet_->isFirstPacket = true;
1774 packet_->markerBit = true;
1775 packet_->seqNum = seq_num_;
1776 packet_->timestamp = timestamp_;
1777
philipel9d3ab612015-12-21 04:12:39 -08001778 EXPECT_EQ(kCompleteSession,
1779 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001780
1781 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1782 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001783 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001784 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001785 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001786
1787 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1788 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001789 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001790 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001791 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001792}
1793
philipel85130292016-07-06 16:10:31 +02001794TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 // ------- -------
1796 // | 2 | | 1 |
1797 // ------- -------
1798 // t = 2700 t = 0xffffff00
1799
1800 seq_num_ = 2;
1801 timestamp_ = 2700;
1802 packet_->frameType = kVideoFrameDelta;
1803 packet_->isFirstPacket = true;
1804 packet_->markerBit = true;
1805 packet_->seqNum = seq_num_;
1806 packet_->timestamp = timestamp_;
1807
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001808 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001809 EXPECT_EQ(kCompleteSession,
1810 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811
1812 // Insert second frame
1813 seq_num_--;
1814 timestamp_ = 0xffffff00;
1815 packet_->frameType = kVideoFrameKey;
1816 packet_->isFirstPacket = true;
1817 packet_->markerBit = true;
1818 packet_->seqNum = seq_num_;
1819 packet_->timestamp = timestamp_;
1820
philipel9d3ab612015-12-21 04:12:39 -08001821 EXPECT_EQ(kCompleteSession,
1822 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001823
1824 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1825 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001826 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001828 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001829
1830 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1831 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001832 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001833 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001834 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001835}
1836
philipel85130292016-07-06 16:10:31 +02001837TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 int loop = 0;
1839 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001840 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001841 // Insert kMaxPacketsInJitterBuffer into frame.
1842 do {
1843 seq_num_++;
1844 packet_->isFirstPacket = false;
1845 packet_->markerBit = false;
1846 packet_->seqNum = seq_num_;
1847
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001848 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001849 EXPECT_EQ(kIncomplete,
1850 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851 firstPacket = false;
1852 } else {
philipel9d3ab612015-12-21 04:12:39 -08001853 EXPECT_EQ(kIncomplete,
1854 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001855 }
1856
1857 loop++;
1858 } while (loop < kMaxPacketsInSession);
1859
1860 // Max number of packets inserted.
1861 // Insert one more packet.
1862 seq_num_++;
1863 packet_->isFirstPacket = false;
1864 packet_->markerBit = true;
1865 packet_->seqNum = seq_num_;
1866
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001867 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001868 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870}
1871
philipel85130292016-07-06 16:10:31 +02001872TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001873 // TEST fill JB with more than max number of frame (50 delta frames +
1874 // 51 key frames) with wrap in seq_num_
1875 //
1876 // --------------------------------------------------------------
1877 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1878 // --------------------------------------------------------------
1879 // |<-----------delta frames------------->|<------key frames----->|
1880
jbauchdb81ffd2015-11-23 03:59:02 -08001881 // Make sure the jitter doesn't request a keyframe after too much non-
1882 // decodable frames.
1883 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001884 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001885
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001886 int loop = 0;
1887 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001888 uint32_t first_key_frame_timestamp = 0;
1889 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001890 // Insert MAX_NUMBER_OF_FRAMES frames.
1891 do {
philipel9d3ab612015-12-21 04:12:39 -08001892 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001893 seq_num_++;
1894 packet_->isFirstPacket = true;
1895 packet_->markerBit = true;
1896 packet_->seqNum = seq_num_;
1897 packet_->timestamp = timestamp_;
1898
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001899 if (loop == 50) {
1900 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001901 packet_->frameType = kVideoFrameKey;
1902 }
1903
1904 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001905 EXPECT_EQ(kCompleteSession,
1906 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001907
1908 loop++;
1909 } while (loop < kMaxNumberOfFrames);
1910
1911 // Max number of frames inserted.
1912
1913 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001914 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915 seq_num_++;
1916 packet_->isFirstPacket = true;
1917 packet_->markerBit = true;
1918 packet_->seqNum = seq_num_;
1919 packet_->timestamp = timestamp_;
1920
1921 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001922 EXPECT_EQ(kFlushIndicator,
1923 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001924
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001925 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1926 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001927 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001929 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001930}
1931
philipel85130292016-07-06 16:10:31 +02001932TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001933 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 seq_num_ = 3;
1935 // Insert one empty packet per frame, should never return the last timestamp
1936 // inserted. Only return empty frames in the presence of subsequent frames.
1937 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001938 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939 for (int i = 0; i < maxSize + 10; i++) {
1940 timestamp_ += 33 * 90;
1941 seq_num_++;
1942 packet_->isFirstPacket = false;
1943 packet_->markerBit = false;
1944 packet_->seqNum = seq_num_;
1945 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001946 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001947
philipel9d3ab612015-12-21 04:12:39 -08001948 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001949 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1950 // Timestamp should never be the last TS inserted.
1951 if (testFrame != NULL) {
1952 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001953 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001954 }
1955 }
1956}
1957
philipel85130292016-07-06 16:10:31 +02001958TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001960 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001961 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001962 timestamp_ += 33 * 90;
1963 int insertedLength = 0;
1964 packet_->seqNum = seq_num_;
1965 packet_->timestamp = timestamp_;
1966 packet_->frameType = kVideoFrameKey;
1967 packet_->isFirstPacket = true;
1968 packet_->completeNALU = kNaluStart;
1969 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001970 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001971
philipel9d3ab612015-12-21 04:12:39 -08001972 EXPECT_EQ(kDecodableSession,
1973 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001974
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001975 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976 packet_->seqNum = seq_num_;
1977 packet_->frameType = kVideoFrameKey;
1978 packet_->isFirstPacket = false;
1979 packet_->completeNALU = kNaluIncomplete;
1980 packet_->markerBit = false;
1981
philipel9d3ab612015-12-21 04:12:39 -08001982 EXPECT_EQ(kDecodableSession,
1983 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001984
1985 seq_num_++;
1986 packet_->seqNum = seq_num_;
1987 packet_->frameType = kVideoFrameKey;
1988 packet_->isFirstPacket = false;
1989 packet_->completeNALU = kNaluEnd;
1990 packet_->markerBit = false;
1991
philipel9d3ab612015-12-21 04:12:39 -08001992 EXPECT_EQ(kDecodableSession,
1993 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001994
1995 seq_num_++;
1996 packet_->seqNum = seq_num_;
1997 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001998 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08001999 EXPECT_EQ(kDecodableSession,
2000 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001 // The JB will only output (incomplete) frames if a packet belonging to a
2002 // subsequent frame was already inserted. Insert one packet of a subsequent
2003 // frame. place high timestamp so the JB would always have a next frame
2004 // (otherwise, for every inserted frame we need to take care of the next
2005 // frame as well).
2006 packet_->seqNum = 1;
2007 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2008 packet_->frameType = kVideoFrameDelta;
2009 packet_->isFirstPacket = false;
2010 packet_->completeNALU = kNaluStart;
2011 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002012
philipel9d3ab612015-12-21 04:12:39 -08002013 EXPECT_EQ(kDecodableSession,
2014 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002015
2016 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2017
2018 // We can decode everything from a NALU until a packet has been lost.
2019 // Thus we can decode the first packet of the first NALU and the second NALU
2020 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002021 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002022 jitter_buffer_->ReleaseFrame(frame_out);
2023
2024 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002025 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002026 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 insertedLength = 0;
2028
2029 packet_->seqNum = seq_num_;
2030 packet_->timestamp = timestamp_;
2031 packet_->frameType = kVideoFrameKey;
2032 packet_->isFirstPacket = false;
2033 packet_->completeNALU = kNaluEnd;
2034 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002035 EXPECT_EQ(kDecodableSession,
2036 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2037 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002038 seq_num_--;
2039 packet_->seqNum = seq_num_;
2040 packet_->timestamp = timestamp_;
2041 packet_->frameType = kVideoFrameKey;
2042 packet_->isFirstPacket = true;
2043 packet_->completeNALU = kNaluStart;
2044 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002045
philipel9d3ab612015-12-21 04:12:39 -08002046 EXPECT_EQ(kDecodableSession,
2047 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2049
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002050 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002051 packet_->seqNum = seq_num_;
2052 packet_->timestamp = timestamp_;
2053 packet_->frameType = kVideoFrameKey;
2054 packet_->isFirstPacket = false;
2055 packet_->completeNALU = kNaluComplete;
2056 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002057 EXPECT_EQ(kDecodableSession,
2058 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002059 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002060 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002061 packet_->seqNum = seq_num_;
2062 packet_->timestamp = timestamp_;
2063 packet_->frameType = kVideoFrameKey;
2064 packet_->isFirstPacket = false;
2065 packet_->completeNALU = kNaluStart;
2066 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002067 EXPECT_EQ(kDecodableSession,
2068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069 // This packet should be decoded since it's the beginning of a NAL.
2070 insertedLength += packet_->sizeBytes;
2071
2072 seq_num_ += 2;
2073 packet_->seqNum = seq_num_;
2074 packet_->timestamp = timestamp_;
2075 packet_->frameType = kVideoFrameKey;
2076 packet_->isFirstPacket = false;
2077 packet_->completeNALU = kNaluEnd;
2078 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002079 EXPECT_EQ(kDecodableSession,
2080 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002081 // This packet should not be decoded because it is an incomplete NAL if it
2082 // is the last.
2083 frame_out = DecodeIncompleteFrame();
2084 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002085 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002086 jitter_buffer_->ReleaseFrame(frame_out);
2087
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002088 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002089 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002090 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002091 WebRtcRTPHeader rtpHeader;
2092 memset(&rtpHeader, 0, sizeof(rtpHeader));
2093 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002094 emptypacket.seqNum = seq_num_;
2095 emptypacket.timestamp = timestamp_;
2096 emptypacket.frameType = kVideoFrameKey;
2097 emptypacket.isFirstPacket = true;
2098 emptypacket.completeNALU = kNaluComplete;
2099 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002100 EXPECT_EQ(kCompleteSession,
2101 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002102 // This packet should not be decoded because it is an incomplete NAL if it
2103 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002104
2105 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2106 // has arrived.
2107 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002108 EXPECT_TRUE(frame_out != NULL);
2109 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002110
2111 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002112 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113 timestamp_ += 33 * 90;
2114
2115 packet_->seqNum = seq_num_;
2116 packet_->timestamp = timestamp_;
2117 packet_->frameType = kVideoFrameKey;
2118 packet_->isFirstPacket = true;
2119 packet_->completeNALU = kNaluComplete;
2120 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002121
philipel9d3ab612015-12-21 04:12:39 -08002122 EXPECT_EQ(kDecodableSession,
2123 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002124
agalusza@google.comd177c102013-08-08 01:12:33 +00002125 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002126 emptypacket.seqNum = seq_num_;
2127 emptypacket.timestamp = timestamp_;
2128 emptypacket.frameType = kVideoFrameKey;
2129 emptypacket.isFirstPacket = true;
2130 emptypacket.completeNALU = kNaluComplete;
2131 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002132 EXPECT_EQ(kCompleteSession,
2133 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002134
2135 frame_out = DecodeCompleteFrame();
2136 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002137 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002138 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002139}
2140
philipel85130292016-07-06 16:10:31 +02002141TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002142 // Test that a we cannot get incomplete frames from the JB if we haven't
2143 // received the marker bit, unless we have received a packet from a later
2144 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002145 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002146 // Start with a complete key frame - insert and decode.
2147 packet_->frameType = kVideoFrameKey;
2148 packet_->isFirstPacket = true;
2149 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002150 bool retransmitted = false;
2151
philipel9d3ab612015-12-21 04:12:39 -08002152 EXPECT_EQ(kCompleteSession,
2153 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2155 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002156 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002157
2158 packet_->seqNum += 2;
2159 packet_->timestamp += 33 * 90;
2160 packet_->frameType = kVideoFrameDelta;
2161 packet_->isFirstPacket = false;
2162 packet_->markerBit = false;
2163
philipel9d3ab612015-12-21 04:12:39 -08002164 EXPECT_EQ(kDecodableSession,
2165 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002166
2167 frame_out = DecodeIncompleteFrame();
2168 EXPECT_TRUE(frame_out == NULL);
2169
2170 packet_->seqNum += 2;
2171 packet_->timestamp += 33 * 90;
2172 packet_->isFirstPacket = true;
2173
philipel9d3ab612015-12-21 04:12:39 -08002174 EXPECT_EQ(kDecodableSession,
2175 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002176
2177 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002178 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002179 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002180}
2181
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002182TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002183 // Make sure the jitter doesn't request a keyframe after too much non-
2184 // decodable frames.
2185 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002186 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002187 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002188 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002189 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002190 DropFrame(1);
2191 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002192 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002193 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002194 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002195 // This frame will make the jitter buffer recycle frames until a key frame.
2196 // Since none is found it will have to wait until the next key frame before
2197 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002198 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002199 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002200}
2201
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002202TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002203 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002204 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002205 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002206 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002207 // Insert empty packet.
2208 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002209 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002210 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002211 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002212 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002213 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002214 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002215 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002216 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002217 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002218 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002219 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002220}
2221
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002222TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002223 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2224 EXPECT_EQ(0, frame_stats.delta_frames);
2225 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002226
2227 uint32_t framerate = 0;
2228 uint32_t bitrate = 0;
2229 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2230 EXPECT_EQ(0u, framerate);
2231 EXPECT_EQ(0u, bitrate);
2232
2233 // Insert a couple of key and delta frames.
2234 InsertFrame(kVideoFrameKey);
2235 InsertFrame(kVideoFrameDelta);
2236 InsertFrame(kVideoFrameDelta);
2237 InsertFrame(kVideoFrameKey);
2238 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002239 // Decode some of them to make sure the statistics doesn't depend on frames
2240 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002241 EXPECT_TRUE(DecodeCompleteFrame());
2242 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002243 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002244 EXPECT_EQ(3, frame_stats.delta_frames);
2245 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002246
2247 // Insert 20 more frames to get estimates of bitrate and framerate over
2248 // 1 second.
2249 for (int i = 0; i < 20; ++i) {
2250 InsertFrame(kVideoFrameDelta);
2251 }
2252 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2253 // TODO(holmer): The current implementation returns the average of the last
2254 // two framerate calculations, which is why it takes two calls to reach the
2255 // actual framerate. This should be fixed.
2256 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2257 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2258 // Insert 25 more frames to get estimates of bitrate and framerate over
2259 // 2 seconds.
2260 for (int i = 0; i < 25; ++i) {
2261 InsertFrame(kVideoFrameDelta);
2262 }
2263 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2264 EXPECT_EQ(kDefaultFrameRate, framerate);
2265 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2266}
2267
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002268TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2269 // Insert delta frames.
2270 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2271 // Can't decode without a key frame.
2272 EXPECT_FALSE(DecodeCompleteFrame());
2273 InsertFrame(kVideoFrameKey);
2274 // Skip to the next key frame.
2275 EXPECT_TRUE(DecodeCompleteFrame());
2276}
2277
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002278TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2279 InsertFrame(kVideoFrameKey);
2280 EXPECT_TRUE(DecodeCompleteFrame());
2281 const int kNumDeltaFrames = 5;
2282 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2283 InsertFrame(kVideoFrameKey);
2284 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2285 EXPECT_TRUE(DecodeCompleteFrame());
2286 }
2287}
2288
2289TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2290 InsertFrame(kVideoFrameKey);
2291 EXPECT_TRUE(DecodeCompleteFrame());
2292 const int kNumDeltaFrames = 5;
2293 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2294 InsertFrame(kVideoFrameKey);
2295 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2296 InsertFrame(kVideoFrameKey);
2297 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2298 EXPECT_TRUE(DecodeCompleteFrame());
2299 }
2300}
2301
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002302TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2303 InsertFrame(kVideoFrameKey);
2304 EXPECT_TRUE(DecodeCompleteFrame());
2305 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2306 clock_->TimeInMilliseconds());
2307 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2308 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2309 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002310 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002311 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2312 EXPECT_FALSE(DecodeCompleteFrame());
2313 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2314 EXPECT_TRUE(DecodeCompleteFrame());
2315 EXPECT_TRUE(DecodeCompleteFrame());
2316}
2317
philipel85130292016-07-06 16:10:31 +02002318TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002319 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002320 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002321 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002322 InsertFrame(kVideoFrameKey);
2323 EXPECT_TRUE(DecodeCompleteFrame());
2324}
2325
philipel85130292016-07-06 16:10:31 +02002326TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002327 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002328 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002329 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002330
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002331 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2332 // old packet.
2333 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002334 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002335 EXPECT_EQ(kFlushIndicator,
2336 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002337 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002338
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002339 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002340 std::vector<uint16_t> nack_list =
2341 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002342 // No key frame will be requested since the jitter buffer is empty.
2343 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002344 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002345
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002346 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002347 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002348 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002349 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002350
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002351 // The next complete continuous frame isn't a key frame, but we're waiting
2352 // for one.
2353 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002354 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002355 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002356 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002357}
2358
philipel85130292016-07-06 16:10:31 +02002359TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002360 // Insert a key frame and decode it.
2361 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2362 EXPECT_TRUE(DecodeCompleteFrame());
2363
2364 // Insert a frame which should trigger a recycle until the next key frame.
2365 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2366
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002367 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002368 std::vector<uint16_t> nack_list =
2369 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002370 // Verify that the jitter buffer does not request a key frame.
2371 EXPECT_FALSE(request_key_frame);
2372 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002373 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002374 // Verify that we can decode the next frame.
2375 EXPECT_TRUE(DecodeCompleteFrame());
2376}
2377
philipel85130292016-07-06 16:10:31 +02002378TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002379 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002380 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002381 EXPECT_TRUE(DecodeCompleteFrame());
2382
2383 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002384 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002385 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002386 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002387 EXPECT_FALSE(DecodeCompleteFrame());
2388
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002389 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002390 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002391 // The jitter buffer is empty, so we won't request key frames until we get a
2392 // packet.
2393 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002394
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002395 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002396 // Now we have a packet in the jitter buffer, a key frame will be requested
2397 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002398 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002399 // The jitter buffer is empty, so we won't request key frames until we get a
2400 // packet.
2401 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002402 // The next complete continuous frame isn't a key frame, but we're waiting
2403 // for one.
2404 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002405 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002406 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002407 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002408 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002409}
2410
philipel85130292016-07-06 16:10:31 +02002411TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002412 DropFrame(10);
2413 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002414 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002415 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002416 std::vector<uint16_t> nack_list =
2417 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002418 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002419 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002420 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002421}
2422
philipel85130292016-07-06 16:10:31 +02002423TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002424 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002425 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002426 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002427 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002428 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002429 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002430 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002431 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002432 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002433 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002434}
2435
philipel85130292016-07-06 16:10:31 +02002436TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002437 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002438 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2439 clock_->TimeInMilliseconds());
2440 VCMPacket packet;
2441 stream_generator_->PopPacket(&packet, 0);
2442 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002443 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002444 EXPECT_FALSE(retransmitted);
2445 // Drop second packet.
2446 stream_generator_->PopPacket(&packet, 1);
2447 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2448 EXPECT_FALSE(retransmitted);
2449 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002450 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002451 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002452 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002453 EXPECT_EQ(1u, nack_list.size());
2454 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002455 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002456 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002457 EXPECT_EQ(kCompleteSession,
2458 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002459 EXPECT_TRUE(retransmitted);
2460 EXPECT_TRUE(DecodeCompleteFrame());
2461}
2462
philipel85130292016-07-06 16:10:31 +02002463TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002464 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002465 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002466 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002467 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002468 // Drop second packet.
2469 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2470 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002471 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002472 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002473 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002474 ASSERT_EQ(1u, nack_list.size());
2475 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002476 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002477 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002478 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002479}
2480
philipel85130292016-07-06 16:10:31 +02002481TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002482 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002483 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002484 // First frame is delta.
2485 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2486 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002487 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002488 // Drop second packet in frame.
2489 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2490 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2491 // Second frame is key.
2492 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2493 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002494 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002495 // Drop second packet in frame.
2496 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2497 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002498 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002499 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002500 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002501 ASSERT_EQ(1u, nack_list.size());
2502 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002503 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002504 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002505}
2506
philipel85130292016-07-06 16:10:31 +02002507TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002508 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002509 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002510
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002511 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002512 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002513
2514 // ----------------------------------------------------------------
2515 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2516 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002517 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002518 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002519 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002520 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002521 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002522 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002523 while (stream_generator_->PacketsRemaining() > 1) {
2524 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002525 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002526 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002527 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002528 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002529 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002530 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002531 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002532 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002533 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002534 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002535
2536 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002537 std::vector<uint16_t> nack_list =
2538 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002539 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002540 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002541 for (size_t i = 0; i < nack_list.size(); ++i)
2542 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002543}
2544
philipel85130292016-07-06 16:10:31 +02002545TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002546 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002547 // ------- ------------------------------------------------------------
2548 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2549 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002550 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002551 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002552 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002553 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002554 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002555 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002556 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002557 while (stream_generator_->PacketsRemaining() > 1) {
2558 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002559 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002560 EXPECT_FALSE(request_key_frame);
2561 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002562 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002563 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002564 }
2565 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002566 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002567 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002568 EXPECT_FALSE(DecodeCompleteFrame());
2569 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002570 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002571 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002572 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002573 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002574 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2575 for (size_t i = 0; i < nack_list.size(); ++i)
2576 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002577}
2578
philipel85130292016-07-06 16:10:31 +02002579TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002580 bool request_key_frame = false;
2581 // -----------------------------------
2582 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2583 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002584 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002585 InsertFrame(kVideoFrameKey);
2586 EXPECT_FALSE(request_key_frame);
2587 EXPECT_TRUE(DecodeCompleteFrame());
2588 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2589 clock_->TimeInMilliseconds());
2590 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2591 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002592 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002593 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002594 EXPECT_FALSE(request_key_frame);
2595 } else {
2596 stream_generator_->NextPacket(NULL); // Drop packet
2597 }
2598 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2599 clock_->TimeInMilliseconds());
2600 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2601 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002602 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002603 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002604 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002605 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002606 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002607 ASSERT_EQ(1u, nack_list.size());
2608 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002609}
2610
philipel85130292016-07-06 16:10:31 +02002611TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002612 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002613 InsertFrame(kVideoFrameKey);
2614 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002615 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002616 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2617 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002618
2619 // Far-into-the-future video frame, could be caused by resetting the encoder
2620 // or otherwise restarting. This should not fail when error when the packet is
2621 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002622 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002623 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2624 InsertFrame(kVideoFrameKey);
2625 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002626 nack_list = jitter_buffer_->GetNackList(&extended);
2627 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002628
2629 // Stream should be decodable from this point.
2630 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2631 InsertFrame(kVideoFrameDelta);
2632 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002633 nack_list = jitter_buffer_->GetNackList(&extended);
2634 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002635}
stefan3cdfcd82016-09-30 09:06:36 -07002636
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002637} // namespace webrtc