blob: 6ae65d62e986c728cad98d47d4eacbbb1ecb6d0c [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
23#include "modules/video_coding/test/test_util.h"
24#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/field_trial.h"
29#include "test/gmock.h"
30#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000031
32namespace webrtc {
33
asapersson9a4cd872015-10-23 00:27:14 -070034namespace {
philipel9d3ab612015-12-21 04:12:39 -080035const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070036} // namespace
37
38class Vp9SsMapTest : public ::testing::Test {
39 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020040 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070041
42 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020043 auto& vp9_header =
44 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
johan0d1b2b62017-01-10 04:21:35 -080045 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020046 packet_.dataPtr = data_;
47 packet_.sizeBytes = 1400;
48 packet_.seqNum = 1234;
49 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070050 packet_.markerBit = true;
51 packet_.frameType = kVideoFrameKey;
52 packet_.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020053 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020054 vp9_header.flexible_mode = false;
55 vp9_header.gof_idx = 0;
56 vp9_header.temporal_idx = kNoTemporalIdx;
57 vp9_header.temporal_up_switch = false;
58 vp9_header.ss_data_available = true;
59 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070060 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
61 }
62
63 Vp9SsMap map_;
64 uint8_t data_[1500];
65 VCMPacket packet_;
66};
67
68TEST_F(Vp9SsMapTest, Insert) {
69 EXPECT_TRUE(map_.Insert(packet_));
70}
71
72TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020073 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
74 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070075 EXPECT_FALSE(map_.Insert(packet_));
76}
77
78TEST_F(Vp9SsMapTest, Find) {
79 EXPECT_TRUE(map_.Insert(packet_));
80 Vp9SsMap::SsMap::iterator it;
81 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
82 EXPECT_EQ(packet_.timestamp, it->first);
83}
84
85TEST_F(Vp9SsMapTest, Find_WithWrap) {
86 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
87 const uint32_t kSsTimestamp2 = 100;
88 packet_.timestamp = kSsTimestamp1;
89 EXPECT_TRUE(map_.Insert(packet_));
90 packet_.timestamp = kSsTimestamp2;
91 EXPECT_TRUE(map_.Insert(packet_));
92 Vp9SsMap::SsMap::iterator it;
93 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
94 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
95 EXPECT_EQ(kSsTimestamp1, it->first);
96 EXPECT_TRUE(map_.Find(0, &it));
97 EXPECT_EQ(kSsTimestamp1, it->first);
98 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
99 EXPECT_EQ(kSsTimestamp1, it->first);
100 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
101 EXPECT_EQ(kSsTimestamp2, it->first);
102 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
103 EXPECT_EQ(kSsTimestamp2, it->first);
104}
105
106TEST_F(Vp9SsMapTest, Reset) {
107 EXPECT_TRUE(map_.Insert(packet_));
108 Vp9SsMap::SsMap::iterator it;
109 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
110 EXPECT_EQ(packet_.timestamp, it->first);
111
112 map_.Reset();
113 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
114}
115
116TEST_F(Vp9SsMapTest, RemoveOld) {
117 Vp9SsMap::SsMap::iterator it;
118 const uint32_t kSsTimestamp1 = 10000;
119 packet_.timestamp = kSsTimestamp1;
120 EXPECT_TRUE(map_.Insert(packet_));
121
122 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
123 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
124 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
125
126 map_.RemoveOld(kTimestamp);
127 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
128 EXPECT_TRUE(map_.Find(kTimestamp, &it));
129 EXPECT_EQ(kTimestamp, it->first);
130}
131
132TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
133 Vp9SsMap::SsMap::iterator it;
134 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
135 const uint32_t kSsTimestamp2 = 10;
136 const uint32_t kSsTimestamp3 = 1000;
137 packet_.timestamp = kSsTimestamp1;
138 EXPECT_TRUE(map_.Insert(packet_));
139 packet_.timestamp = kSsTimestamp2;
140 EXPECT_TRUE(map_.Insert(packet_));
141 packet_.timestamp = kSsTimestamp3;
142 EXPECT_TRUE(map_.Insert(packet_));
143
144 map_.RemoveOld(kSsTimestamp3);
145 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
146 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
147 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
148}
149
150TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200151 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
152 0;
asapersson9a4cd872015-10-23 00:27:14 -0700153 EXPECT_FALSE(map_.UpdatePacket(&packet_));
154}
155
156TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
157 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200158 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
159 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700160 EXPECT_FALSE(map_.UpdatePacket(&packet_));
161}
162
163TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
164 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200165 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
166 4;
asapersson9a4cd872015-10-23 00:27:14 -0700167 EXPECT_FALSE(map_.UpdatePacket(&packet_));
168}
169
170TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200171 auto& vp9_header =
172 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700173 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
174
philipel29d88462018-08-08 14:26:00 +0200175 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200177 EXPECT_EQ(0, vp9_header.temporal_idx);
178 EXPECT_FALSE(vp9_header.temporal_up_switch);
179 EXPECT_EQ(1U, vp9_header.num_ref_pics);
180 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700181
philipel29d88462018-08-08 14:26:00 +0200182 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200184 EXPECT_EQ(2, vp9_header.temporal_idx);
185 EXPECT_TRUE(vp9_header.temporal_up_switch);
186 EXPECT_EQ(1U, vp9_header.num_ref_pics);
187 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700188
philipel29d88462018-08-08 14:26:00 +0200189 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700190 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200191 EXPECT_EQ(1, vp9_header.temporal_idx);
192 EXPECT_TRUE(vp9_header.temporal_up_switch);
193 EXPECT_EQ(1U, vp9_header.num_ref_pics);
194 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700195
philipel29d88462018-08-08 14:26:00 +0200196 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700197 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200198 EXPECT_EQ(2, vp9_header.temporal_idx);
199 EXPECT_TRUE(vp9_header.temporal_up_switch);
200 EXPECT_EQ(1U, vp9_header.num_ref_pics);
201 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700202}
203
philipel83f831a2016-03-12 03:30:23 -0800204class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
205 public NackSender,
206 public KeyFrameRequestSender {
207 public:
208 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
209 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
210 sequence_numbers.end());
211 }
212
213 void RequestKeyFrame() override { ++keyframe_requests_; }
214
philipel83f831a2016-03-12 03:30:23 -0800215 std::vector<uint16_t> nack_sent_;
216 int keyframe_requests_;
217
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000218 protected:
philipel85130292016-07-06 16:10:31 +0200219 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700220 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000221 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700222 jitter_buffer_.reset(new VCMJitterBuffer(
223 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200224 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
philipel83f831a2016-03-12 03:30:23 -0800225 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000226 jitter_buffer_->Start();
227 seq_num_ = 1234;
228 timestamp_ = 0;
229 size_ = 1400;
230 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
231 data_[0] = 0;
232 data_[1] = 0;
233 data_[2] = 0x80;
234 int count = 3;
235 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
236 data_[i] = count;
237 count++;
238 if (count == 10) {
239 data_[i + 1] = 0;
240 data_[i + 2] = 0;
241 data_[i + 3] = 0x80;
242 count = 3;
243 i += 3;
244 }
245 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200246 WebRtcRTPHeader rtpHeader;
247 memset(&rtpHeader, 0, sizeof(rtpHeader));
248 rtpHeader.header.sequenceNumber = seq_num_;
249 rtpHeader.header.timestamp = timestamp_;
250 rtpHeader.header.markerBit = true;
251 rtpHeader.frameType = kVideoFrameDelta;
Magnus Jedvert22341212018-07-11 14:27:49 +0200252 rtpHeader.video_header().codec = kVideoCodecGeneric;
253 rtpHeader.video_header().is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200254 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000255 }
256
257 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700258 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000259 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700260 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200261 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000262 }
263
264 VCMEncodedFrame* DecodeIncompleteFrame() {
265 uint32_t timestamp = 0;
266 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
267 if (!found_frame)
268 return NULL;
269 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
270 return frame;
271 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000272
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000273 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800274 unsigned int size,
275 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000276 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000277
278 const uint8_t* outData = frame_out->Buffer();
279 unsigned int i = 0;
280
281 if (startCode) {
282 EXPECT_EQ(0, outData[0]);
283 EXPECT_EQ(0, outData[1]);
284 EXPECT_EQ(0, outData[2]);
285 EXPECT_EQ(1, outData[3]);
286 i += 4;
287 }
288
289 EXPECT_EQ(size, frame_out->Length());
290 int count = 3;
291 for (; i < size; i++) {
292 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
293 i += 2;
294 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
295 EXPECT_EQ(0, outData[0]);
296 EXPECT_EQ(0, outData[1]);
297 EXPECT_EQ(0, outData[2]);
298 EXPECT_EQ(1, outData[3]);
299 i += 3;
300 } else {
301 EXPECT_EQ(count, outData[i]);
302 count++;
303 if (count == 10) {
304 count = 3;
305 }
306 }
307 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000308 }
309
310 uint16_t seq_num_;
311 uint32_t timestamp_;
312 int size_;
313 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800314 std::unique_ptr<VCMPacket> packet_;
315 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000316 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800317 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000318};
319
philipel83f831a2016-03-12 03:30:23 -0800320class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
321 public NackSender,
322 public KeyFrameRequestSender {
323 public:
324 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
325 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
326 sequence_numbers.end());
327 }
328
329 void RequestKeyFrame() { ++keyframe_requests_; }
330
philipel83f831a2016-03-12 03:30:23 -0800331 std::vector<uint16_t> nack_sent_;
332 int keyframe_requests_;
333
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000334 protected:
335 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000336
337 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000338 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000339 max_nack_list_size_ = 150;
340 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700341 jitter_buffer_ = new VCMJitterBuffer(
342 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200343 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
344 this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700345 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000346 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800347 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
348 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 memset(data_buffer_, 0, kDataBufferSize);
350 }
351
352 virtual void TearDown() {
353 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000354 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000355 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000356 }
357
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000358 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000359 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000360 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000361 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000362 EXPECT_TRUE(packet_available);
363 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000364 return kGeneralError; // Return here to avoid crashes below.
365 bool retransmitted = false;
366 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000367 }
368
369 VCMFrameBufferEnum InsertPacket(int index) {
370 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000371 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000372 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000373 EXPECT_TRUE(packet_available);
374 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000375 return kGeneralError; // Return here to avoid crashes below.
376 bool retransmitted = false;
377 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000378 }
379
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000380 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700381 stream_generator_->GenerateFrame(
382 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
383 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000384 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000385 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000386 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000387 }
388
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000389 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
390 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000391 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000392 VCMFrameBufferEnum ret = InsertFrame(frame_type);
393 if (ret < kNoError) {
394 ret_for_all = ret;
395 } else if (ret_for_all >= kNoError) {
396 ret_for_all = ret;
397 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000398 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000399 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000400 }
401
402 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000403 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000404 clock_->TimeInMilliseconds());
405 for (int i = 0; i < num_packets; ++i)
406 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000407 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000408 }
409
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000410 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700411 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000412 if (!found_frame)
413 return false;
414
isheriff6b4b5f32016-06-08 00:24:21 -0700415 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200416 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000417 bool ret = (frame != NULL);
418 jitter_buffer_->ReleaseFrame(frame);
419 return ret;
420 }
421
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000422 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000423 uint32_t timestamp = 0;
424 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
425 if (!found_frame)
426 return false;
427 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000428 bool ret = (frame != NULL);
429 jitter_buffer_->ReleaseFrame(frame);
430 return ret;
431 }
432
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000433 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000434 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800435 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000436 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000437 size_t max_nack_list_size_;
438 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000439 uint8_t data_buffer_[kDataBufferSize];
440};
441
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000442class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000443 protected:
philipel85130292016-07-06 16:10:31 +0200444 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000445 virtual void SetUp() {
446 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000447 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000448 }
449
philipel9d3ab612015-12-21 04:12:39 -0800450 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000451};
452
philipel85130292016-07-06 16:10:31 +0200453TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000454 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000455 EXPECT_TRUE(NULL == DecodeCompleteFrame());
456 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
457 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000458 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000459 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000460
461 // No packets inserted.
462 EXPECT_TRUE(NULL == DecodeCompleteFrame());
463 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
464
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000465 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000466 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000467
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000468 // No packets inserted.
469 EXPECT_TRUE(NULL == DecodeCompleteFrame());
470 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
471}
472
philipel85130292016-07-06 16:10:31 +0200473TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000474 // Always start with a complete key frame when not allowing errors.
475 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000476 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800477 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000478 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000479 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480
481 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000482 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800483 EXPECT_EQ(kCompleteSession,
484 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000485 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000486 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000487 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000488 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000489}
490
philipel85130292016-07-06 16:10:31 +0200491TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700492 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200493 // Always start with a complete key frame when not allowing errors.
494 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
495 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800496 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200497 packet_->markerBit = true;
498 packet_->timestamp += 123 * 90;
499
500 // Insert single packet frame to the jitter buffer and get a frame.
501 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800502 EXPECT_EQ(kCompleteSession,
503 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200504 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
505 CheckOutFrame(frame_out, size_, false);
506 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
507 jitter_buffer_->ReleaseFrame(frame_out);
508
509 // Verify that histograms are updated when the jitter buffer is stopped.
510 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
511 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700512 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
513 EXPECT_EQ(1,
514 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800515 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700516 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800517 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700518 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200519
520 // Verify that histograms are not updated if stop is called again.
521 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700522 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
523 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800524 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700525 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
526 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200527}
528
philipel85130292016-07-06 16:10:31 +0200529TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000530 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800531 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000532 packet_->markerBit = false;
533
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000534 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800535 EXPECT_EQ(kIncomplete,
536 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
538 // Should not be complete.
539 EXPECT_TRUE(frame_out == NULL);
540
541 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800542 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000543 packet_->markerBit = true;
544 packet_->seqNum = seq_num_;
545
philipel9d3ab612015-12-21 04:12:39 -0800546 EXPECT_EQ(kCompleteSession,
547 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000548
549 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000550 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000551
552 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000553 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000554}
555
philipel85130292016-07-06 16:10:31 +0200556TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800558 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000559 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000561 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800562 EXPECT_EQ(kIncomplete,
563 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564
565 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
566
567 // Frame should not be complete.
568 EXPECT_TRUE(frame_out == NULL);
569
570 // Insert 98 frames.
571 int loop = 0;
572 do {
573 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800574 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000575 packet_->markerBit = false;
576 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577
philipel9d3ab612015-12-21 04:12:39 -0800578 EXPECT_EQ(kIncomplete,
579 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000580 loop++;
581 } while (loop < 98);
582
583 // Insert last packet.
584 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800585 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000586 packet_->markerBit = true;
587 packet_->seqNum = seq_num_;
588
philipel9d3ab612015-12-21 04:12:39 -0800589 EXPECT_EQ(kCompleteSession,
590 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000591
592 frame_out = DecodeCompleteFrame();
593
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000594 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000595 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000596 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000597}
598
philipel85130292016-07-06 16:10:31 +0200599TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000600 // Always start with a complete key frame.
601 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800602 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000603 packet_->markerBit = true;
604
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000605 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800606 EXPECT_EQ(kCompleteSession,
607 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
609 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000610 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000611
612 ++seq_num_;
613 packet_->seqNum = seq_num_;
614 packet_->markerBit = false;
615 packet_->frameType = kVideoFrameDelta;
616 packet_->timestamp += 33 * 90;
617
philipel9d3ab612015-12-21 04:12:39 -0800618 EXPECT_EQ(kIncomplete,
619 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620
621 frame_out = DecodeCompleteFrame();
622
623 // Frame should not be complete.
624 EXPECT_TRUE(frame_out == NULL);
625
johan0d1b2b62017-01-10 04:21:35 -0800626 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000627 // Insert 98 frames.
628 int loop = 0;
629 do {
630 ++seq_num_;
631 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000632
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000633 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800634 EXPECT_EQ(kIncomplete,
635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000636 loop++;
637 } while (loop < 98);
638
639 // Insert the last packet.
640 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800641 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000642 packet_->markerBit = true;
643 packet_->seqNum = seq_num_;
644
philipel9d3ab612015-12-21 04:12:39 -0800645 EXPECT_EQ(kCompleteSession,
646 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000647
648 frame_out = DecodeCompleteFrame();
649
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000650 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000651 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000652 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653}
654
philipel85130292016-07-06 16:10:31 +0200655TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000656 // Insert the "first" packet last.
657 seq_num_ += 100;
658 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800659 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660 packet_->markerBit = true;
661 packet_->seqNum = seq_num_;
662 packet_->timestamp = timestamp_;
663
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000664 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800665 EXPECT_EQ(kIncomplete,
666 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000667
668 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
669
670 EXPECT_TRUE(frame_out == NULL);
671
672 // Insert 98 packets.
673 int loop = 0;
674 do {
675 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800676 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000677 packet_->markerBit = false;
678 packet_->seqNum = seq_num_;
679
philipel9d3ab612015-12-21 04:12:39 -0800680 EXPECT_EQ(kIncomplete,
681 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000682 loop++;
683 } while (loop < 98);
684
685 // Insert the last packet.
686 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800687 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000688 packet_->markerBit = false;
689 packet_->seqNum = seq_num_;
690
philipel9d3ab612015-12-21 04:12:39 -0800691 EXPECT_EQ(kCompleteSession,
692 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000693
philipel9d3ab612015-12-21 04:12:39 -0800694 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000695
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000696 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697
698 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000699 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000700}
701
philipel85130292016-07-06 16:10:31 +0200702TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000703 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800704 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705 packet_->markerBit = false;
706
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000707 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800708 EXPECT_EQ(kIncomplete,
709 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710
711 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
712
713 EXPECT_TRUE(frame_out == NULL);
714
715 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800716 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000717 packet_->markerBit = true;
718 packet_->seqNum = seq_num_;
719
philipel9d3ab612015-12-21 04:12:39 -0800720 EXPECT_EQ(kCompleteSession,
721 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000722
723 // check that we fail to get frame since seqnum is not continuous
724 frame_out = DecodeCompleteFrame();
725 EXPECT_TRUE(frame_out == NULL);
726
727 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800728 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000729 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800730 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000731 packet_->markerBit = false;
732 packet_->seqNum = seq_num_;
733 packet_->timestamp = timestamp_;
734
philipel9d3ab612015-12-21 04:12:39 -0800735 EXPECT_EQ(kIncomplete,
736 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000737
738 frame_out = DecodeCompleteFrame();
739
740 // It should not be complete.
741 EXPECT_TRUE(frame_out == NULL);
742
743 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800744 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000745 packet_->markerBit = true;
746 packet_->seqNum = seq_num_;
747
philipel9d3ab612015-12-21 04:12:39 -0800748 EXPECT_EQ(kCompleteSession,
749 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000750
751 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000752 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000753 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000754 jitter_buffer_->ReleaseFrame(frame_out);
755
756 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000757 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000758 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000759 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000760}
761
philipel85130292016-07-06 16:10:31 +0200762TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700763 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800764 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700765 packet_->markerBit = true;
766
767 // Send in an initial good packet/frame (Frame A) to start things off.
768 bool retransmitted = false;
769 EXPECT_EQ(kCompleteSession,
770 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
771 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
772 EXPECT_TRUE(frame_out != NULL);
773 jitter_buffer_->ReleaseFrame(frame_out);
774
775 // Now send in a complete delta frame (Frame C), but with a sequence number
776 // gap. No pic index either, so no temporal scalability cheating :)
777 packet_->frameType = kVideoFrameDelta;
778 // Leave a gap of 2 sequence numbers and two frames.
779 packet_->seqNum = seq_num_ + 3;
780 packet_->timestamp = timestamp_ + (66 * 90);
781 // Still isFirst = marker = true.
782 // Session should be complete (frame is complete), but there's nothing to
783 // decode yet.
784 EXPECT_EQ(kCompleteSession,
785 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
786 frame_out = DecodeCompleteFrame();
787 EXPECT_TRUE(frame_out == NULL);
788
789 // Now send in a complete delta frame (Frame B) that is continuous from A, but
790 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
791 packet_->seqNum = seq_num_ + 1;
792 packet_->timestamp = timestamp_ + (33 * 90);
793 // Still isFirst = marker = true.
794 EXPECT_EQ(kCompleteSession,
795 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
796 frame_out = DecodeCompleteFrame();
797 EXPECT_TRUE(frame_out != NULL);
798 jitter_buffer_->ReleaseFrame(frame_out);
799
800 // But Frame C isn't continuous yet.
801 frame_out = DecodeCompleteFrame();
802 EXPECT_TRUE(frame_out == NULL);
803
804 // Add in the padding. These are empty packets (data length is 0) with no
805 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200806 WebRtcRTPHeader rtpHeader;
807 memset(&rtpHeader, 0, sizeof(rtpHeader));
808 rtpHeader.header.sequenceNumber = seq_num_ + 2;
809 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
810 rtpHeader.header.markerBit = false;
Magnus Jedvert22341212018-07-11 14:27:49 +0200811 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200812 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700813 EXPECT_EQ(kOldPacket,
814 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
815 empty_packet.seqNum += 1;
816 EXPECT_EQ(kOldPacket,
817 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
818
819 // But now Frame C should be ready!
820 frame_out = DecodeCompleteFrame();
821 EXPECT_TRUE(frame_out != NULL);
822 jitter_buffer_->ReleaseFrame(frame_out);
823}
824
philipel85130292016-07-06 16:10:31 +0200825TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000826 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800827 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000828 packet_->markerBit = false;
829 packet_->seqNum = seq_num_;
830 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000831 EXPECT_EQ(0, jitter_buffer_->num_packets());
832 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000833
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000834 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800835 EXPECT_EQ(kIncomplete,
836 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000837
838 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
839
840 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000841 EXPECT_EQ(1, jitter_buffer_->num_packets());
842 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000843
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800845 EXPECT_EQ(kDuplicatePacket,
846 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000847 EXPECT_EQ(2, jitter_buffer_->num_packets());
848 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000849
850 seq_num_++;
851 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000852 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800853 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000854
philipel9d3ab612015-12-21 04:12:39 -0800855 EXPECT_EQ(kCompleteSession,
856 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000857
858 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000859 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000860 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000861
862 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000863 EXPECT_EQ(3, jitter_buffer_->num_packets());
864 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000865 jitter_buffer_->ReleaseFrame(frame_out);
866}
867
philipel85130292016-07-06 16:10:31 +0200868TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000869 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800870 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000871 packet_->markerBit = true;
872 packet_->seqNum = seq_num_;
873 packet_->timestamp = timestamp_;
874 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
875 EXPECT_EQ(0, jitter_buffer_->num_packets());
876 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
877
878 bool retransmitted = false;
879 // Insert first complete frame.
880 EXPECT_EQ(kCompleteSession,
881 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
882
883 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
884 ASSERT_TRUE(frame_out != NULL);
885 CheckOutFrame(frame_out, size_, false);
886 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
887 jitter_buffer_->ReleaseFrame(frame_out);
888
889 // Insert 3 delta frames.
890 for (uint16_t i = 1; i <= 3; ++i) {
891 packet_->seqNum = seq_num_ + i;
892 packet_->timestamp = timestamp_ + (i * 33) * 90;
893 packet_->frameType = kVideoFrameDelta;
894 EXPECT_EQ(kCompleteSession,
895 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
896 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
897 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
898 }
899
900 // Retransmit second delta frame.
901 packet_->seqNum = seq_num_ + 2;
902 packet_->timestamp = timestamp_ + 66 * 90;
903
904 EXPECT_EQ(kDuplicatePacket,
905 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
906
907 EXPECT_EQ(5, jitter_buffer_->num_packets());
908 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
909
910 // Should be able to decode 3 delta frames, key frame already decoded.
911 for (size_t i = 0; i < 3; ++i) {
912 frame_out = DecodeCompleteFrame();
913 ASSERT_TRUE(frame_out != NULL);
914 CheckOutFrame(frame_out, size_, false);
915 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
916 jitter_buffer_->ReleaseFrame(frame_out);
917 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000918}
919
philipel85130292016-07-06 16:10:31 +0200920TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700921 // Verify that JB skips forward to next base layer frame.
922 // -------------------------------------------------
923 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
924 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
925 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
926 // | ss | x | x | x | |
927 // -------------------------------------------------
928 // |<----------tl0idx:200--------->|<---tl0idx:201---
929
philipel29d88462018-08-08 14:26:00 +0200930 auto& vp9_header =
931 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
932
asapersson9a4cd872015-10-23 00:27:14 -0700933 bool re = false;
934 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200935 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800936 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700937 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200938 vp9_header.flexible_mode = false;
939 vp9_header.spatial_idx = 0;
940 vp9_header.beginning_of_frame = true;
941 vp9_header.end_of_frame = true;
942 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700943
944 packet_->seqNum = 65485;
945 packet_->timestamp = 1000;
946 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200947 vp9_header.picture_id = 5;
948 vp9_header.tl0_pic_idx = 200;
949 vp9_header.temporal_idx = 0;
950 vp9_header.ss_data_available = true;
951 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700952 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
953 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
954
955 // Insert next temporal layer 0.
956 packet_->seqNum = 65489;
957 packet_->timestamp = 13000;
958 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200959 vp9_header.picture_id = 9;
960 vp9_header.tl0_pic_idx = 201;
961 vp9_header.temporal_idx = 0;
962 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700963 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
964
965 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200966 EXPECT_EQ(1000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700967 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
968 jitter_buffer_->ReleaseFrame(frame_out);
969
970 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200971 EXPECT_EQ(13000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700972 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
973 jitter_buffer_->ReleaseFrame(frame_out);
974}
975
philipel85130292016-07-06 16:10:31 +0200976TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700977 // Verify that frames are updated with SS data when SS packet is reordered.
978 // --------------------------------
979 // | 65486 | 65487 | 65485 |...
980 // | pid:6 | pid:7 | pid:5 |...
981 // | tid:2 | tid:1 | tid:0 |...
982 // | | | ss |
983 // --------------------------------
984 // |<--------tl0idx:200--------->|
985
philipel29d88462018-08-08 14:26:00 +0200986 auto& vp9_header =
987 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
988
asapersson9a4cd872015-10-23 00:27:14 -0700989 bool re = false;
990 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200991 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800992 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700993 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200994 vp9_header.flexible_mode = false;
995 vp9_header.spatial_idx = 0;
996 vp9_header.beginning_of_frame = true;
997 vp9_header.end_of_frame = true;
998 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700999
1000 packet_->seqNum = 65486;
1001 packet_->timestamp = 6000;
1002 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001003 vp9_header.picture_id = 6;
1004 vp9_header.temporal_idx = 2;
1005 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001006 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1007
1008 packet_->seqNum = 65487;
1009 packet_->timestamp = 9000;
1010 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001011 vp9_header.picture_id = 7;
1012 vp9_header.temporal_idx = 1;
1013 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001014 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1015
1016 // Insert first frame with SS data.
1017 packet_->seqNum = 65485;
1018 packet_->timestamp = 3000;
1019 packet_->frameType = kVideoFrameKey;
1020 packet_->width = 352;
1021 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001022 vp9_header.picture_id = 5;
1023 vp9_header.temporal_idx = 0;
1024 vp9_header.temporal_up_switch = false;
1025 vp9_header.ss_data_available = true;
1026 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001027 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1028 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1029
1030 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001031 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001032 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1033 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1034 EXPECT_FALSE(
1035 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1036 jitter_buffer_->ReleaseFrame(frame_out);
1037
1038 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001039 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001040 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1041 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1042 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1043 jitter_buffer_->ReleaseFrame(frame_out);
1044
1045 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001046 EXPECT_EQ(9000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001047 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1048 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1049 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1050 jitter_buffer_->ReleaseFrame(frame_out);
1051}
1052
philipel85130292016-07-06 16:10:31 +02001053TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001054 // Verify that frames are updated with SS data when SS packet is reordered.
1055 // -----------------------------------------
1056 // | 65486 | 65487 | 65485 | 65484 |...
1057 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1058 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1059 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1060 // | t:6000 | t:6000 | t:3000 | t:3000 |
1061 // | | | | ss |
1062 // -----------------------------------------
1063 // |<-----------tl0idx:200------------>|
1064
philipel29d88462018-08-08 14:26:00 +02001065 auto& vp9_header =
1066 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1067
asapersson9a4cd872015-10-23 00:27:14 -07001068 bool re = false;
1069 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001070 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001071 vp9_header.flexible_mode = false;
1072 vp9_header.beginning_of_frame = true;
1073 vp9_header.end_of_frame = true;
1074 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001075
johan0d1b2b62017-01-10 04:21:35 -08001076 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001077 packet_->markerBit = false;
1078 packet_->seqNum = 65486;
1079 packet_->timestamp = 6000;
1080 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001081 vp9_header.spatial_idx = 0;
1082 vp9_header.picture_id = 6;
1083 vp9_header.temporal_idx = 1;
1084 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001085 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1086
johan0d1b2b62017-01-10 04:21:35 -08001087 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001088 packet_->markerBit = true;
1089 packet_->seqNum = 65487;
1090 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001091 vp9_header.spatial_idx = 1;
1092 vp9_header.picture_id = 6;
1093 vp9_header.temporal_idx = 1;
1094 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001095 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1096
johan0d1b2b62017-01-10 04:21:35 -08001097 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001098 packet_->markerBit = true;
1099 packet_->seqNum = 65485;
1100 packet_->timestamp = 3000;
1101 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001102 vp9_header.spatial_idx = 1;
1103 vp9_header.picture_id = 5;
1104 vp9_header.temporal_idx = 0;
1105 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001106 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1107
1108 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001109 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001110 packet_->markerBit = false;
1111 packet_->seqNum = 65484;
1112 packet_->frameType = kVideoFrameKey;
1113 packet_->width = 352;
1114 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001115 vp9_header.spatial_idx = 0;
1116 vp9_header.picture_id = 5;
1117 vp9_header.temporal_idx = 0;
1118 vp9_header.temporal_up_switch = false;
1119 vp9_header.ss_data_available = true;
1120 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001121 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1122 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1123
1124 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001125 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001126 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1127 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1128 EXPECT_FALSE(
1129 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1130 jitter_buffer_->ReleaseFrame(frame_out);
1131
1132 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001133 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001134 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1135 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1136 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1137 jitter_buffer_->ReleaseFrame(frame_out);
1138}
1139
philipel85130292016-07-06 16:10:31 +02001140TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001141 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001142 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001143 packet_->markerBit = false;
1144 packet_->seqNum = seq_num_;
1145 packet_->timestamp = timestamp_;
1146 packet_->insertStartCode = true;
1147
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001148 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001149 EXPECT_EQ(kIncomplete,
1150 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001151
1152 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1153
1154 // Frame should not be complete.
1155 EXPECT_TRUE(frame_out == NULL);
1156
1157 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001158 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159 packet_->markerBit = true;
1160 packet_->seqNum = seq_num_;
1161
philipel9d3ab612015-12-21 04:12:39 -08001162 EXPECT_EQ(kCompleteSession,
1163 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001164
1165 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001166 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001167 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001168 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001169}
1170
stefana669a3a2016-10-06 05:04:52 -07001171TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1172 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1173
philipel7d745e52018-08-02 14:03:53 +02001174 auto& h264_header =
1175 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001176 packet_->timestamp = timestamp_;
1177 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001178 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001179 packet_->markerBit = true;
1180 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001181 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001182 h264_header.nalu_type = H264::NaluType::kIdr;
1183 h264_header.nalus[0].type = H264::NaluType::kIdr;
1184 h264_header.nalus[0].sps_id = -1;
1185 h264_header.nalus[0].pps_id = 0;
1186 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001187 bool retransmitted = false;
1188 EXPECT_EQ(kCompleteSession,
1189 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1190 // Not decodable since sps and pps are missing.
1191 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1192
1193 timestamp_ += 3000;
1194 packet_->timestamp = timestamp_;
1195 ++seq_num_;
1196 packet_->seqNum = seq_num_;
1197 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001198 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001199 packet_->markerBit = false;
1200 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001201 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001202 h264_header.nalu_type = H264::NaluType::kStapA;
1203 h264_header.nalus[0].type = H264::NaluType::kSps;
1204 h264_header.nalus[0].sps_id = 0;
1205 h264_header.nalus[0].pps_id = -1;
1206 h264_header.nalus[1].type = H264::NaluType::kPps;
1207 h264_header.nalus[1].sps_id = 0;
1208 h264_header.nalus[1].pps_id = 0;
1209 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001210 // Not complete since the marker bit hasn't been received.
1211 EXPECT_EQ(kIncomplete,
1212 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1213
1214 ++seq_num_;
1215 packet_->seqNum = seq_num_;
1216 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001217 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001218 packet_->markerBit = true;
1219 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001220 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001221 h264_header.nalu_type = H264::NaluType::kIdr;
1222 h264_header.nalus[0].type = H264::NaluType::kIdr;
1223 h264_header.nalus[0].sps_id = -1;
1224 h264_header.nalus[0].pps_id = 0;
1225 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001226 // Complete and decodable since the pps and sps are received in the first
1227 // packet of this frame.
1228 EXPECT_EQ(kCompleteSession,
1229 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1230 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1231 ASSERT_NE(nullptr, frame_out);
1232 jitter_buffer_->ReleaseFrame(frame_out);
1233
1234 timestamp_ += 3000;
1235 packet_->timestamp = timestamp_;
1236 ++seq_num_;
1237 packet_->seqNum = seq_num_;
1238 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001239 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001240 packet_->markerBit = true;
1241 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001242 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001243 h264_header.nalu_type = H264::NaluType::kSlice;
1244 h264_header.nalus[0].type = H264::NaluType::kSlice;
1245 h264_header.nalus[0].sps_id = -1;
1246 h264_header.nalus[0].pps_id = 0;
1247 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001248 // Complete and decodable since sps, pps and key frame has been received.
1249 EXPECT_EQ(kCompleteSession,
1250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1251 frame_out = DecodeCompleteFrame();
1252 ASSERT_NE(nullptr, frame_out);
1253 jitter_buffer_->ReleaseFrame(frame_out);
1254}
1255
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001256// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001257TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001258 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001259 // Always start with a key frame. Use 10 packets to test Decodable State
1260 // boundaries.
1261 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001262 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001263 packet_->markerBit = false;
1264 packet_->seqNum = seq_num_;
1265 packet_->timestamp = timestamp_;
1266
1267 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001268 EXPECT_EQ(kIncomplete,
1269 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001270 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001271 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001272 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1273
johan0d1b2b62017-01-10 04:21:35 -08001274 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001275 for (int i = 1; i < 9; ++i) {
1276 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001277 EXPECT_EQ(kIncomplete,
1278 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001279 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001280 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1281 }
1282
1283 // last packet
1284 packet_->markerBit = true;
1285 packet_->seqNum++;
1286
philipel9d3ab612015-12-21 04:12:39 -08001287 EXPECT_EQ(kCompleteSession,
1288 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001289 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1290 CheckOutFrame(frame_out, 10 * size_, false);
1291 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001292 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001293
1294 // An incomplete frame can only be decoded once a subsequent frame has begun
1295 // to arrive. Insert packet in distant frame for this purpose.
1296 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001297 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001298 packet_->markerBit = false;
1299 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001300 packet_->timestamp += 33 * 90 * 8;
1301
philipel9d3ab612015-12-21 04:12:39 -08001302 EXPECT_EQ(kDecodableSession,
1303 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001304 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001305 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1306
1307 // Insert second frame
1308 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001309 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001310
philipel9d3ab612015-12-21 04:12:39 -08001311 EXPECT_EQ(kDecodableSession,
1312 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001313 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001314 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1315
johan0d1b2b62017-01-10 04:21:35 -08001316 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001317 for (int i = 1; i < 8; ++i) {
1318 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001319 EXPECT_EQ(kDecodableSession,
1320 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001321 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001322 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1323 }
1324
1325 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001326 EXPECT_EQ(kDecodableSession,
1327 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001328 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001329 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1330
1331 frame_out = DecodeIncompleteFrame();
1332 ASSERT_FALSE(NULL == frame_out);
1333 CheckOutFrame(frame_out, 9 * size_, false);
1334 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001335 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001336
1337 packet_->markerBit = true;
1338 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001339 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001340}
1341
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001342// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001343TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001344 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1345 // Always start with a key frame.
1346 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001347 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348 packet_->markerBit = true;
1349 packet_->seqNum = seq_num_;
1350 packet_->timestamp = timestamp_;
1351
1352 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001353 EXPECT_EQ(kCompleteSession,
1354 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001355 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1356 CheckOutFrame(frame_out, size_, false);
1357 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001358 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001359
1360 // An incomplete frame can only be decoded once a subsequent frame has begun
1361 // to arrive. Insert packet in distant frame for this purpose.
1362 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001363 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001364 packet_->markerBit = false;
1365 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001366 packet_->timestamp += 33 * 90 * 8;
1367 EXPECT_EQ(kIncomplete,
1368 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001369 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001370 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001371 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1372
1373 // Insert second frame - an incomplete key frame.
1374 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001375 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001376 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001377 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001378
philipel9d3ab612015-12-21 04:12:39 -08001379 EXPECT_EQ(kIncomplete,
1380 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001381 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001382 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1383
1384 // Insert a few more packets. Make sure we're waiting for the key frame to be
1385 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001386 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001387 for (int i = 1; i < 5; ++i) {
1388 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001389 EXPECT_EQ(kIncomplete,
1390 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001391 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001392 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1393 }
1394
1395 // Complete key frame.
1396 packet_->markerBit = true;
1397 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001398 EXPECT_EQ(kCompleteSession,
1399 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001400 frame_out = DecodeCompleteFrame();
1401 CheckOutFrame(frame_out, 6 * size_, false);
1402 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001403 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001404}
1405
1406// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001407TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001408 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1409 // Always start with a key frame.
1410 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001411 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001412 packet_->markerBit = true;
1413 packet_->seqNum = seq_num_;
1414 packet_->timestamp = timestamp_;
1415
1416 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001417 EXPECT_EQ(kCompleteSession,
1418 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001419 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1420 CheckOutFrame(frame_out, size_, false);
1421 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001422 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001423
1424 // An incomplete frame can only be decoded once a subsequent frame has begun
1425 // to arrive. Insert packet in distant frame for this purpose.
1426 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001427 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001428 packet_->markerBit = false;
1429 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001430 packet_->timestamp += 33 * 90 * 8;
1431 EXPECT_EQ(kIncomplete,
1432 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001433 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001434 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001435 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1436
1437 // Insert second frame with the first packet missing. Make sure we're waiting
1438 // for the key frame to be complete.
1439 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001440 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001441
philipel9d3ab612015-12-21 04:12:39 -08001442 EXPECT_EQ(kIncomplete,
1443 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001444 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001445 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1446
1447 for (int i = 0; i < 5; ++i) {
1448 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001449 EXPECT_EQ(kIncomplete,
1450 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001451 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001452 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1453 }
1454
1455 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001456 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001457 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001458 EXPECT_EQ(kDecodableSession,
1459 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001460 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001461 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1462
1463 frame_out = DecodeIncompleteFrame();
1464 CheckOutFrame(frame_out, 7 * size_, false);
1465 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001466 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001467}
1468
philipel85130292016-07-06 16:10:31 +02001469TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001470 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001471 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001472 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001473 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001474 packet_->markerBit = true;
1475 packet_->seqNum = seq_num_;
1476 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001477 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001478 EXPECT_EQ(kCompleteSession,
1479 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001480 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001481 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1482 EXPECT_NE(frame, nullptr);
Niels Möller23775882018-08-16 10:24:12 +02001483 EXPECT_EQ(packet_->timestamp, frame->Timestamp());
1484 frame = jitter_buffer_->ExtractAndSetDecode(frame->Timestamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001485 EXPECT_TRUE(frame != NULL);
1486 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001487
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001488 // Drop a complete frame.
1489 timestamp_ += 2 * 33 * 90;
1490 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001491 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001492 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001493 packet_->markerBit = false;
1494 packet_->seqNum = seq_num_;
1495 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001496 EXPECT_EQ(kDecodableSession,
1497 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001498 // Insert a packet (so the previous one will be released).
1499 timestamp_ += 33 * 90;
1500 seq_num_ += 2;
1501 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001502 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001503 packet_->markerBit = false;
1504 packet_->seqNum = seq_num_;
1505 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001506 EXPECT_EQ(kDecodableSession,
1507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001508 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001509 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1510 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001511}
1512
philipel85130292016-07-06 16:10:31 +02001513TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001514 // Verify missing packets statistics and not decodable packets statistics.
1515 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1516 // The last packet is an empty (non-media) packet.
1517
1518 // Select a start seqNum which triggers a difficult wrap situation
1519 // The JB will only output (incomplete)frames if the next one has started
1520 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001521 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 seq_num_ = 0xffff - 4;
1523 seq_num_++;
1524 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001525 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001526 packet_->markerBit = false;
1527 packet_->seqNum = seq_num_;
1528 packet_->timestamp = timestamp_;
1529 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001530
1531 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001532 EXPECT_EQ(kDecodableSession,
1533 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001534 for (int i = 0; i < 11; ++i) {
1535 webrtc::FrameType frametype = kVideoFrameDelta;
1536 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001537 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001538 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001539 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540 packet_->markerBit = false;
1541 packet_->seqNum = seq_num_;
1542 packet_->timestamp = timestamp_;
1543 packet_->completeNALU = kNaluStart;
1544
philipel9d3ab612015-12-21 04:12:39 -08001545 EXPECT_EQ(kDecodableSession,
1546 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547
1548 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1549
1550 // Should not be complete.
1551 EXPECT_TRUE(frame_out == NULL);
1552
1553 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001554 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001555 packet_->markerBit = true;
1556 packet_->seqNum = seq_num_;
1557 packet_->completeNALU = kNaluEnd;
1558
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001559 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1560 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561
1562 // Insert an empty (non-media) packet.
1563 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001564 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 packet_->markerBit = false;
1566 packet_->seqNum = seq_num_;
1567 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001568 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001569
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001570 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001571 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001572 frame_out = DecodeIncompleteFrame();
1573
1574 // One of the packets has been discarded by the jitter buffer.
1575 // Last frame can't be extracted yet.
1576 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001577 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001578
1579 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001580 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581 } else {
philipel9d3ab612015-12-21 04:12:39 -08001582 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001583 }
1584 EXPECT_FALSE(frame_out->Complete());
1585 EXPECT_FALSE(frame_out->MissingFrame());
1586 }
1587
1588 jitter_buffer_->ReleaseFrame(frame_out);
1589 }
1590
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001591 // Insert 3 old packets and verify that we have 3 discarded packets
1592 // Match value to actual latest timestamp decoded.
1593 timestamp_ -= 33 * 90;
1594 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001595
philipel9d3ab612015-12-21 04:12:39 -08001596 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001597
1598 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001599
philipel9d3ab612015-12-21 04:12:39 -08001600 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001601
1602 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001603
philipel9d3ab612015-12-21 04:12:39 -08001604 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001605
1606 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1607
1608 jitter_buffer_->Flush();
1609
1610 // This statistic shouldn't be reset by a flush.
1611 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1612}
1613
philipel85130292016-07-06 16:10:31 +02001614TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 seq_num_ = 0xfff0;
1616 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001617 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618 packet_->markerBit = false;
1619 packet_->seqNum = seq_num_;
1620 packet_->timestamp = timestamp_;
1621
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001622 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001623 EXPECT_EQ(kIncomplete,
1624 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001625
1626 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1627
1628 EXPECT_TRUE(frame_out == NULL);
1629
1630 int loop = 0;
1631 do {
1632 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001633 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634 packet_->markerBit = false;
1635 packet_->seqNum = seq_num_;
1636
philipel9d3ab612015-12-21 04:12:39 -08001637 EXPECT_EQ(kIncomplete,
1638 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001639
1640 frame_out = DecodeCompleteFrame();
1641
1642 EXPECT_TRUE(frame_out == NULL);
1643
1644 loop++;
1645 } while (loop < 98);
1646
1647 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001648 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001649 packet_->markerBit = true;
1650 packet_->seqNum = seq_num_;
1651
philipel9d3ab612015-12-21 04:12:39 -08001652 EXPECT_EQ(kCompleteSession,
1653 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654
1655 frame_out = DecodeCompleteFrame();
1656
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001657 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001658
1659 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001660 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001661}
1662
philipel85130292016-07-06 16:10:31 +02001663TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001664 // Insert "first" packet last seqnum.
1665 seq_num_ = 10;
1666 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001667 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001668 packet_->markerBit = true;
1669 packet_->seqNum = seq_num_;
1670
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001671 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001672 EXPECT_EQ(kIncomplete,
1673 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001674 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1675
1676 // Should not be complete.
1677 EXPECT_TRUE(frame_out == NULL);
1678
1679 // Insert 98 frames.
1680 int loop = 0;
1681 do {
1682 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001683 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001684 packet_->markerBit = false;
1685 packet_->seqNum = seq_num_;
1686
philipel9d3ab612015-12-21 04:12:39 -08001687 EXPECT_EQ(kIncomplete,
1688 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689
1690 frame_out = DecodeCompleteFrame();
1691
1692 EXPECT_TRUE(frame_out == NULL);
1693
1694 loop++;
1695 } while (loop < 98);
1696
1697 // Insert last packet.
1698 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001699 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001700 packet_->markerBit = false;
1701 packet_->seqNum = seq_num_;
1702
philipel9d3ab612015-12-21 04:12:39 -08001703 EXPECT_EQ(kCompleteSession,
1704 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001705
1706 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001707 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001708 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001709 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001710}
1711
philipel85130292016-07-06 16:10:31 +02001712TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001713 // ------- -------
1714 // | 2 | | 1 |
1715 // ------- -------
1716 // t = 3000 t = 2000
1717 seq_num_ = 2;
1718 timestamp_ = 3000;
1719 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001720 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001721 packet_->markerBit = true;
1722 packet_->timestamp = timestamp_;
1723 packet_->seqNum = seq_num_;
1724
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001725 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001726 EXPECT_EQ(kCompleteSession,
1727 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001728
1729 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001730 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001731 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001732 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001733 jitter_buffer_->ReleaseFrame(frame_out);
1734
1735 seq_num_--;
1736 timestamp_ = 2000;
1737 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001738 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001739 packet_->markerBit = true;
1740 packet_->seqNum = seq_num_;
1741 packet_->timestamp = timestamp_;
1742
philipel9d3ab612015-12-21 04:12:39 -08001743 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001744}
1745
philipel85130292016-07-06 16:10:31 +02001746TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001747 // ------- -------
1748 // | 2 | | 1 |
1749 // ------- -------
1750 // t = 3000 t = 0xffffff00
1751
1752 seq_num_ = 2;
1753 timestamp_ = 3000;
1754 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001755 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001756 packet_->markerBit = true;
1757 packet_->seqNum = seq_num_;
1758 packet_->timestamp = timestamp_;
1759
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001760 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001761 EXPECT_EQ(kCompleteSession,
1762 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001763
1764 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001765 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001766
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001767 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001768
1769 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1770
1771 jitter_buffer_->ReleaseFrame(frame_out);
1772
1773 seq_num_--;
1774 timestamp_ = 0xffffff00;
1775 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001776 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001777 packet_->markerBit = true;
1778 packet_->seqNum = seq_num_;
1779 packet_->timestamp = timestamp_;
1780
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001781 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001782 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001783}
1784
philipel85130292016-07-06 16:10:31 +02001785TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001786 // --------------- ---------------
1787 // | 1 | 2 | | 3 | 4 |
1788 // --------------- ---------------
1789 // t = 0xffffff00 t = 33*90
1790
1791 timestamp_ = 0xffffff00;
1792 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001793 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001794 packet_->markerBit = false;
1795 packet_->seqNum = seq_num_;
1796 packet_->timestamp = timestamp_;
1797
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001798 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001799 EXPECT_EQ(kIncomplete,
1800 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001801
1802 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001803 EXPECT_TRUE(frame_out == NULL);
1804
1805 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001806 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001807 packet_->markerBit = true;
1808 packet_->seqNum = seq_num_;
1809
philipel9d3ab612015-12-21 04:12:39 -08001810 EXPECT_EQ(kCompleteSession,
1811 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001812
1813 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001814 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001815 jitter_buffer_->ReleaseFrame(frame_out);
1816
1817 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001818 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001819 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001820 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001821 packet_->markerBit = false;
1822 packet_->seqNum = seq_num_;
1823 packet_->timestamp = timestamp_;
1824
philipel9d3ab612015-12-21 04:12:39 -08001825 EXPECT_EQ(kIncomplete,
1826 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827
1828 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001829 EXPECT_TRUE(frame_out == NULL);
1830
1831 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001832 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001833 packet_->markerBit = true;
1834 packet_->seqNum = seq_num_;
1835
philipel9d3ab612015-12-21 04:12:39 -08001836 EXPECT_EQ(kCompleteSession,
1837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838
1839 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001840 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001841 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001842 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001843}
1844
philipel85130292016-07-06 16:10:31 +02001845TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001846 // ------- -------
1847 // | 1 | | 2 |
1848 // ------- -------
1849 // t = 0xffffff00 t = 2700
1850
1851 timestamp_ = 0xffffff00;
1852 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001853 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001854 packet_->markerBit = true;
1855 packet_->timestamp = timestamp_;
1856
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001857 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001858 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001859 EXPECT_EQ(kCompleteSession,
1860 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001861
1862 // Insert next frame.
1863 seq_num_++;
1864 timestamp_ = 2700;
1865 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001866 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001867 packet_->markerBit = true;
1868 packet_->seqNum = seq_num_;
1869 packet_->timestamp = timestamp_;
1870
philipel9d3ab612015-12-21 04:12:39 -08001871 EXPECT_EQ(kCompleteSession,
1872 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001873
1874 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001875 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001876 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001877 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001878 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001879
1880 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001881 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001882 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001883 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001884 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001885}
1886
philipel85130292016-07-06 16:10:31 +02001887TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001888 // ------- -------
1889 // | 2 | | 1 |
1890 // ------- -------
1891 // t = 2700 t = 0xffffff00
1892
1893 seq_num_ = 2;
1894 timestamp_ = 2700;
1895 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001896 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001897 packet_->markerBit = true;
1898 packet_->seqNum = seq_num_;
1899 packet_->timestamp = timestamp_;
1900
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001901 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001902 EXPECT_EQ(kCompleteSession,
1903 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001904
1905 // Insert second frame
1906 seq_num_--;
1907 timestamp_ = 0xffffff00;
1908 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001909 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001910 packet_->markerBit = true;
1911 packet_->seqNum = seq_num_;
1912 packet_->timestamp = timestamp_;
1913
philipel9d3ab612015-12-21 04:12:39 -08001914 EXPECT_EQ(kCompleteSession,
1915 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001916
1917 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001918 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001919 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001921 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001922
1923 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001924 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001925 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001926 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001927 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928}
1929
philipel85130292016-07-06 16:10:31 +02001930TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001931 int loop = 0;
1932 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001933 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 // Insert kMaxPacketsInJitterBuffer into frame.
1935 do {
1936 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001937 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001938 packet_->markerBit = false;
1939 packet_->seqNum = seq_num_;
1940
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001942 EXPECT_EQ(kIncomplete,
1943 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944 firstPacket = false;
1945 } else {
philipel9d3ab612015-12-21 04:12:39 -08001946 EXPECT_EQ(kIncomplete,
1947 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001948 }
1949
1950 loop++;
1951 } while (loop < kMaxPacketsInSession);
1952
1953 // Max number of packets inserted.
1954 // Insert one more packet.
1955 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001956 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001957 packet_->markerBit = true;
1958 packet_->seqNum = seq_num_;
1959
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001960 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001961 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001962 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001963}
1964
philipel85130292016-07-06 16:10:31 +02001965TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001966 // TEST fill JB with more than max number of frame (50 delta frames +
1967 // 51 key frames) with wrap in seq_num_
1968 //
1969 // --------------------------------------------------------------
1970 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1971 // --------------------------------------------------------------
1972 // |<-----------delta frames------------->|<------key frames----->|
1973
jbauchdb81ffd2015-11-23 03:59:02 -08001974 // Make sure the jitter doesn't request a keyframe after too much non-
1975 // decodable frames.
1976 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001977 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001978
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001979 int loop = 0;
1980 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001981 uint32_t first_key_frame_timestamp = 0;
1982 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001983 // Insert MAX_NUMBER_OF_FRAMES frames.
1984 do {
philipel9d3ab612015-12-21 04:12:39 -08001985 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001986 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001987 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001988 packet_->markerBit = true;
1989 packet_->seqNum = seq_num_;
1990 packet_->timestamp = timestamp_;
1991
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001992 if (loop == 50) {
1993 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001994 packet_->frameType = kVideoFrameKey;
1995 }
1996
1997 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001998 EXPECT_EQ(kCompleteSession,
1999 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002000
2001 loop++;
2002 } while (loop < kMaxNumberOfFrames);
2003
2004 // Max number of frames inserted.
2005
2006 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08002007 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002008 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002009 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002010 packet_->markerBit = true;
2011 packet_->seqNum = seq_num_;
2012 packet_->timestamp = timestamp_;
2013
2014 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002015 EXPECT_EQ(kFlushIndicator,
2016 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002017
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002018 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02002019 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002020 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002021 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002022 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002023}
2024
philipel85130292016-07-06 16:10:31 +02002025TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002026 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 seq_num_ = 3;
2028 // Insert one empty packet per frame, should never return the last timestamp
2029 // inserted. Only return empty frames in the presence of subsequent frames.
2030 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002031 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002032 for (int i = 0; i < maxSize + 10; i++) {
2033 timestamp_ += 33 * 90;
2034 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002035 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002036 packet_->markerBit = false;
2037 packet_->seqNum = seq_num_;
2038 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002039 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002040
philipel9d3ab612015-12-21 04:12:39 -08002041 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002042 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2043 // Timestamp should never be the last TS inserted.
2044 if (testFrame != NULL) {
Niels Möller23775882018-08-16 10:24:12 +02002045 EXPECT_TRUE(testFrame->Timestamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002046 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002047 }
2048 }
2049}
2050
philipel85130292016-07-06 16:10:31 +02002051TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002052 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002053 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002054 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002055 timestamp_ += 33 * 90;
2056 int insertedLength = 0;
2057 packet_->seqNum = seq_num_;
2058 packet_->timestamp = timestamp_;
2059 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002060 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002061 packet_->completeNALU = kNaluStart;
2062 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002063 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002064
philipel9d3ab612015-12-21 04:12:39 -08002065 EXPECT_EQ(kDecodableSession,
2066 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002067
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002068 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069 packet_->seqNum = seq_num_;
2070 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002071 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002072 packet_->completeNALU = kNaluIncomplete;
2073 packet_->markerBit = false;
2074
philipel9d3ab612015-12-21 04:12:39 -08002075 EXPECT_EQ(kDecodableSession,
2076 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002077
2078 seq_num_++;
2079 packet_->seqNum = seq_num_;
2080 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002081 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002082 packet_->completeNALU = kNaluEnd;
2083 packet_->markerBit = false;
2084
philipel9d3ab612015-12-21 04:12:39 -08002085 EXPECT_EQ(kDecodableSession,
2086 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002087
2088 seq_num_++;
2089 packet_->seqNum = seq_num_;
2090 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002091 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002092 EXPECT_EQ(kDecodableSession,
2093 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002094 // The JB will only output (incomplete) frames if a packet belonging to a
2095 // subsequent frame was already inserted. Insert one packet of a subsequent
2096 // frame. place high timestamp so the JB would always have a next frame
2097 // (otherwise, for every inserted frame we need to take care of the next
2098 // frame as well).
2099 packet_->seqNum = 1;
2100 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2101 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002102 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002103 packet_->completeNALU = kNaluStart;
2104 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002105
philipel9d3ab612015-12-21 04:12:39 -08002106 EXPECT_EQ(kDecodableSession,
2107 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108
2109 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2110
2111 // We can decode everything from a NALU until a packet has been lost.
2112 // Thus we can decode the first packet of the first NALU and the second NALU
2113 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002114 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002115 jitter_buffer_->ReleaseFrame(frame_out);
2116
2117 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002118 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002119 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002120 insertedLength = 0;
2121
2122 packet_->seqNum = seq_num_;
2123 packet_->timestamp = timestamp_;
2124 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002125 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002126 packet_->completeNALU = kNaluEnd;
2127 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002128 EXPECT_EQ(kDecodableSession,
2129 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2130 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002131 seq_num_--;
2132 packet_->seqNum = seq_num_;
2133 packet_->timestamp = timestamp_;
2134 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002135 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002136 packet_->completeNALU = kNaluStart;
2137 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002138
philipel9d3ab612015-12-21 04:12:39 -08002139 EXPECT_EQ(kDecodableSession,
2140 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002141 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2142
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002143 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002144 packet_->seqNum = seq_num_;
2145 packet_->timestamp = timestamp_;
2146 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002147 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002148 packet_->completeNALU = kNaluComplete;
2149 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002150 EXPECT_EQ(kDecodableSession,
2151 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002152 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002153 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154 packet_->seqNum = seq_num_;
2155 packet_->timestamp = timestamp_;
2156 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002157 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002158 packet_->completeNALU = kNaluStart;
2159 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002160 EXPECT_EQ(kDecodableSession,
2161 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002162 // This packet should be decoded since it's the beginning of a NAL.
2163 insertedLength += packet_->sizeBytes;
2164
2165 seq_num_ += 2;
2166 packet_->seqNum = seq_num_;
2167 packet_->timestamp = timestamp_;
2168 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002169 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002170 packet_->completeNALU = kNaluEnd;
2171 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002172 EXPECT_EQ(kDecodableSession,
2173 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002174 // This packet should not be decoded because it is an incomplete NAL if it
2175 // is the last.
2176 frame_out = DecodeIncompleteFrame();
2177 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002178 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002179 jitter_buffer_->ReleaseFrame(frame_out);
2180
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002181 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002182 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002183 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002184 WebRtcRTPHeader rtpHeader;
2185 memset(&rtpHeader, 0, sizeof(rtpHeader));
Magnus Jedvert22341212018-07-11 14:27:49 +02002186 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002187 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002188 emptypacket.seqNum = seq_num_;
2189 emptypacket.timestamp = timestamp_;
2190 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002191 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002192 emptypacket.completeNALU = kNaluComplete;
2193 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002194 EXPECT_EQ(kCompleteSession,
2195 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002196 // This packet should not be decoded because it is an incomplete NAL if it
2197 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002198
2199 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2200 // has arrived.
2201 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002202 EXPECT_TRUE(frame_out != NULL);
2203 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002204
2205 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002206 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002207 timestamp_ += 33 * 90;
2208
2209 packet_->seqNum = seq_num_;
2210 packet_->timestamp = timestamp_;
2211 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002212 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002213 packet_->completeNALU = kNaluComplete;
2214 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002215
philipel9d3ab612015-12-21 04:12:39 -08002216 EXPECT_EQ(kDecodableSession,
2217 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002218
agalusza@google.comd177c102013-08-08 01:12:33 +00002219 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002220 emptypacket.seqNum = seq_num_;
2221 emptypacket.timestamp = timestamp_;
2222 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002223 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002224 emptypacket.completeNALU = kNaluComplete;
2225 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002226 EXPECT_EQ(kCompleteSession,
2227 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002228
2229 frame_out = DecodeCompleteFrame();
2230 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002231 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002232 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002233}
2234
philipel85130292016-07-06 16:10:31 +02002235TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002236 // Test that a we cannot get incomplete frames from the JB if we haven't
2237 // received the marker bit, unless we have received a packet from a later
2238 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002239 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002240 // Start with a complete key frame - insert and decode.
2241 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002242 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002243 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002244 bool retransmitted = false;
2245
philipel9d3ab612015-12-21 04:12:39 -08002246 EXPECT_EQ(kCompleteSession,
2247 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002248 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2249 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002250 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002251
2252 packet_->seqNum += 2;
2253 packet_->timestamp += 33 * 90;
2254 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002255 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002256 packet_->markerBit = false;
2257
philipel9d3ab612015-12-21 04:12:39 -08002258 EXPECT_EQ(kDecodableSession,
2259 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002260
2261 frame_out = DecodeIncompleteFrame();
2262 EXPECT_TRUE(frame_out == NULL);
2263
2264 packet_->seqNum += 2;
2265 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002266 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002267
philipel9d3ab612015-12-21 04:12:39 -08002268 EXPECT_EQ(kDecodableSession,
2269 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002270
2271 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002272 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002273 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002274}
2275
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002276TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002277 // Make sure the jitter doesn't request a keyframe after too much non-
2278 // decodable frames.
2279 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002280 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002281 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002282 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002283 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002284 DropFrame(1);
2285 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002286 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002287 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002288 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002289 // This frame will make the jitter buffer recycle frames until a key frame.
2290 // Since none is found it will have to wait until the next key frame before
2291 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002292 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002293 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002294}
2295
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002296TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002297 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002298 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002299 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002300 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002301 // Insert empty packet.
2302 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002303 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002304 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002305 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002306 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002307 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002308 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002309 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002310 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002311 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002312 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002313 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002314}
2315
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002316TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002317 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2318 EXPECT_EQ(0, frame_stats.delta_frames);
2319 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002320
2321 uint32_t framerate = 0;
2322 uint32_t bitrate = 0;
2323 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2324 EXPECT_EQ(0u, framerate);
2325 EXPECT_EQ(0u, bitrate);
2326
2327 // Insert a couple of key and delta frames.
2328 InsertFrame(kVideoFrameKey);
2329 InsertFrame(kVideoFrameDelta);
2330 InsertFrame(kVideoFrameDelta);
2331 InsertFrame(kVideoFrameKey);
2332 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002333 // Decode some of them to make sure the statistics doesn't depend on frames
2334 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002335 EXPECT_TRUE(DecodeCompleteFrame());
2336 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002337 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002338 EXPECT_EQ(3, frame_stats.delta_frames);
2339 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002340
2341 // Insert 20 more frames to get estimates of bitrate and framerate over
2342 // 1 second.
2343 for (int i = 0; i < 20; ++i) {
2344 InsertFrame(kVideoFrameDelta);
2345 }
2346 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2347 // TODO(holmer): The current implementation returns the average of the last
2348 // two framerate calculations, which is why it takes two calls to reach the
2349 // actual framerate. This should be fixed.
2350 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2351 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2352 // Insert 25 more frames to get estimates of bitrate and framerate over
2353 // 2 seconds.
2354 for (int i = 0; i < 25; ++i) {
2355 InsertFrame(kVideoFrameDelta);
2356 }
2357 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2358 EXPECT_EQ(kDefaultFrameRate, framerate);
2359 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2360}
2361
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002362TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2363 // Insert delta frames.
2364 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2365 // Can't decode without a key frame.
2366 EXPECT_FALSE(DecodeCompleteFrame());
2367 InsertFrame(kVideoFrameKey);
2368 // Skip to the next key frame.
2369 EXPECT_TRUE(DecodeCompleteFrame());
2370}
2371
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002372TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2373 InsertFrame(kVideoFrameKey);
2374 EXPECT_TRUE(DecodeCompleteFrame());
2375 const int kNumDeltaFrames = 5;
2376 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2377 InsertFrame(kVideoFrameKey);
2378 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2379 EXPECT_TRUE(DecodeCompleteFrame());
2380 }
2381}
2382
2383TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2384 InsertFrame(kVideoFrameKey);
2385 EXPECT_TRUE(DecodeCompleteFrame());
2386 const int kNumDeltaFrames = 5;
2387 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2388 InsertFrame(kVideoFrameKey);
2389 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2390 InsertFrame(kVideoFrameKey);
2391 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2392 EXPECT_TRUE(DecodeCompleteFrame());
2393 }
2394}
2395
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002396TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2397 InsertFrame(kVideoFrameKey);
2398 EXPECT_TRUE(DecodeCompleteFrame());
2399 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2400 clock_->TimeInMilliseconds());
2401 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2402 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2403 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002404 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002405 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2406 EXPECT_FALSE(DecodeCompleteFrame());
2407 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2408 EXPECT_TRUE(DecodeCompleteFrame());
2409 EXPECT_TRUE(DecodeCompleteFrame());
2410}
2411
philipel85130292016-07-06 16:10:31 +02002412TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002413 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002414 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002415 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002416 InsertFrame(kVideoFrameKey);
2417 EXPECT_TRUE(DecodeCompleteFrame());
2418}
2419
philipel85130292016-07-06 16:10:31 +02002420TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002421 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002422 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002423 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002424
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002425 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2426 // old packet.
2427 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002428 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002429 EXPECT_EQ(kFlushIndicator,
2430 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002431 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002432
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002433 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002434 std::vector<uint16_t> nack_list =
2435 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002436 // No key frame will be requested since the jitter buffer is empty.
2437 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002438 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002439
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002440 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002441 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002442 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002443 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002444
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002445 // The next complete continuous frame isn't a key frame, but we're waiting
2446 // for one.
2447 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002448 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002449 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002450 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002451}
2452
philipel85130292016-07-06 16:10:31 +02002453TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002454 // Insert a key frame and decode it.
2455 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2456 EXPECT_TRUE(DecodeCompleteFrame());
2457
2458 // Insert a frame which should trigger a recycle until the next key frame.
2459 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2460
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002461 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002462 std::vector<uint16_t> nack_list =
2463 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002464 // Verify that the jitter buffer does not request a key frame.
2465 EXPECT_FALSE(request_key_frame);
2466 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002467 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002468 // Verify that we can decode the next frame.
2469 EXPECT_TRUE(DecodeCompleteFrame());
2470}
2471
philipel85130292016-07-06 16:10:31 +02002472TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002473 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002474 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002475 EXPECT_TRUE(DecodeCompleteFrame());
2476
2477 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002478 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002479 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002480 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002481 EXPECT_FALSE(DecodeCompleteFrame());
2482
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002483 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002484 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002485 // The jitter buffer is empty, so we won't request key frames until we get a
2486 // packet.
2487 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002488
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002489 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002490 // Now we have a packet in the jitter buffer, a key frame will be requested
2491 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002492 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002493 // The jitter buffer is empty, so we won't request key frames until we get a
2494 // packet.
2495 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002496 // The next complete continuous frame isn't a key frame, but we're waiting
2497 // for one.
2498 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002499 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002500 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002501 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002502 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002503}
2504
philipel85130292016-07-06 16:10:31 +02002505TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002506 DropFrame(10);
2507 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002508 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002509 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002510 std::vector<uint16_t> nack_list =
2511 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002512 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002513 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002514 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002515}
2516
philipel85130292016-07-06 16:10:31 +02002517TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002518 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002519 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002520 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002521 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002522 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002523 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002524 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002525 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002526 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002527 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002528}
2529
philipel85130292016-07-06 16:10:31 +02002530TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002531 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002532 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2533 clock_->TimeInMilliseconds());
2534 VCMPacket packet;
2535 stream_generator_->PopPacket(&packet, 0);
2536 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002537 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002538 EXPECT_FALSE(retransmitted);
2539 // Drop second packet.
2540 stream_generator_->PopPacket(&packet, 1);
2541 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2542 EXPECT_FALSE(retransmitted);
2543 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002544 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002545 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002546 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002547 EXPECT_EQ(1u, nack_list.size());
2548 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002549 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002550 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002551 EXPECT_EQ(kCompleteSession,
2552 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002553 EXPECT_TRUE(retransmitted);
2554 EXPECT_TRUE(DecodeCompleteFrame());
2555}
2556
philipel85130292016-07-06 16:10:31 +02002557TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002558 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002559 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002560 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002561 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002562 // Drop second packet.
2563 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2564 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002565 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002566 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002567 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002568 ASSERT_EQ(1u, nack_list.size());
2569 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002570 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002571 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002572 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002573}
2574
philipel85130292016-07-06 16:10:31 +02002575TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002576 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002577 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002578 // First frame is delta.
2579 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2580 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002581 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002582 // Drop second packet in frame.
2583 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2584 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2585 // Second frame is key.
2586 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2587 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002588 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002589 // Drop second packet in frame.
2590 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2591 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002592 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002593 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002594 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002595 ASSERT_EQ(1u, nack_list.size());
2596 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002597 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002598 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002599}
2600
philipel85130292016-07-06 16:10:31 +02002601TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002602 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002603 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002604
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002605 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002606 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002607
2608 // ----------------------------------------------------------------
2609 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2610 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002611 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002612 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002613 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002614 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002615 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002616 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002617 while (stream_generator_->PacketsRemaining() > 1) {
2618 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002619 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002620 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002621 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002622 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002623 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002624 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002625 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002626 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002627 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002628 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002629
2630 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002631 std::vector<uint16_t> nack_list =
2632 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002633 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002634 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002635 for (size_t i = 0; i < nack_list.size(); ++i)
2636 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002637}
2638
philipel85130292016-07-06 16:10:31 +02002639TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002640 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002641 // ------- ------------------------------------------------------------
2642 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2643 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002644 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002645 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002646 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002647 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002648 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002649 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002650 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002651 while (stream_generator_->PacketsRemaining() > 1) {
2652 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002653 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002654 EXPECT_FALSE(request_key_frame);
2655 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002656 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002657 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002658 }
2659 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002660 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002661 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002662 EXPECT_FALSE(DecodeCompleteFrame());
2663 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002664 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002665 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002666 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002667 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002668 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2669 for (size_t i = 0; i < nack_list.size(); ++i)
2670 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002671}
2672
philipel85130292016-07-06 16:10:31 +02002673TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002674 bool request_key_frame = false;
2675 // -----------------------------------
2676 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2677 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002678 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002679 InsertFrame(kVideoFrameKey);
2680 EXPECT_FALSE(request_key_frame);
2681 EXPECT_TRUE(DecodeCompleteFrame());
2682 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2683 clock_->TimeInMilliseconds());
2684 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2685 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002686 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002687 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002688 EXPECT_FALSE(request_key_frame);
2689 } else {
2690 stream_generator_->NextPacket(NULL); // Drop packet
2691 }
2692 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2693 clock_->TimeInMilliseconds());
2694 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2695 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002696 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002697 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002698 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002699 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002700 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002701 ASSERT_EQ(1u, nack_list.size());
2702 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002703}
2704
philipel85130292016-07-06 16:10:31 +02002705TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002706 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002707 InsertFrame(kVideoFrameKey);
2708 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002709 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002710 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2711 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002712
2713 // Far-into-the-future video frame, could be caused by resetting the encoder
2714 // or otherwise restarting. This should not fail when error when the packet is
2715 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002716 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002717 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2718 InsertFrame(kVideoFrameKey);
2719 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002720 nack_list = jitter_buffer_->GetNackList(&extended);
2721 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002722
2723 // Stream should be decodable from this point.
2724 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2725 InsertFrame(kVideoFrameDelta);
2726 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002727 nack_list = jitter_buffer_->GetNackList(&extended);
2728 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002729}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002730} // namespace webrtc