blob: 7e333aa6fd0b1a5170b25856ea87780ded2029d0 [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>();
Niels Möllerd5e02f02019-02-20 13:12:21 +010044 packet_.video_header.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;
Niels Möller8f7ce222019-03-21 15:43:58 +010050 packet_.frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +010051 packet_.video_header.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 }
Niels Möller075e7fd2019-03-12 12:29:22 +0100243 RTPHeader rtp_header;
244 RTPVideoHeader video_header;
245 rtp_header.sequenceNumber = seq_num_;
246 rtp_header.timestamp = timestamp_;
247 rtp_header.markerBit = true;
248 video_header.codec = kVideoCodecGeneric;
249 video_header.is_first_packet_in_frame = true;
250 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
Niels Möller8f7ce222019-03-21 15:43:58 +0100251 VideoFrameType::kVideoFrameDelta,
252 /*ntp_time_ms=*/0));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000253 }
254
255 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700256 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000257 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700258 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200259 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000260 }
261
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000262 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800263 unsigned int size,
264 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000265 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000266
Niels Möller9c843902019-01-11 10:21:35 +0100267 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000268 unsigned int i = 0;
269
270 if (startCode) {
271 EXPECT_EQ(0, outData[0]);
272 EXPECT_EQ(0, outData[1]);
273 EXPECT_EQ(0, outData[2]);
274 EXPECT_EQ(1, outData[3]);
275 i += 4;
276 }
277
Niels Möllerf0eee002018-11-28 16:31:29 +0100278 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000279 int count = 3;
280 for (; i < size; i++) {
281 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
282 i += 2;
283 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
284 EXPECT_EQ(0, outData[0]);
285 EXPECT_EQ(0, outData[1]);
286 EXPECT_EQ(0, outData[2]);
287 EXPECT_EQ(1, outData[3]);
288 i += 3;
289 } else {
290 EXPECT_EQ(count, outData[i]);
291 count++;
292 if (count == 10) {
293 count = 3;
294 }
295 }
296 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000297 }
298
299 uint16_t seq_num_;
300 uint32_t timestamp_;
301 int size_;
302 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800303 std::unique_ptr<VCMPacket> packet_;
304 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800305 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000306};
307
philipel83f831a2016-03-12 03:30:23 -0800308class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
309 public NackSender,
310 public KeyFrameRequestSender {
311 public:
312 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
313 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
314 sequence_numbers.end());
315 }
316
317 void RequestKeyFrame() { ++keyframe_requests_; }
318
philipel83f831a2016-03-12 03:30:23 -0800319 std::vector<uint16_t> nack_sent_;
320 int keyframe_requests_;
321
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000322 protected:
323 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000324
325 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000326 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000327 max_nack_list_size_ = 150;
328 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700329 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100330 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700331 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000332 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800333 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
334 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000335 memset(data_buffer_, 0, kDataBufferSize);
336 }
337
338 virtual void TearDown() {
339 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000340 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000341 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000342 }
343
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000344 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000345 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000346 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000347 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000348 EXPECT_TRUE(packet_available);
349 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000350 return kGeneralError; // Return here to avoid crashes below.
351 bool retransmitted = false;
352 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000353 }
354
355 VCMFrameBufferEnum InsertPacket(int index) {
356 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000357 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000358 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000359 EXPECT_TRUE(packet_available);
360 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000361 return kGeneralError; // Return here to avoid crashes below.
362 bool retransmitted = false;
363 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000364 }
365
Niels Möller87e2d782019-03-07 10:18:23 +0100366 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700367 stream_generator_->GenerateFrame(
Niels Möller8f7ce222019-03-21 15:43:58 +0100368 frame_type, (frame_type != VideoFrameType::kEmptyFrame) ? 1 : 0,
369 (frame_type == VideoFrameType::kEmptyFrame) ? 1 : 0,
370 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000371 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000372 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000373 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000374 }
375
Niels Möller87e2d782019-03-07 10:18:23 +0100376 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000377 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000378 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000379 VCMFrameBufferEnum ret = InsertFrame(frame_type);
380 if (ret < kNoError) {
381 ret_for_all = ret;
382 } else if (ret_for_all >= kNoError) {
383 ret_for_all = ret;
384 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000385 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000386 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000387 }
388
389 void DropFrame(int num_packets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100390 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta,
391 num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000392 clock_->TimeInMilliseconds());
393 for (int i = 0; i < num_packets; ++i)
394 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000395 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000396 }
397
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000398 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700399 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000400 if (!found_frame)
401 return false;
402
isheriff6b4b5f32016-06-08 00:24:21 -0700403 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200404 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000405 bool ret = (frame != NULL);
406 jitter_buffer_->ReleaseFrame(frame);
407 return ret;
408 }
409
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000410 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000411 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800412 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000413 size_t max_nack_list_size_;
414 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000415 uint8_t data_buffer_[kDataBufferSize];
416};
417
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000418class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000419 protected:
philipel85130292016-07-06 16:10:31 +0200420 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000421 virtual void SetUp() {
422 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000423 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000424 }
425
philipel9d3ab612015-12-21 04:12:39 -0800426 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000427};
428
philipel85130292016-07-06 16:10:31 +0200429TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000430 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000431 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000432 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000433
434 // No packets inserted.
435 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000436}
437
philipel85130292016-07-06 16:10:31 +0200438TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000439 // Always start with a complete key frame when not allowing errors.
Niels Möller8f7ce222019-03-21 15:43:58 +0100440 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100441 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000442 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000443 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000444
445 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000446 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800447 EXPECT_EQ(kCompleteSession,
448 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000449 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000450 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100451 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000452 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000453}
454
philipel85130292016-07-06 16:10:31 +0200455TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100456 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100457 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000458 packet_->markerBit = false;
459
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000460 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800461 EXPECT_EQ(kIncomplete,
462 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000463 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
464 // Should not be complete.
465 EXPECT_TRUE(frame_out == NULL);
466
467 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100468 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469 packet_->markerBit = true;
470 packet_->seqNum = seq_num_;
471
philipel9d3ab612015-12-21 04:12:39 -0800472 EXPECT_EQ(kCompleteSession,
473 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000474
475 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000476 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000477
Niels Möller8f7ce222019-03-21 15:43:58 +0100478 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000479 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480}
481
philipel85130292016-07-06 16:10:31 +0200482TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100483 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100484 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000485 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000486
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000487 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800488 EXPECT_EQ(kIncomplete,
489 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000490
491 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
492
493 // Frame should not be complete.
494 EXPECT_TRUE(frame_out == NULL);
495
496 // Insert 98 frames.
497 int loop = 0;
498 do {
499 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100500 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000501 packet_->markerBit = false;
502 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503
philipel9d3ab612015-12-21 04:12:39 -0800504 EXPECT_EQ(kIncomplete,
505 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000506 loop++;
507 } while (loop < 98);
508
509 // Insert last packet.
510 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100511 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000512 packet_->markerBit = true;
513 packet_->seqNum = seq_num_;
514
philipel9d3ab612015-12-21 04:12:39 -0800515 EXPECT_EQ(kCompleteSession,
516 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000517
518 frame_out = DecodeCompleteFrame();
519
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000520 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100521 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000522 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000523}
524
philipel85130292016-07-06 16:10:31 +0200525TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000526 // Always start with a complete key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +0100527 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100528 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000529 packet_->markerBit = true;
530
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000531 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800532 EXPECT_EQ(kCompleteSession,
533 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000534 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
535 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000536 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537
538 ++seq_num_;
539 packet_->seqNum = seq_num_;
540 packet_->markerBit = false;
Niels Möller8f7ce222019-03-21 15:43:58 +0100541 packet_->frameType = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000542 packet_->timestamp += 33 * 90;
543
philipel9d3ab612015-12-21 04:12:39 -0800544 EXPECT_EQ(kIncomplete,
545 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546
547 frame_out = DecodeCompleteFrame();
548
549 // Frame should not be complete.
550 EXPECT_TRUE(frame_out == NULL);
551
Niels Möllerd5e02f02019-02-20 13:12:21 +0100552 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553 // Insert 98 frames.
554 int loop = 0;
555 do {
556 ++seq_num_;
557 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000558
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000559 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800560 EXPECT_EQ(kIncomplete,
561 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000562 loop++;
563 } while (loop < 98);
564
565 // Insert the last packet.
566 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100567 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568 packet_->markerBit = true;
569 packet_->seqNum = seq_num_;
570
philipel9d3ab612015-12-21 04:12:39 -0800571 EXPECT_EQ(kCompleteSession,
572 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000573
574 frame_out = DecodeCompleteFrame();
575
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000576 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100577 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000578 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000579}
580
philipel85130292016-07-06 16:10:31 +0200581TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000582 // Insert the "first" packet last.
583 seq_num_ += 100;
Niels Möller8f7ce222019-03-21 15:43:58 +0100584 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100585 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000586 packet_->markerBit = true;
587 packet_->seqNum = seq_num_;
588 packet_->timestamp = timestamp_;
589
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000590 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800591 EXPECT_EQ(kIncomplete,
592 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593
594 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
595
596 EXPECT_TRUE(frame_out == NULL);
597
598 // Insert 98 packets.
599 int loop = 0;
600 do {
601 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100602 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000603 packet_->markerBit = false;
604 packet_->seqNum = seq_num_;
605
philipel9d3ab612015-12-21 04:12:39 -0800606 EXPECT_EQ(kIncomplete,
607 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000608 loop++;
609 } while (loop < 98);
610
611 // Insert the last packet.
612 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100613 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000614 packet_->markerBit = false;
615 packet_->seqNum = seq_num_;
616
philipel9d3ab612015-12-21 04:12:39 -0800617 EXPECT_EQ(kCompleteSession,
618 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000619
philipel9d3ab612015-12-21 04:12:39 -0800620 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000621
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000622 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000623
Niels Möller8f7ce222019-03-21 15:43:58 +0100624 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000625 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000626}
627
philipel85130292016-07-06 16:10:31 +0200628TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100629 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100630 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000631 packet_->markerBit = false;
632
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000633 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800634 EXPECT_EQ(kIncomplete,
635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000636
637 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
638
639 EXPECT_TRUE(frame_out == NULL);
640
641 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100642 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000643 packet_->markerBit = true;
644 packet_->seqNum = seq_num_;
645
philipel9d3ab612015-12-21 04:12:39 -0800646 EXPECT_EQ(kCompleteSession,
647 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648
649 // check that we fail to get frame since seqnum is not continuous
650 frame_out = DecodeCompleteFrame();
651 EXPECT_TRUE(frame_out == NULL);
652
653 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800654 timestamp_ -= 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +0100655 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100656 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000657 packet_->markerBit = false;
658 packet_->seqNum = seq_num_;
659 packet_->timestamp = timestamp_;
660
philipel9d3ab612015-12-21 04:12:39 -0800661 EXPECT_EQ(kIncomplete,
662 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000663
664 frame_out = DecodeCompleteFrame();
665
666 // It should not be complete.
667 EXPECT_TRUE(frame_out == NULL);
668
669 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100670 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000671 packet_->markerBit = true;
672 packet_->seqNum = seq_num_;
673
philipel9d3ab612015-12-21 04:12:39 -0800674 EXPECT_EQ(kCompleteSession,
675 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000676
677 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000678 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100679 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000680 jitter_buffer_->ReleaseFrame(frame_out);
681
682 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000683 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100684 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000685 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000686}
687
philipel85130292016-07-06 16:10:31 +0200688TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100689 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100690 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700691 packet_->markerBit = true;
692
693 // Send in an initial good packet/frame (Frame A) to start things off.
694 bool retransmitted = false;
695 EXPECT_EQ(kCompleteSession,
696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
697 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
698 EXPECT_TRUE(frame_out != NULL);
699 jitter_buffer_->ReleaseFrame(frame_out);
700
701 // Now send in a complete delta frame (Frame C), but with a sequence number
702 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möller8f7ce222019-03-21 15:43:58 +0100703 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700704 // Leave a gap of 2 sequence numbers and two frames.
705 packet_->seqNum = seq_num_ + 3;
706 packet_->timestamp = timestamp_ + (66 * 90);
707 // Still isFirst = marker = true.
708 // Session should be complete (frame is complete), but there's nothing to
709 // decode yet.
710 EXPECT_EQ(kCompleteSession,
711 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
712 frame_out = DecodeCompleteFrame();
713 EXPECT_TRUE(frame_out == NULL);
714
715 // Now send in a complete delta frame (Frame B) that is continuous from A, but
716 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
717 packet_->seqNum = seq_num_ + 1;
718 packet_->timestamp = timestamp_ + (33 * 90);
719 // Still isFirst = marker = true.
720 EXPECT_EQ(kCompleteSession,
721 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
722 frame_out = DecodeCompleteFrame();
723 EXPECT_TRUE(frame_out != NULL);
724 jitter_buffer_->ReleaseFrame(frame_out);
725
726 // But Frame C isn't continuous yet.
727 frame_out = DecodeCompleteFrame();
728 EXPECT_TRUE(frame_out == NULL);
729
730 // Add in the padding. These are empty packets (data length is 0) with no
731 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100732 RTPHeader rtp_header;
733 RTPVideoHeader video_header;
734 rtp_header.sequenceNumber = seq_num_ + 2;
735 rtp_header.timestamp = timestamp_ + (33 * 90);
736 rtp_header.markerBit = false;
737 video_header.codec = kVideoCodecGeneric;
738 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
739 VideoFrameType::kEmptyFrame, /*ntp_time_ms=*/0);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700740 EXPECT_EQ(kOldPacket,
741 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
742 empty_packet.seqNum += 1;
743 EXPECT_EQ(kOldPacket,
744 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
745
746 // But now Frame C should be ready!
747 frame_out = DecodeCompleteFrame();
748 EXPECT_TRUE(frame_out != NULL);
749 jitter_buffer_->ReleaseFrame(frame_out);
750}
751
philipel85130292016-07-06 16:10:31 +0200752TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100753 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100754 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000755 packet_->markerBit = false;
756 packet_->seqNum = seq_num_;
757 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000758 EXPECT_EQ(0, jitter_buffer_->num_packets());
759 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000760
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000761 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800762 EXPECT_EQ(kIncomplete,
763 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000764
765 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
766
767 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000768 EXPECT_EQ(1, jitter_buffer_->num_packets());
769 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000770
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000771 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800772 EXPECT_EQ(kDuplicatePacket,
773 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000774 EXPECT_EQ(2, jitter_buffer_->num_packets());
775 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000776
777 seq_num_++;
778 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000779 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100780 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000781
philipel9d3ab612015-12-21 04:12:39 -0800782 EXPECT_EQ(kCompleteSession,
783 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000784
785 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000786 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000787 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000788
Niels Möller8f7ce222019-03-21 15:43:58 +0100789 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000790 EXPECT_EQ(3, jitter_buffer_->num_packets());
791 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000792 jitter_buffer_->ReleaseFrame(frame_out);
793}
794
philipel85130292016-07-06 16:10:31 +0200795TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100796 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100797 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000798 packet_->markerBit = true;
799 packet_->seqNum = seq_num_;
800 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000801 EXPECT_EQ(0, jitter_buffer_->num_packets());
802 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
803
804 bool retransmitted = false;
805 // Insert first complete frame.
806 EXPECT_EQ(kCompleteSession,
807 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
808
809 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
810 ASSERT_TRUE(frame_out != NULL);
811 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100812 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000813 jitter_buffer_->ReleaseFrame(frame_out);
814
815 // Insert 3 delta frames.
816 for (uint16_t i = 1; i <= 3; ++i) {
817 packet_->seqNum = seq_num_ + i;
818 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +0100819 packet_->frameType = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000820 EXPECT_EQ(kCompleteSession,
821 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
822 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
823 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
824 }
825
826 // Retransmit second delta frame.
827 packet_->seqNum = seq_num_ + 2;
828 packet_->timestamp = timestamp_ + 66 * 90;
829
830 EXPECT_EQ(kDuplicatePacket,
831 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
832
833 EXPECT_EQ(5, jitter_buffer_->num_packets());
834 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
835
836 // Should be able to decode 3 delta frames, key frame already decoded.
837 for (size_t i = 0; i < 3; ++i) {
838 frame_out = DecodeCompleteFrame();
839 ASSERT_TRUE(frame_out != NULL);
840 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100841 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000842 jitter_buffer_->ReleaseFrame(frame_out);
843 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844}
845
philipel85130292016-07-06 16:10:31 +0200846TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700847 // Verify that JB skips forward to next base layer frame.
848 // -------------------------------------------------
849 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
850 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
851 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
852 // | ss | x | x | x | |
853 // -------------------------------------------------
854 // |<----------tl0idx:200--------->|<---tl0idx:201---
855
philipel29d88462018-08-08 14:26:00 +0200856 auto& vp9_header =
857 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
858
asapersson9a4cd872015-10-23 00:27:14 -0700859 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200860 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100861 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700862 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200863 vp9_header.flexible_mode = false;
864 vp9_header.spatial_idx = 0;
865 vp9_header.beginning_of_frame = true;
866 vp9_header.end_of_frame = true;
867 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700868
869 packet_->seqNum = 65485;
870 packet_->timestamp = 1000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100871 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200872 vp9_header.picture_id = 5;
873 vp9_header.tl0_pic_idx = 200;
874 vp9_header.temporal_idx = 0;
875 vp9_header.ss_data_available = true;
876 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700877 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
878 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
879
880 // Insert next temporal layer 0.
881 packet_->seqNum = 65489;
882 packet_->timestamp = 13000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100883 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200884 vp9_header.picture_id = 9;
885 vp9_header.tl0_pic_idx = 201;
886 vp9_header.temporal_idx = 0;
887 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700888 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
889
890 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200891 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100892 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700893 jitter_buffer_->ReleaseFrame(frame_out);
894
895 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200896 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100897 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700898 jitter_buffer_->ReleaseFrame(frame_out);
899}
900
philipel85130292016-07-06 16:10:31 +0200901TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700902 // Verify that frames are updated with SS data when SS packet is reordered.
903 // --------------------------------
904 // | 65486 | 65487 | 65485 |...
905 // | pid:6 | pid:7 | pid:5 |...
906 // | tid:2 | tid:1 | tid:0 |...
907 // | | | ss |
908 // --------------------------------
909 // |<--------tl0idx:200--------->|
910
philipel29d88462018-08-08 14:26:00 +0200911 auto& vp9_header =
912 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
913
asapersson9a4cd872015-10-23 00:27:14 -0700914 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200915 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100916 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700917 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200918 vp9_header.flexible_mode = false;
919 vp9_header.spatial_idx = 0;
920 vp9_header.beginning_of_frame = true;
921 vp9_header.end_of_frame = true;
922 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700923
924 packet_->seqNum = 65486;
925 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100926 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200927 vp9_header.picture_id = 6;
928 vp9_header.temporal_idx = 2;
929 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700930 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
931
932 packet_->seqNum = 65487;
933 packet_->timestamp = 9000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100934 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200935 vp9_header.picture_id = 7;
936 vp9_header.temporal_idx = 1;
937 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700938 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
939
940 // Insert first frame with SS data.
941 packet_->seqNum = 65485;
942 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100943 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100944 packet_->video_header.width = 352;
945 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200946 vp9_header.picture_id = 5;
947 vp9_header.temporal_idx = 0;
948 vp9_header.temporal_up_switch = false;
949 vp9_header.ss_data_available = true;
950 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700951 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
952 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
953
954 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200955 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100956 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700957 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
958 EXPECT_FALSE(
959 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
960 jitter_buffer_->ReleaseFrame(frame_out);
961
962 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200963 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100964 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700965 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
966 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
967 jitter_buffer_->ReleaseFrame(frame_out);
968
969 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200970 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100971 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700972 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
973 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
974 jitter_buffer_->ReleaseFrame(frame_out);
975}
976
philipel85130292016-07-06 16:10:31 +0200977TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700978 // Verify that frames are updated with SS data when SS packet is reordered.
979 // -----------------------------------------
980 // | 65486 | 65487 | 65485 | 65484 |...
981 // | pid:6 | pid:6 | pid:5 | pid:5 |...
982 // | tid:1 | tid:1 | tid:0 | tid:0 |...
983 // | sid:0 | sid:1 | sid:1 | sid:0 |...
984 // | t:6000 | t:6000 | t:3000 | t:3000 |
985 // | | | | ss |
986 // -----------------------------------------
987 // |<-----------tl0idx:200------------>|
988
philipel29d88462018-08-08 14:26:00 +0200989 auto& vp9_header =
990 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
991
asapersson9a4cd872015-10-23 00:27:14 -0700992 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200993 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200994 vp9_header.flexible_mode = false;
995 vp9_header.beginning_of_frame = true;
996 vp9_header.end_of_frame = true;
997 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700998
Niels Möllerd5e02f02019-02-20 13:12:21 +0100999 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001000 packet_->markerBit = false;
1001 packet_->seqNum = 65486;
1002 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001003 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001004 vp9_header.spatial_idx = 0;
1005 vp9_header.picture_id = 6;
1006 vp9_header.temporal_idx = 1;
1007 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001008 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1009
Niels Möllerd5e02f02019-02-20 13:12:21 +01001010 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001011 packet_->markerBit = true;
1012 packet_->seqNum = 65487;
Niels Möller8f7ce222019-03-21 15:43:58 +01001013 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001014 vp9_header.spatial_idx = 1;
1015 vp9_header.picture_id = 6;
1016 vp9_header.temporal_idx = 1;
1017 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001018 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1019
Niels Möllerd5e02f02019-02-20 13:12:21 +01001020 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001021 packet_->markerBit = true;
1022 packet_->seqNum = 65485;
1023 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001024 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001025 vp9_header.spatial_idx = 1;
1026 vp9_header.picture_id = 5;
1027 vp9_header.temporal_idx = 0;
1028 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001029 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1030
1031 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +01001032 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001033 packet_->markerBit = false;
1034 packet_->seqNum = 65484;
Niels Möller8f7ce222019-03-21 15:43:58 +01001035 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001036 packet_->video_header.width = 352;
1037 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +02001038 vp9_header.spatial_idx = 0;
1039 vp9_header.picture_id = 5;
1040 vp9_header.temporal_idx = 0;
1041 vp9_header.temporal_up_switch = false;
1042 vp9_header.ss_data_available = true;
1043 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001044 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1045 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1046
1047 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001048 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001049 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001050 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1051 EXPECT_FALSE(
1052 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1053 jitter_buffer_->ReleaseFrame(frame_out);
1054
1055 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001056 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001057 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001058 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1059 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1060 jitter_buffer_->ReleaseFrame(frame_out);
1061}
1062
philipel85130292016-07-06 16:10:31 +02001063TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001064 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001065 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001066 packet_->markerBit = false;
1067 packet_->seqNum = seq_num_;
1068 packet_->timestamp = timestamp_;
1069 packet_->insertStartCode = true;
1070
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001071 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001072 EXPECT_EQ(kIncomplete,
1073 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001074
1075 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1076
1077 // Frame should not be complete.
1078 EXPECT_TRUE(frame_out == NULL);
1079
1080 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001081 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001082 packet_->markerBit = true;
1083 packet_->seqNum = seq_num_;
1084
philipel9d3ab612015-12-21 04:12:39 -08001085 EXPECT_EQ(kCompleteSession,
1086 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001087
1088 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001089 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +01001090 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001091 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001092}
1093
stefana669a3a2016-10-06 05:04:52 -07001094TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001095 auto& h264_header =
1096 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001097 packet_->timestamp = timestamp_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001098 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001099 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001100 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001101 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001102 h264_header.nalu_type = H264::NaluType::kIdr;
1103 h264_header.nalus[0].type = H264::NaluType::kIdr;
1104 h264_header.nalus[0].sps_id = -1;
1105 h264_header.nalus[0].pps_id = 0;
1106 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001107 bool retransmitted = false;
1108 EXPECT_EQ(kCompleteSession,
1109 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1110 // Not decodable since sps and pps are missing.
1111 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1112
1113 timestamp_ += 3000;
1114 packet_->timestamp = timestamp_;
1115 ++seq_num_;
1116 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001117 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001118 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001119 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001120 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001121 h264_header.nalu_type = H264::NaluType::kStapA;
1122 h264_header.nalus[0].type = H264::NaluType::kSps;
1123 h264_header.nalus[0].sps_id = 0;
1124 h264_header.nalus[0].pps_id = -1;
1125 h264_header.nalus[1].type = H264::NaluType::kPps;
1126 h264_header.nalus[1].sps_id = 0;
1127 h264_header.nalus[1].pps_id = 0;
1128 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001129 // Not complete since the marker bit hasn't been received.
1130 EXPECT_EQ(kIncomplete,
1131 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1132
1133 ++seq_num_;
1134 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001135 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001136 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001137 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001138 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001139 h264_header.nalu_type = H264::NaluType::kIdr;
1140 h264_header.nalus[0].type = H264::NaluType::kIdr;
1141 h264_header.nalus[0].sps_id = -1;
1142 h264_header.nalus[0].pps_id = 0;
1143 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001144 // Complete and decodable since the pps and sps are received in the first
1145 // packet of this frame.
1146 EXPECT_EQ(kCompleteSession,
1147 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1148 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1149 ASSERT_NE(nullptr, frame_out);
1150 jitter_buffer_->ReleaseFrame(frame_out);
1151
1152 timestamp_ += 3000;
1153 packet_->timestamp = timestamp_;
1154 ++seq_num_;
1155 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001156 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001157 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001158 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001159 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001160 h264_header.nalu_type = H264::NaluType::kSlice;
1161 h264_header.nalus[0].type = H264::NaluType::kSlice;
1162 h264_header.nalus[0].sps_id = -1;
1163 h264_header.nalus[0].pps_id = 0;
1164 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001165 // Complete and decodable since sps, pps and key frame has been received.
1166 EXPECT_EQ(kCompleteSession,
1167 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1168 frame_out = DecodeCompleteFrame();
1169 ASSERT_NE(nullptr, frame_out);
1170 jitter_buffer_->ReleaseFrame(frame_out);
1171}
1172
philipel85130292016-07-06 16:10:31 +02001173TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001174 seq_num_ = 0xfff0;
Niels Möller8f7ce222019-03-21 15:43:58 +01001175 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001176 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001177 packet_->markerBit = false;
1178 packet_->seqNum = seq_num_;
1179 packet_->timestamp = timestamp_;
1180
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001181 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001182 EXPECT_EQ(kIncomplete,
1183 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001184
1185 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1186
1187 EXPECT_TRUE(frame_out == NULL);
1188
1189 int loop = 0;
1190 do {
1191 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001192 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001193 packet_->markerBit = false;
1194 packet_->seqNum = seq_num_;
1195
philipel9d3ab612015-12-21 04:12:39 -08001196 EXPECT_EQ(kIncomplete,
1197 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001198
1199 frame_out = DecodeCompleteFrame();
1200
1201 EXPECT_TRUE(frame_out == NULL);
1202
1203 loop++;
1204 } while (loop < 98);
1205
1206 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001207 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001208 packet_->markerBit = true;
1209 packet_->seqNum = seq_num_;
1210
philipel9d3ab612015-12-21 04:12:39 -08001211 EXPECT_EQ(kCompleteSession,
1212 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001213
1214 frame_out = DecodeCompleteFrame();
1215
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001216 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001217
Niels Möller8f7ce222019-03-21 15:43:58 +01001218 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001219 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001220}
1221
philipel85130292016-07-06 16:10:31 +02001222TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001223 // Insert "first" packet last seqnum.
1224 seq_num_ = 10;
Niels Möller8f7ce222019-03-21 15:43:58 +01001225 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001226 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001227 packet_->markerBit = true;
1228 packet_->seqNum = seq_num_;
1229
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001230 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001231 EXPECT_EQ(kIncomplete,
1232 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001233 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1234
1235 // Should not be complete.
1236 EXPECT_TRUE(frame_out == NULL);
1237
1238 // Insert 98 frames.
1239 int loop = 0;
1240 do {
1241 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001242 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001243 packet_->markerBit = false;
1244 packet_->seqNum = seq_num_;
1245
philipel9d3ab612015-12-21 04:12:39 -08001246 EXPECT_EQ(kIncomplete,
1247 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001248
1249 frame_out = DecodeCompleteFrame();
1250
1251 EXPECT_TRUE(frame_out == NULL);
1252
1253 loop++;
1254 } while (loop < 98);
1255
1256 // Insert last packet.
1257 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001258 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001259 packet_->markerBit = false;
1260 packet_->seqNum = seq_num_;
1261
philipel9d3ab612015-12-21 04:12:39 -08001262 EXPECT_EQ(kCompleteSession,
1263 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001264
1265 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001266 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001267 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001268 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001269}
1270
philipel85130292016-07-06 16:10:31 +02001271TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001272 // ------- -------
1273 // | 2 | | 1 |
1274 // ------- -------
1275 // t = 3000 t = 2000
1276 seq_num_ = 2;
1277 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001278 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001279 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001280 packet_->markerBit = true;
1281 packet_->timestamp = timestamp_;
1282 packet_->seqNum = seq_num_;
1283
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001284 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001285 EXPECT_EQ(kCompleteSession,
1286 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001287
1288 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001289 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001290 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001291 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001292 jitter_buffer_->ReleaseFrame(frame_out);
1293
1294 seq_num_--;
1295 timestamp_ = 2000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001296 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001297 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001298 packet_->markerBit = true;
1299 packet_->seqNum = seq_num_;
1300 packet_->timestamp = timestamp_;
1301
philipel9d3ab612015-12-21 04:12:39 -08001302 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001303}
1304
philipel85130292016-07-06 16:10:31 +02001305TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001306 // ------- -------
1307 // | 2 | | 1 |
1308 // ------- -------
1309 // t = 3000 t = 0xffffff00
1310
1311 seq_num_ = 2;
1312 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001313 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001314 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001315 packet_->markerBit = true;
1316 packet_->seqNum = seq_num_;
1317 packet_->timestamp = timestamp_;
1318
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001319 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001320 EXPECT_EQ(kCompleteSession,
1321 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001322
1323 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001324 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001325
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001326 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001327
Niels Möller8f7ce222019-03-21 15:43:58 +01001328 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001329
1330 jitter_buffer_->ReleaseFrame(frame_out);
1331
1332 seq_num_--;
1333 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001334 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001335 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001336 packet_->markerBit = true;
1337 packet_->seqNum = seq_num_;
1338 packet_->timestamp = timestamp_;
1339
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001340 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001341 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001342}
1343
philipel85130292016-07-06 16:10:31 +02001344TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001345 // --------------- ---------------
1346 // | 1 | 2 | | 3 | 4 |
1347 // --------------- ---------------
1348 // t = 0xffffff00 t = 33*90
1349
1350 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001351 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001352 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001353 packet_->markerBit = false;
1354 packet_->seqNum = seq_num_;
1355 packet_->timestamp = timestamp_;
1356
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001357 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001358 EXPECT_EQ(kIncomplete,
1359 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001360
1361 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001362 EXPECT_TRUE(frame_out == NULL);
1363
1364 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001365 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001366 packet_->markerBit = true;
1367 packet_->seqNum = seq_num_;
1368
philipel9d3ab612015-12-21 04:12:39 -08001369 EXPECT_EQ(kCompleteSession,
1370 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001371
1372 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001373 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001374 jitter_buffer_->ReleaseFrame(frame_out);
1375
1376 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001377 timestamp_ += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001378 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001379 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001380 packet_->markerBit = false;
1381 packet_->seqNum = seq_num_;
1382 packet_->timestamp = timestamp_;
1383
philipel9d3ab612015-12-21 04:12:39 -08001384 EXPECT_EQ(kIncomplete,
1385 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001386
1387 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001388 EXPECT_TRUE(frame_out == NULL);
1389
1390 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001391 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001392 packet_->markerBit = true;
1393 packet_->seqNum = seq_num_;
1394
philipel9d3ab612015-12-21 04:12:39 -08001395 EXPECT_EQ(kCompleteSession,
1396 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001397
1398 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001399 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001400 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001401 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001402}
1403
philipel85130292016-07-06 16:10:31 +02001404TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001405 // ------- -------
1406 // | 1 | | 2 |
1407 // ------- -------
1408 // t = 0xffffff00 t = 2700
1409
1410 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001411 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001412 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001413 packet_->markerBit = true;
1414 packet_->timestamp = timestamp_;
1415
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001416 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001417 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kCompleteSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420
1421 // Insert next frame.
1422 seq_num_++;
1423 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001424 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001425 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001426 packet_->markerBit = true;
1427 packet_->seqNum = seq_num_;
1428 packet_->timestamp = timestamp_;
1429
philipel9d3ab612015-12-21 04:12:39 -08001430 EXPECT_EQ(kCompleteSession,
1431 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001432
1433 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001434 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001435 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001436 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001437 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001438
1439 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001440 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001441 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001442 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001443 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001444}
1445
philipel85130292016-07-06 16:10:31 +02001446TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001447 // ------- -------
1448 // | 2 | | 1 |
1449 // ------- -------
1450 // t = 2700 t = 0xffffff00
1451
1452 seq_num_ = 2;
1453 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001454 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001455 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001456 packet_->markerBit = true;
1457 packet_->seqNum = seq_num_;
1458 packet_->timestamp = timestamp_;
1459
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001460 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001461 EXPECT_EQ(kCompleteSession,
1462 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001463
1464 // Insert second frame
1465 seq_num_--;
1466 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001467 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001468 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001469 packet_->markerBit = true;
1470 packet_->seqNum = seq_num_;
1471 packet_->timestamp = timestamp_;
1472
philipel9d3ab612015-12-21 04:12:39 -08001473 EXPECT_EQ(kCompleteSession,
1474 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001475
1476 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001477 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001478 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001479 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001480 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001481
1482 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001483 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001484 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001485 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001486 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001487}
1488
philipel85130292016-07-06 16:10:31 +02001489TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490 int loop = 0;
1491 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001492 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001493 // Insert kMaxPacketsInJitterBuffer into frame.
1494 do {
1495 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001496 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001497 packet_->markerBit = false;
1498 packet_->seqNum = seq_num_;
1499
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001500 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001501 EXPECT_EQ(kIncomplete,
1502 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 firstPacket = false;
1504 } else {
philipel9d3ab612015-12-21 04:12:39 -08001505 EXPECT_EQ(kIncomplete,
1506 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001507 }
1508
1509 loop++;
1510 } while (loop < kMaxPacketsInSession);
1511
1512 // Max number of packets inserted.
1513 // Insert one more packet.
1514 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001515 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001516 packet_->markerBit = true;
1517 packet_->seqNum = seq_num_;
1518
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001520 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001521 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522}
1523
philipel85130292016-07-06 16:10:31 +02001524TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001525 // TEST fill JB with more than max number of frame (50 delta frames +
1526 // 51 key frames) with wrap in seq_num_
1527 //
1528 // --------------------------------------------------------------
1529 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1530 // --------------------------------------------------------------
1531 // |<-----------delta frames------------->|<------key frames----->|
1532
jbauchdb81ffd2015-11-23 03:59:02 -08001533 // Make sure the jitter doesn't request a keyframe after too much non-
1534 // decodable frames.
1535 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001536 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001537
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001538 int loop = 0;
1539 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001540 uint32_t first_key_frame_timestamp = 0;
1541 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001542 // Insert MAX_NUMBER_OF_FRAMES frames.
1543 do {
philipel9d3ab612015-12-21 04:12:39 -08001544 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001545 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001546 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547 packet_->markerBit = true;
1548 packet_->seqNum = seq_num_;
1549 packet_->timestamp = timestamp_;
1550
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001551 if (loop == 50) {
1552 first_key_frame_timestamp = packet_->timestamp;
Niels Möller8f7ce222019-03-21 15:43:58 +01001553 packet_->frameType = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001554 }
1555
1556 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001557 EXPECT_EQ(kCompleteSession,
1558 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559
1560 loop++;
1561 } while (loop < kMaxNumberOfFrames);
1562
1563 // Max number of frames inserted.
1564
1565 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001566 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001567 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001568 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001569 packet_->markerBit = true;
1570 packet_->seqNum = seq_num_;
1571 packet_->timestamp = timestamp_;
1572
1573 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001574 EXPECT_EQ(kFlushIndicator,
1575 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001577 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001578 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001579 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001580 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001581 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582}
1583
philipel85130292016-07-06 16:10:31 +02001584TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001585 seq_num_ = 3;
1586 // Insert one empty packet per frame, should never return the last timestamp
1587 // inserted. Only return empty frames in the presence of subsequent frames.
1588 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001589 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001590 for (int i = 0; i < maxSize + 10; i++) {
1591 timestamp_ += 33 * 90;
1592 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001593 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001594 packet_->markerBit = false;
1595 packet_->seqNum = seq_num_;
1596 packet_->timestamp = timestamp_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001597 packet_->frameType = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001598
philipel9d3ab612015-12-21 04:12:39 -08001599 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001600 }
1601}
1602
philipel85130292016-07-06 16:10:31 +02001603TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001604 // Test that a we cannot get incomplete frames from the JB if we haven't
1605 // received the marker bit, unless we have received a packet from a later
1606 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001607 // Start with a complete key frame - insert and decode.
Niels Möller8f7ce222019-03-21 15:43:58 +01001608 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001609 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001610 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001611 bool retransmitted = false;
1612
philipel9d3ab612015-12-21 04:12:39 -08001613 EXPECT_EQ(kCompleteSession,
1614 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1616 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001617 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618
1619 packet_->seqNum += 2;
1620 packet_->timestamp += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001621 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001622 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001623 packet_->markerBit = false;
1624
Niels Möller375b3462019-01-10 15:35:56 +01001625 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001628 packet_->seqNum += 2;
1629 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001630 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001631
Niels Möller375b3462019-01-10 15:35:56 +01001632 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001633 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634}
1635
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001636TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001637 // Make sure the jitter doesn't request a keyframe after too much non-
1638 // decodable frames.
1639 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001640 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001641 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001642 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001643 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001644 DropFrame(1);
1645 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001646 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1647 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001648 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001649 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001650 // This frame will make the jitter buffer recycle frames until a key frame.
1651 // Since none is found it will have to wait until the next key frame before
1652 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001653 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001654 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001655}
1656
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001657TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001658 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001659 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001660 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001661 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001662 // Insert empty packet.
1663 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001664 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001665 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001666 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001667 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001668 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001669 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001670 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001671 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001672 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001673 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001674 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001675}
1676
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001677TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1678 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001679 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001680 // Can't decode without a key frame.
1681 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001682 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001683 // Skip to the next key frame.
1684 EXPECT_TRUE(DecodeCompleteFrame());
1685}
1686
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001687TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001688 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001689 EXPECT_TRUE(DecodeCompleteFrame());
1690 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001691 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1692 kNoError);
1693 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001694 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1695 EXPECT_TRUE(DecodeCompleteFrame());
1696 }
1697}
1698
1699TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001700 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001701 EXPECT_TRUE(DecodeCompleteFrame());
1702 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001703 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1704 kNoError);
1705 InsertFrame(VideoFrameType::kVideoFrameKey);
1706 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1707 kNoError);
1708 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001709 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1710 EXPECT_TRUE(DecodeCompleteFrame());
1711 }
1712}
1713
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001714TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001715 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001716 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001717 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001718 clock_->TimeInMilliseconds());
1719 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001720 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001721 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001722 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001723 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1724 EXPECT_FALSE(DecodeCompleteFrame());
1725 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1726 EXPECT_TRUE(DecodeCompleteFrame());
1727 EXPECT_TRUE(DecodeCompleteFrame());
1728}
1729
philipel85130292016-07-06 16:10:31 +02001730TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001731 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00001732 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
Niels Möller8f7ce222019-03-21 15:43:58 +01001733 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1734 kNoError);
1735 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001736 EXPECT_TRUE(DecodeCompleteFrame());
1737}
1738
philipel85130292016-07-06 16:10:31 +02001739TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001740 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001741 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001742 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001743
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001744 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1745 // old packet.
1746 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001747 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001748 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1749 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001750 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001751
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001752 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001753 std::vector<uint16_t> nack_list =
1754 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001755 // No key frame will be requested since the jitter buffer is empty.
1756 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001757 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001758
Niels Möller8f7ce222019-03-21 15:43:58 +01001759 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001760 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001761 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001762
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001763 // The next complete continuous frame isn't a key frame, but we're waiting
1764 // for one.
1765 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001766 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001767 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001768 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001769}
1770
philipel85130292016-07-06 16:10:31 +02001771TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001772 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001773 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001774 EXPECT_TRUE(DecodeCompleteFrame());
1775
1776 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001777 EXPECT_GE(
1778 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1779 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001780
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001781 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001782 std::vector<uint16_t> nack_list =
1783 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001784 // Verify that the jitter buffer does not request a key frame.
1785 EXPECT_FALSE(request_key_frame);
1786 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001787 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001788 // Verify that we can decode the next frame.
1789 EXPECT_TRUE(DecodeCompleteFrame());
1790}
1791
philipel85130292016-07-06 16:10:31 +02001792TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001793 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001794 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001795 EXPECT_TRUE(DecodeCompleteFrame());
1796
1797 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001798 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001799 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001800 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001801 EXPECT_FALSE(DecodeCompleteFrame());
1802
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001803 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001804 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001805 // The jitter buffer is empty, so we won't request key frames until we get a
1806 // packet.
1807 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001808
Niels Möller8f7ce222019-03-21 15:43:58 +01001809 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001810 // Now we have a packet in the jitter buffer, a key frame will be requested
1811 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001812 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001813 // The jitter buffer is empty, so we won't request key frames until we get a
1814 // packet.
1815 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001816 // The next complete continuous frame isn't a key frame, but we're waiting
1817 // for one.
1818 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001819 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001820 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001821 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001822}
1823
philipel85130292016-07-06 16:10:31 +02001824TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001825 DropFrame(10);
1826 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001827 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001828 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001829 std::vector<uint16_t> nack_list =
1830 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001831 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001832 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001833 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001834}
1835
philipel85130292016-07-06 16:10:31 +02001836TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001837 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001838 InsertFrame(VideoFrameType::kVideoFrameKey);
1839 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001840 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001841 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001842 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001843 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001844 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001845 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001846 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001847}
1848
philipel85130292016-07-06 16:10:31 +02001849TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001850 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001851 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001852 clock_->TimeInMilliseconds());
1853 VCMPacket packet;
1854 stream_generator_->PopPacket(&packet, 0);
1855 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001856 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001857 EXPECT_FALSE(retransmitted);
1858 // Drop second packet.
1859 stream_generator_->PopPacket(&packet, 1);
1860 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1861 EXPECT_FALSE(retransmitted);
1862 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001863 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001864 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001865 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001866 EXPECT_EQ(1u, nack_list.size());
1867 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001868 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001869 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001870 EXPECT_EQ(kCompleteSession,
1871 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001872 EXPECT_TRUE(retransmitted);
1873 EXPECT_TRUE(DecodeCompleteFrame());
1874}
1875
philipel85130292016-07-06 16:10:31 +02001876TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001877 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001878 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001879 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001880 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001881 // Drop second packet.
1882 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1883 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001884 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001885 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001886 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001887 ASSERT_EQ(1u, nack_list.size());
1888 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001889 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001890 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001891 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001892}
1893
philipel85130292016-07-06 16:10:31 +02001894TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001895 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001896 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001897 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001898 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001899 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001900 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001901 // Drop second packet in frame.
1902 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1903 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1904 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001905 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001906 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001907 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001908 // Drop second packet in frame.
1909 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1910 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001911 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001912 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001913 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001914 ASSERT_EQ(1u, nack_list.size());
1915 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001916 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001917 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001918}
1919
philipel85130292016-07-06 16:10:31 +02001920TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001921 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001922
Niels Möller8f7ce222019-03-21 15:43:58 +01001923 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001924 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001925
1926 // ----------------------------------------------------------------
1927 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1928 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001929 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001930 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001931 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001932 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001933 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001934 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001935 while (stream_generator_->PacketsRemaining() > 1) {
1936 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001937 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001938 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001939 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001940 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001941 }
Niels Möller375b3462019-01-10 15:35:56 +01001942 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001943 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001944 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001945 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001946
1947 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001948 std::vector<uint16_t> nack_list =
1949 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001950 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001951 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001952 for (size_t i = 0; i < nack_list.size(); ++i)
1953 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001954}
1955
philipel85130292016-07-06 16:10:31 +02001956TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001957 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001958 // ------- ------------------------------------------------------------
1959 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1960 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001961 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001962 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001963 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001964 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001965 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001966 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001967 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001968 while (stream_generator_->PacketsRemaining() > 1) {
1969 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001970 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001971 EXPECT_FALSE(request_key_frame);
1972 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001973 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001974 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001975 }
1976 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001977 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001978 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001979 EXPECT_FALSE(DecodeCompleteFrame());
1980 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001981 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001982 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001983 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001984 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001985 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1986 for (size_t i = 0; i < nack_list.size(); ++i)
1987 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001988}
1989
philipel85130292016-07-06 16:10:31 +02001990TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001991 bool request_key_frame = false;
1992 // -----------------------------------
1993 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1994 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001995 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001996 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001997 EXPECT_FALSE(request_key_frame);
1998 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001999 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002000 clock_->TimeInMilliseconds());
2001 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2002 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002003 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002004 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002005 EXPECT_FALSE(request_key_frame);
2006 } else {
2007 stream_generator_->NextPacket(NULL); // Drop packet
2008 }
Niels Möller8f7ce222019-03-21 15:43:58 +01002009 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002010 clock_->TimeInMilliseconds());
2011 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2012 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002013 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002014 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002015 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002016 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002017 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002018 ASSERT_EQ(1u, nack_list.size());
2019 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002020}
2021
philipel85130292016-07-06 16:10:31 +02002022TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002023 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01002024 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002025 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002026 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002027 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2028 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002029
2030 // Far-into-the-future video frame, could be caused by resetting the encoder
2031 // or otherwise restarting. This should not fail when error when the packet is
2032 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002033 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002034 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002035 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002036 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002037 nack_list = jitter_buffer_->GetNackList(&extended);
2038 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002039
2040 // Stream should be decodable from this point.
2041 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002042 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002043 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002044 nack_list = jitter_buffer_->GetNackList(&extended);
2045 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002046}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002047} // namespace webrtc