blob: 756dc523c379164f9f9e755477b735ccb727ebbf [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
philipel7d745e52018-08-02 14:03:53 +02001158 auto& h264_header =
1159 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001160 packet_->timestamp = timestamp_;
1161 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001162 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001163 packet_->markerBit = true;
1164 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001165 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001166 h264_header.nalu_type = H264::NaluType::kIdr;
1167 h264_header.nalus[0].type = H264::NaluType::kIdr;
1168 h264_header.nalus[0].sps_id = -1;
1169 h264_header.nalus[0].pps_id = 0;
1170 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001171 bool retransmitted = false;
1172 EXPECT_EQ(kCompleteSession,
1173 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1174 // Not decodable since sps and pps are missing.
1175 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1176
1177 timestamp_ += 3000;
1178 packet_->timestamp = timestamp_;
1179 ++seq_num_;
1180 packet_->seqNum = seq_num_;
1181 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001182 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001183 packet_->markerBit = false;
1184 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001185 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001186 h264_header.nalu_type = H264::NaluType::kStapA;
1187 h264_header.nalus[0].type = H264::NaluType::kSps;
1188 h264_header.nalus[0].sps_id = 0;
1189 h264_header.nalus[0].pps_id = -1;
1190 h264_header.nalus[1].type = H264::NaluType::kPps;
1191 h264_header.nalus[1].sps_id = 0;
1192 h264_header.nalus[1].pps_id = 0;
1193 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001194 // Not complete since the marker bit hasn't been received.
1195 EXPECT_EQ(kIncomplete,
1196 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1197
1198 ++seq_num_;
1199 packet_->seqNum = seq_num_;
1200 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001201 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001202 packet_->markerBit = true;
1203 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001204 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001205 h264_header.nalu_type = H264::NaluType::kIdr;
1206 h264_header.nalus[0].type = H264::NaluType::kIdr;
1207 h264_header.nalus[0].sps_id = -1;
1208 h264_header.nalus[0].pps_id = 0;
1209 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001210 // Complete and decodable since the pps and sps are received in the first
1211 // packet of this frame.
1212 EXPECT_EQ(kCompleteSession,
1213 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1214 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1215 ASSERT_NE(nullptr, frame_out);
1216 jitter_buffer_->ReleaseFrame(frame_out);
1217
1218 timestamp_ += 3000;
1219 packet_->timestamp = timestamp_;
1220 ++seq_num_;
1221 packet_->seqNum = seq_num_;
1222 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001223 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001224 packet_->markerBit = true;
1225 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001226 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001227 h264_header.nalu_type = H264::NaluType::kSlice;
1228 h264_header.nalus[0].type = H264::NaluType::kSlice;
1229 h264_header.nalus[0].sps_id = -1;
1230 h264_header.nalus[0].pps_id = 0;
1231 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001232 // Complete and decodable since sps, pps and key frame has been received.
1233 EXPECT_EQ(kCompleteSession,
1234 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1235 frame_out = DecodeCompleteFrame();
1236 ASSERT_NE(nullptr, frame_out);
1237 jitter_buffer_->ReleaseFrame(frame_out);
1238}
1239
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001240// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001241TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001242 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001243 // Always start with a key frame. Use 10 packets to test Decodable State
1244 // boundaries.
1245 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001246 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001247 packet_->markerBit = false;
1248 packet_->seqNum = seq_num_;
1249 packet_->timestamp = timestamp_;
1250
1251 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001252 EXPECT_EQ(kIncomplete,
1253 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001254 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001255 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001256 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1257
johan0d1b2b62017-01-10 04:21:35 -08001258 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001259 for (int i = 1; i < 9; ++i) {
1260 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001261 EXPECT_EQ(kIncomplete,
1262 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001263 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001264 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1265 }
1266
1267 // last packet
1268 packet_->markerBit = true;
1269 packet_->seqNum++;
1270
philipel9d3ab612015-12-21 04:12:39 -08001271 EXPECT_EQ(kCompleteSession,
1272 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001273 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1274 CheckOutFrame(frame_out, 10 * size_, false);
1275 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001276 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001277
1278 // An incomplete frame can only be decoded once a subsequent frame has begun
1279 // to arrive. Insert packet in distant frame for this purpose.
1280 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001281 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001282 packet_->markerBit = false;
1283 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001284 packet_->timestamp += 33 * 90 * 8;
1285
philipel9d3ab612015-12-21 04:12:39 -08001286 EXPECT_EQ(kDecodableSession,
1287 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001288 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001289 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1290
1291 // Insert second frame
1292 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001293 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001294
philipel9d3ab612015-12-21 04:12:39 -08001295 EXPECT_EQ(kDecodableSession,
1296 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001297 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001298 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1299
johan0d1b2b62017-01-10 04:21:35 -08001300 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001301 for (int i = 1; i < 8; ++i) {
1302 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001303 EXPECT_EQ(kDecodableSession,
1304 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001305 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001306 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1307 }
1308
1309 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001310 EXPECT_EQ(kDecodableSession,
1311 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001312 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001313 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1314
1315 frame_out = DecodeIncompleteFrame();
1316 ASSERT_FALSE(NULL == frame_out);
1317 CheckOutFrame(frame_out, 9 * size_, false);
1318 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001319 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001320
1321 packet_->markerBit = true;
1322 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001323 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001324}
1325
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001326// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001327TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001328 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1329 // Always start with a key frame.
1330 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001331 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001332 packet_->markerBit = true;
1333 packet_->seqNum = seq_num_;
1334 packet_->timestamp = timestamp_;
1335
1336 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001337 EXPECT_EQ(kCompleteSession,
1338 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001339 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1340 CheckOutFrame(frame_out, size_, false);
1341 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001342 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001343
1344 // An incomplete frame can only be decoded once a subsequent frame has begun
1345 // to arrive. Insert packet in distant frame for this purpose.
1346 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001347 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348 packet_->markerBit = false;
1349 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001350 packet_->timestamp += 33 * 90 * 8;
1351 EXPECT_EQ(kIncomplete,
1352 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001353 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001354 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001355 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1356
1357 // Insert second frame - an incomplete key frame.
1358 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001359 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001360 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001361 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001362
philipel9d3ab612015-12-21 04:12:39 -08001363 EXPECT_EQ(kIncomplete,
1364 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001365 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001366 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1367
1368 // Insert a few more packets. Make sure we're waiting for the key frame to be
1369 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001370 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001371 for (int i = 1; i < 5; ++i) {
1372 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001373 EXPECT_EQ(kIncomplete,
1374 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001375 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001376 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1377 }
1378
1379 // Complete key frame.
1380 packet_->markerBit = true;
1381 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001382 EXPECT_EQ(kCompleteSession,
1383 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001384 frame_out = DecodeCompleteFrame();
1385 CheckOutFrame(frame_out, 6 * size_, false);
1386 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001387 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001388}
1389
1390// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001391TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001392 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1393 // Always start with a key frame.
1394 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001395 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001396 packet_->markerBit = true;
1397 packet_->seqNum = seq_num_;
1398 packet_->timestamp = timestamp_;
1399
1400 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001401 EXPECT_EQ(kCompleteSession,
1402 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001403 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1404 CheckOutFrame(frame_out, size_, false);
1405 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001406 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001407
1408 // An incomplete frame can only be decoded once a subsequent frame has begun
1409 // to arrive. Insert packet in distant frame for this purpose.
1410 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001411 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001412 packet_->markerBit = false;
1413 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001414 packet_->timestamp += 33 * 90 * 8;
1415 EXPECT_EQ(kIncomplete,
1416 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001417 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001418 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001419 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1420
1421 // Insert second frame with the first packet missing. Make sure we're waiting
1422 // for the key frame to be complete.
1423 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001424 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001425
philipel9d3ab612015-12-21 04:12:39 -08001426 EXPECT_EQ(kIncomplete,
1427 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001428 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001429 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1430
1431 for (int i = 0; i < 5; ++i) {
1432 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001433 EXPECT_EQ(kIncomplete,
1434 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001435 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001436 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1437 }
1438
1439 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001440 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001441 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001442 EXPECT_EQ(kDecodableSession,
1443 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001444 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001445 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1446
1447 frame_out = DecodeIncompleteFrame();
1448 CheckOutFrame(frame_out, 7 * size_, false);
1449 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001450 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001451}
1452
philipel85130292016-07-06 16:10:31 +02001453TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001454 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001455 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001456 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001457 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001458 packet_->markerBit = true;
1459 packet_->seqNum = seq_num_;
1460 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001461 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001462 EXPECT_EQ(kCompleteSession,
1463 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001464 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001465 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1466 EXPECT_NE(frame, nullptr);
Björn Terelius52f53d52018-06-26 11:52:33 +00001467 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1468 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001469 EXPECT_TRUE(frame != NULL);
1470 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001471
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001472 // Drop a complete frame.
1473 timestamp_ += 2 * 33 * 90;
1474 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001475 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001476 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001477 packet_->markerBit = false;
1478 packet_->seqNum = seq_num_;
1479 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001480 EXPECT_EQ(kDecodableSession,
1481 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001482 // Insert a packet (so the previous one will be released).
1483 timestamp_ += 33 * 90;
1484 seq_num_ += 2;
1485 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001486 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001487 packet_->markerBit = false;
1488 packet_->seqNum = seq_num_;
1489 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001490 EXPECT_EQ(kDecodableSession,
1491 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001492 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001493 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1494 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001495}
1496
philipel85130292016-07-06 16:10:31 +02001497TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001498 // Verify missing packets statistics and not decodable packets statistics.
1499 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1500 // The last packet is an empty (non-media) packet.
1501
1502 // Select a start seqNum which triggers a difficult wrap situation
1503 // The JB will only output (incomplete)frames if the next one has started
1504 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001505 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001506 seq_num_ = 0xffff - 4;
1507 seq_num_++;
1508 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001509 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001510 packet_->markerBit = false;
1511 packet_->seqNum = seq_num_;
1512 packet_->timestamp = timestamp_;
1513 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001514
1515 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001516 EXPECT_EQ(kDecodableSession,
1517 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001518 for (int i = 0; i < 11; ++i) {
1519 webrtc::FrameType frametype = kVideoFrameDelta;
1520 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001521 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001523 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001524 packet_->markerBit = false;
1525 packet_->seqNum = seq_num_;
1526 packet_->timestamp = timestamp_;
1527 packet_->completeNALU = kNaluStart;
1528
philipel9d3ab612015-12-21 04:12:39 -08001529 EXPECT_EQ(kDecodableSession,
1530 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001531
1532 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1533
1534 // Should not be complete.
1535 EXPECT_TRUE(frame_out == NULL);
1536
1537 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001538 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001539 packet_->markerBit = true;
1540 packet_->seqNum = seq_num_;
1541 packet_->completeNALU = kNaluEnd;
1542
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001543 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1544 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001545
1546 // Insert an empty (non-media) packet.
1547 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001548 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001549 packet_->markerBit = false;
1550 packet_->seqNum = seq_num_;
1551 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001552 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001553
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001554 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001555 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001556 frame_out = DecodeIncompleteFrame();
1557
1558 // One of the packets has been discarded by the jitter buffer.
1559 // Last frame can't be extracted yet.
1560 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001561 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562
1563 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001564 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 } else {
philipel9d3ab612015-12-21 04:12:39 -08001566 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001567 }
1568 EXPECT_FALSE(frame_out->Complete());
1569 EXPECT_FALSE(frame_out->MissingFrame());
1570 }
1571
1572 jitter_buffer_->ReleaseFrame(frame_out);
1573 }
1574
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001575 // Insert 3 old packets and verify that we have 3 discarded packets
1576 // Match value to actual latest timestamp decoded.
1577 timestamp_ -= 33 * 90;
1578 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001579
philipel9d3ab612015-12-21 04:12:39 -08001580 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581
1582 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001583
philipel9d3ab612015-12-21 04:12:39 -08001584 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001585
1586 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001587
philipel9d3ab612015-12-21 04:12:39 -08001588 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001589
1590 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1591
1592 jitter_buffer_->Flush();
1593
1594 // This statistic shouldn't be reset by a flush.
1595 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1596}
1597
philipel85130292016-07-06 16:10:31 +02001598TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001599 seq_num_ = 0xfff0;
1600 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001601 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001602 packet_->markerBit = false;
1603 packet_->seqNum = seq_num_;
1604 packet_->timestamp = timestamp_;
1605
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001606 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001607 EXPECT_EQ(kIncomplete,
1608 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001609
1610 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1611
1612 EXPECT_TRUE(frame_out == NULL);
1613
1614 int loop = 0;
1615 do {
1616 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001617 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618 packet_->markerBit = false;
1619 packet_->seqNum = seq_num_;
1620
philipel9d3ab612015-12-21 04:12:39 -08001621 EXPECT_EQ(kIncomplete,
1622 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001623
1624 frame_out = DecodeCompleteFrame();
1625
1626 EXPECT_TRUE(frame_out == NULL);
1627
1628 loop++;
1629 } while (loop < 98);
1630
1631 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001632 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001633 packet_->markerBit = true;
1634 packet_->seqNum = seq_num_;
1635
philipel9d3ab612015-12-21 04:12:39 -08001636 EXPECT_EQ(kCompleteSession,
1637 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001638
1639 frame_out = DecodeCompleteFrame();
1640
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001641 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001642
1643 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001644 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001645}
1646
philipel85130292016-07-06 16:10:31 +02001647TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001648 // Insert "first" packet last seqnum.
1649 seq_num_ = 10;
1650 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001651 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001652 packet_->markerBit = true;
1653 packet_->seqNum = seq_num_;
1654
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001655 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001656 EXPECT_EQ(kIncomplete,
1657 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001658 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1659
1660 // Should not be complete.
1661 EXPECT_TRUE(frame_out == NULL);
1662
1663 // Insert 98 frames.
1664 int loop = 0;
1665 do {
1666 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001667 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001668 packet_->markerBit = false;
1669 packet_->seqNum = seq_num_;
1670
philipel9d3ab612015-12-21 04:12:39 -08001671 EXPECT_EQ(kIncomplete,
1672 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001673
1674 frame_out = DecodeCompleteFrame();
1675
1676 EXPECT_TRUE(frame_out == NULL);
1677
1678 loop++;
1679 } while (loop < 98);
1680
1681 // Insert last packet.
1682 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001683 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001684 packet_->markerBit = false;
1685 packet_->seqNum = seq_num_;
1686
philipel9d3ab612015-12-21 04:12:39 -08001687 EXPECT_EQ(kCompleteSession,
1688 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689
1690 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001691 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001692 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001693 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001694}
1695
philipel85130292016-07-06 16:10:31 +02001696TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001697 // ------- -------
1698 // | 2 | | 1 |
1699 // ------- -------
1700 // t = 3000 t = 2000
1701 seq_num_ = 2;
1702 timestamp_ = 3000;
1703 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001704 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001705 packet_->markerBit = true;
1706 packet_->timestamp = timestamp_;
1707 packet_->seqNum = seq_num_;
1708
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001709 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001710 EXPECT_EQ(kCompleteSession,
1711 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001712
1713 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001714 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001715 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001716 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001717 jitter_buffer_->ReleaseFrame(frame_out);
1718
1719 seq_num_--;
1720 timestamp_ = 2000;
1721 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001722 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001723 packet_->markerBit = true;
1724 packet_->seqNum = seq_num_;
1725 packet_->timestamp = timestamp_;
1726
philipel9d3ab612015-12-21 04:12:39 -08001727 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001728}
1729
philipel85130292016-07-06 16:10:31 +02001730TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001731 // ------- -------
1732 // | 2 | | 1 |
1733 // ------- -------
1734 // t = 3000 t = 0xffffff00
1735
1736 seq_num_ = 2;
1737 timestamp_ = 3000;
1738 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001739 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001740 packet_->markerBit = true;
1741 packet_->seqNum = seq_num_;
1742 packet_->timestamp = timestamp_;
1743
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001744 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001745 EXPECT_EQ(kCompleteSession,
1746 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001747
1748 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001749 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001750
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001751 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001752
1753 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1754
1755 jitter_buffer_->ReleaseFrame(frame_out);
1756
1757 seq_num_--;
1758 timestamp_ = 0xffffff00;
1759 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001760 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001761 packet_->markerBit = true;
1762 packet_->seqNum = seq_num_;
1763 packet_->timestamp = timestamp_;
1764
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001766 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001767}
1768
philipel85130292016-07-06 16:10:31 +02001769TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001770 // --------------- ---------------
1771 // | 1 | 2 | | 3 | 4 |
1772 // --------------- ---------------
1773 // t = 0xffffff00 t = 33*90
1774
1775 timestamp_ = 0xffffff00;
1776 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001777 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001778 packet_->markerBit = false;
1779 packet_->seqNum = seq_num_;
1780 packet_->timestamp = timestamp_;
1781
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001782 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001783 EXPECT_EQ(kIncomplete,
1784 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001785
1786 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 EXPECT_TRUE(frame_out == NULL);
1788
1789 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001790 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001791 packet_->markerBit = true;
1792 packet_->seqNum = seq_num_;
1793
philipel9d3ab612015-12-21 04:12:39 -08001794 EXPECT_EQ(kCompleteSession,
1795 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796
1797 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001798 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001799 jitter_buffer_->ReleaseFrame(frame_out);
1800
1801 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001802 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001803 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001804 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001805 packet_->markerBit = false;
1806 packet_->seqNum = seq_num_;
1807 packet_->timestamp = timestamp_;
1808
philipel9d3ab612015-12-21 04:12:39 -08001809 EXPECT_EQ(kIncomplete,
1810 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811
1812 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001813 EXPECT_TRUE(frame_out == NULL);
1814
1815 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001816 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001817 packet_->markerBit = true;
1818 packet_->seqNum = seq_num_;
1819
philipel9d3ab612015-12-21 04:12:39 -08001820 EXPECT_EQ(kCompleteSession,
1821 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822
1823 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001824 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001825 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001826 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827}
1828
philipel85130292016-07-06 16:10:31 +02001829TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001830 // ------- -------
1831 // | 1 | | 2 |
1832 // ------- -------
1833 // t = 0xffffff00 t = 2700
1834
1835 timestamp_ = 0xffffff00;
1836 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001837 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 packet_->markerBit = true;
1839 packet_->timestamp = timestamp_;
1840
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001841 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001843 EXPECT_EQ(kCompleteSession,
1844 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001845
1846 // Insert next frame.
1847 seq_num_++;
1848 timestamp_ = 2700;
1849 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001850 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851 packet_->markerBit = true;
1852 packet_->seqNum = seq_num_;
1853 packet_->timestamp = timestamp_;
1854
philipel9d3ab612015-12-21 04:12:39 -08001855 EXPECT_EQ(kCompleteSession,
1856 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001857
1858 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001859 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001860 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001861 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001862 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001863
1864 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001865 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001866 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001867 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001868 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869}
1870
philipel85130292016-07-06 16:10:31 +02001871TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001872 // ------- -------
1873 // | 2 | | 1 |
1874 // ------- -------
1875 // t = 2700 t = 0xffffff00
1876
1877 seq_num_ = 2;
1878 timestamp_ = 2700;
1879 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001880 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001881 packet_->markerBit = true;
1882 packet_->seqNum = seq_num_;
1883 packet_->timestamp = timestamp_;
1884
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001885 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001886 EXPECT_EQ(kCompleteSession,
1887 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001888
1889 // Insert second frame
1890 seq_num_--;
1891 timestamp_ = 0xffffff00;
1892 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001893 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001894 packet_->markerBit = true;
1895 packet_->seqNum = seq_num_;
1896 packet_->timestamp = timestamp_;
1897
philipel9d3ab612015-12-21 04:12:39 -08001898 EXPECT_EQ(kCompleteSession,
1899 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001900
1901 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001902 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001903 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001904 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001905 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001906
1907 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001908 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001909 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001910 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001911 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912}
1913
philipel85130292016-07-06 16:10:31 +02001914TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915 int loop = 0;
1916 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001917 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001918 // Insert kMaxPacketsInJitterBuffer into frame.
1919 do {
1920 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001921 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001922 packet_->markerBit = false;
1923 packet_->seqNum = seq_num_;
1924
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001925 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001926 EXPECT_EQ(kIncomplete,
1927 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928 firstPacket = false;
1929 } else {
philipel9d3ab612015-12-21 04:12:39 -08001930 EXPECT_EQ(kIncomplete,
1931 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001932 }
1933
1934 loop++;
1935 } while (loop < kMaxPacketsInSession);
1936
1937 // Max number of packets inserted.
1938 // Insert one more packet.
1939 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001940 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 packet_->markerBit = true;
1942 packet_->seqNum = seq_num_;
1943
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001945 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001946 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001947}
1948
philipel85130292016-07-06 16:10:31 +02001949TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001950 // TEST fill JB with more than max number of frame (50 delta frames +
1951 // 51 key frames) with wrap in seq_num_
1952 //
1953 // --------------------------------------------------------------
1954 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1955 // --------------------------------------------------------------
1956 // |<-----------delta frames------------->|<------key frames----->|
1957
jbauchdb81ffd2015-11-23 03:59:02 -08001958 // Make sure the jitter doesn't request a keyframe after too much non-
1959 // decodable frames.
1960 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001961 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001962
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001963 int loop = 0;
1964 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001965 uint32_t first_key_frame_timestamp = 0;
1966 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001967 // Insert MAX_NUMBER_OF_FRAMES frames.
1968 do {
philipel9d3ab612015-12-21 04:12:39 -08001969 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001970 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001971 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001972 packet_->markerBit = true;
1973 packet_->seqNum = seq_num_;
1974 packet_->timestamp = timestamp_;
1975
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001976 if (loop == 50) {
1977 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001978 packet_->frameType = kVideoFrameKey;
1979 }
1980
1981 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001982 EXPECT_EQ(kCompleteSession,
1983 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001984
1985 loop++;
1986 } while (loop < kMaxNumberOfFrames);
1987
1988 // Max number of frames inserted.
1989
1990 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001991 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001992 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001993 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001994 packet_->markerBit = true;
1995 packet_->seqNum = seq_num_;
1996 packet_->timestamp = timestamp_;
1997
1998 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001999 EXPECT_EQ(kFlushIndicator,
2000 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002002 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00002003 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002004 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002005 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002006 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002007}
2008
philipel85130292016-07-06 16:10:31 +02002009TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002010 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002011 seq_num_ = 3;
2012 // Insert one empty packet per frame, should never return the last timestamp
2013 // inserted. Only return empty frames in the presence of subsequent frames.
2014 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002015 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016 for (int i = 0; i < maxSize + 10; i++) {
2017 timestamp_ += 33 * 90;
2018 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002019 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002020 packet_->markerBit = false;
2021 packet_->seqNum = seq_num_;
2022 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002023 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002024
philipel9d3ab612015-12-21 04:12:39 -08002025 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002026 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2027 // Timestamp should never be the last TS inserted.
2028 if (testFrame != NULL) {
Björn Terelius52f53d52018-06-26 11:52:33 +00002029 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002030 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002031 }
2032 }
2033}
2034
philipel85130292016-07-06 16:10:31 +02002035TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002036 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002037 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002038 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002039 timestamp_ += 33 * 90;
2040 int insertedLength = 0;
2041 packet_->seqNum = seq_num_;
2042 packet_->timestamp = timestamp_;
2043 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002044 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002045 packet_->completeNALU = kNaluStart;
2046 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002047 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048
philipel9d3ab612015-12-21 04:12:39 -08002049 EXPECT_EQ(kDecodableSession,
2050 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002051
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002052 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 packet_->seqNum = seq_num_;
2054 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002055 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002056 packet_->completeNALU = kNaluIncomplete;
2057 packet_->markerBit = false;
2058
philipel9d3ab612015-12-21 04:12:39 -08002059 EXPECT_EQ(kDecodableSession,
2060 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002061
2062 seq_num_++;
2063 packet_->seqNum = seq_num_;
2064 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002065 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002066 packet_->completeNALU = kNaluEnd;
2067 packet_->markerBit = false;
2068
philipel9d3ab612015-12-21 04:12:39 -08002069 EXPECT_EQ(kDecodableSession,
2070 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002071
2072 seq_num_++;
2073 packet_->seqNum = seq_num_;
2074 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002075 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002076 EXPECT_EQ(kDecodableSession,
2077 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002078 // The JB will only output (incomplete) frames if a packet belonging to a
2079 // subsequent frame was already inserted. Insert one packet of a subsequent
2080 // frame. place high timestamp so the JB would always have a next frame
2081 // (otherwise, for every inserted frame we need to take care of the next
2082 // frame as well).
2083 packet_->seqNum = 1;
2084 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2085 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002086 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002087 packet_->completeNALU = kNaluStart;
2088 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002089
philipel9d3ab612015-12-21 04:12:39 -08002090 EXPECT_EQ(kDecodableSession,
2091 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002092
2093 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2094
2095 // We can decode everything from a NALU until a packet has been lost.
2096 // Thus we can decode the first packet of the first NALU and the second NALU
2097 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002098 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002099 jitter_buffer_->ReleaseFrame(frame_out);
2100
2101 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002102 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002103 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002104 insertedLength = 0;
2105
2106 packet_->seqNum = seq_num_;
2107 packet_->timestamp = timestamp_;
2108 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002109 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002110 packet_->completeNALU = kNaluEnd;
2111 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002112 EXPECT_EQ(kDecodableSession,
2113 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2114 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002115 seq_num_--;
2116 packet_->seqNum = seq_num_;
2117 packet_->timestamp = timestamp_;
2118 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002119 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002120 packet_->completeNALU = kNaluStart;
2121 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002122
philipel9d3ab612015-12-21 04:12:39 -08002123 EXPECT_EQ(kDecodableSession,
2124 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002125 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2126
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002127 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002128 packet_->seqNum = seq_num_;
2129 packet_->timestamp = timestamp_;
2130 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002131 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002132 packet_->completeNALU = kNaluComplete;
2133 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002134 EXPECT_EQ(kDecodableSession,
2135 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002136 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002137 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002138 packet_->seqNum = seq_num_;
2139 packet_->timestamp = timestamp_;
2140 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002141 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002142 packet_->completeNALU = kNaluStart;
2143 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002144 EXPECT_EQ(kDecodableSession,
2145 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002146 // This packet should be decoded since it's the beginning of a NAL.
2147 insertedLength += packet_->sizeBytes;
2148
2149 seq_num_ += 2;
2150 packet_->seqNum = seq_num_;
2151 packet_->timestamp = timestamp_;
2152 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002153 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154 packet_->completeNALU = kNaluEnd;
2155 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002156 EXPECT_EQ(kDecodableSession,
2157 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002158 // This packet should not be decoded because it is an incomplete NAL if it
2159 // is the last.
2160 frame_out = DecodeIncompleteFrame();
2161 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002162 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 jitter_buffer_->ReleaseFrame(frame_out);
2164
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002165 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002166 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002167 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002168 WebRtcRTPHeader rtpHeader;
2169 memset(&rtpHeader, 0, sizeof(rtpHeader));
Magnus Jedvert22341212018-07-11 14:27:49 +02002170 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002171 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002172 emptypacket.seqNum = seq_num_;
2173 emptypacket.timestamp = timestamp_;
2174 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002175 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002176 emptypacket.completeNALU = kNaluComplete;
2177 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002178 EXPECT_EQ(kCompleteSession,
2179 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002180 // This packet should not be decoded because it is an incomplete NAL if it
2181 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002182
2183 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2184 // has arrived.
2185 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002186 EXPECT_TRUE(frame_out != NULL);
2187 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002188
2189 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002190 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002191 timestamp_ += 33 * 90;
2192
2193 packet_->seqNum = seq_num_;
2194 packet_->timestamp = timestamp_;
2195 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002196 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002197 packet_->completeNALU = kNaluComplete;
2198 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002199
philipel9d3ab612015-12-21 04:12:39 -08002200 EXPECT_EQ(kDecodableSession,
2201 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002202
agalusza@google.comd177c102013-08-08 01:12:33 +00002203 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002204 emptypacket.seqNum = seq_num_;
2205 emptypacket.timestamp = timestamp_;
2206 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002207 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002208 emptypacket.completeNALU = kNaluComplete;
2209 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002210 EXPECT_EQ(kCompleteSession,
2211 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002212
2213 frame_out = DecodeCompleteFrame();
2214 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002215 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002216 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002217}
2218
philipel85130292016-07-06 16:10:31 +02002219TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002220 // Test that a we cannot get incomplete frames from the JB if we haven't
2221 // received the marker bit, unless we have received a packet from a later
2222 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002223 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002224 // Start with a complete key frame - insert and decode.
2225 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002226 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002227 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002228 bool retransmitted = false;
2229
philipel9d3ab612015-12-21 04:12:39 -08002230 EXPECT_EQ(kCompleteSession,
2231 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002232 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2233 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002234 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002235
2236 packet_->seqNum += 2;
2237 packet_->timestamp += 33 * 90;
2238 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002239 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002240 packet_->markerBit = false;
2241
philipel9d3ab612015-12-21 04:12:39 -08002242 EXPECT_EQ(kDecodableSession,
2243 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002244
2245 frame_out = DecodeIncompleteFrame();
2246 EXPECT_TRUE(frame_out == NULL);
2247
2248 packet_->seqNum += 2;
2249 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002250 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002251
philipel9d3ab612015-12-21 04:12:39 -08002252 EXPECT_EQ(kDecodableSession,
2253 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002254
2255 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002256 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002257 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002258}
2259
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002260TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002261 // Make sure the jitter doesn't request a keyframe after too much non-
2262 // decodable frames.
2263 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002264 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002265 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002266 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002267 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002268 DropFrame(1);
2269 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002270 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002271 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002272 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002273 // This frame will make the jitter buffer recycle frames until a key frame.
2274 // Since none is found it will have to wait until the next key frame before
2275 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002276 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002277 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002278}
2279
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002280TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002281 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002282 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002283 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002284 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002285 // Insert empty packet.
2286 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002287 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002288 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002289 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002290 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002291 EXPECT_EQ(kIncomplete, 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 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002294 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002295 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002296 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002297 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002298}
2299
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002300TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002301 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2302 EXPECT_EQ(0, frame_stats.delta_frames);
2303 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002304
2305 uint32_t framerate = 0;
2306 uint32_t bitrate = 0;
2307 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2308 EXPECT_EQ(0u, framerate);
2309 EXPECT_EQ(0u, bitrate);
2310
2311 // Insert a couple of key and delta frames.
2312 InsertFrame(kVideoFrameKey);
2313 InsertFrame(kVideoFrameDelta);
2314 InsertFrame(kVideoFrameDelta);
2315 InsertFrame(kVideoFrameKey);
2316 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002317 // Decode some of them to make sure the statistics doesn't depend on frames
2318 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002319 EXPECT_TRUE(DecodeCompleteFrame());
2320 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002321 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002322 EXPECT_EQ(3, frame_stats.delta_frames);
2323 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002324
2325 // Insert 20 more frames to get estimates of bitrate and framerate over
2326 // 1 second.
2327 for (int i = 0; i < 20; ++i) {
2328 InsertFrame(kVideoFrameDelta);
2329 }
2330 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2331 // TODO(holmer): The current implementation returns the average of the last
2332 // two framerate calculations, which is why it takes two calls to reach the
2333 // actual framerate. This should be fixed.
2334 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2335 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2336 // Insert 25 more frames to get estimates of bitrate and framerate over
2337 // 2 seconds.
2338 for (int i = 0; i < 25; ++i) {
2339 InsertFrame(kVideoFrameDelta);
2340 }
2341 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2342 EXPECT_EQ(kDefaultFrameRate, framerate);
2343 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2344}
2345
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002346TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2347 // Insert delta frames.
2348 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2349 // Can't decode without a key frame.
2350 EXPECT_FALSE(DecodeCompleteFrame());
2351 InsertFrame(kVideoFrameKey);
2352 // Skip to the next key frame.
2353 EXPECT_TRUE(DecodeCompleteFrame());
2354}
2355
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002356TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2357 InsertFrame(kVideoFrameKey);
2358 EXPECT_TRUE(DecodeCompleteFrame());
2359 const int kNumDeltaFrames = 5;
2360 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2361 InsertFrame(kVideoFrameKey);
2362 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2363 EXPECT_TRUE(DecodeCompleteFrame());
2364 }
2365}
2366
2367TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2368 InsertFrame(kVideoFrameKey);
2369 EXPECT_TRUE(DecodeCompleteFrame());
2370 const int kNumDeltaFrames = 5;
2371 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2372 InsertFrame(kVideoFrameKey);
2373 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2374 InsertFrame(kVideoFrameKey);
2375 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2376 EXPECT_TRUE(DecodeCompleteFrame());
2377 }
2378}
2379
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002380TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2381 InsertFrame(kVideoFrameKey);
2382 EXPECT_TRUE(DecodeCompleteFrame());
2383 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2384 clock_->TimeInMilliseconds());
2385 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2386 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2387 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002388 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002389 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2390 EXPECT_FALSE(DecodeCompleteFrame());
2391 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2392 EXPECT_TRUE(DecodeCompleteFrame());
2393 EXPECT_TRUE(DecodeCompleteFrame());
2394}
2395
philipel85130292016-07-06 16:10:31 +02002396TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002397 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002398 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002399 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002400 InsertFrame(kVideoFrameKey);
2401 EXPECT_TRUE(DecodeCompleteFrame());
2402}
2403
philipel85130292016-07-06 16:10:31 +02002404TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002405 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002406 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002407 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002408
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002409 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2410 // old packet.
2411 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002412 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002413 EXPECT_EQ(kFlushIndicator,
2414 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002415 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002416
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002417 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002418 std::vector<uint16_t> nack_list =
2419 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002420 // No key frame will be requested since the jitter buffer is empty.
2421 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002422 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002423
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002424 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002425 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002426 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002427 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002428
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002429 // The next complete continuous frame isn't a key frame, but we're waiting
2430 // for one.
2431 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002432 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002433 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002434 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002435}
2436
philipel85130292016-07-06 16:10:31 +02002437TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002438 // Insert a key frame and decode it.
2439 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2440 EXPECT_TRUE(DecodeCompleteFrame());
2441
2442 // Insert a frame which should trigger a recycle until the next key frame.
2443 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2444
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002445 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002446 std::vector<uint16_t> nack_list =
2447 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002448 // Verify that the jitter buffer does not request a key frame.
2449 EXPECT_FALSE(request_key_frame);
2450 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002451 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002452 // Verify that we can decode the next frame.
2453 EXPECT_TRUE(DecodeCompleteFrame());
2454}
2455
philipel85130292016-07-06 16:10:31 +02002456TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002457 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002458 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002459 EXPECT_TRUE(DecodeCompleteFrame());
2460
2461 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002462 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002463 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002464 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002465 EXPECT_FALSE(DecodeCompleteFrame());
2466
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002467 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002468 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002469 // The jitter buffer is empty, so we won't request key frames until we get a
2470 // packet.
2471 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002472
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002473 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002474 // Now we have a packet in the jitter buffer, a key frame will be requested
2475 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002476 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002477 // The jitter buffer is empty, so we won't request key frames until we get a
2478 // packet.
2479 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002480 // The next complete continuous frame isn't a key frame, but we're waiting
2481 // for one.
2482 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002483 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002484 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002485 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002486 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002487}
2488
philipel85130292016-07-06 16:10:31 +02002489TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002490 DropFrame(10);
2491 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002492 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002493 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002494 std::vector<uint16_t> nack_list =
2495 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002496 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002497 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002498 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002499}
2500
philipel85130292016-07-06 16:10:31 +02002501TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002502 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002503 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002504 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002505 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002506 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002507 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002508 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002509 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002510 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002511 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002512}
2513
philipel85130292016-07-06 16:10:31 +02002514TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002515 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002516 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2517 clock_->TimeInMilliseconds());
2518 VCMPacket packet;
2519 stream_generator_->PopPacket(&packet, 0);
2520 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002521 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002522 EXPECT_FALSE(retransmitted);
2523 // Drop second packet.
2524 stream_generator_->PopPacket(&packet, 1);
2525 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2526 EXPECT_FALSE(retransmitted);
2527 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002528 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002529 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002530 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002531 EXPECT_EQ(1u, nack_list.size());
2532 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002533 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002534 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002535 EXPECT_EQ(kCompleteSession,
2536 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002537 EXPECT_TRUE(retransmitted);
2538 EXPECT_TRUE(DecodeCompleteFrame());
2539}
2540
philipel85130292016-07-06 16:10:31 +02002541TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002542 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002543 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002544 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002545 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002546 // Drop second packet.
2547 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2548 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002549 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002550 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002551 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002552 ASSERT_EQ(1u, nack_list.size());
2553 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002554 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002555 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002556 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002557}
2558
philipel85130292016-07-06 16:10:31 +02002559TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002560 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002561 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002562 // First frame is delta.
2563 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2564 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002565 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002566 // Drop second packet in frame.
2567 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2568 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2569 // Second frame is key.
2570 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2571 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002572 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002573 // Drop second packet in frame.
2574 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2575 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002576 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002577 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002578 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002579 ASSERT_EQ(1u, nack_list.size());
2580 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002581 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002582 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002583}
2584
philipel85130292016-07-06 16:10:31 +02002585TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002586 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002587 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002588
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002589 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002590 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002591
2592 // ----------------------------------------------------------------
2593 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2594 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002595 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002596 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002597 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002598 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002599 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002600 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002601 while (stream_generator_->PacketsRemaining() > 1) {
2602 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002603 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002604 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002605 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002606 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002607 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002608 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002609 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002610 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002611 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002612 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002613
2614 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002615 std::vector<uint16_t> nack_list =
2616 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002617 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002618 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002619 for (size_t i = 0; i < nack_list.size(); ++i)
2620 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002621}
2622
philipel85130292016-07-06 16:10:31 +02002623TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002624 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002625 // ------- ------------------------------------------------------------
2626 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2627 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002628 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002629 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002630 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002631 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002632 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002633 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002634 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002635 while (stream_generator_->PacketsRemaining() > 1) {
2636 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002637 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002638 EXPECT_FALSE(request_key_frame);
2639 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002640 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002641 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002642 }
2643 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002644 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002645 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002646 EXPECT_FALSE(DecodeCompleteFrame());
2647 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002648 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002649 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002650 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002651 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002652 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2653 for (size_t i = 0; i < nack_list.size(); ++i)
2654 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002655}
2656
philipel85130292016-07-06 16:10:31 +02002657TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002658 bool request_key_frame = false;
2659 // -----------------------------------
2660 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2661 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002662 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002663 InsertFrame(kVideoFrameKey);
2664 EXPECT_FALSE(request_key_frame);
2665 EXPECT_TRUE(DecodeCompleteFrame());
2666 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2667 clock_->TimeInMilliseconds());
2668 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2669 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002670 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002671 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002672 EXPECT_FALSE(request_key_frame);
2673 } else {
2674 stream_generator_->NextPacket(NULL); // Drop packet
2675 }
2676 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2677 clock_->TimeInMilliseconds());
2678 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2679 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002680 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002681 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002682 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002683 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002684 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002685 ASSERT_EQ(1u, nack_list.size());
2686 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002687}
2688
philipel85130292016-07-06 16:10:31 +02002689TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002690 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002691 InsertFrame(kVideoFrameKey);
2692 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002693 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002694 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2695 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002696
2697 // Far-into-the-future video frame, could be caused by resetting the encoder
2698 // or otherwise restarting. This should not fail when error when the packet is
2699 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002700 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002701 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2702 InsertFrame(kVideoFrameKey);
2703 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002704 nack_list = jitter_buffer_->GetNackList(&extended);
2705 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002706
2707 // Stream should be decodable from this point.
2708 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2709 InsertFrame(kVideoFrameDelta);
2710 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002711 nack_list = jitter_buffer_->GetNackList(&extended);
2712 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002713}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002714} // namespace webrtc