blob: c2f5ed3326164a59107ccac78a740ea39a4eba18 [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"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/location.h"
24#include "system_wrappers/include/clock.h"
25#include "system_wrappers/include/field_trial.h"
26#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "test/field_trial.h"
28#include "test/gmock.h"
29#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000030
31namespace webrtc {
32
asapersson9a4cd872015-10-23 00:27:14 -070033namespace {
philipel9d3ab612015-12-21 04:12:39 -080034const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070035} // namespace
36
37class Vp9SsMapTest : public ::testing::Test {
38 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020039 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070040
41 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020042 auto& vp9_header =
43 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
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;
philipel29d88462018-08-08 14:26:00 +020053 vp9_header.flexible_mode = false;
54 vp9_header.gof_idx = 0;
55 vp9_header.temporal_idx = kNoTemporalIdx;
56 vp9_header.temporal_up_switch = false;
57 vp9_header.ss_data_available = true;
58 vp9_header.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) {
philipel29d88462018-08-08 14:26:00 +020072 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
73 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070074 EXPECT_FALSE(map_.Insert(packet_));
75}
76
77TEST_F(Vp9SsMapTest, Find) {
78 EXPECT_TRUE(map_.Insert(packet_));
79 Vp9SsMap::SsMap::iterator it;
80 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
81 EXPECT_EQ(packet_.timestamp, it->first);
82}
83
84TEST_F(Vp9SsMapTest, Find_WithWrap) {
85 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
86 const uint32_t kSsTimestamp2 = 100;
87 packet_.timestamp = kSsTimestamp1;
88 EXPECT_TRUE(map_.Insert(packet_));
89 packet_.timestamp = kSsTimestamp2;
90 EXPECT_TRUE(map_.Insert(packet_));
91 Vp9SsMap::SsMap::iterator it;
92 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
93 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(0, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
98 EXPECT_EQ(kSsTimestamp1, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
100 EXPECT_EQ(kSsTimestamp2, it->first);
101 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
102 EXPECT_EQ(kSsTimestamp2, it->first);
103}
104
105TEST_F(Vp9SsMapTest, Reset) {
106 EXPECT_TRUE(map_.Insert(packet_));
107 Vp9SsMap::SsMap::iterator it;
108 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
109 EXPECT_EQ(packet_.timestamp, it->first);
110
111 map_.Reset();
112 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
113}
114
115TEST_F(Vp9SsMapTest, RemoveOld) {
116 Vp9SsMap::SsMap::iterator it;
117 const uint32_t kSsTimestamp1 = 10000;
118 packet_.timestamp = kSsTimestamp1;
119 EXPECT_TRUE(map_.Insert(packet_));
120
121 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
122 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
123 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
124
125 map_.RemoveOld(kTimestamp);
126 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
127 EXPECT_TRUE(map_.Find(kTimestamp, &it));
128 EXPECT_EQ(kTimestamp, it->first);
129}
130
131TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
132 Vp9SsMap::SsMap::iterator it;
133 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
134 const uint32_t kSsTimestamp2 = 10;
135 const uint32_t kSsTimestamp3 = 1000;
136 packet_.timestamp = kSsTimestamp1;
137 EXPECT_TRUE(map_.Insert(packet_));
138 packet_.timestamp = kSsTimestamp2;
139 EXPECT_TRUE(map_.Insert(packet_));
140 packet_.timestamp = kSsTimestamp3;
141 EXPECT_TRUE(map_.Insert(packet_));
142
143 map_.RemoveOld(kSsTimestamp3);
144 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
145 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
146 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
147}
148
149TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200150 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
151 0;
asapersson9a4cd872015-10-23 00:27:14 -0700152 EXPECT_FALSE(map_.UpdatePacket(&packet_));
153}
154
155TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
156 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200157 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
158 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700159 EXPECT_FALSE(map_.UpdatePacket(&packet_));
160}
161
162TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
163 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200164 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
165 4;
asapersson9a4cd872015-10-23 00:27:14 -0700166 EXPECT_FALSE(map_.UpdatePacket(&packet_));
167}
168
169TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200170 auto& vp9_header =
171 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700172 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
173
philipel29d88462018-08-08 14:26:00 +0200174 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700175 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200176 EXPECT_EQ(0, vp9_header.temporal_idx);
177 EXPECT_FALSE(vp9_header.temporal_up_switch);
178 EXPECT_EQ(1U, vp9_header.num_ref_pics);
179 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700180
philipel29d88462018-08-08 14:26:00 +0200181 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700182 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200183 EXPECT_EQ(2, vp9_header.temporal_idx);
184 EXPECT_TRUE(vp9_header.temporal_up_switch);
185 EXPECT_EQ(1U, vp9_header.num_ref_pics);
186 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700187
philipel29d88462018-08-08 14:26:00 +0200188 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700189 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200190 EXPECT_EQ(1, vp9_header.temporal_idx);
191 EXPECT_TRUE(vp9_header.temporal_up_switch);
192 EXPECT_EQ(1U, vp9_header.num_ref_pics);
193 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700194
philipel29d88462018-08-08 14:26:00 +0200195 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700196 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200197 EXPECT_EQ(2, vp9_header.temporal_idx);
198 EXPECT_TRUE(vp9_header.temporal_up_switch);
199 EXPECT_EQ(1U, vp9_header.num_ref_pics);
200 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700201}
202
philipel83f831a2016-03-12 03:30:23 -0800203class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
204 public NackSender,
205 public KeyFrameRequestSender {
206 public:
207 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
208 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
209 sequence_numbers.end());
210 }
211
212 void RequestKeyFrame() override { ++keyframe_requests_; }
213
philipel83f831a2016-03-12 03:30:23 -0800214 std::vector<uint16_t> nack_sent_;
215 int keyframe_requests_;
216
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000217 protected:
philipel85130292016-07-06 16:10:31 +0200218 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700219 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700221 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100222 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 jitter_buffer_->Start();
224 seq_num_ = 1234;
225 timestamp_ = 0;
226 size_ = 1400;
227 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
228 data_[0] = 0;
229 data_[1] = 0;
230 data_[2] = 0x80;
231 int count = 3;
232 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
233 data_[i] = count;
234 count++;
235 if (count == 10) {
236 data_[i + 1] = 0;
237 data_[i + 2] = 0;
238 data_[i + 3] = 0x80;
239 count = 3;
240 i += 3;
241 }
242 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200243 WebRtcRTPHeader rtpHeader;
244 memset(&rtpHeader, 0, sizeof(rtpHeader));
245 rtpHeader.header.sequenceNumber = seq_num_;
246 rtpHeader.header.timestamp = timestamp_;
247 rtpHeader.header.markerBit = true;
248 rtpHeader.frameType = kVideoFrameDelta;
Magnus Jedvert22341212018-07-11 14:27:49 +0200249 rtpHeader.video_header().codec = kVideoCodecGeneric;
250 rtpHeader.video_header().is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200251 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000252 }
253
254 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700255 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700257 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200258 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000259 }
260
261 VCMEncodedFrame* DecodeIncompleteFrame() {
262 uint32_t timestamp = 0;
263 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
264 if (!found_frame)
265 return NULL;
266 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
267 return frame;
268 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000269
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000270 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800271 unsigned int size,
272 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000273 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000274
Niels Möller9c843902019-01-11 10:21:35 +0100275 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000276 unsigned int i = 0;
277
278 if (startCode) {
279 EXPECT_EQ(0, outData[0]);
280 EXPECT_EQ(0, outData[1]);
281 EXPECT_EQ(0, outData[2]);
282 EXPECT_EQ(1, outData[3]);
283 i += 4;
284 }
285
Niels Möllerf0eee002018-11-28 16:31:29 +0100286 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000287 int count = 3;
288 for (; i < size; i++) {
289 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
290 i += 2;
291 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
292 EXPECT_EQ(0, outData[0]);
293 EXPECT_EQ(0, outData[1]);
294 EXPECT_EQ(0, outData[2]);
295 EXPECT_EQ(1, outData[3]);
296 i += 3;
297 } else {
298 EXPECT_EQ(count, outData[i]);
299 count++;
300 if (count == 10) {
301 count = 3;
302 }
303 }
304 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000305 }
306
307 uint16_t seq_num_;
308 uint32_t timestamp_;
309 int size_;
310 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800311 std::unique_ptr<VCMPacket> packet_;
312 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800313 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000314};
315
philipel83f831a2016-03-12 03:30:23 -0800316class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
317 public NackSender,
318 public KeyFrameRequestSender {
319 public:
320 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
321 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
322 sequence_numbers.end());
323 }
324
325 void RequestKeyFrame() { ++keyframe_requests_; }
326
philipel83f831a2016-03-12 03:30:23 -0800327 std::vector<uint16_t> nack_sent_;
328 int keyframe_requests_;
329
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000330 protected:
331 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000332
333 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000334 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000335 max_nack_list_size_ = 150;
336 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700337 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100338 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700339 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000340 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800341 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
342 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000343 memset(data_buffer_, 0, kDataBufferSize);
344 }
345
346 virtual void TearDown() {
347 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000348 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000350 }
351
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000352 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000353 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000354 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000355 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000356 EXPECT_TRUE(packet_available);
357 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000358 return kGeneralError; // Return here to avoid crashes below.
359 bool retransmitted = false;
360 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000361 }
362
363 VCMFrameBufferEnum InsertPacket(int index) {
364 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000365 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000366 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000367 EXPECT_TRUE(packet_available);
368 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000369 return kGeneralError; // Return here to avoid crashes below.
370 bool retransmitted = false;
371 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000372 }
373
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000374 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700375 stream_generator_->GenerateFrame(
376 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
377 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000378 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000379 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000380 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000381 }
382
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000383 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
384 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000385 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000386 VCMFrameBufferEnum ret = InsertFrame(frame_type);
387 if (ret < kNoError) {
388 ret_for_all = ret;
389 } else if (ret_for_all >= kNoError) {
390 ret_for_all = ret;
391 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000393 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000394 }
395
396 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000397 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000398 clock_->TimeInMilliseconds());
399 for (int i = 0; i < num_packets; ++i)
400 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000401 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000402 }
403
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000404 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700405 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000406 if (!found_frame)
407 return false;
408
isheriff6b4b5f32016-06-08 00:24:21 -0700409 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200410 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000411 bool ret = (frame != NULL);
412 jitter_buffer_->ReleaseFrame(frame);
413 return ret;
414 }
415
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000416 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000417 uint32_t timestamp = 0;
418 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
419 if (!found_frame)
420 return false;
421 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000422 bool ret = (frame != NULL);
423 jitter_buffer_->ReleaseFrame(frame);
424 return ret;
425 }
426
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000427 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000428 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800429 std::unique_ptr<SimulatedClock> clock_;
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
philipel29d88462018-08-08 14:26:00 +0200923 auto& vp9_header =
924 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
925
asapersson9a4cd872015-10-23 00:27:14 -0700926 bool re = false;
927 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200928 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800929 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700930 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200931 vp9_header.flexible_mode = false;
932 vp9_header.spatial_idx = 0;
933 vp9_header.beginning_of_frame = true;
934 vp9_header.end_of_frame = true;
935 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700936
937 packet_->seqNum = 65485;
938 packet_->timestamp = 1000;
939 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200940 vp9_header.picture_id = 5;
941 vp9_header.tl0_pic_idx = 200;
942 vp9_header.temporal_idx = 0;
943 vp9_header.ss_data_available = true;
944 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700945 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
946 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
947
948 // Insert next temporal layer 0.
949 packet_->seqNum = 65489;
950 packet_->timestamp = 13000;
951 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200952 vp9_header.picture_id = 9;
953 vp9_header.tl0_pic_idx = 201;
954 vp9_header.temporal_idx = 0;
955 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700956 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
957
958 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200959 EXPECT_EQ(1000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700960 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
961 jitter_buffer_->ReleaseFrame(frame_out);
962
963 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200964 EXPECT_EQ(13000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700965 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
966 jitter_buffer_->ReleaseFrame(frame_out);
967}
968
philipel85130292016-07-06 16:10:31 +0200969TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700970 // Verify that frames are updated with SS data when SS packet is reordered.
971 // --------------------------------
972 // | 65486 | 65487 | 65485 |...
973 // | pid:6 | pid:7 | pid:5 |...
974 // | tid:2 | tid:1 | tid:0 |...
975 // | | | ss |
976 // --------------------------------
977 // |<--------tl0idx:200--------->|
978
philipel29d88462018-08-08 14:26:00 +0200979 auto& vp9_header =
980 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
981
asapersson9a4cd872015-10-23 00:27:14 -0700982 bool re = false;
983 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200984 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800985 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700986 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200987 vp9_header.flexible_mode = false;
988 vp9_header.spatial_idx = 0;
989 vp9_header.beginning_of_frame = true;
990 vp9_header.end_of_frame = true;
991 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700992
993 packet_->seqNum = 65486;
994 packet_->timestamp = 6000;
995 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200996 vp9_header.picture_id = 6;
997 vp9_header.temporal_idx = 2;
998 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700999 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1000
1001 packet_->seqNum = 65487;
1002 packet_->timestamp = 9000;
1003 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001004 vp9_header.picture_id = 7;
1005 vp9_header.temporal_idx = 1;
1006 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001007 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1008
1009 // Insert first frame with SS data.
1010 packet_->seqNum = 65485;
1011 packet_->timestamp = 3000;
1012 packet_->frameType = kVideoFrameKey;
1013 packet_->width = 352;
1014 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001015 vp9_header.picture_id = 5;
1016 vp9_header.temporal_idx = 0;
1017 vp9_header.temporal_up_switch = false;
1018 vp9_header.ss_data_available = true;
1019 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001020 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1021 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1022
1023 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001024 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001025 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1026 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1027 EXPECT_FALSE(
1028 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1029 jitter_buffer_->ReleaseFrame(frame_out);
1030
1031 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001032 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001033 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1034 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1036 jitter_buffer_->ReleaseFrame(frame_out);
1037
1038 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001039 EXPECT_EQ(9000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001040 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1041 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1042 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1043 jitter_buffer_->ReleaseFrame(frame_out);
1044}
1045
philipel85130292016-07-06 16:10:31 +02001046TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001047 // Verify that frames are updated with SS data when SS packet is reordered.
1048 // -----------------------------------------
1049 // | 65486 | 65487 | 65485 | 65484 |...
1050 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1051 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1052 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1053 // | t:6000 | t:6000 | t:3000 | t:3000 |
1054 // | | | | ss |
1055 // -----------------------------------------
1056 // |<-----------tl0idx:200------------>|
1057
philipel29d88462018-08-08 14:26:00 +02001058 auto& vp9_header =
1059 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1060
asapersson9a4cd872015-10-23 00:27:14 -07001061 bool re = false;
1062 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001063 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001064 vp9_header.flexible_mode = false;
1065 vp9_header.beginning_of_frame = true;
1066 vp9_header.end_of_frame = true;
1067 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001068
johan0d1b2b62017-01-10 04:21:35 -08001069 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001070 packet_->markerBit = false;
1071 packet_->seqNum = 65486;
1072 packet_->timestamp = 6000;
1073 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001074 vp9_header.spatial_idx = 0;
1075 vp9_header.picture_id = 6;
1076 vp9_header.temporal_idx = 1;
1077 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001078 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1079
johan0d1b2b62017-01-10 04:21:35 -08001080 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001081 packet_->markerBit = true;
1082 packet_->seqNum = 65487;
1083 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001084 vp9_header.spatial_idx = 1;
1085 vp9_header.picture_id = 6;
1086 vp9_header.temporal_idx = 1;
1087 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001088 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1089
johan0d1b2b62017-01-10 04:21:35 -08001090 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001091 packet_->markerBit = true;
1092 packet_->seqNum = 65485;
1093 packet_->timestamp = 3000;
1094 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001095 vp9_header.spatial_idx = 1;
1096 vp9_header.picture_id = 5;
1097 vp9_header.temporal_idx = 0;
1098 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001099 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1100
1101 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001102 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001103 packet_->markerBit = false;
1104 packet_->seqNum = 65484;
1105 packet_->frameType = kVideoFrameKey;
1106 packet_->width = 352;
1107 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001108 vp9_header.spatial_idx = 0;
1109 vp9_header.picture_id = 5;
1110 vp9_header.temporal_idx = 0;
1111 vp9_header.temporal_up_switch = false;
1112 vp9_header.ss_data_available = true;
1113 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001114 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1115 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1116
1117 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001118 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001119 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1120 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1121 EXPECT_FALSE(
1122 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1123 jitter_buffer_->ReleaseFrame(frame_out);
1124
1125 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001126 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001127 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1128 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1129 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1130 jitter_buffer_->ReleaseFrame(frame_out);
1131}
1132
philipel85130292016-07-06 16:10:31 +02001133TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001134 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001135 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001136 packet_->markerBit = false;
1137 packet_->seqNum = seq_num_;
1138 packet_->timestamp = timestamp_;
1139 packet_->insertStartCode = true;
1140
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001141 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001142 EXPECT_EQ(kIncomplete,
1143 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001144
1145 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1146
1147 // Frame should not be complete.
1148 EXPECT_TRUE(frame_out == NULL);
1149
1150 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001151 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152 packet_->markerBit = true;
1153 packet_->seqNum = seq_num_;
1154
philipel9d3ab612015-12-21 04:12:39 -08001155 EXPECT_EQ(kCompleteSession,
1156 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001157
1158 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001159 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001160 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001161 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001162}
1163
stefana669a3a2016-10-06 05:04:52 -07001164TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1165 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1166
philipel7d745e52018-08-02 14:03:53 +02001167 auto& h264_header =
1168 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001169 packet_->timestamp = timestamp_;
1170 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001171 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001172 packet_->markerBit = true;
1173 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001174 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001175 h264_header.nalu_type = H264::NaluType::kIdr;
1176 h264_header.nalus[0].type = H264::NaluType::kIdr;
1177 h264_header.nalus[0].sps_id = -1;
1178 h264_header.nalus[0].pps_id = 0;
1179 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001180 bool retransmitted = false;
1181 EXPECT_EQ(kCompleteSession,
1182 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1183 // Not decodable since sps and pps are missing.
1184 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1185
1186 timestamp_ += 3000;
1187 packet_->timestamp = timestamp_;
1188 ++seq_num_;
1189 packet_->seqNum = seq_num_;
1190 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001191 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001192 packet_->markerBit = false;
1193 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001194 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001195 h264_header.nalu_type = H264::NaluType::kStapA;
1196 h264_header.nalus[0].type = H264::NaluType::kSps;
1197 h264_header.nalus[0].sps_id = 0;
1198 h264_header.nalus[0].pps_id = -1;
1199 h264_header.nalus[1].type = H264::NaluType::kPps;
1200 h264_header.nalus[1].sps_id = 0;
1201 h264_header.nalus[1].pps_id = 0;
1202 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001203 // Not complete since the marker bit hasn't been received.
1204 EXPECT_EQ(kIncomplete,
1205 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1206
1207 ++seq_num_;
1208 packet_->seqNum = seq_num_;
1209 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001210 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001211 packet_->markerBit = true;
1212 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001213 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001214 h264_header.nalu_type = H264::NaluType::kIdr;
1215 h264_header.nalus[0].type = H264::NaluType::kIdr;
1216 h264_header.nalus[0].sps_id = -1;
1217 h264_header.nalus[0].pps_id = 0;
1218 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001219 // Complete and decodable since the pps and sps are received in the first
1220 // packet of this frame.
1221 EXPECT_EQ(kCompleteSession,
1222 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1223 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1224 ASSERT_NE(nullptr, frame_out);
1225 jitter_buffer_->ReleaseFrame(frame_out);
1226
1227 timestamp_ += 3000;
1228 packet_->timestamp = timestamp_;
1229 ++seq_num_;
1230 packet_->seqNum = seq_num_;
1231 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001232 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001233 packet_->markerBit = true;
1234 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001235 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001236 h264_header.nalu_type = H264::NaluType::kSlice;
1237 h264_header.nalus[0].type = H264::NaluType::kSlice;
1238 h264_header.nalus[0].sps_id = -1;
1239 h264_header.nalus[0].pps_id = 0;
1240 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001241 // Complete and decodable since sps, pps and key frame has been received.
1242 EXPECT_EQ(kCompleteSession,
1243 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1244 frame_out = DecodeCompleteFrame();
1245 ASSERT_NE(nullptr, frame_out);
1246 jitter_buffer_->ReleaseFrame(frame_out);
1247}
1248
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001249// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001250TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001251 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001252 // Always start with a key frame. Use 10 packets to test Decodable State
1253 // boundaries.
1254 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001255 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001256 packet_->markerBit = false;
1257 packet_->seqNum = seq_num_;
1258 packet_->timestamp = timestamp_;
1259
1260 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001261 EXPECT_EQ(kIncomplete,
1262 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001263 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001264 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001265 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1266
johan0d1b2b62017-01-10 04:21:35 -08001267 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001268 for (int i = 1; i < 9; ++i) {
1269 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001270 EXPECT_EQ(kIncomplete,
1271 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001272 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001273 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1274 }
1275
1276 // last packet
1277 packet_->markerBit = true;
1278 packet_->seqNum++;
1279
philipel9d3ab612015-12-21 04:12:39 -08001280 EXPECT_EQ(kCompleteSession,
1281 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001282 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1283 CheckOutFrame(frame_out, 10 * size_, false);
1284 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001285 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001286
1287 // An incomplete frame can only be decoded once a subsequent frame has begun
1288 // to arrive. Insert packet in distant frame for this purpose.
1289 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001290 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001291 packet_->markerBit = false;
1292 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001293 packet_->timestamp += 33 * 90 * 8;
1294
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_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1299
1300 // Insert second frame
1301 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001302 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001303
philipel9d3ab612015-12-21 04:12:39 -08001304 EXPECT_EQ(kDecodableSession,
1305 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001306 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001307 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1308
johan0d1b2b62017-01-10 04:21:35 -08001309 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001310 for (int i = 1; i < 8; ++i) {
1311 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001312 EXPECT_EQ(kDecodableSession,
1313 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001314 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001315 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1316 }
1317
1318 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001319 EXPECT_EQ(kDecodableSession,
1320 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001321 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001322 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1323
1324 frame_out = DecodeIncompleteFrame();
1325 ASSERT_FALSE(NULL == frame_out);
1326 CheckOutFrame(frame_out, 9 * size_, false);
1327 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001328 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001329
1330 packet_->markerBit = true;
1331 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001332 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001333}
1334
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001335// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001336TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001337 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1338 // Always start with a key frame.
1339 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001340 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001341 packet_->markerBit = true;
1342 packet_->seqNum = seq_num_;
1343 packet_->timestamp = timestamp_;
1344
1345 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001346 EXPECT_EQ(kCompleteSession,
1347 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1349 CheckOutFrame(frame_out, size_, false);
1350 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001351 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001352
1353 // An incomplete frame can only be decoded once a subsequent frame has begun
1354 // to arrive. Insert packet in distant frame for this purpose.
1355 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001356 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 packet_->markerBit = false;
1358 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001359 packet_->timestamp += 33 * 90 * 8;
1360 EXPECT_EQ(kIncomplete,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001362 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001363 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001364 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1365
1366 // Insert second frame - an incomplete key frame.
1367 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001368 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001369 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001370 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001371
philipel9d3ab612015-12-21 04:12:39 -08001372 EXPECT_EQ(kIncomplete,
1373 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001374 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001375 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1376
1377 // Insert a few more packets. Make sure we're waiting for the key frame to be
1378 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001379 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001380 for (int i = 1; i < 5; ++i) {
1381 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001382 EXPECT_EQ(kIncomplete,
1383 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001384 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001385 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1386 }
1387
1388 // Complete key frame.
1389 packet_->markerBit = true;
1390 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001391 EXPECT_EQ(kCompleteSession,
1392 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 frame_out = DecodeCompleteFrame();
1394 CheckOutFrame(frame_out, 6 * size_, false);
1395 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001396 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001397}
1398
1399// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001400TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001401 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1402 // Always start with a key frame.
1403 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001404 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001405 packet_->markerBit = true;
1406 packet_->seqNum = seq_num_;
1407 packet_->timestamp = timestamp_;
1408
1409 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001410 EXPECT_EQ(kCompleteSession,
1411 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001412 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1413 CheckOutFrame(frame_out, size_, false);
1414 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001415 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001416
1417 // An incomplete frame can only be decoded once a subsequent frame has begun
1418 // to arrive. Insert packet in distant frame for this purpose.
1419 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001420 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001421 packet_->markerBit = false;
1422 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001423 packet_->timestamp += 33 * 90 * 8;
1424 EXPECT_EQ(kIncomplete,
1425 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001426 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001427 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001428 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1429
1430 // Insert second frame with the first packet missing. Make sure we're waiting
1431 // for the key frame to be complete.
1432 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001433 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001434
philipel9d3ab612015-12-21 04:12:39 -08001435 EXPECT_EQ(kIncomplete,
1436 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001437 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001438 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1439
1440 for (int i = 0; i < 5; ++i) {
1441 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001442 EXPECT_EQ(kIncomplete,
1443 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001444 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001445 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1446 }
1447
1448 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001449 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001450 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001451 EXPECT_EQ(kDecodableSession,
1452 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001453 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001454 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1455
1456 frame_out = DecodeIncompleteFrame();
1457 CheckOutFrame(frame_out, 7 * size_, false);
1458 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001459 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001460}
1461
philipel85130292016-07-06 16:10:31 +02001462TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001463 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001464 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001465 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001466 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001467 packet_->markerBit = true;
1468 packet_->seqNum = seq_num_;
1469 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001470 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001471 EXPECT_EQ(kCompleteSession,
1472 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001473 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001474 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1475 EXPECT_NE(frame, nullptr);
Niels Möller23775882018-08-16 10:24:12 +02001476 EXPECT_EQ(packet_->timestamp, frame->Timestamp());
1477 frame = jitter_buffer_->ExtractAndSetDecode(frame->Timestamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001478 EXPECT_TRUE(frame != NULL);
1479 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001480
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001481 // Drop a complete frame.
1482 timestamp_ += 2 * 33 * 90;
1483 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001484 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001485 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001486 packet_->markerBit = false;
1487 packet_->seqNum = seq_num_;
1488 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001489 EXPECT_EQ(kDecodableSession,
1490 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001491 // Insert a packet (so the previous one will be released).
1492 timestamp_ += 33 * 90;
1493 seq_num_ += 2;
1494 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001495 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001496 packet_->markerBit = false;
1497 packet_->seqNum = seq_num_;
1498 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001499 EXPECT_EQ(kDecodableSession,
1500 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001501 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001502 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1503 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001504}
1505
philipel85130292016-07-06 16:10:31 +02001506TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001507 // Verify missing packets statistics and not decodable packets statistics.
1508 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1509 // The last packet is an empty (non-media) packet.
1510
1511 // Select a start seqNum which triggers a difficult wrap situation
1512 // The JB will only output (incomplete)frames if the next one has started
1513 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001514 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515 seq_num_ = 0xffff - 4;
1516 seq_num_++;
1517 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001518 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 packet_->markerBit = false;
1520 packet_->seqNum = seq_num_;
1521 packet_->timestamp = timestamp_;
1522 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001523
1524 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001525 EXPECT_EQ(kDecodableSession,
1526 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527 for (int i = 0; i < 11; ++i) {
1528 webrtc::FrameType frametype = kVideoFrameDelta;
1529 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001530 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001531 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001532 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001533 packet_->markerBit = false;
1534 packet_->seqNum = seq_num_;
1535 packet_->timestamp = timestamp_;
1536 packet_->completeNALU = kNaluStart;
1537
philipel9d3ab612015-12-21 04:12:39 -08001538 EXPECT_EQ(kDecodableSession,
1539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540
1541 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1542
1543 // Should not be complete.
1544 EXPECT_TRUE(frame_out == NULL);
1545
1546 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001547 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001548 packet_->markerBit = true;
1549 packet_->seqNum = seq_num_;
1550 packet_->completeNALU = kNaluEnd;
1551
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001552 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1553 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001554
1555 // Insert an empty (non-media) packet.
1556 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001557 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001558 packet_->markerBit = false;
1559 packet_->seqNum = seq_num_;
1560 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001561 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001563 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001564 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 frame_out = DecodeIncompleteFrame();
1566
1567 // One of the packets has been discarded by the jitter buffer.
1568 // Last frame can't be extracted yet.
1569 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001570 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571
1572 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001573 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001574 } else {
philipel9d3ab612015-12-21 04:12:39 -08001575 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576 }
1577 EXPECT_FALSE(frame_out->Complete());
1578 EXPECT_FALSE(frame_out->MissingFrame());
1579 }
1580
1581 jitter_buffer_->ReleaseFrame(frame_out);
1582 }
1583
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001584 // Insert 3 old packets and verify that we have 3 discarded packets
1585 // Match value to actual latest timestamp decoded.
1586 timestamp_ -= 33 * 90;
1587 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001588
philipel9d3ab612015-12-21 04:12:39 -08001589 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001590
1591 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001592
philipel9d3ab612015-12-21 04:12:39 -08001593 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001594
1595 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001596
philipel9d3ab612015-12-21 04:12:39 -08001597 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001598
1599 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1600
1601 jitter_buffer_->Flush();
1602
1603 // This statistic shouldn't be reset by a flush.
1604 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1605}
1606
philipel85130292016-07-06 16:10:31 +02001607TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001608 seq_num_ = 0xfff0;
1609 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001610 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001611 packet_->markerBit = false;
1612 packet_->seqNum = seq_num_;
1613 packet_->timestamp = timestamp_;
1614
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001615 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001616 EXPECT_EQ(kIncomplete,
1617 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618
1619 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1620
1621 EXPECT_TRUE(frame_out == NULL);
1622
1623 int loop = 0;
1624 do {
1625 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001626 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627 packet_->markerBit = false;
1628 packet_->seqNum = seq_num_;
1629
philipel9d3ab612015-12-21 04:12:39 -08001630 EXPECT_EQ(kIncomplete,
1631 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001632
1633 frame_out = DecodeCompleteFrame();
1634
1635 EXPECT_TRUE(frame_out == NULL);
1636
1637 loop++;
1638 } while (loop < 98);
1639
1640 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001641 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001642 packet_->markerBit = true;
1643 packet_->seqNum = seq_num_;
1644
philipel9d3ab612015-12-21 04:12:39 -08001645 EXPECT_EQ(kCompleteSession,
1646 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001647
1648 frame_out = DecodeCompleteFrame();
1649
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001650 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001651
1652 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001653 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654}
1655
philipel85130292016-07-06 16:10:31 +02001656TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001657 // Insert "first" packet last seqnum.
1658 seq_num_ = 10;
1659 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001660 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001661 packet_->markerBit = true;
1662 packet_->seqNum = seq_num_;
1663
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001664 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001665 EXPECT_EQ(kIncomplete,
1666 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001667 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1668
1669 // Should not be complete.
1670 EXPECT_TRUE(frame_out == NULL);
1671
1672 // Insert 98 frames.
1673 int loop = 0;
1674 do {
1675 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001676 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001677 packet_->markerBit = false;
1678 packet_->seqNum = seq_num_;
1679
philipel9d3ab612015-12-21 04:12:39 -08001680 EXPECT_EQ(kIncomplete,
1681 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001682
1683 frame_out = DecodeCompleteFrame();
1684
1685 EXPECT_TRUE(frame_out == NULL);
1686
1687 loop++;
1688 } while (loop < 98);
1689
1690 // Insert last packet.
1691 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001692 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 packet_->markerBit = false;
1694 packet_->seqNum = seq_num_;
1695
philipel9d3ab612015-12-21 04:12:39 -08001696 EXPECT_EQ(kCompleteSession,
1697 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001698
1699 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001700 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001701 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001702 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001703}
1704
philipel85130292016-07-06 16:10:31 +02001705TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001706 // ------- -------
1707 // | 2 | | 1 |
1708 // ------- -------
1709 // t = 3000 t = 2000
1710 seq_num_ = 2;
1711 timestamp_ = 3000;
1712 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001713 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 packet_->markerBit = true;
1715 packet_->timestamp = timestamp_;
1716 packet_->seqNum = seq_num_;
1717
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001718 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001719 EXPECT_EQ(kCompleteSession,
1720 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001721
1722 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001723 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001724 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001726 jitter_buffer_->ReleaseFrame(frame_out);
1727
1728 seq_num_--;
1729 timestamp_ = 2000;
1730 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001731 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001732 packet_->markerBit = true;
1733 packet_->seqNum = seq_num_;
1734 packet_->timestamp = timestamp_;
1735
philipel9d3ab612015-12-21 04:12:39 -08001736 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737}
1738
philipel85130292016-07-06 16:10:31 +02001739TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001740 // ------- -------
1741 // | 2 | | 1 |
1742 // ------- -------
1743 // t = 3000 t = 0xffffff00
1744
1745 seq_num_ = 2;
1746 timestamp_ = 3000;
1747 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001748 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749 packet_->markerBit = true;
1750 packet_->seqNum = seq_num_;
1751 packet_->timestamp = timestamp_;
1752
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001753 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001754 EXPECT_EQ(kCompleteSession,
1755 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001756
1757 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001758 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001759
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001760 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001761
1762 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1763
1764 jitter_buffer_->ReleaseFrame(frame_out);
1765
1766 seq_num_--;
1767 timestamp_ = 0xffffff00;
1768 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001769 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001770 packet_->markerBit = true;
1771 packet_->seqNum = seq_num_;
1772 packet_->timestamp = timestamp_;
1773
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001774 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001775 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001776}
1777
philipel85130292016-07-06 16:10:31 +02001778TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001779 // --------------- ---------------
1780 // | 1 | 2 | | 3 | 4 |
1781 // --------------- ---------------
1782 // t = 0xffffff00 t = 33*90
1783
1784 timestamp_ = 0xffffff00;
1785 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001786 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 packet_->markerBit = false;
1788 packet_->seqNum = seq_num_;
1789 packet_->timestamp = timestamp_;
1790
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001791 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001792 EXPECT_EQ(kIncomplete,
1793 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001794
1795 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796 EXPECT_TRUE(frame_out == NULL);
1797
1798 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001799 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001800 packet_->markerBit = true;
1801 packet_->seqNum = seq_num_;
1802
philipel9d3ab612015-12-21 04:12:39 -08001803 EXPECT_EQ(kCompleteSession,
1804 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001805
1806 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001807 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001808 jitter_buffer_->ReleaseFrame(frame_out);
1809
1810 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001811 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001812 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001813 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001814 packet_->markerBit = false;
1815 packet_->seqNum = seq_num_;
1816 packet_->timestamp = timestamp_;
1817
philipel9d3ab612015-12-21 04:12:39 -08001818 EXPECT_EQ(kIncomplete,
1819 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001820
1821 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822 EXPECT_TRUE(frame_out == NULL);
1823
1824 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001825 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001826 packet_->markerBit = true;
1827 packet_->seqNum = seq_num_;
1828
philipel9d3ab612015-12-21 04:12:39 -08001829 EXPECT_EQ(kCompleteSession,
1830 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001831
1832 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001833 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001835 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001836}
1837
philipel85130292016-07-06 16:10:31 +02001838TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839 // ------- -------
1840 // | 1 | | 2 |
1841 // ------- -------
1842 // t = 0xffffff00 t = 2700
1843
1844 timestamp_ = 0xffffff00;
1845 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001846 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001847 packet_->markerBit = true;
1848 packet_->timestamp = timestamp_;
1849
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001850 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001852 EXPECT_EQ(kCompleteSession,
1853 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001854
1855 // Insert next frame.
1856 seq_num_++;
1857 timestamp_ = 2700;
1858 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001859 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001860 packet_->markerBit = true;
1861 packet_->seqNum = seq_num_;
1862 packet_->timestamp = timestamp_;
1863
philipel9d3ab612015-12-21 04:12:39 -08001864 EXPECT_EQ(kCompleteSession,
1865 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001866
1867 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001868 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001869 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001871 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001872
1873 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001874 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001875 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001876 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001877 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878}
1879
philipel85130292016-07-06 16:10:31 +02001880TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001881 // ------- -------
1882 // | 2 | | 1 |
1883 // ------- -------
1884 // t = 2700 t = 0xffffff00
1885
1886 seq_num_ = 2;
1887 timestamp_ = 2700;
1888 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001889 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001890 packet_->markerBit = true;
1891 packet_->seqNum = seq_num_;
1892 packet_->timestamp = timestamp_;
1893
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001894 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001895 EXPECT_EQ(kCompleteSession,
1896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001897
1898 // Insert second frame
1899 seq_num_--;
1900 timestamp_ = 0xffffff00;
1901 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001902 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001903 packet_->markerBit = true;
1904 packet_->seqNum = seq_num_;
1905 packet_->timestamp = timestamp_;
1906
philipel9d3ab612015-12-21 04:12:39 -08001907 EXPECT_EQ(kCompleteSession,
1908 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001909
1910 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001911 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001912 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001913 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001914 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915
1916 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001917 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001918 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001919 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001920 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001921}
1922
philipel85130292016-07-06 16:10:31 +02001923TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001924 int loop = 0;
1925 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001926 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001927 // Insert kMaxPacketsInJitterBuffer into frame.
1928 do {
1929 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001930 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001931 packet_->markerBit = false;
1932 packet_->seqNum = seq_num_;
1933
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001935 EXPECT_EQ(kIncomplete,
1936 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001937 firstPacket = false;
1938 } else {
philipel9d3ab612015-12-21 04:12:39 -08001939 EXPECT_EQ(kIncomplete,
1940 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 }
1942
1943 loop++;
1944 } while (loop < kMaxPacketsInSession);
1945
1946 // Max number of packets inserted.
1947 // Insert one more packet.
1948 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001949 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001950 packet_->markerBit = true;
1951 packet_->seqNum = seq_num_;
1952
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001953 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001954 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001955 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001956}
1957
philipel85130292016-07-06 16:10:31 +02001958TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 // TEST fill JB with more than max number of frame (50 delta frames +
1960 // 51 key frames) with wrap in seq_num_
1961 //
1962 // --------------------------------------------------------------
1963 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1964 // --------------------------------------------------------------
1965 // |<-----------delta frames------------->|<------key frames----->|
1966
jbauchdb81ffd2015-11-23 03:59:02 -08001967 // Make sure the jitter doesn't request a keyframe after too much non-
1968 // decodable frames.
1969 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001970 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001971
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001972 int loop = 0;
1973 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001974 uint32_t first_key_frame_timestamp = 0;
1975 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976 // Insert MAX_NUMBER_OF_FRAMES frames.
1977 do {
philipel9d3ab612015-12-21 04:12:39 -08001978 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001979 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001980 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001981 packet_->markerBit = true;
1982 packet_->seqNum = seq_num_;
1983 packet_->timestamp = timestamp_;
1984
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001985 if (loop == 50) {
1986 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001987 packet_->frameType = kVideoFrameKey;
1988 }
1989
1990 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001991 EXPECT_EQ(kCompleteSession,
1992 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001993
1994 loop++;
1995 } while (loop < kMaxNumberOfFrames);
1996
1997 // Max number of frames inserted.
1998
1999 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08002000 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002002 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002003 packet_->markerBit = true;
2004 packet_->seqNum = seq_num_;
2005 packet_->timestamp = timestamp_;
2006
2007 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002008 EXPECT_EQ(kFlushIndicator,
2009 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002010
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002011 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02002012 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002013 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002014 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002015 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016}
2017
philipel85130292016-07-06 16:10:31 +02002018TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002019 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002020 seq_num_ = 3;
2021 // Insert one empty packet per frame, should never return the last timestamp
2022 // inserted. Only return empty frames in the presence of subsequent frames.
2023 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002024 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002025 for (int i = 0; i < maxSize + 10; i++) {
2026 timestamp_ += 33 * 90;
2027 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002028 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002029 packet_->markerBit = false;
2030 packet_->seqNum = seq_num_;
2031 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002032 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002033
philipel9d3ab612015-12-21 04:12:39 -08002034 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002035 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2036 // Timestamp should never be the last TS inserted.
2037 if (testFrame != NULL) {
Niels Möller23775882018-08-16 10:24:12 +02002038 EXPECT_TRUE(testFrame->Timestamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002039 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002040 }
2041 }
2042}
2043
philipel85130292016-07-06 16:10:31 +02002044TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002045 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002046 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002047 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048 timestamp_ += 33 * 90;
2049 int insertedLength = 0;
2050 packet_->seqNum = seq_num_;
2051 packet_->timestamp = timestamp_;
2052 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002053 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002054 packet_->completeNALU = kNaluStart;
2055 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002056 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002057
philipel9d3ab612015-12-21 04:12:39 -08002058 EXPECT_EQ(kDecodableSession,
2059 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002060
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002061 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002062 packet_->seqNum = seq_num_;
2063 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002064 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002065 packet_->completeNALU = kNaluIncomplete;
2066 packet_->markerBit = false;
2067
philipel9d3ab612015-12-21 04:12:39 -08002068 EXPECT_EQ(kDecodableSession,
2069 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002070
2071 seq_num_++;
2072 packet_->seqNum = seq_num_;
2073 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002074 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002075 packet_->completeNALU = kNaluEnd;
2076 packet_->markerBit = false;
2077
philipel9d3ab612015-12-21 04:12:39 -08002078 EXPECT_EQ(kDecodableSession,
2079 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002080
2081 seq_num_++;
2082 packet_->seqNum = seq_num_;
2083 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002084 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002085 EXPECT_EQ(kDecodableSession,
2086 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002087 // The JB will only output (incomplete) frames if a packet belonging to a
2088 // subsequent frame was already inserted. Insert one packet of a subsequent
2089 // frame. place high timestamp so the JB would always have a next frame
2090 // (otherwise, for every inserted frame we need to take care of the next
2091 // frame as well).
2092 packet_->seqNum = 1;
2093 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2094 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002095 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 packet_->completeNALU = kNaluStart;
2097 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002098
philipel9d3ab612015-12-21 04:12:39 -08002099 EXPECT_EQ(kDecodableSession,
2100 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101
2102 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2103
2104 // We can decode everything from a NALU until a packet has been lost.
2105 // Thus we can decode the first packet of the first NALU and the second NALU
2106 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002107 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108 jitter_buffer_->ReleaseFrame(frame_out);
2109
2110 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002111 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002112 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002113 insertedLength = 0;
2114
2115 packet_->seqNum = seq_num_;
2116 packet_->timestamp = timestamp_;
2117 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002118 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002119 packet_->completeNALU = kNaluEnd;
2120 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002121 EXPECT_EQ(kDecodableSession,
2122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2123 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002124 seq_num_--;
2125 packet_->seqNum = seq_num_;
2126 packet_->timestamp = timestamp_;
2127 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002128 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002129 packet_->completeNALU = kNaluStart;
2130 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002131
philipel9d3ab612015-12-21 04:12:39 -08002132 EXPECT_EQ(kDecodableSession,
2133 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002134 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2135
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002136 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137 packet_->seqNum = seq_num_;
2138 packet_->timestamp = timestamp_;
2139 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002140 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002141 packet_->completeNALU = kNaluComplete;
2142 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002143 EXPECT_EQ(kDecodableSession,
2144 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002145 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002146 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002147 packet_->seqNum = seq_num_;
2148 packet_->timestamp = timestamp_;
2149 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002150 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002151 packet_->completeNALU = kNaluStart;
2152 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002153 EXPECT_EQ(kDecodableSession,
2154 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155 // This packet should be decoded since it's the beginning of a NAL.
2156 insertedLength += packet_->sizeBytes;
2157
2158 seq_num_ += 2;
2159 packet_->seqNum = seq_num_;
2160 packet_->timestamp = timestamp_;
2161 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002162 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 packet_->completeNALU = kNaluEnd;
2164 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002165 EXPECT_EQ(kDecodableSession,
2166 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002167 // This packet should not be decoded because it is an incomplete NAL if it
2168 // is the last.
2169 frame_out = DecodeIncompleteFrame();
2170 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002171 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002172 jitter_buffer_->ReleaseFrame(frame_out);
2173
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002174 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002175 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002176 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002177 WebRtcRTPHeader rtpHeader;
2178 memset(&rtpHeader, 0, sizeof(rtpHeader));
Magnus Jedvert22341212018-07-11 14:27:49 +02002179 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002180 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002181 emptypacket.seqNum = seq_num_;
2182 emptypacket.timestamp = timestamp_;
2183 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002184 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002185 emptypacket.completeNALU = kNaluComplete;
2186 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002187 EXPECT_EQ(kCompleteSession,
2188 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002189 // This packet should not be decoded because it is an incomplete NAL if it
2190 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002191
2192 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2193 // has arrived.
2194 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002195 EXPECT_TRUE(frame_out != NULL);
2196 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002197
2198 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002199 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002200 timestamp_ += 33 * 90;
2201
2202 packet_->seqNum = seq_num_;
2203 packet_->timestamp = timestamp_;
2204 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002205 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002206 packet_->completeNALU = kNaluComplete;
2207 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002208
philipel9d3ab612015-12-21 04:12:39 -08002209 EXPECT_EQ(kDecodableSession,
2210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002211
agalusza@google.comd177c102013-08-08 01:12:33 +00002212 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002213 emptypacket.seqNum = seq_num_;
2214 emptypacket.timestamp = timestamp_;
2215 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002216 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002217 emptypacket.completeNALU = kNaluComplete;
2218 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002219 EXPECT_EQ(kCompleteSession,
2220 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002221
2222 frame_out = DecodeCompleteFrame();
2223 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002224 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002225 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002226}
2227
philipel85130292016-07-06 16:10:31 +02002228TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002229 // Test that a we cannot get incomplete frames from the JB if we haven't
2230 // received the marker bit, unless we have received a packet from a later
2231 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002232 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002233 // Start with a complete key frame - insert and decode.
2234 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002235 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002236 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002237 bool retransmitted = false;
2238
philipel9d3ab612015-12-21 04:12:39 -08002239 EXPECT_EQ(kCompleteSession,
2240 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002241 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2242 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002243 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002244
2245 packet_->seqNum += 2;
2246 packet_->timestamp += 33 * 90;
2247 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002248 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002249 packet_->markerBit = false;
2250
philipel9d3ab612015-12-21 04:12:39 -08002251 EXPECT_EQ(kDecodableSession,
2252 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002253
2254 frame_out = DecodeIncompleteFrame();
2255 EXPECT_TRUE(frame_out == NULL);
2256
2257 packet_->seqNum += 2;
2258 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002259 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002260
philipel9d3ab612015-12-21 04:12:39 -08002261 EXPECT_EQ(kDecodableSession,
2262 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002263
2264 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002265 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002266 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002267}
2268
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002269TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002270 // Make sure the jitter doesn't request a keyframe after too much non-
2271 // decodable frames.
2272 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002273 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002274 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002275 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002276 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002277 DropFrame(1);
2278 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002279 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002280 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002281 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002282 // This frame will make the jitter buffer recycle frames until a key frame.
2283 // Since none is found it will have to wait until the next key frame before
2284 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002285 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002286 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002287}
2288
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002289TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002290 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002291 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002292 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002293 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002294 // Insert empty packet.
2295 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002296 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002297 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002298 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002299 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002300 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002301 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002302 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002303 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002304 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002305 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002306 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002307}
2308
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002309TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002310 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2311 EXPECT_EQ(0, frame_stats.delta_frames);
2312 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002313
2314 uint32_t framerate = 0;
2315 uint32_t bitrate = 0;
2316 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2317 EXPECT_EQ(0u, framerate);
2318 EXPECT_EQ(0u, bitrate);
2319
2320 // Insert a couple of key and delta frames.
2321 InsertFrame(kVideoFrameKey);
2322 InsertFrame(kVideoFrameDelta);
2323 InsertFrame(kVideoFrameDelta);
2324 InsertFrame(kVideoFrameKey);
2325 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002326 // Decode some of them to make sure the statistics doesn't depend on frames
2327 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002328 EXPECT_TRUE(DecodeCompleteFrame());
2329 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002330 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002331 EXPECT_EQ(3, frame_stats.delta_frames);
2332 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002333
2334 // Insert 20 more frames to get estimates of bitrate and framerate over
2335 // 1 second.
2336 for (int i = 0; i < 20; ++i) {
2337 InsertFrame(kVideoFrameDelta);
2338 }
2339 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2340 // TODO(holmer): The current implementation returns the average of the last
2341 // two framerate calculations, which is why it takes two calls to reach the
2342 // actual framerate. This should be fixed.
2343 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2344 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2345 // Insert 25 more frames to get estimates of bitrate and framerate over
2346 // 2 seconds.
2347 for (int i = 0; i < 25; ++i) {
2348 InsertFrame(kVideoFrameDelta);
2349 }
2350 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2351 EXPECT_EQ(kDefaultFrameRate, framerate);
2352 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2353}
2354
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002355TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2356 // Insert delta frames.
2357 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2358 // Can't decode without a key frame.
2359 EXPECT_FALSE(DecodeCompleteFrame());
2360 InsertFrame(kVideoFrameKey);
2361 // Skip to the next key frame.
2362 EXPECT_TRUE(DecodeCompleteFrame());
2363}
2364
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002365TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2366 InsertFrame(kVideoFrameKey);
2367 EXPECT_TRUE(DecodeCompleteFrame());
2368 const int kNumDeltaFrames = 5;
2369 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2370 InsertFrame(kVideoFrameKey);
2371 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2372 EXPECT_TRUE(DecodeCompleteFrame());
2373 }
2374}
2375
2376TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2377 InsertFrame(kVideoFrameKey);
2378 EXPECT_TRUE(DecodeCompleteFrame());
2379 const int kNumDeltaFrames = 5;
2380 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2381 InsertFrame(kVideoFrameKey);
2382 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2383 InsertFrame(kVideoFrameKey);
2384 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2385 EXPECT_TRUE(DecodeCompleteFrame());
2386 }
2387}
2388
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002389TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2390 InsertFrame(kVideoFrameKey);
2391 EXPECT_TRUE(DecodeCompleteFrame());
2392 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2393 clock_->TimeInMilliseconds());
2394 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2395 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2396 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002397 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002398 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2399 EXPECT_FALSE(DecodeCompleteFrame());
2400 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2401 EXPECT_TRUE(DecodeCompleteFrame());
2402 EXPECT_TRUE(DecodeCompleteFrame());
2403}
2404
philipel85130292016-07-06 16:10:31 +02002405TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002406 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002407 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002408 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002409 InsertFrame(kVideoFrameKey);
2410 EXPECT_TRUE(DecodeCompleteFrame());
2411}
2412
philipel85130292016-07-06 16:10:31 +02002413TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002414 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002415 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002416 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002417
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002418 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2419 // old packet.
2420 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002421 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002422 EXPECT_EQ(kFlushIndicator,
2423 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002424 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002425
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002426 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002427 std::vector<uint16_t> nack_list =
2428 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002429 // No key frame will be requested since the jitter buffer is empty.
2430 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002431 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002432
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002433 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002434 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002435 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002436 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002437
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002438 // The next complete continuous frame isn't a key frame, but we're waiting
2439 // for one.
2440 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002441 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002442 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002443 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002444}
2445
philipel85130292016-07-06 16:10:31 +02002446TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002447 // Insert a key frame and decode it.
2448 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2449 EXPECT_TRUE(DecodeCompleteFrame());
2450
2451 // Insert a frame which should trigger a recycle until the next key frame.
2452 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2453
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002454 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002455 std::vector<uint16_t> nack_list =
2456 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002457 // Verify that the jitter buffer does not request a key frame.
2458 EXPECT_FALSE(request_key_frame);
2459 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002460 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002461 // Verify that we can decode the next frame.
2462 EXPECT_TRUE(DecodeCompleteFrame());
2463}
2464
philipel85130292016-07-06 16:10:31 +02002465TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002466 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002467 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002468 EXPECT_TRUE(DecodeCompleteFrame());
2469
2470 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002471 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002472 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002473 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002474 EXPECT_FALSE(DecodeCompleteFrame());
2475
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002476 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002477 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002478 // The jitter buffer is empty, so we won't request key frames until we get a
2479 // packet.
2480 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002481
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002482 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002483 // Now we have a packet in the jitter buffer, a key frame will be requested
2484 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002485 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002486 // The jitter buffer is empty, so we won't request key frames until we get a
2487 // packet.
2488 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002489 // The next complete continuous frame isn't a key frame, but we're waiting
2490 // for one.
2491 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002492 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002493 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002494 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002495 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002496}
2497
philipel85130292016-07-06 16:10:31 +02002498TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002499 DropFrame(10);
2500 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002501 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002502 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002503 std::vector<uint16_t> nack_list =
2504 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002505 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002506 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002507 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002508}
2509
philipel85130292016-07-06 16:10:31 +02002510TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002511 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002512 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002513 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002514 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002515 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002516 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002517 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002518 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002519 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002520 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002521}
2522
philipel85130292016-07-06 16:10:31 +02002523TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002524 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002525 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2526 clock_->TimeInMilliseconds());
2527 VCMPacket packet;
2528 stream_generator_->PopPacket(&packet, 0);
2529 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002530 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002531 EXPECT_FALSE(retransmitted);
2532 // Drop second packet.
2533 stream_generator_->PopPacket(&packet, 1);
2534 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2535 EXPECT_FALSE(retransmitted);
2536 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002537 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002538 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002539 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002540 EXPECT_EQ(1u, nack_list.size());
2541 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002542 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002543 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002544 EXPECT_EQ(kCompleteSession,
2545 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002546 EXPECT_TRUE(retransmitted);
2547 EXPECT_TRUE(DecodeCompleteFrame());
2548}
2549
philipel85130292016-07-06 16:10:31 +02002550TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002551 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002552 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002553 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002554 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002555 // Drop second packet.
2556 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2557 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002558 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002559 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002560 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002561 ASSERT_EQ(1u, nack_list.size());
2562 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002563 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002564 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002565 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002566}
2567
philipel85130292016-07-06 16:10:31 +02002568TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002569 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002570 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002571 // First frame is delta.
2572 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2573 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002574 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002575 // Drop second packet in frame.
2576 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2577 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2578 // Second frame is key.
2579 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2580 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002581 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002582 // Drop second packet in frame.
2583 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2584 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002585 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002586 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002587 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002588 ASSERT_EQ(1u, nack_list.size());
2589 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002590 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002591 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002592}
2593
philipel85130292016-07-06 16:10:31 +02002594TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002595 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002596 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002597
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002598 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002599 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002600
2601 // ----------------------------------------------------------------
2602 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2603 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002604 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002605 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002606 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002607 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002608 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002609 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002610 while (stream_generator_->PacketsRemaining() > 1) {
2611 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002612 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002613 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002614 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002615 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002616 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002617 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002618 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002619 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002620 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002621 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002622
2623 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002624 std::vector<uint16_t> nack_list =
2625 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002626 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002627 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002628 for (size_t i = 0; i < nack_list.size(); ++i)
2629 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002630}
2631
philipel85130292016-07-06 16:10:31 +02002632TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002633 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002634 // ------- ------------------------------------------------------------
2635 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2636 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002637 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002638 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002639 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002640 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002641 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002642 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002643 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002644 while (stream_generator_->PacketsRemaining() > 1) {
2645 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002646 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002647 EXPECT_FALSE(request_key_frame);
2648 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002649 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002650 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002651 }
2652 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002653 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002654 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002655 EXPECT_FALSE(DecodeCompleteFrame());
2656 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002657 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002658 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002659 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002660 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002661 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2662 for (size_t i = 0; i < nack_list.size(); ++i)
2663 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002664}
2665
philipel85130292016-07-06 16:10:31 +02002666TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002667 bool request_key_frame = false;
2668 // -----------------------------------
2669 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2670 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002671 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002672 InsertFrame(kVideoFrameKey);
2673 EXPECT_FALSE(request_key_frame);
2674 EXPECT_TRUE(DecodeCompleteFrame());
2675 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2676 clock_->TimeInMilliseconds());
2677 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2678 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002679 if (stream_generator_->NextSequenceNumber() != 65535) {
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);
2682 } else {
2683 stream_generator_->NextPacket(NULL); // Drop packet
2684 }
2685 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2686 clock_->TimeInMilliseconds());
2687 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2688 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002689 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002690 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002691 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002692 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002693 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002694 ASSERT_EQ(1u, nack_list.size());
2695 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002696}
2697
philipel85130292016-07-06 16:10:31 +02002698TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002699 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002700 InsertFrame(kVideoFrameKey);
2701 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002702 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002703 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2704 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002705
2706 // Far-into-the-future video frame, could be caused by resetting the encoder
2707 // or otherwise restarting. This should not fail when error when the packet is
2708 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002709 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002710 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2711 InsertFrame(kVideoFrameKey);
2712 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002713 nack_list = jitter_buffer_->GetNackList(&extended);
2714 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002715
2716 // Stream should be decodable from this point.
2717 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2718 InsertFrame(kVideoFrameDelta);
2719 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002720 nack_list = jitter_buffer_->GetNackList(&extended);
2721 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002722}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002723} // namespace webrtc