blob: adb495d6fee23c2f796173c13c381e59502a17c2 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
23#include "modules/video_coding/test/test_util.h"
24#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
28#include "system_wrappers/include/metrics_default.h"
29#include "test/field_trial.h"
30#include "test/gmock.h"
31#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000032
33namespace webrtc {
34
asapersson9a4cd872015-10-23 00:27:14 -070035namespace {
philipel9d3ab612015-12-21 04:12:39 -080036const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070037} // namespace
38
39class Vp9SsMapTest : public ::testing::Test {
40 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020041 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070042
43 virtual void SetUp() {
johan0d1b2b62017-01-10 04:21:35 -080044 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
51 packet_.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020052 packet_.video_header.codec = kVideoCodecVP9;
philipel5ab67a52018-07-05 12:27:04 +020053 packet_.video_header.vp9().flexible_mode = false;
54 packet_.video_header.vp9().gof_idx = 0;
55 packet_.video_header.vp9().temporal_idx = kNoTemporalIdx;
56 packet_.video_header.vp9().temporal_up_switch = false;
57 packet_.video_header.vp9().ss_data_available = true;
58 packet_.video_header.vp9().gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel5ab67a52018-07-05 12:27:04 +020072 packet_.video_header.vp9().ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070073 EXPECT_FALSE(map_.Insert(packet_));
74}
75
76TEST_F(Vp9SsMapTest, Find) {
77 EXPECT_TRUE(map_.Insert(packet_));
78 Vp9SsMap::SsMap::iterator it;
79 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
80 EXPECT_EQ(packet_.timestamp, it->first);
81}
82
83TEST_F(Vp9SsMapTest, Find_WithWrap) {
84 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
85 const uint32_t kSsTimestamp2 = 100;
86 packet_.timestamp = kSsTimestamp1;
87 EXPECT_TRUE(map_.Insert(packet_));
88 packet_.timestamp = kSsTimestamp2;
89 EXPECT_TRUE(map_.Insert(packet_));
90 Vp9SsMap::SsMap::iterator it;
91 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
92 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
93 EXPECT_EQ(kSsTimestamp1, it->first);
94 EXPECT_TRUE(map_.Find(0, &it));
95 EXPECT_EQ(kSsTimestamp1, it->first);
96 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
97 EXPECT_EQ(kSsTimestamp1, it->first);
98 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
99 EXPECT_EQ(kSsTimestamp2, it->first);
100 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
101 EXPECT_EQ(kSsTimestamp2, it->first);
102}
103
104TEST_F(Vp9SsMapTest, Reset) {
105 EXPECT_TRUE(map_.Insert(packet_));
106 Vp9SsMap::SsMap::iterator it;
107 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
108 EXPECT_EQ(packet_.timestamp, it->first);
109
110 map_.Reset();
111 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
112}
113
114TEST_F(Vp9SsMapTest, RemoveOld) {
115 Vp9SsMap::SsMap::iterator it;
116 const uint32_t kSsTimestamp1 = 10000;
117 packet_.timestamp = kSsTimestamp1;
118 EXPECT_TRUE(map_.Insert(packet_));
119
120 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
121 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
122 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
123
124 map_.RemoveOld(kTimestamp);
125 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
126 EXPECT_TRUE(map_.Find(kTimestamp, &it));
127 EXPECT_EQ(kTimestamp, it->first);
128}
129
130TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
131 Vp9SsMap::SsMap::iterator it;
132 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
133 const uint32_t kSsTimestamp2 = 10;
134 const uint32_t kSsTimestamp3 = 1000;
135 packet_.timestamp = kSsTimestamp1;
136 EXPECT_TRUE(map_.Insert(packet_));
137 packet_.timestamp = kSsTimestamp2;
138 EXPECT_TRUE(map_.Insert(packet_));
139 packet_.timestamp = kSsTimestamp3;
140 EXPECT_TRUE(map_.Insert(packet_));
141
142 map_.RemoveOld(kSsTimestamp3);
143 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
144 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
145 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
146}
147
148TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel5ab67a52018-07-05 12:27:04 +0200149 packet_.video_header.vp9().gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700150 EXPECT_FALSE(map_.UpdatePacket(&packet_));
151}
152
153TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
154 EXPECT_TRUE(map_.Insert(packet_));
philipel5ab67a52018-07-05 12:27:04 +0200155 packet_.video_header.vp9().gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700156 EXPECT_FALSE(map_.UpdatePacket(&packet_));
157}
158
159TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
160 EXPECT_TRUE(map_.Insert(packet_));
philipel5ab67a52018-07-05 12:27:04 +0200161 packet_.video_header.vp9().gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700162 EXPECT_FALSE(map_.UpdatePacket(&packet_));
163}
164
165TEST_F(Vp9SsMapTest, UpdatePacket) {
166 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
167
philipel5ab67a52018-07-05 12:27:04 +0200168 packet_.video_header.vp9().gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700169 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel5ab67a52018-07-05 12:27:04 +0200170 EXPECT_EQ(0, packet_.video_header.vp9().temporal_idx);
171 EXPECT_FALSE(packet_.video_header.vp9().temporal_up_switch);
172 EXPECT_EQ(1U, packet_.video_header.vp9().num_ref_pics);
173 EXPECT_EQ(4, packet_.video_header.vp9().pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700174
philipel5ab67a52018-07-05 12:27:04 +0200175 packet_.video_header.vp9().gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel5ab67a52018-07-05 12:27:04 +0200177 EXPECT_EQ(2, packet_.video_header.vp9().temporal_idx);
178 EXPECT_TRUE(packet_.video_header.vp9().temporal_up_switch);
179 EXPECT_EQ(1U, packet_.video_header.vp9().num_ref_pics);
180 EXPECT_EQ(1, packet_.video_header.vp9().pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700181
philipel5ab67a52018-07-05 12:27:04 +0200182 packet_.video_header.vp9().gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel5ab67a52018-07-05 12:27:04 +0200184 EXPECT_EQ(1, packet_.video_header.vp9().temporal_idx);
185 EXPECT_TRUE(packet_.video_header.vp9().temporal_up_switch);
186 EXPECT_EQ(1U, packet_.video_header.vp9().num_ref_pics);
187 EXPECT_EQ(2, packet_.video_header.vp9().pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700188
philipel5ab67a52018-07-05 12:27:04 +0200189 packet_.video_header.vp9().gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700190 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel5ab67a52018-07-05 12:27:04 +0200191 EXPECT_EQ(2, packet_.video_header.vp9().temporal_idx);
192 EXPECT_TRUE(packet_.video_header.vp9().temporal_up_switch);
193 EXPECT_EQ(1U, packet_.video_header.vp9().num_ref_pics);
194 EXPECT_EQ(1, packet_.video_header.vp9().pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700195}
196
philipel83f831a2016-03-12 03:30:23 -0800197class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
198 public NackSender,
199 public KeyFrameRequestSender {
200 public:
201 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
202 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
203 sequence_numbers.end());
204 }
205
206 void RequestKeyFrame() override { ++keyframe_requests_; }
207
philipel83f831a2016-03-12 03:30:23 -0800208 std::vector<uint16_t> nack_sent_;
209 int keyframe_requests_;
210
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000211 protected:
philipel85130292016-07-06 16:10:31 +0200212 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700213 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000214 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700215 jitter_buffer_.reset(new VCMJitterBuffer(
216 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200217 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
philipel83f831a2016-03-12 03:30:23 -0800218 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000219 jitter_buffer_->Start();
220 seq_num_ = 1234;
221 timestamp_ = 0;
222 size_ = 1400;
223 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
224 data_[0] = 0;
225 data_[1] = 0;
226 data_[2] = 0x80;
227 int count = 3;
228 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
229 data_[i] = count;
230 count++;
231 if (count == 10) {
232 data_[i + 1] = 0;
233 data_[i + 2] = 0;
234 data_[i + 3] = 0x80;
235 count = 3;
236 i += 3;
237 }
238 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200239 WebRtcRTPHeader rtpHeader;
240 memset(&rtpHeader, 0, sizeof(rtpHeader));
241 rtpHeader.header.sequenceNumber = seq_num_;
242 rtpHeader.header.timestamp = timestamp_;
243 rtpHeader.header.markerBit = true;
244 rtpHeader.frameType = kVideoFrameDelta;
Magnus Jedvert22341212018-07-11 14:27:49 +0200245 rtpHeader.video_header().codec = kVideoCodecGeneric;
246 rtpHeader.video_header().is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200247 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000248 }
249
250 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700251 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000252 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700253 return nullptr;
Björn Terelius52f53d52018-06-26 11:52:33 +0000254 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000255 }
256
257 VCMEncodedFrame* DecodeIncompleteFrame() {
258 uint32_t timestamp = 0;
259 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
260 if (!found_frame)
261 return NULL;
262 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
263 return frame;
264 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000265
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000266 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800267 unsigned int size,
268 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000269 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000270
271 const uint8_t* outData = frame_out->Buffer();
272 unsigned int i = 0;
273
274 if (startCode) {
275 EXPECT_EQ(0, outData[0]);
276 EXPECT_EQ(0, outData[1]);
277 EXPECT_EQ(0, outData[2]);
278 EXPECT_EQ(1, outData[3]);
279 i += 4;
280 }
281
282 EXPECT_EQ(size, frame_out->Length());
283 int count = 3;
284 for (; i < size; i++) {
285 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
286 i += 2;
287 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
288 EXPECT_EQ(0, outData[0]);
289 EXPECT_EQ(0, outData[1]);
290 EXPECT_EQ(0, outData[2]);
291 EXPECT_EQ(1, outData[3]);
292 i += 3;
293 } else {
294 EXPECT_EQ(count, outData[i]);
295 count++;
296 if (count == 10) {
297 count = 3;
298 }
299 }
300 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000301 }
302
303 uint16_t seq_num_;
304 uint32_t timestamp_;
305 int size_;
306 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800307 std::unique_ptr<VCMPacket> packet_;
308 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800310 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000311};
312
philipel83f831a2016-03-12 03:30:23 -0800313class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
314 public NackSender,
315 public KeyFrameRequestSender {
316 public:
317 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
318 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
319 sequence_numbers.end());
320 }
321
322 void RequestKeyFrame() { ++keyframe_requests_; }
323
philipel83f831a2016-03-12 03:30:23 -0800324 std::vector<uint16_t> nack_sent_;
325 int keyframe_requests_;
326
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000327 protected:
328 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000329
330 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000331 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000332 max_nack_list_size_ = 150;
333 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700334 jitter_buffer_ = new VCMJitterBuffer(
335 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200336 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
337 this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700338 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000339 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800340 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
341 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000342 memset(data_buffer_, 0, kDataBufferSize);
343 }
344
345 virtual void TearDown() {
346 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000347 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 }
350
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000351 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000352 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000353 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000354 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000355 EXPECT_TRUE(packet_available);
356 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000357 return kGeneralError; // Return here to avoid crashes below.
358 bool retransmitted = false;
359 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000360 }
361
362 VCMFrameBufferEnum InsertPacket(int index) {
363 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000364 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000365 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000366 EXPECT_TRUE(packet_available);
367 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000368 return kGeneralError; // Return here to avoid crashes below.
369 bool retransmitted = false;
370 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000371 }
372
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000373 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700374 stream_generator_->GenerateFrame(
375 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
376 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000377 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000378 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000379 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000380 }
381
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000382 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
383 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000384 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 VCMFrameBufferEnum ret = InsertFrame(frame_type);
386 if (ret < kNoError) {
387 ret_for_all = ret;
388 } else if (ret_for_all >= kNoError) {
389 ret_for_all = ret;
390 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000391 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000392 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000393 }
394
395 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000396 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000397 clock_->TimeInMilliseconds());
398 for (int i = 0; i < num_packets; ++i)
399 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000400 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000401 }
402
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000403 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700404 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000405 if (!found_frame)
406 return false;
407
isheriff6b4b5f32016-06-08 00:24:21 -0700408 VCMEncodedFrame* frame =
Björn Terelius52f53d52018-06-26 11:52:33 +0000409 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000410 bool ret = (frame != NULL);
411 jitter_buffer_->ReleaseFrame(frame);
412 return ret;
413 }
414
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000415 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000416 uint32_t timestamp = 0;
417 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
418 if (!found_frame)
419 return false;
420 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000421 bool ret = (frame != NULL);
422 jitter_buffer_->ReleaseFrame(frame);
423 return ret;
424 }
425
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000426 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000427 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800428 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000429 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000430 size_t max_nack_list_size_;
431 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000432 uint8_t data_buffer_[kDataBufferSize];
433};
434
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000435class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000436 protected:
philipel85130292016-07-06 16:10:31 +0200437 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000438 virtual void SetUp() {
439 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000440 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000441 }
442
philipel9d3ab612015-12-21 04:12:39 -0800443 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444};
445
philipel85130292016-07-06 16:10:31 +0200446TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000447 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448 EXPECT_TRUE(NULL == DecodeCompleteFrame());
449 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
450 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000451 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000452 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000453
454 // No packets inserted.
455 EXPECT_TRUE(NULL == DecodeCompleteFrame());
456 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
457
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000458 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000459 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000461 // No packets inserted.
462 EXPECT_TRUE(NULL == DecodeCompleteFrame());
463 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
464}
465
philipel85130292016-07-06 16:10:31 +0200466TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000467 // Always start with a complete key frame when not allowing errors.
468 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800470 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000471 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000472 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000473
474 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000475 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800476 EXPECT_EQ(kCompleteSession,
477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000478 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000479 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000481 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000482}
483
philipel85130292016-07-06 16:10:31 +0200484TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700485 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200486 // Always start with a complete key frame when not allowing errors.
487 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
488 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800489 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200490 packet_->markerBit = true;
491 packet_->timestamp += 123 * 90;
492
493 // Insert single packet frame to the jitter buffer and get a frame.
494 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800495 EXPECT_EQ(kCompleteSession,
496 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200497 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
498 CheckOutFrame(frame_out, size_, false);
499 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
500 jitter_buffer_->ReleaseFrame(frame_out);
501
502 // Verify that histograms are updated when the jitter buffer is stopped.
503 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
504 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700505 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
506 EXPECT_EQ(1,
507 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800508 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700509 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800510 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700511 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200512
513 // Verify that histograms are not updated if stop is called again.
514 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700515 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
516 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800517 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700518 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
519 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200520}
521
philipel85130292016-07-06 16:10:31 +0200522TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000523 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800524 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000525 packet_->markerBit = false;
526
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000527 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800528 EXPECT_EQ(kIncomplete,
529 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000530 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
531 // Should not be complete.
532 EXPECT_TRUE(frame_out == NULL);
533
534 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800535 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000536 packet_->markerBit = true;
537 packet_->seqNum = seq_num_;
538
philipel9d3ab612015-12-21 04:12:39 -0800539 EXPECT_EQ(kCompleteSession,
540 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000541
542 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000543 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000544
545 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000546 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000547}
548
philipel85130292016-07-06 16:10:31 +0200549TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000550 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800551 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000554 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800555 EXPECT_EQ(kIncomplete,
556 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557
558 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
559
560 // Frame should not be complete.
561 EXPECT_TRUE(frame_out == NULL);
562
563 // Insert 98 frames.
564 int loop = 0;
565 do {
566 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800567 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568 packet_->markerBit = false;
569 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000570
philipel9d3ab612015-12-21 04:12:39 -0800571 EXPECT_EQ(kIncomplete,
572 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000573 loop++;
574 } while (loop < 98);
575
576 // Insert last packet.
577 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800578 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000579 packet_->markerBit = true;
580 packet_->seqNum = seq_num_;
581
philipel9d3ab612015-12-21 04:12:39 -0800582 EXPECT_EQ(kCompleteSession,
583 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000584
585 frame_out = DecodeCompleteFrame();
586
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000587 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000589 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000590}
591
philipel85130292016-07-06 16:10:31 +0200592TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593 // Always start with a complete key frame.
594 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800595 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596 packet_->markerBit = true;
597
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000598 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800599 EXPECT_EQ(kCompleteSession,
600 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000601 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
602 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000603 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604
605 ++seq_num_;
606 packet_->seqNum = seq_num_;
607 packet_->markerBit = false;
608 packet_->frameType = kVideoFrameDelta;
609 packet_->timestamp += 33 * 90;
610
philipel9d3ab612015-12-21 04:12:39 -0800611 EXPECT_EQ(kIncomplete,
612 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613
614 frame_out = DecodeCompleteFrame();
615
616 // Frame should not be complete.
617 EXPECT_TRUE(frame_out == NULL);
618
johan0d1b2b62017-01-10 04:21:35 -0800619 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620 // Insert 98 frames.
621 int loop = 0;
622 do {
623 ++seq_num_;
624 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000625
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000626 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800627 EXPECT_EQ(kIncomplete,
628 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000629 loop++;
630 } while (loop < 98);
631
632 // Insert the last packet.
633 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800634 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000635 packet_->markerBit = true;
636 packet_->seqNum = seq_num_;
637
philipel9d3ab612015-12-21 04:12:39 -0800638 EXPECT_EQ(kCompleteSession,
639 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000640
641 frame_out = DecodeCompleteFrame();
642
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000643 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000644 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000645 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000646}
647
philipel85130292016-07-06 16:10:31 +0200648TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649 // Insert the "first" packet last.
650 seq_num_ += 100;
651 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800652 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653 packet_->markerBit = true;
654 packet_->seqNum = seq_num_;
655 packet_->timestamp = timestamp_;
656
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000657 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800658 EXPECT_EQ(kIncomplete,
659 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660
661 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
662
663 EXPECT_TRUE(frame_out == NULL);
664
665 // Insert 98 packets.
666 int loop = 0;
667 do {
668 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800669 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000670 packet_->markerBit = false;
671 packet_->seqNum = seq_num_;
672
philipel9d3ab612015-12-21 04:12:39 -0800673 EXPECT_EQ(kIncomplete,
674 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000675 loop++;
676 } while (loop < 98);
677
678 // Insert the last packet.
679 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800680 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000681 packet_->markerBit = false;
682 packet_->seqNum = seq_num_;
683
philipel9d3ab612015-12-21 04:12:39 -0800684 EXPECT_EQ(kCompleteSession,
685 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000686
philipel9d3ab612015-12-21 04:12:39 -0800687 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000688
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000689 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000690
691 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000692 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000693}
694
philipel85130292016-07-06 16:10:31 +0200695TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000696 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800697 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000698 packet_->markerBit = false;
699
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000700 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800701 EXPECT_EQ(kIncomplete,
702 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000703
704 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
705
706 EXPECT_TRUE(frame_out == NULL);
707
708 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800709 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710 packet_->markerBit = true;
711 packet_->seqNum = seq_num_;
712
philipel9d3ab612015-12-21 04:12:39 -0800713 EXPECT_EQ(kCompleteSession,
714 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000715
716 // check that we fail to get frame since seqnum is not continuous
717 frame_out = DecodeCompleteFrame();
718 EXPECT_TRUE(frame_out == NULL);
719
720 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800721 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000722 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800723 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000724 packet_->markerBit = false;
725 packet_->seqNum = seq_num_;
726 packet_->timestamp = timestamp_;
727
philipel9d3ab612015-12-21 04:12:39 -0800728 EXPECT_EQ(kIncomplete,
729 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000730
731 frame_out = DecodeCompleteFrame();
732
733 // It should not be complete.
734 EXPECT_TRUE(frame_out == NULL);
735
736 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800737 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000738 packet_->markerBit = true;
739 packet_->seqNum = seq_num_;
740
philipel9d3ab612015-12-21 04:12:39 -0800741 EXPECT_EQ(kCompleteSession,
742 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000743
744 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000745 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000747 jitter_buffer_->ReleaseFrame(frame_out);
748
749 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000750 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000751 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000752 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000753}
754
philipel85130292016-07-06 16:10:31 +0200755TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700756 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800757 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700758 packet_->markerBit = true;
759
760 // Send in an initial good packet/frame (Frame A) to start things off.
761 bool retransmitted = false;
762 EXPECT_EQ(kCompleteSession,
763 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
764 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
765 EXPECT_TRUE(frame_out != NULL);
766 jitter_buffer_->ReleaseFrame(frame_out);
767
768 // Now send in a complete delta frame (Frame C), but with a sequence number
769 // gap. No pic index either, so no temporal scalability cheating :)
770 packet_->frameType = kVideoFrameDelta;
771 // Leave a gap of 2 sequence numbers and two frames.
772 packet_->seqNum = seq_num_ + 3;
773 packet_->timestamp = timestamp_ + (66 * 90);
774 // Still isFirst = marker = true.
775 // Session should be complete (frame is complete), but there's nothing to
776 // decode yet.
777 EXPECT_EQ(kCompleteSession,
778 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
779 frame_out = DecodeCompleteFrame();
780 EXPECT_TRUE(frame_out == NULL);
781
782 // Now send in a complete delta frame (Frame B) that is continuous from A, but
783 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
784 packet_->seqNum = seq_num_ + 1;
785 packet_->timestamp = timestamp_ + (33 * 90);
786 // Still isFirst = marker = true.
787 EXPECT_EQ(kCompleteSession,
788 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
789 frame_out = DecodeCompleteFrame();
790 EXPECT_TRUE(frame_out != NULL);
791 jitter_buffer_->ReleaseFrame(frame_out);
792
793 // But Frame C isn't continuous yet.
794 frame_out = DecodeCompleteFrame();
795 EXPECT_TRUE(frame_out == NULL);
796
797 // Add in the padding. These are empty packets (data length is 0) with no
798 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200799 WebRtcRTPHeader rtpHeader;
800 memset(&rtpHeader, 0, sizeof(rtpHeader));
801 rtpHeader.header.sequenceNumber = seq_num_ + 2;
802 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
803 rtpHeader.header.markerBit = false;
Magnus Jedvert22341212018-07-11 14:27:49 +0200804 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200805 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700806 EXPECT_EQ(kOldPacket,
807 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
808 empty_packet.seqNum += 1;
809 EXPECT_EQ(kOldPacket,
810 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
811
812 // But now Frame C should be ready!
813 frame_out = DecodeCompleteFrame();
814 EXPECT_TRUE(frame_out != NULL);
815 jitter_buffer_->ReleaseFrame(frame_out);
816}
817
philipel85130292016-07-06 16:10:31 +0200818TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000819 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800820 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000821 packet_->markerBit = false;
822 packet_->seqNum = seq_num_;
823 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000824 EXPECT_EQ(0, jitter_buffer_->num_packets());
825 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000826
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000827 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800828 EXPECT_EQ(kIncomplete,
829 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000830
831 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
832
833 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000834 EXPECT_EQ(1, jitter_buffer_->num_packets());
835 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000836
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000837 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800838 EXPECT_EQ(kDuplicatePacket,
839 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000840 EXPECT_EQ(2, jitter_buffer_->num_packets());
841 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000842
843 seq_num_++;
844 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000845 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800846 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000847
philipel9d3ab612015-12-21 04:12:39 -0800848 EXPECT_EQ(kCompleteSession,
849 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000850
851 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000852 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000853 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000854
855 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000856 EXPECT_EQ(3, jitter_buffer_->num_packets());
857 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000858 jitter_buffer_->ReleaseFrame(frame_out);
859}
860
philipel85130292016-07-06 16:10:31 +0200861TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000862 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800863 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000864 packet_->markerBit = true;
865 packet_->seqNum = seq_num_;
866 packet_->timestamp = timestamp_;
867 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
868 EXPECT_EQ(0, jitter_buffer_->num_packets());
869 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
870
871 bool retransmitted = false;
872 // Insert first complete frame.
873 EXPECT_EQ(kCompleteSession,
874 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
875
876 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
877 ASSERT_TRUE(frame_out != NULL);
878 CheckOutFrame(frame_out, size_, false);
879 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
880 jitter_buffer_->ReleaseFrame(frame_out);
881
882 // Insert 3 delta frames.
883 for (uint16_t i = 1; i <= 3; ++i) {
884 packet_->seqNum = seq_num_ + i;
885 packet_->timestamp = timestamp_ + (i * 33) * 90;
886 packet_->frameType = kVideoFrameDelta;
887 EXPECT_EQ(kCompleteSession,
888 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
889 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
890 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
891 }
892
893 // Retransmit second delta frame.
894 packet_->seqNum = seq_num_ + 2;
895 packet_->timestamp = timestamp_ + 66 * 90;
896
897 EXPECT_EQ(kDuplicatePacket,
898 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
899
900 EXPECT_EQ(5, jitter_buffer_->num_packets());
901 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
902
903 // Should be able to decode 3 delta frames, key frame already decoded.
904 for (size_t i = 0; i < 3; ++i) {
905 frame_out = DecodeCompleteFrame();
906 ASSERT_TRUE(frame_out != NULL);
907 CheckOutFrame(frame_out, size_, false);
908 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
909 jitter_buffer_->ReleaseFrame(frame_out);
910 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000911}
912
philipel85130292016-07-06 16:10:31 +0200913TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700914 // Verify that JB skips forward to next base layer frame.
915 // -------------------------------------------------
916 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
917 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
918 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
919 // | ss | x | x | x | |
920 // -------------------------------------------------
921 // |<----------tl0idx:200--------->|<---tl0idx:201---
922
923 bool re = false;
924 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200925 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800926 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700927 packet_->markerBit = true;
philipel5ab67a52018-07-05 12:27:04 +0200928 packet_->video_header.vp9().flexible_mode = false;
929 packet_->video_header.vp9().spatial_idx = 0;
930 packet_->video_header.vp9().beginning_of_frame = true;
931 packet_->video_header.vp9().end_of_frame = true;
932 packet_->video_header.vp9().temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700933
934 packet_->seqNum = 65485;
935 packet_->timestamp = 1000;
936 packet_->frameType = kVideoFrameKey;
philipel5ab67a52018-07-05 12:27:04 +0200937 packet_->video_header.vp9().picture_id = 5;
938 packet_->video_header.vp9().tl0_pic_idx = 200;
939 packet_->video_header.vp9().temporal_idx = 0;
940 packet_->video_header.vp9().ss_data_available = true;
941 packet_->video_header.vp9().gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700942 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
943 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
944
945 // Insert next temporal layer 0.
946 packet_->seqNum = 65489;
947 packet_->timestamp = 13000;
948 packet_->frameType = kVideoFrameDelta;
philipel5ab67a52018-07-05 12:27:04 +0200949 packet_->video_header.vp9().picture_id = 9;
950 packet_->video_header.vp9().tl0_pic_idx = 201;
951 packet_->video_header.vp9().temporal_idx = 0;
952 packet_->video_header.vp9().ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700953 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
954
955 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +0000956 EXPECT_EQ(1000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -0700957 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
958 jitter_buffer_->ReleaseFrame(frame_out);
959
960 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +0000961 EXPECT_EQ(13000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -0700962 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
963 jitter_buffer_->ReleaseFrame(frame_out);
964}
965
philipel85130292016-07-06 16:10:31 +0200966TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700967 // Verify that frames are updated with SS data when SS packet is reordered.
968 // --------------------------------
969 // | 65486 | 65487 | 65485 |...
970 // | pid:6 | pid:7 | pid:5 |...
971 // | tid:2 | tid:1 | tid:0 |...
972 // | | | ss |
973 // --------------------------------
974 // |<--------tl0idx:200--------->|
975
976 bool re = false;
977 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200978 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800979 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700980 packet_->markerBit = true;
philipel5ab67a52018-07-05 12:27:04 +0200981 packet_->video_header.vp9().flexible_mode = false;
982 packet_->video_header.vp9().spatial_idx = 0;
983 packet_->video_header.vp9().beginning_of_frame = true;
984 packet_->video_header.vp9().end_of_frame = true;
985 packet_->video_header.vp9().tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700986
987 packet_->seqNum = 65486;
988 packet_->timestamp = 6000;
989 packet_->frameType = kVideoFrameDelta;
philipel5ab67a52018-07-05 12:27:04 +0200990 packet_->video_header.vp9().picture_id = 6;
991 packet_->video_header.vp9().temporal_idx = 2;
992 packet_->video_header.vp9().temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700993 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
994
995 packet_->seqNum = 65487;
996 packet_->timestamp = 9000;
997 packet_->frameType = kVideoFrameDelta;
philipel5ab67a52018-07-05 12:27:04 +0200998 packet_->video_header.vp9().picture_id = 7;
999 packet_->video_header.vp9().temporal_idx = 1;
1000 packet_->video_header.vp9().temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001001 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1002
1003 // Insert first frame with SS data.
1004 packet_->seqNum = 65485;
1005 packet_->timestamp = 3000;
1006 packet_->frameType = kVideoFrameKey;
1007 packet_->width = 352;
1008 packet_->height = 288;
philipel5ab67a52018-07-05 12:27:04 +02001009 packet_->video_header.vp9().picture_id = 5;
1010 packet_->video_header.vp9().temporal_idx = 0;
1011 packet_->video_header.vp9().temporal_up_switch = false;
1012 packet_->video_header.vp9().ss_data_available = true;
1013 packet_->video_header.vp9().gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001014 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1015 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1016
1017 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001018 EXPECT_EQ(3000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001019 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1020 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1021 EXPECT_FALSE(
1022 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1023 jitter_buffer_->ReleaseFrame(frame_out);
1024
1025 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001026 EXPECT_EQ(6000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001027 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1028 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1029 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1030 jitter_buffer_->ReleaseFrame(frame_out);
1031
1032 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001033 EXPECT_EQ(9000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001034 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1035 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1036 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1037 jitter_buffer_->ReleaseFrame(frame_out);
1038}
1039
philipel85130292016-07-06 16:10:31 +02001040TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001041 // Verify that frames are updated with SS data when SS packet is reordered.
1042 // -----------------------------------------
1043 // | 65486 | 65487 | 65485 | 65484 |...
1044 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1045 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1046 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1047 // | t:6000 | t:6000 | t:3000 | t:3000 |
1048 // | | | | ss |
1049 // -----------------------------------------
1050 // |<-----------tl0idx:200------------>|
1051
1052 bool re = false;
1053 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001054 packet_->video_header.codec = kVideoCodecVP9;
philipel5ab67a52018-07-05 12:27:04 +02001055 packet_->video_header.vp9().flexible_mode = false;
1056 packet_->video_header.vp9().beginning_of_frame = true;
1057 packet_->video_header.vp9().end_of_frame = true;
1058 packet_->video_header.vp9().tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001059
johan0d1b2b62017-01-10 04:21:35 -08001060 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001061 packet_->markerBit = false;
1062 packet_->seqNum = 65486;
1063 packet_->timestamp = 6000;
1064 packet_->frameType = kVideoFrameDelta;
philipel5ab67a52018-07-05 12:27:04 +02001065 packet_->video_header.vp9().spatial_idx = 0;
1066 packet_->video_header.vp9().picture_id = 6;
1067 packet_->video_header.vp9().temporal_idx = 1;
1068 packet_->video_header.vp9().temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001069 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1070
johan0d1b2b62017-01-10 04:21:35 -08001071 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001072 packet_->markerBit = true;
1073 packet_->seqNum = 65487;
1074 packet_->frameType = kVideoFrameDelta;
philipel5ab67a52018-07-05 12:27:04 +02001075 packet_->video_header.vp9().spatial_idx = 1;
1076 packet_->video_header.vp9().picture_id = 6;
1077 packet_->video_header.vp9().temporal_idx = 1;
1078 packet_->video_header.vp9().temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001079 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1080
johan0d1b2b62017-01-10 04:21:35 -08001081 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001082 packet_->markerBit = true;
1083 packet_->seqNum = 65485;
1084 packet_->timestamp = 3000;
1085 packet_->frameType = kVideoFrameKey;
philipel5ab67a52018-07-05 12:27:04 +02001086 packet_->video_header.vp9().spatial_idx = 1;
1087 packet_->video_header.vp9().picture_id = 5;
1088 packet_->video_header.vp9().temporal_idx = 0;
1089 packet_->video_header.vp9().temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001090 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1091
1092 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001093 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001094 packet_->markerBit = false;
1095 packet_->seqNum = 65484;
1096 packet_->frameType = kVideoFrameKey;
1097 packet_->width = 352;
1098 packet_->height = 288;
philipel5ab67a52018-07-05 12:27:04 +02001099 packet_->video_header.vp9().spatial_idx = 0;
1100 packet_->video_header.vp9().picture_id = 5;
1101 packet_->video_header.vp9().temporal_idx = 0;
1102 packet_->video_header.vp9().temporal_up_switch = false;
1103 packet_->video_header.vp9().ss_data_available = true;
1104 packet_->video_header.vp9().gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001105 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1106 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1107
1108 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001109 EXPECT_EQ(3000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001110 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1111 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1112 EXPECT_FALSE(
1113 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1114 jitter_buffer_->ReleaseFrame(frame_out);
1115
1116 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001117 EXPECT_EQ(6000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001118 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1119 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1120 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1121 jitter_buffer_->ReleaseFrame(frame_out);
1122}
1123
philipel85130292016-07-06 16:10:31 +02001124TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001125 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001126 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001127 packet_->markerBit = false;
1128 packet_->seqNum = seq_num_;
1129 packet_->timestamp = timestamp_;
1130 packet_->insertStartCode = true;
1131
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001132 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001133 EXPECT_EQ(kIncomplete,
1134 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001135
1136 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1137
1138 // Frame should not be complete.
1139 EXPECT_TRUE(frame_out == NULL);
1140
1141 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001142 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001143 packet_->markerBit = true;
1144 packet_->seqNum = seq_num_;
1145
philipel9d3ab612015-12-21 04:12:39 -08001146 EXPECT_EQ(kCompleteSession,
1147 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001148
1149 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001150 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001151 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001152 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001153}
1154
stefana669a3a2016-10-06 05:04:52 -07001155TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1156 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1157
1158 packet_->timestamp = timestamp_;
1159 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001160 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001161 packet_->markerBit = true;
1162 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001163 packet_->video_header.codec = kVideoCodecH264;
JT Teh5daeff92018-07-16 17:17:17 +00001164 packet_->video_header.h264().nalu_type = H264::NaluType::kIdr;
1165 packet_->video_header.h264().nalus[0].type = H264::NaluType::kIdr;
1166 packet_->video_header.h264().nalus[0].sps_id = -1;
1167 packet_->video_header.h264().nalus[0].pps_id = 0;
1168 packet_->video_header.h264().nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001169 bool retransmitted = false;
1170 EXPECT_EQ(kCompleteSession,
1171 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1172 // Not decodable since sps and pps are missing.
1173 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1174
1175 timestamp_ += 3000;
1176 packet_->timestamp = timestamp_;
1177 ++seq_num_;
1178 packet_->seqNum = seq_num_;
1179 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001180 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001181 packet_->markerBit = false;
1182 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001183 packet_->video_header.codec = kVideoCodecH264;
JT Teh5daeff92018-07-16 17:17:17 +00001184 packet_->video_header.h264().nalu_type = H264::NaluType::kStapA;
1185 packet_->video_header.h264().nalus[0].type = H264::NaluType::kSps;
1186 packet_->video_header.h264().nalus[0].sps_id = 0;
1187 packet_->video_header.h264().nalus[0].pps_id = -1;
1188 packet_->video_header.h264().nalus[1].type = H264::NaluType::kPps;
1189 packet_->video_header.h264().nalus[1].sps_id = 0;
1190 packet_->video_header.h264().nalus[1].pps_id = 0;
1191 packet_->video_header.h264().nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001192 // Not complete since the marker bit hasn't been received.
1193 EXPECT_EQ(kIncomplete,
1194 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1195
1196 ++seq_num_;
1197 packet_->seqNum = seq_num_;
1198 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001199 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001200 packet_->markerBit = true;
1201 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001202 packet_->video_header.codec = kVideoCodecH264;
JT Teh5daeff92018-07-16 17:17:17 +00001203 packet_->video_header.h264().nalu_type = H264::NaluType::kIdr;
1204 packet_->video_header.h264().nalus[0].type = H264::NaluType::kIdr;
1205 packet_->video_header.h264().nalus[0].sps_id = -1;
1206 packet_->video_header.h264().nalus[0].pps_id = 0;
1207 packet_->video_header.h264().nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001208 // Complete and decodable since the pps and sps are received in the first
1209 // packet of this frame.
1210 EXPECT_EQ(kCompleteSession,
1211 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1212 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1213 ASSERT_NE(nullptr, frame_out);
1214 jitter_buffer_->ReleaseFrame(frame_out);
1215
1216 timestamp_ += 3000;
1217 packet_->timestamp = timestamp_;
1218 ++seq_num_;
1219 packet_->seqNum = seq_num_;
1220 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001221 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001222 packet_->markerBit = true;
1223 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001224 packet_->video_header.codec = kVideoCodecH264;
JT Teh5daeff92018-07-16 17:17:17 +00001225 packet_->video_header.h264().nalu_type = H264::NaluType::kSlice;
1226 packet_->video_header.h264().nalus[0].type = H264::NaluType::kSlice;
1227 packet_->video_header.h264().nalus[0].sps_id = -1;
1228 packet_->video_header.h264().nalus[0].pps_id = 0;
1229 packet_->video_header.h264().nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001230 // Complete and decodable since sps, pps and key frame has been received.
1231 EXPECT_EQ(kCompleteSession,
1232 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1233 frame_out = DecodeCompleteFrame();
1234 ASSERT_NE(nullptr, frame_out);
1235 jitter_buffer_->ReleaseFrame(frame_out);
1236}
1237
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001238// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001239TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001240 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001241 // Always start with a key frame. Use 10 packets to test Decodable State
1242 // boundaries.
1243 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001244 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001245 packet_->markerBit = false;
1246 packet_->seqNum = seq_num_;
1247 packet_->timestamp = timestamp_;
1248
1249 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001250 EXPECT_EQ(kIncomplete,
1251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001252 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001253 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001254 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1255
johan0d1b2b62017-01-10 04:21:35 -08001256 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001257 for (int i = 1; i < 9; ++i) {
1258 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001259 EXPECT_EQ(kIncomplete,
1260 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001261 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001262 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1263 }
1264
1265 // last packet
1266 packet_->markerBit = true;
1267 packet_->seqNum++;
1268
philipel9d3ab612015-12-21 04:12:39 -08001269 EXPECT_EQ(kCompleteSession,
1270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001271 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1272 CheckOutFrame(frame_out, 10 * size_, false);
1273 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001274 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001275
1276 // An incomplete frame can only be decoded once a subsequent frame has begun
1277 // to arrive. Insert packet in distant frame for this purpose.
1278 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001279 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001280 packet_->markerBit = false;
1281 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001282 packet_->timestamp += 33 * 90 * 8;
1283
philipel9d3ab612015-12-21 04:12:39 -08001284 EXPECT_EQ(kDecodableSession,
1285 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001286 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001287 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1288
1289 // Insert second frame
1290 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001291 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001292
philipel9d3ab612015-12-21 04:12:39 -08001293 EXPECT_EQ(kDecodableSession,
1294 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001295 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001296 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1297
johan0d1b2b62017-01-10 04:21:35 -08001298 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001299 for (int i = 1; i < 8; ++i) {
1300 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001301 EXPECT_EQ(kDecodableSession,
1302 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001303 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001304 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1305 }
1306
1307 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001308 EXPECT_EQ(kDecodableSession,
1309 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001310 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001311 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1312
1313 frame_out = DecodeIncompleteFrame();
1314 ASSERT_FALSE(NULL == frame_out);
1315 CheckOutFrame(frame_out, 9 * size_, false);
1316 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001317 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001318
1319 packet_->markerBit = true;
1320 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001321 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001322}
1323
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001324// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001325TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001326 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1327 // Always start with a key frame.
1328 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001329 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001330 packet_->markerBit = true;
1331 packet_->seqNum = seq_num_;
1332 packet_->timestamp = timestamp_;
1333
1334 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001335 EXPECT_EQ(kCompleteSession,
1336 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001337 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1338 CheckOutFrame(frame_out, size_, false);
1339 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001340 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001341
1342 // An incomplete frame can only be decoded once a subsequent frame has begun
1343 // to arrive. Insert packet in distant frame for this purpose.
1344 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001345 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001346 packet_->markerBit = false;
1347 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001348 packet_->timestamp += 33 * 90 * 8;
1349 EXPECT_EQ(kIncomplete,
1350 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001351 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001352 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001353 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1354
1355 // Insert second frame - an incomplete key frame.
1356 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001357 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001358 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001359 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001360
philipel9d3ab612015-12-21 04:12:39 -08001361 EXPECT_EQ(kIncomplete,
1362 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001363 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001364 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1365
1366 // Insert a few more packets. Make sure we're waiting for the key frame to be
1367 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001368 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001369 for (int i = 1; i < 5; ++i) {
1370 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001371 EXPECT_EQ(kIncomplete,
1372 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001373 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001374 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1375 }
1376
1377 // Complete key frame.
1378 packet_->markerBit = true;
1379 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001380 EXPECT_EQ(kCompleteSession,
1381 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001382 frame_out = DecodeCompleteFrame();
1383 CheckOutFrame(frame_out, 6 * size_, false);
1384 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001385 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001386}
1387
1388// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001389TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001390 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1391 // Always start with a key frame.
1392 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001393 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001394 packet_->markerBit = true;
1395 packet_->seqNum = seq_num_;
1396 packet_->timestamp = timestamp_;
1397
1398 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001399 EXPECT_EQ(kCompleteSession,
1400 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001401 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1402 CheckOutFrame(frame_out, size_, false);
1403 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001404 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001405
1406 // An incomplete frame can only be decoded once a subsequent frame has begun
1407 // to arrive. Insert packet in distant frame for this purpose.
1408 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001409 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001410 packet_->markerBit = false;
1411 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001412 packet_->timestamp += 33 * 90 * 8;
1413 EXPECT_EQ(kIncomplete,
1414 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001415 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001416 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001417 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1418
1419 // Insert second frame with the first packet missing. Make sure we're waiting
1420 // for the key frame to be complete.
1421 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001422 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001423
philipel9d3ab612015-12-21 04:12:39 -08001424 EXPECT_EQ(kIncomplete,
1425 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001426 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001427 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1428
1429 for (int i = 0; i < 5; ++i) {
1430 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001431 EXPECT_EQ(kIncomplete,
1432 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001433 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001434 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1435 }
1436
1437 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001438 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001439 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001440 EXPECT_EQ(kDecodableSession,
1441 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001442 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001443 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1444
1445 frame_out = DecodeIncompleteFrame();
1446 CheckOutFrame(frame_out, 7 * size_, false);
1447 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001448 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001449}
1450
philipel85130292016-07-06 16:10:31 +02001451TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001452 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001453 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001454 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001455 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001456 packet_->markerBit = true;
1457 packet_->seqNum = seq_num_;
1458 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001459 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001460 EXPECT_EQ(kCompleteSession,
1461 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001462 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001463 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1464 EXPECT_NE(frame, nullptr);
Björn Terelius52f53d52018-06-26 11:52:33 +00001465 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1466 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001467 EXPECT_TRUE(frame != NULL);
1468 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001469
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001470 // Drop a complete frame.
1471 timestamp_ += 2 * 33 * 90;
1472 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001473 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001474 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001475 packet_->markerBit = false;
1476 packet_->seqNum = seq_num_;
1477 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001478 EXPECT_EQ(kDecodableSession,
1479 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001480 // Insert a packet (so the previous one will be released).
1481 timestamp_ += 33 * 90;
1482 seq_num_ += 2;
1483 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001484 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001485 packet_->markerBit = false;
1486 packet_->seqNum = seq_num_;
1487 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001488 EXPECT_EQ(kDecodableSession,
1489 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001490 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001491 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1492 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001493}
1494
philipel85130292016-07-06 16:10:31 +02001495TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001496 // Verify missing packets statistics and not decodable packets statistics.
1497 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1498 // The last packet is an empty (non-media) packet.
1499
1500 // Select a start seqNum which triggers a difficult wrap situation
1501 // The JB will only output (incomplete)frames if the next one has started
1502 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001503 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001504 seq_num_ = 0xffff - 4;
1505 seq_num_++;
1506 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001507 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001508 packet_->markerBit = false;
1509 packet_->seqNum = seq_num_;
1510 packet_->timestamp = timestamp_;
1511 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001512
1513 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001514 EXPECT_EQ(kDecodableSession,
1515 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001516 for (int i = 0; i < 11; ++i) {
1517 webrtc::FrameType frametype = kVideoFrameDelta;
1518 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001519 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001520 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001521 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 packet_->markerBit = false;
1523 packet_->seqNum = seq_num_;
1524 packet_->timestamp = timestamp_;
1525 packet_->completeNALU = kNaluStart;
1526
philipel9d3ab612015-12-21 04:12:39 -08001527 EXPECT_EQ(kDecodableSession,
1528 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001529
1530 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1531
1532 // Should not be complete.
1533 EXPECT_TRUE(frame_out == NULL);
1534
1535 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001536 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001537 packet_->markerBit = true;
1538 packet_->seqNum = seq_num_;
1539 packet_->completeNALU = kNaluEnd;
1540
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001541 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1542 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001543
1544 // Insert an empty (non-media) packet.
1545 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001546 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547 packet_->markerBit = false;
1548 packet_->seqNum = seq_num_;
1549 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001550 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001551
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001552 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001553 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001554 frame_out = DecodeIncompleteFrame();
1555
1556 // One of the packets has been discarded by the jitter buffer.
1557 // Last frame can't be extracted yet.
1558 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001559 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001560
1561 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001562 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001563 } else {
philipel9d3ab612015-12-21 04:12:39 -08001564 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 }
1566 EXPECT_FALSE(frame_out->Complete());
1567 EXPECT_FALSE(frame_out->MissingFrame());
1568 }
1569
1570 jitter_buffer_->ReleaseFrame(frame_out);
1571 }
1572
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001573 // Insert 3 old packets and verify that we have 3 discarded packets
1574 // Match value to actual latest timestamp decoded.
1575 timestamp_ -= 33 * 90;
1576 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001577
philipel9d3ab612015-12-21 04:12:39 -08001578 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001579
1580 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001581
philipel9d3ab612015-12-21 04:12:39 -08001582 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001583
1584 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001585
philipel9d3ab612015-12-21 04:12:39 -08001586 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001587
1588 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1589
1590 jitter_buffer_->Flush();
1591
1592 // This statistic shouldn't be reset by a flush.
1593 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1594}
1595
philipel85130292016-07-06 16:10:31 +02001596TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001597 seq_num_ = 0xfff0;
1598 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001599 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001600 packet_->markerBit = false;
1601 packet_->seqNum = seq_num_;
1602 packet_->timestamp = timestamp_;
1603
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001604 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001605 EXPECT_EQ(kIncomplete,
1606 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001607
1608 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1609
1610 EXPECT_TRUE(frame_out == NULL);
1611
1612 int loop = 0;
1613 do {
1614 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001615 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001616 packet_->markerBit = false;
1617 packet_->seqNum = seq_num_;
1618
philipel9d3ab612015-12-21 04:12:39 -08001619 EXPECT_EQ(kIncomplete,
1620 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001621
1622 frame_out = DecodeCompleteFrame();
1623
1624 EXPECT_TRUE(frame_out == NULL);
1625
1626 loop++;
1627 } while (loop < 98);
1628
1629 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001630 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001631 packet_->markerBit = true;
1632 packet_->seqNum = seq_num_;
1633
philipel9d3ab612015-12-21 04:12:39 -08001634 EXPECT_EQ(kCompleteSession,
1635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001636
1637 frame_out = DecodeCompleteFrame();
1638
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001639 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640
1641 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001642 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001643}
1644
philipel85130292016-07-06 16:10:31 +02001645TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001646 // Insert "first" packet last seqnum.
1647 seq_num_ = 10;
1648 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001649 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001650 packet_->markerBit = true;
1651 packet_->seqNum = seq_num_;
1652
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001653 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001654 EXPECT_EQ(kIncomplete,
1655 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001656 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1657
1658 // Should not be complete.
1659 EXPECT_TRUE(frame_out == NULL);
1660
1661 // Insert 98 frames.
1662 int loop = 0;
1663 do {
1664 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001665 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001666 packet_->markerBit = false;
1667 packet_->seqNum = seq_num_;
1668
philipel9d3ab612015-12-21 04:12:39 -08001669 EXPECT_EQ(kIncomplete,
1670 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001671
1672 frame_out = DecodeCompleteFrame();
1673
1674 EXPECT_TRUE(frame_out == NULL);
1675
1676 loop++;
1677 } while (loop < 98);
1678
1679 // Insert last packet.
1680 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001681 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001682 packet_->markerBit = false;
1683 packet_->seqNum = seq_num_;
1684
philipel9d3ab612015-12-21 04:12:39 -08001685 EXPECT_EQ(kCompleteSession,
1686 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001687
1688 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001689 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001691 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001692}
1693
philipel85130292016-07-06 16:10:31 +02001694TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001695 // ------- -------
1696 // | 2 | | 1 |
1697 // ------- -------
1698 // t = 3000 t = 2000
1699 seq_num_ = 2;
1700 timestamp_ = 3000;
1701 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001702 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001703 packet_->markerBit = true;
1704 packet_->timestamp = timestamp_;
1705 packet_->seqNum = seq_num_;
1706
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001707 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001708 EXPECT_EQ(kCompleteSession,
1709 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001710
1711 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001712 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001713 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001715 jitter_buffer_->ReleaseFrame(frame_out);
1716
1717 seq_num_--;
1718 timestamp_ = 2000;
1719 packet_->frameType = kVideoFrameDelta;
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_->seqNum = seq_num_;
1723 packet_->timestamp = timestamp_;
1724
philipel9d3ab612015-12-21 04:12:39 -08001725 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001726}
1727
philipel85130292016-07-06 16:10:31 +02001728TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001729 // ------- -------
1730 // | 2 | | 1 |
1731 // ------- -------
1732 // t = 3000 t = 0xffffff00
1733
1734 seq_num_ = 2;
1735 timestamp_ = 3000;
1736 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001737 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001738 packet_->markerBit = true;
1739 packet_->seqNum = seq_num_;
1740 packet_->timestamp = timestamp_;
1741
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001742 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001743 EXPECT_EQ(kCompleteSession,
1744 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001745
1746 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001747 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001748
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001749 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001750
1751 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1752
1753 jitter_buffer_->ReleaseFrame(frame_out);
1754
1755 seq_num_--;
1756 timestamp_ = 0xffffff00;
1757 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001758 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001759 packet_->markerBit = true;
1760 packet_->seqNum = seq_num_;
1761 packet_->timestamp = timestamp_;
1762
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001763 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001764 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765}
1766
philipel85130292016-07-06 16:10:31 +02001767TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001768 // --------------- ---------------
1769 // | 1 | 2 | | 3 | 4 |
1770 // --------------- ---------------
1771 // t = 0xffffff00 t = 33*90
1772
1773 timestamp_ = 0xffffff00;
1774 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001775 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001776 packet_->markerBit = false;
1777 packet_->seqNum = seq_num_;
1778 packet_->timestamp = timestamp_;
1779
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001780 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001781 EXPECT_EQ(kIncomplete,
1782 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001783
1784 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001785 EXPECT_TRUE(frame_out == NULL);
1786
1787 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001788 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001789 packet_->markerBit = true;
1790 packet_->seqNum = seq_num_;
1791
philipel9d3ab612015-12-21 04:12:39 -08001792 EXPECT_EQ(kCompleteSession,
1793 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001794
1795 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001796 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001797 jitter_buffer_->ReleaseFrame(frame_out);
1798
1799 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001800 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001801 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001802 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001803 packet_->markerBit = false;
1804 packet_->seqNum = seq_num_;
1805 packet_->timestamp = timestamp_;
1806
philipel9d3ab612015-12-21 04:12:39 -08001807 EXPECT_EQ(kIncomplete,
1808 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001809
1810 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811 EXPECT_TRUE(frame_out == NULL);
1812
1813 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001814 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001815 packet_->markerBit = true;
1816 packet_->seqNum = seq_num_;
1817
philipel9d3ab612015-12-21 04:12:39 -08001818 EXPECT_EQ(kCompleteSession,
1819 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001820
1821 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001822 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001823 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001824 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001825}
1826
philipel85130292016-07-06 16:10:31 +02001827TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001828 // ------- -------
1829 // | 1 | | 2 |
1830 // ------- -------
1831 // t = 0xffffff00 t = 2700
1832
1833 timestamp_ = 0xffffff00;
1834 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001835 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001836 packet_->markerBit = true;
1837 packet_->timestamp = timestamp_;
1838
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001839 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001840 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001841 EXPECT_EQ(kCompleteSession,
1842 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001843
1844 // Insert next frame.
1845 seq_num_++;
1846 timestamp_ = 2700;
1847 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001848 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001849 packet_->markerBit = true;
1850 packet_->seqNum = seq_num_;
1851 packet_->timestamp = timestamp_;
1852
philipel9d3ab612015-12-21 04:12:39 -08001853 EXPECT_EQ(kCompleteSession,
1854 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001855
1856 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001857 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001858 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001859 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001860 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001861
1862 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001863 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001864 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001865 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001866 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001867}
1868
philipel85130292016-07-06 16:10:31 +02001869TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870 // ------- -------
1871 // | 2 | | 1 |
1872 // ------- -------
1873 // t = 2700 t = 0xffffff00
1874
1875 seq_num_ = 2;
1876 timestamp_ = 2700;
1877 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001878 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001879 packet_->markerBit = true;
1880 packet_->seqNum = seq_num_;
1881 packet_->timestamp = timestamp_;
1882
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001883 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001884 EXPECT_EQ(kCompleteSession,
1885 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001886
1887 // Insert second frame
1888 seq_num_--;
1889 timestamp_ = 0xffffff00;
1890 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001891 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001892 packet_->markerBit = true;
1893 packet_->seqNum = seq_num_;
1894 packet_->timestamp = timestamp_;
1895
philipel9d3ab612015-12-21 04:12:39 -08001896 EXPECT_EQ(kCompleteSession,
1897 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001898
1899 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001900 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001901 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001902 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001903 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001904
1905 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001906 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001907 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001908 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001909 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001910}
1911
philipel85130292016-07-06 16:10:31 +02001912TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001913 int loop = 0;
1914 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001915 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001916 // Insert kMaxPacketsInJitterBuffer into frame.
1917 do {
1918 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001919 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001920 packet_->markerBit = false;
1921 packet_->seqNum = seq_num_;
1922
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001923 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001924 EXPECT_EQ(kIncomplete,
1925 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001926 firstPacket = false;
1927 } else {
philipel9d3ab612015-12-21 04:12:39 -08001928 EXPECT_EQ(kIncomplete,
1929 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001930 }
1931
1932 loop++;
1933 } while (loop < kMaxPacketsInSession);
1934
1935 // Max number of packets inserted.
1936 // Insert one more packet.
1937 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001938 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939 packet_->markerBit = true;
1940 packet_->seqNum = seq_num_;
1941
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001942 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001943 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001945}
1946
philipel85130292016-07-06 16:10:31 +02001947TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001948 // TEST fill JB with more than max number of frame (50 delta frames +
1949 // 51 key frames) with wrap in seq_num_
1950 //
1951 // --------------------------------------------------------------
1952 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1953 // --------------------------------------------------------------
1954 // |<-----------delta frames------------->|<------key frames----->|
1955
jbauchdb81ffd2015-11-23 03:59:02 -08001956 // Make sure the jitter doesn't request a keyframe after too much non-
1957 // decodable frames.
1958 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001959 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001960
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001961 int loop = 0;
1962 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001963 uint32_t first_key_frame_timestamp = 0;
1964 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001965 // Insert MAX_NUMBER_OF_FRAMES frames.
1966 do {
philipel9d3ab612015-12-21 04:12:39 -08001967 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001968 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001969 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001970 packet_->markerBit = true;
1971 packet_->seqNum = seq_num_;
1972 packet_->timestamp = timestamp_;
1973
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001974 if (loop == 50) {
1975 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976 packet_->frameType = kVideoFrameKey;
1977 }
1978
1979 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001980 EXPECT_EQ(kCompleteSession,
1981 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001982
1983 loop++;
1984 } while (loop < kMaxNumberOfFrames);
1985
1986 // Max number of frames inserted.
1987
1988 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001989 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001990 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001991 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001992 packet_->markerBit = true;
1993 packet_->seqNum = seq_num_;
1994 packet_->timestamp = timestamp_;
1995
1996 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001997 EXPECT_EQ(kFlushIndicator,
1998 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001999
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002000 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00002001 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002002 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002003 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002004 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002005}
2006
philipel85130292016-07-06 16:10:31 +02002007TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002008 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002009 seq_num_ = 3;
2010 // Insert one empty packet per frame, should never return the last timestamp
2011 // inserted. Only return empty frames in the presence of subsequent frames.
2012 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002013 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002014 for (int i = 0; i < maxSize + 10; i++) {
2015 timestamp_ += 33 * 90;
2016 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002017 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002018 packet_->markerBit = false;
2019 packet_->seqNum = seq_num_;
2020 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002021 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002022
philipel9d3ab612015-12-21 04:12:39 -08002023 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002024 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2025 // Timestamp should never be the last TS inserted.
2026 if (testFrame != NULL) {
Björn Terelius52f53d52018-06-26 11:52:33 +00002027 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002028 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002029 }
2030 }
2031}
2032
philipel85130292016-07-06 16:10:31 +02002033TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002034 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002035 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002036 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002037 timestamp_ += 33 * 90;
2038 int insertedLength = 0;
2039 packet_->seqNum = seq_num_;
2040 packet_->timestamp = timestamp_;
2041 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002042 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002043 packet_->completeNALU = kNaluStart;
2044 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002045 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002046
philipel9d3ab612015-12-21 04:12:39 -08002047 EXPECT_EQ(kDecodableSession,
2048 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002049
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002050 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002051 packet_->seqNum = seq_num_;
2052 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002053 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002054 packet_->completeNALU = kNaluIncomplete;
2055 packet_->markerBit = false;
2056
philipel9d3ab612015-12-21 04:12:39 -08002057 EXPECT_EQ(kDecodableSession,
2058 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002059
2060 seq_num_++;
2061 packet_->seqNum = seq_num_;
2062 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002063 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002064 packet_->completeNALU = kNaluEnd;
2065 packet_->markerBit = false;
2066
philipel9d3ab612015-12-21 04:12:39 -08002067 EXPECT_EQ(kDecodableSession,
2068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069
2070 seq_num_++;
2071 packet_->seqNum = seq_num_;
2072 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002073 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002074 EXPECT_EQ(kDecodableSession,
2075 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002076 // The JB will only output (incomplete) frames if a packet belonging to a
2077 // subsequent frame was already inserted. Insert one packet of a subsequent
2078 // frame. place high timestamp so the JB would always have a next frame
2079 // (otherwise, for every inserted frame we need to take care of the next
2080 // frame as well).
2081 packet_->seqNum = 1;
2082 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2083 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002084 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002085 packet_->completeNALU = kNaluStart;
2086 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002087
philipel9d3ab612015-12-21 04:12:39 -08002088 EXPECT_EQ(kDecodableSession,
2089 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002090
2091 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2092
2093 // We can decode everything from a NALU until a packet has been lost.
2094 // Thus we can decode the first packet of the first NALU and the second NALU
2095 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002096 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002097 jitter_buffer_->ReleaseFrame(frame_out);
2098
2099 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002100 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002101 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002102 insertedLength = 0;
2103
2104 packet_->seqNum = seq_num_;
2105 packet_->timestamp = timestamp_;
2106 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002107 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108 packet_->completeNALU = kNaluEnd;
2109 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002110 EXPECT_EQ(kDecodableSession,
2111 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2112 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113 seq_num_--;
2114 packet_->seqNum = seq_num_;
2115 packet_->timestamp = timestamp_;
2116 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002117 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002118 packet_->completeNALU = kNaluStart;
2119 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002120
philipel9d3ab612015-12-21 04:12:39 -08002121 EXPECT_EQ(kDecodableSession,
2122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002123 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2124
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002125 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002126 packet_->seqNum = seq_num_;
2127 packet_->timestamp = timestamp_;
2128 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002129 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002130 packet_->completeNALU = kNaluComplete;
2131 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002132 EXPECT_EQ(kDecodableSession,
2133 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002134 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002135 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002136 packet_->seqNum = seq_num_;
2137 packet_->timestamp = timestamp_;
2138 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002139 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002140 packet_->completeNALU = kNaluStart;
2141 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002142 EXPECT_EQ(kDecodableSession,
2143 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002144 // This packet should be decoded since it's the beginning of a NAL.
2145 insertedLength += packet_->sizeBytes;
2146
2147 seq_num_ += 2;
2148 packet_->seqNum = seq_num_;
2149 packet_->timestamp = timestamp_;
2150 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002151 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002152 packet_->completeNALU = kNaluEnd;
2153 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002154 EXPECT_EQ(kDecodableSession,
2155 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002156 // This packet should not be decoded because it is an incomplete NAL if it
2157 // is the last.
2158 frame_out = DecodeIncompleteFrame();
2159 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002160 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002161 jitter_buffer_->ReleaseFrame(frame_out);
2162
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002164 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002165 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002166 WebRtcRTPHeader rtpHeader;
2167 memset(&rtpHeader, 0, sizeof(rtpHeader));
Magnus Jedvert22341212018-07-11 14:27:49 +02002168 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002169 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002170 emptypacket.seqNum = seq_num_;
2171 emptypacket.timestamp = timestamp_;
2172 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002173 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002174 emptypacket.completeNALU = kNaluComplete;
2175 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002176 EXPECT_EQ(kCompleteSession,
2177 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002178 // This packet should not be decoded because it is an incomplete NAL if it
2179 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002180
2181 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2182 // has arrived.
2183 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002184 EXPECT_TRUE(frame_out != NULL);
2185 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002186
2187 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002188 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002189 timestamp_ += 33 * 90;
2190
2191 packet_->seqNum = seq_num_;
2192 packet_->timestamp = timestamp_;
2193 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002194 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002195 packet_->completeNALU = kNaluComplete;
2196 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002197
philipel9d3ab612015-12-21 04:12:39 -08002198 EXPECT_EQ(kDecodableSession,
2199 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002200
agalusza@google.comd177c102013-08-08 01:12:33 +00002201 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002202 emptypacket.seqNum = seq_num_;
2203 emptypacket.timestamp = timestamp_;
2204 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002205 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002206 emptypacket.completeNALU = kNaluComplete;
2207 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002208 EXPECT_EQ(kCompleteSession,
2209 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002210
2211 frame_out = DecodeCompleteFrame();
2212 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002213 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002214 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002215}
2216
philipel85130292016-07-06 16:10:31 +02002217TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002218 // Test that a we cannot get incomplete frames from the JB if we haven't
2219 // received the marker bit, unless we have received a packet from a later
2220 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002221 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002222 // Start with a complete key frame - insert and decode.
2223 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002224 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002225 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002226 bool retransmitted = false;
2227
philipel9d3ab612015-12-21 04:12:39 -08002228 EXPECT_EQ(kCompleteSession,
2229 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002230 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2231 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002232 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002233
2234 packet_->seqNum += 2;
2235 packet_->timestamp += 33 * 90;
2236 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002237 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002238 packet_->markerBit = false;
2239
philipel9d3ab612015-12-21 04:12:39 -08002240 EXPECT_EQ(kDecodableSession,
2241 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002242
2243 frame_out = DecodeIncompleteFrame();
2244 EXPECT_TRUE(frame_out == NULL);
2245
2246 packet_->seqNum += 2;
2247 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002248 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002249
philipel9d3ab612015-12-21 04:12:39 -08002250 EXPECT_EQ(kDecodableSession,
2251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002252
2253 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002254 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002255 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002256}
2257
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002258TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002259 // Make sure the jitter doesn't request a keyframe after too much non-
2260 // decodable frames.
2261 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002262 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002263 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002264 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002265 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002266 DropFrame(1);
2267 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002268 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002269 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002270 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002271 // This frame will make the jitter buffer recycle frames until a key frame.
2272 // Since none is found it will have to wait until the next key frame before
2273 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002274 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002275 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002276}
2277
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002278TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002279 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002280 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002281 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002282 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002283 // Insert empty packet.
2284 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002285 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002286 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002287 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002288 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002289 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002290 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002291 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002292 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002293 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002294 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002295 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002296}
2297
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002298TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002299 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2300 EXPECT_EQ(0, frame_stats.delta_frames);
2301 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002302
2303 uint32_t framerate = 0;
2304 uint32_t bitrate = 0;
2305 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2306 EXPECT_EQ(0u, framerate);
2307 EXPECT_EQ(0u, bitrate);
2308
2309 // Insert a couple of key and delta frames.
2310 InsertFrame(kVideoFrameKey);
2311 InsertFrame(kVideoFrameDelta);
2312 InsertFrame(kVideoFrameDelta);
2313 InsertFrame(kVideoFrameKey);
2314 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002315 // Decode some of them to make sure the statistics doesn't depend on frames
2316 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002317 EXPECT_TRUE(DecodeCompleteFrame());
2318 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002319 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002320 EXPECT_EQ(3, frame_stats.delta_frames);
2321 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002322
2323 // Insert 20 more frames to get estimates of bitrate and framerate over
2324 // 1 second.
2325 for (int i = 0; i < 20; ++i) {
2326 InsertFrame(kVideoFrameDelta);
2327 }
2328 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2329 // TODO(holmer): The current implementation returns the average of the last
2330 // two framerate calculations, which is why it takes two calls to reach the
2331 // actual framerate. This should be fixed.
2332 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2333 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2334 // Insert 25 more frames to get estimates of bitrate and framerate over
2335 // 2 seconds.
2336 for (int i = 0; i < 25; ++i) {
2337 InsertFrame(kVideoFrameDelta);
2338 }
2339 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2340 EXPECT_EQ(kDefaultFrameRate, framerate);
2341 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2342}
2343
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002344TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2345 // Insert delta frames.
2346 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2347 // Can't decode without a key frame.
2348 EXPECT_FALSE(DecodeCompleteFrame());
2349 InsertFrame(kVideoFrameKey);
2350 // Skip to the next key frame.
2351 EXPECT_TRUE(DecodeCompleteFrame());
2352}
2353
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002354TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2355 InsertFrame(kVideoFrameKey);
2356 EXPECT_TRUE(DecodeCompleteFrame());
2357 const int kNumDeltaFrames = 5;
2358 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2359 InsertFrame(kVideoFrameKey);
2360 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2361 EXPECT_TRUE(DecodeCompleteFrame());
2362 }
2363}
2364
2365TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2366 InsertFrame(kVideoFrameKey);
2367 EXPECT_TRUE(DecodeCompleteFrame());
2368 const int kNumDeltaFrames = 5;
2369 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2370 InsertFrame(kVideoFrameKey);
2371 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2372 InsertFrame(kVideoFrameKey);
2373 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2374 EXPECT_TRUE(DecodeCompleteFrame());
2375 }
2376}
2377
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002378TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2379 InsertFrame(kVideoFrameKey);
2380 EXPECT_TRUE(DecodeCompleteFrame());
2381 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2382 clock_->TimeInMilliseconds());
2383 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2384 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2385 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002386 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002387 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2388 EXPECT_FALSE(DecodeCompleteFrame());
2389 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2390 EXPECT_TRUE(DecodeCompleteFrame());
2391 EXPECT_TRUE(DecodeCompleteFrame());
2392}
2393
philipel85130292016-07-06 16:10:31 +02002394TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002395 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002396 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002397 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002398 InsertFrame(kVideoFrameKey);
2399 EXPECT_TRUE(DecodeCompleteFrame());
2400}
2401
philipel85130292016-07-06 16:10:31 +02002402TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002403 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002404 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002405 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002406
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002407 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2408 // old packet.
2409 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002410 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002411 EXPECT_EQ(kFlushIndicator,
2412 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002413 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002414
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002415 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002416 std::vector<uint16_t> nack_list =
2417 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002418 // No key frame will be requested since the jitter buffer is empty.
2419 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002420 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002421
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002422 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002423 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002424 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002425 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002426
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002427 // The next complete continuous frame isn't a key frame, but we're waiting
2428 // for one.
2429 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002430 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002431 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002432 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002433}
2434
philipel85130292016-07-06 16:10:31 +02002435TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002436 // Insert a key frame and decode it.
2437 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2438 EXPECT_TRUE(DecodeCompleteFrame());
2439
2440 // Insert a frame which should trigger a recycle until the next key frame.
2441 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2442
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002443 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002444 std::vector<uint16_t> nack_list =
2445 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002446 // Verify that the jitter buffer does not request a key frame.
2447 EXPECT_FALSE(request_key_frame);
2448 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002449 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002450 // Verify that we can decode the next frame.
2451 EXPECT_TRUE(DecodeCompleteFrame());
2452}
2453
philipel85130292016-07-06 16:10:31 +02002454TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002455 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002456 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002457 EXPECT_TRUE(DecodeCompleteFrame());
2458
2459 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002460 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002461 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002462 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002463 EXPECT_FALSE(DecodeCompleteFrame());
2464
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002465 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002466 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002467 // The jitter buffer is empty, so we won't request key frames until we get a
2468 // packet.
2469 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002470
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002471 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002472 // Now we have a packet in the jitter buffer, a key frame will be requested
2473 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002474 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002475 // The jitter buffer is empty, so we won't request key frames until we get a
2476 // packet.
2477 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002478 // The next complete continuous frame isn't a key frame, but we're waiting
2479 // for one.
2480 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002481 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002482 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002483 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002484 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002485}
2486
philipel85130292016-07-06 16:10:31 +02002487TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002488 DropFrame(10);
2489 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002490 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002491 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002492 std::vector<uint16_t> nack_list =
2493 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002494 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002495 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002496 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002497}
2498
philipel85130292016-07-06 16:10:31 +02002499TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002500 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002501 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002502 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002503 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002504 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002505 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002506 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002507 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002508 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002509 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002510}
2511
philipel85130292016-07-06 16:10:31 +02002512TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002513 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002514 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2515 clock_->TimeInMilliseconds());
2516 VCMPacket packet;
2517 stream_generator_->PopPacket(&packet, 0);
2518 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002519 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002520 EXPECT_FALSE(retransmitted);
2521 // Drop second packet.
2522 stream_generator_->PopPacket(&packet, 1);
2523 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2524 EXPECT_FALSE(retransmitted);
2525 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002526 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002527 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002528 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002529 EXPECT_EQ(1u, nack_list.size());
2530 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002531 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002532 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002533 EXPECT_EQ(kCompleteSession,
2534 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002535 EXPECT_TRUE(retransmitted);
2536 EXPECT_TRUE(DecodeCompleteFrame());
2537}
2538
philipel85130292016-07-06 16:10:31 +02002539TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002540 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002541 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002542 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002543 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002544 // Drop second packet.
2545 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2546 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002547 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002548 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002549 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002550 ASSERT_EQ(1u, nack_list.size());
2551 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002552 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002553 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002554 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002555}
2556
philipel85130292016-07-06 16:10:31 +02002557TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002558 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002559 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002560 // First frame is delta.
2561 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2562 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002563 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002564 // Drop second packet in frame.
2565 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2566 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2567 // Second frame is key.
2568 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2569 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002570 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002571 // Drop second packet in frame.
2572 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2573 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002574 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002575 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002576 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002577 ASSERT_EQ(1u, nack_list.size());
2578 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002579 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002580 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002581}
2582
philipel85130292016-07-06 16:10:31 +02002583TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002584 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002585 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002586
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002587 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002588 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002589
2590 // ----------------------------------------------------------------
2591 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2592 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002593 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002594 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002595 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002596 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002597 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002598 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002599 while (stream_generator_->PacketsRemaining() > 1) {
2600 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002601 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002602 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002603 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002604 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002605 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002606 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002607 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002608 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002609 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002610 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002611
2612 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002613 std::vector<uint16_t> nack_list =
2614 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002615 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002616 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002617 for (size_t i = 0; i < nack_list.size(); ++i)
2618 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002619}
2620
philipel85130292016-07-06 16:10:31 +02002621TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002622 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002623 // ------- ------------------------------------------------------------
2624 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2625 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002626 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002627 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002628 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002629 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002630 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002631 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002632 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002633 while (stream_generator_->PacketsRemaining() > 1) {
2634 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002635 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002636 EXPECT_FALSE(request_key_frame);
2637 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002638 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002639 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002640 }
2641 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002642 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002643 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002644 EXPECT_FALSE(DecodeCompleteFrame());
2645 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002646 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002647 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002648 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002649 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002650 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2651 for (size_t i = 0; i < nack_list.size(); ++i)
2652 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002653}
2654
philipel85130292016-07-06 16:10:31 +02002655TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002656 bool request_key_frame = false;
2657 // -----------------------------------
2658 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2659 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002660 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002661 InsertFrame(kVideoFrameKey);
2662 EXPECT_FALSE(request_key_frame);
2663 EXPECT_TRUE(DecodeCompleteFrame());
2664 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2665 clock_->TimeInMilliseconds());
2666 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2667 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002668 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002669 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002670 EXPECT_FALSE(request_key_frame);
2671 } else {
2672 stream_generator_->NextPacket(NULL); // Drop packet
2673 }
2674 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2675 clock_->TimeInMilliseconds());
2676 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2677 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002678 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002679 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002680 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002681 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002682 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002683 ASSERT_EQ(1u, nack_list.size());
2684 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002685}
2686
philipel85130292016-07-06 16:10:31 +02002687TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002688 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002689 InsertFrame(kVideoFrameKey);
2690 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002691 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002692 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2693 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002694
2695 // Far-into-the-future video frame, could be caused by resetting the encoder
2696 // or otherwise restarting. This should not fail when error when the packet is
2697 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002698 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002699 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2700 InsertFrame(kVideoFrameKey);
2701 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002702 nack_list = jitter_buffer_->GetNackList(&extended);
2703 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002704
2705 // Stream should be decodable from this point.
2706 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2707 InsertFrame(kVideoFrameDelta);
2708 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002709 nack_list = jitter_buffer_->GetNackList(&extended);
2710 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002711}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002712} // namespace webrtc