blob: f92c092835c15966908cbc29a61db3e97401c705 [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
Niels Möllerdb64d992019-03-29 14:30:53 +010017#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "common_video/h264/h264_common.h"
19#include "modules/video_coding/frame_buffer.h"
20#include "modules/video_coding/jitter_buffer.h"
21#include "modules/video_coding/media_opt_util.h"
22#include "modules/video_coding/packet.h"
23#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/field_trial.h"
29#include "test/gmock.h"
30#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000031
32namespace webrtc {
33
asapersson9a4cd872015-10-23 00:27:14 -070034namespace {
philipel9d3ab612015-12-21 04:12:39 -080035const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070036} // namespace
37
38class Vp9SsMapTest : public ::testing::Test {
39 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020040 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070041
42 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020043 auto& vp9_header =
44 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
Niels Möllerd5e02f02019-02-20 13:12:21 +010045 packet_.video_header.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020046 packet_.dataPtr = data_;
47 packet_.sizeBytes = 1400;
48 packet_.seqNum = 1234;
49 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070050 packet_.markerBit = true;
Niels Möller8f7ce222019-03-21 15:43:58 +010051 packet_.frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +010052 packet_.video_header.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020053 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020054 vp9_header.flexible_mode = false;
55 vp9_header.gof_idx = 0;
56 vp9_header.temporal_idx = kNoTemporalIdx;
57 vp9_header.temporal_up_switch = false;
58 vp9_header.ss_data_available = true;
59 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070060 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
61 }
62
63 Vp9SsMap map_;
64 uint8_t data_[1500];
65 VCMPacket packet_;
66};
67
68TEST_F(Vp9SsMapTest, Insert) {
69 EXPECT_TRUE(map_.Insert(packet_));
70}
71
72TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020073 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
74 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070075 EXPECT_FALSE(map_.Insert(packet_));
76}
77
78TEST_F(Vp9SsMapTest, Find) {
79 EXPECT_TRUE(map_.Insert(packet_));
80 Vp9SsMap::SsMap::iterator it;
81 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
82 EXPECT_EQ(packet_.timestamp, it->first);
83}
84
85TEST_F(Vp9SsMapTest, Find_WithWrap) {
86 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
87 const uint32_t kSsTimestamp2 = 100;
88 packet_.timestamp = kSsTimestamp1;
89 EXPECT_TRUE(map_.Insert(packet_));
90 packet_.timestamp = kSsTimestamp2;
91 EXPECT_TRUE(map_.Insert(packet_));
92 Vp9SsMap::SsMap::iterator it;
93 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
94 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
95 EXPECT_EQ(kSsTimestamp1, it->first);
96 EXPECT_TRUE(map_.Find(0, &it));
97 EXPECT_EQ(kSsTimestamp1, it->first);
98 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
99 EXPECT_EQ(kSsTimestamp1, it->first);
100 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
101 EXPECT_EQ(kSsTimestamp2, it->first);
102 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
103 EXPECT_EQ(kSsTimestamp2, it->first);
104}
105
106TEST_F(Vp9SsMapTest, Reset) {
107 EXPECT_TRUE(map_.Insert(packet_));
108 Vp9SsMap::SsMap::iterator it;
109 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
110 EXPECT_EQ(packet_.timestamp, it->first);
111
112 map_.Reset();
113 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
114}
115
116TEST_F(Vp9SsMapTest, RemoveOld) {
117 Vp9SsMap::SsMap::iterator it;
118 const uint32_t kSsTimestamp1 = 10000;
119 packet_.timestamp = kSsTimestamp1;
120 EXPECT_TRUE(map_.Insert(packet_));
121
122 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
123 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
124 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
125
126 map_.RemoveOld(kTimestamp);
127 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
128 EXPECT_TRUE(map_.Find(kTimestamp, &it));
129 EXPECT_EQ(kTimestamp, it->first);
130}
131
132TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
133 Vp9SsMap::SsMap::iterator it;
134 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
135 const uint32_t kSsTimestamp2 = 10;
136 const uint32_t kSsTimestamp3 = 1000;
137 packet_.timestamp = kSsTimestamp1;
138 EXPECT_TRUE(map_.Insert(packet_));
139 packet_.timestamp = kSsTimestamp2;
140 EXPECT_TRUE(map_.Insert(packet_));
141 packet_.timestamp = kSsTimestamp3;
142 EXPECT_TRUE(map_.Insert(packet_));
143
144 map_.RemoveOld(kSsTimestamp3);
145 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
146 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
147 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
148}
149
150TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200151 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
152 0;
asapersson9a4cd872015-10-23 00:27:14 -0700153 EXPECT_FALSE(map_.UpdatePacket(&packet_));
154}
155
156TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
157 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200158 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
159 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700160 EXPECT_FALSE(map_.UpdatePacket(&packet_));
161}
162
163TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
164 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200165 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
166 4;
asapersson9a4cd872015-10-23 00:27:14 -0700167 EXPECT_FALSE(map_.UpdatePacket(&packet_));
168}
169
170TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200171 auto& vp9_header =
172 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700173 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
174
philipel29d88462018-08-08 14:26:00 +0200175 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200177 EXPECT_EQ(0, vp9_header.temporal_idx);
178 EXPECT_FALSE(vp9_header.temporal_up_switch);
179 EXPECT_EQ(1U, vp9_header.num_ref_pics);
180 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700181
philipel29d88462018-08-08 14:26:00 +0200182 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200184 EXPECT_EQ(2, vp9_header.temporal_idx);
185 EXPECT_TRUE(vp9_header.temporal_up_switch);
186 EXPECT_EQ(1U, vp9_header.num_ref_pics);
187 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700188
philipel29d88462018-08-08 14:26:00 +0200189 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700190 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200191 EXPECT_EQ(1, vp9_header.temporal_idx);
192 EXPECT_TRUE(vp9_header.temporal_up_switch);
193 EXPECT_EQ(1U, vp9_header.num_ref_pics);
194 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700195
philipel29d88462018-08-08 14:26:00 +0200196 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700197 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200198 EXPECT_EQ(2, vp9_header.temporal_idx);
199 EXPECT_TRUE(vp9_header.temporal_up_switch);
200 EXPECT_EQ(1U, vp9_header.num_ref_pics);
201 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700202}
203
Niels Möllerdb64d992019-03-29 14:30:53 +0100204class TestBasicJitterBuffer : public ::testing::Test {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000205 protected:
philipel85130292016-07-06 16:10:31 +0200206 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700207 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000208 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700209 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +0100210 clock_.get(), absl::WrapUnique(EventWrapper::Create())));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000211 jitter_buffer_->Start();
212 seq_num_ = 1234;
213 timestamp_ = 0;
214 size_ = 1400;
215 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
216 data_[0] = 0;
217 data_[1] = 0;
218 data_[2] = 0x80;
219 int count = 3;
220 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
221 data_[i] = count;
222 count++;
223 if (count == 10) {
224 data_[i + 1] = 0;
225 data_[i + 2] = 0;
226 data_[i + 3] = 0x80;
227 count = 3;
228 i += 3;
229 }
230 }
Niels Möller075e7fd2019-03-12 12:29:22 +0100231 RTPHeader rtp_header;
232 RTPVideoHeader video_header;
233 rtp_header.sequenceNumber = seq_num_;
234 rtp_header.timestamp = timestamp_;
235 rtp_header.markerBit = true;
236 video_header.codec = kVideoCodecGeneric;
237 video_header.is_first_packet_in_frame = true;
238 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
Niels Möller8f7ce222019-03-21 15:43:58 +0100239 VideoFrameType::kVideoFrameDelta,
240 /*ntp_time_ms=*/0));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000241 }
242
243 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700244 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000245 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700246 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200247 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000248 }
249
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000250 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800251 unsigned int size,
252 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000253 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000254
Niels Möller9c843902019-01-11 10:21:35 +0100255 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 unsigned int i = 0;
257
258 if (startCode) {
259 EXPECT_EQ(0, outData[0]);
260 EXPECT_EQ(0, outData[1]);
261 EXPECT_EQ(0, outData[2]);
262 EXPECT_EQ(1, outData[3]);
263 i += 4;
264 }
265
Niels Möllerf0eee002018-11-28 16:31:29 +0100266 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000267 int count = 3;
268 for (; i < size; i++) {
269 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
270 i += 2;
271 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
272 EXPECT_EQ(0, outData[0]);
273 EXPECT_EQ(0, outData[1]);
274 EXPECT_EQ(0, outData[2]);
275 EXPECT_EQ(1, outData[3]);
276 i += 3;
277 } else {
278 EXPECT_EQ(count, outData[i]);
279 count++;
280 if (count == 10) {
281 count = 3;
282 }
283 }
284 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000285 }
286
287 uint16_t seq_num_;
288 uint32_t timestamp_;
289 int size_;
290 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800291 std::unique_ptr<VCMPacket> packet_;
292 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800293 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000294};
295
Niels Möllerdb64d992019-03-29 14:30:53 +0100296class TestRunningJitterBuffer : public ::testing::Test {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000297 protected:
298 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000299
300 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000301 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000302 max_nack_list_size_ = 150;
303 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700304 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +0100305 clock_.get(), absl::WrapUnique(EventWrapper::Create()));
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700306 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000307 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800308 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
309 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000310 memset(data_buffer_, 0, kDataBufferSize);
311 }
312
313 virtual void TearDown() {
314 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000315 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000316 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000317 }
318
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000319 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000320 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000321 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000322 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000323 EXPECT_TRUE(packet_available);
324 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000325 return kGeneralError; // Return here to avoid crashes below.
326 bool retransmitted = false;
327 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000328 }
329
330 VCMFrameBufferEnum InsertPacket(int index) {
331 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000332 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000333 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000334 EXPECT_TRUE(packet_available);
335 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000336 return kGeneralError; // Return here to avoid crashes below.
337 bool retransmitted = false;
338 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000339 }
340
Niels Möller87e2d782019-03-07 10:18:23 +0100341 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700342 stream_generator_->GenerateFrame(
Niels Möller8f7ce222019-03-21 15:43:58 +0100343 frame_type, (frame_type != VideoFrameType::kEmptyFrame) ? 1 : 0,
344 (frame_type == VideoFrameType::kEmptyFrame) ? 1 : 0,
345 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000346 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000347 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000348 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 }
350
Niels Möller87e2d782019-03-07 10:18:23 +0100351 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000352 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000353 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000354 VCMFrameBufferEnum ret = InsertFrame(frame_type);
355 if (ret < kNoError) {
356 ret_for_all = ret;
357 } else if (ret_for_all >= kNoError) {
358 ret_for_all = ret;
359 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000360 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000361 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000362 }
363
364 void DropFrame(int num_packets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100365 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta,
366 num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000367 clock_->TimeInMilliseconds());
368 for (int i = 0; i < num_packets; ++i)
369 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000370 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000371 }
372
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000373 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700374 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000375 if (!found_frame)
376 return false;
377
isheriff6b4b5f32016-06-08 00:24:21 -0700378 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200379 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000380 bool ret = (frame != NULL);
381 jitter_buffer_->ReleaseFrame(frame);
382 return ret;
383 }
384
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000385 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000386 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800387 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000388 size_t max_nack_list_size_;
389 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000390 uint8_t data_buffer_[kDataBufferSize];
391};
392
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000393class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000394 protected:
philipel85130292016-07-06 16:10:31 +0200395 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000396 virtual void SetUp() {
397 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000398 }
399
philipel9d3ab612015-12-21 04:12:39 -0800400 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000401};
402
philipel85130292016-07-06 16:10:31 +0200403TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000404 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000405 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000406 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000407
408 // No packets inserted.
409 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000410}
411
philipel85130292016-07-06 16:10:31 +0200412TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000413 // Always start with a complete key frame when not allowing errors.
Niels Möller8f7ce222019-03-21 15:43:58 +0100414 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100415 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000416 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000417 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000418
419 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000420 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800421 EXPECT_EQ(kCompleteSession,
422 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000423 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000424 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100425 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000426 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000427}
428
philipel85130292016-07-06 16:10:31 +0200429TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100430 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100431 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000432 packet_->markerBit = false;
433
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000434 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800435 EXPECT_EQ(kIncomplete,
436 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000437 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
438 // Should not be complete.
439 EXPECT_TRUE(frame_out == NULL);
440
441 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100442 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000443 packet_->markerBit = true;
444 packet_->seqNum = seq_num_;
445
philipel9d3ab612015-12-21 04:12:39 -0800446 EXPECT_EQ(kCompleteSession,
447 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448
449 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000450 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000451
Niels Möller8f7ce222019-03-21 15:43:58 +0100452 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000453 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000454}
455
philipel85130292016-07-06 16:10:31 +0200456TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100457 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100458 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000459 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000461 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800462 EXPECT_EQ(kIncomplete,
463 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000464
465 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
466
467 // Frame should not be complete.
468 EXPECT_TRUE(frame_out == NULL);
469
470 // Insert 98 frames.
471 int loop = 0;
472 do {
473 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100474 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000475 packet_->markerBit = false;
476 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000477
philipel9d3ab612015-12-21 04:12:39 -0800478 EXPECT_EQ(kIncomplete,
479 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480 loop++;
481 } while (loop < 98);
482
483 // Insert last packet.
484 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100485 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000486 packet_->markerBit = true;
487 packet_->seqNum = seq_num_;
488
philipel9d3ab612015-12-21 04:12:39 -0800489 EXPECT_EQ(kCompleteSession,
490 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000491
492 frame_out = DecodeCompleteFrame();
493
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000494 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100495 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000496 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000497}
498
philipel85130292016-07-06 16:10:31 +0200499TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000500 // Always start with a complete key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +0100501 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100502 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503 packet_->markerBit = true;
504
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000505 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800506 EXPECT_EQ(kCompleteSession,
507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000508 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
509 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000510 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000511
512 ++seq_num_;
513 packet_->seqNum = seq_num_;
514 packet_->markerBit = false;
Niels Möller8f7ce222019-03-21 15:43:58 +0100515 packet_->frameType = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000516 packet_->timestamp += 33 * 90;
517
philipel9d3ab612015-12-21 04:12:39 -0800518 EXPECT_EQ(kIncomplete,
519 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000520
521 frame_out = DecodeCompleteFrame();
522
523 // Frame should not be complete.
524 EXPECT_TRUE(frame_out == NULL);
525
Niels Möllerd5e02f02019-02-20 13:12:21 +0100526 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000527 // Insert 98 frames.
528 int loop = 0;
529 do {
530 ++seq_num_;
531 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000532
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000533 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800534 EXPECT_EQ(kIncomplete,
535 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000536 loop++;
537 } while (loop < 98);
538
539 // Insert the last packet.
540 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100541 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000542 packet_->markerBit = true;
543 packet_->seqNum = seq_num_;
544
philipel9d3ab612015-12-21 04:12:39 -0800545 EXPECT_EQ(kCompleteSession,
546 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000547
548 frame_out = DecodeCompleteFrame();
549
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000550 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100551 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000552 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553}
554
philipel85130292016-07-06 16:10:31 +0200555TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000556 // Insert the "first" packet last.
557 seq_num_ += 100;
Niels Möller8f7ce222019-03-21 15:43:58 +0100558 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100559 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 packet_->markerBit = true;
561 packet_->seqNum = seq_num_;
562 packet_->timestamp = timestamp_;
563
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000564 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800565 EXPECT_EQ(kIncomplete,
566 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000567
568 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
569
570 EXPECT_TRUE(frame_out == NULL);
571
572 // Insert 98 packets.
573 int loop = 0;
574 do {
575 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100576 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577 packet_->markerBit = false;
578 packet_->seqNum = seq_num_;
579
philipel9d3ab612015-12-21 04:12:39 -0800580 EXPECT_EQ(kIncomplete,
581 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000582 loop++;
583 } while (loop < 98);
584
585 // Insert the last packet.
586 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100587 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588 packet_->markerBit = false;
589 packet_->seqNum = seq_num_;
590
philipel9d3ab612015-12-21 04:12:39 -0800591 EXPECT_EQ(kCompleteSession,
592 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593
philipel9d3ab612015-12-21 04:12:39 -0800594 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000595
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000596 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000597
Niels Möller8f7ce222019-03-21 15:43:58 +0100598 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000599 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000600}
601
philipel85130292016-07-06 16:10:31 +0200602TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100603 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100604 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000605 packet_->markerBit = false;
606
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000607 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800608 EXPECT_EQ(kIncomplete,
609 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000610
611 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
612
613 EXPECT_TRUE(frame_out == NULL);
614
615 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100616 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000617 packet_->markerBit = true;
618 packet_->seqNum = seq_num_;
619
philipel9d3ab612015-12-21 04:12:39 -0800620 EXPECT_EQ(kCompleteSession,
621 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000622
623 // check that we fail to get frame since seqnum is not continuous
624 frame_out = DecodeCompleteFrame();
625 EXPECT_TRUE(frame_out == NULL);
626
627 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800628 timestamp_ -= 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +0100629 packet_->frameType = VideoFrameType::kVideoFrameKey;
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 packet_->seqNum = seq_num_;
633 packet_->timestamp = timestamp_;
634
philipel9d3ab612015-12-21 04:12:39 -0800635 EXPECT_EQ(kIncomplete,
636 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637
638 frame_out = DecodeCompleteFrame();
639
640 // It should not be complete.
641 EXPECT_TRUE(frame_out == NULL);
642
643 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100644 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000645 packet_->markerBit = true;
646 packet_->seqNum = seq_num_;
647
philipel9d3ab612015-12-21 04:12:39 -0800648 EXPECT_EQ(kCompleteSession,
649 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000650
651 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000652 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100653 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000654 jitter_buffer_->ReleaseFrame(frame_out);
655
656 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000657 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100658 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000659 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660}
661
philipel85130292016-07-06 16:10:31 +0200662TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller691f62c2019-04-11 15:27:17 +0200663 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möller8f7ce222019-03-21 15:43:58 +0100664 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100665 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700666 packet_->markerBit = true;
667
668 // Send in an initial good packet/frame (Frame A) to start things off.
669 bool retransmitted = false;
670 EXPECT_EQ(kCompleteSession,
671 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
672 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
673 EXPECT_TRUE(frame_out != NULL);
674 jitter_buffer_->ReleaseFrame(frame_out);
675
676 // Now send in a complete delta frame (Frame C), but with a sequence number
677 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möller8f7ce222019-03-21 15:43:58 +0100678 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700679 // Leave a gap of 2 sequence numbers and two frames.
680 packet_->seqNum = seq_num_ + 3;
681 packet_->timestamp = timestamp_ + (66 * 90);
682 // Still isFirst = marker = true.
683 // Session should be complete (frame is complete), but there's nothing to
684 // decode yet.
685 EXPECT_EQ(kCompleteSession,
686 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
687 frame_out = DecodeCompleteFrame();
688 EXPECT_TRUE(frame_out == NULL);
689
690 // Now send in a complete delta frame (Frame B) that is continuous from A, but
691 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
692 packet_->seqNum = seq_num_ + 1;
693 packet_->timestamp = timestamp_ + (33 * 90);
694 // Still isFirst = marker = true.
695 EXPECT_EQ(kCompleteSession,
696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
697 frame_out = DecodeCompleteFrame();
698 EXPECT_TRUE(frame_out != NULL);
699 jitter_buffer_->ReleaseFrame(frame_out);
700
701 // But Frame C isn't continuous yet.
702 frame_out = DecodeCompleteFrame();
703 EXPECT_TRUE(frame_out == NULL);
704
705 // Add in the padding. These are empty packets (data length is 0) with no
706 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100707 RTPHeader rtp_header;
708 RTPVideoHeader video_header;
709 rtp_header.sequenceNumber = seq_num_ + 2;
710 rtp_header.timestamp = timestamp_ + (33 * 90);
711 rtp_header.markerBit = false;
712 video_header.codec = kVideoCodecGeneric;
713 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
714 VideoFrameType::kEmptyFrame, /*ntp_time_ms=*/0);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700715 EXPECT_EQ(kOldPacket,
716 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
717 empty_packet.seqNum += 1;
718 EXPECT_EQ(kOldPacket,
719 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
720
721 // But now Frame C should be ready!
722 frame_out = DecodeCompleteFrame();
723 EXPECT_TRUE(frame_out != NULL);
724 jitter_buffer_->ReleaseFrame(frame_out);
725}
726
philipel85130292016-07-06 16:10:31 +0200727TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100728 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100729 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000730 packet_->markerBit = false;
731 packet_->seqNum = seq_num_;
732 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000733 EXPECT_EQ(0, jitter_buffer_->num_packets());
734 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000735
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000736 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800737 EXPECT_EQ(kIncomplete,
738 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000739
740 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
741
742 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000743 EXPECT_EQ(1, jitter_buffer_->num_packets());
744 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000745
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800747 EXPECT_EQ(kDuplicatePacket,
748 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000749 EXPECT_EQ(2, jitter_buffer_->num_packets());
750 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000751
752 seq_num_++;
753 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000754 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100755 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000756
philipel9d3ab612015-12-21 04:12:39 -0800757 EXPECT_EQ(kCompleteSession,
758 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000759
760 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000761 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000762 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000763
Niels Möller8f7ce222019-03-21 15:43:58 +0100764 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000765 EXPECT_EQ(3, jitter_buffer_->num_packets());
766 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000767 jitter_buffer_->ReleaseFrame(frame_out);
768}
769
philipel85130292016-07-06 16:10:31 +0200770TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100771 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100772 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000773 packet_->markerBit = true;
774 packet_->seqNum = seq_num_;
775 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000776 EXPECT_EQ(0, jitter_buffer_->num_packets());
777 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
778
779 bool retransmitted = false;
780 // Insert first complete frame.
781 EXPECT_EQ(kCompleteSession,
782 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
783
784 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
785 ASSERT_TRUE(frame_out != NULL);
786 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100787 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000788 jitter_buffer_->ReleaseFrame(frame_out);
789
790 // Insert 3 delta frames.
791 for (uint16_t i = 1; i <= 3; ++i) {
792 packet_->seqNum = seq_num_ + i;
793 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +0100794 packet_->frameType = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000795 EXPECT_EQ(kCompleteSession,
796 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
797 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
798 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
799 }
800
801 // Retransmit second delta frame.
802 packet_->seqNum = seq_num_ + 2;
803 packet_->timestamp = timestamp_ + 66 * 90;
804
805 EXPECT_EQ(kDuplicatePacket,
806 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
807
808 EXPECT_EQ(5, jitter_buffer_->num_packets());
809 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
810
811 // Should be able to decode 3 delta frames, key frame already decoded.
812 for (size_t i = 0; i < 3; ++i) {
813 frame_out = DecodeCompleteFrame();
814 ASSERT_TRUE(frame_out != NULL);
815 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100816 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000817 jitter_buffer_->ReleaseFrame(frame_out);
818 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000819}
820
philipel85130292016-07-06 16:10:31 +0200821TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700822 // Verify that JB skips forward to next base layer frame.
823 // -------------------------------------------------
824 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
825 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
826 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
827 // | ss | x | x | x | |
828 // -------------------------------------------------
829 // |<----------tl0idx:200--------->|<---tl0idx:201---
830
Niels Möller691f62c2019-04-11 15:27:17 +0200831 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
philipel29d88462018-08-08 14:26:00 +0200832 auto& vp9_header =
833 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
834
asapersson9a4cd872015-10-23 00:27:14 -0700835 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200836 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100837 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700838 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200839 vp9_header.flexible_mode = false;
840 vp9_header.spatial_idx = 0;
841 vp9_header.beginning_of_frame = true;
842 vp9_header.end_of_frame = true;
843 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700844
845 packet_->seqNum = 65485;
846 packet_->timestamp = 1000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100847 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200848 vp9_header.picture_id = 5;
849 vp9_header.tl0_pic_idx = 200;
850 vp9_header.temporal_idx = 0;
851 vp9_header.ss_data_available = true;
852 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700853 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
854 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
855
856 // Insert next temporal layer 0.
857 packet_->seqNum = 65489;
858 packet_->timestamp = 13000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100859 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200860 vp9_header.picture_id = 9;
861 vp9_header.tl0_pic_idx = 201;
862 vp9_header.temporal_idx = 0;
863 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700864 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
865
866 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200867 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100868 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700869 jitter_buffer_->ReleaseFrame(frame_out);
870
871 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200872 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100873 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700874 jitter_buffer_->ReleaseFrame(frame_out);
875}
876
philipel85130292016-07-06 16:10:31 +0200877TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700878 // Verify that frames are updated with SS data when SS packet is reordered.
879 // --------------------------------
880 // | 65486 | 65487 | 65485 |...
881 // | pid:6 | pid:7 | pid:5 |...
882 // | tid:2 | tid:1 | tid:0 |...
883 // | | | ss |
884 // --------------------------------
885 // |<--------tl0idx:200--------->|
886
philipel29d88462018-08-08 14:26:00 +0200887 auto& vp9_header =
888 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
889
asapersson9a4cd872015-10-23 00:27:14 -0700890 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200891 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100892 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700893 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200894 vp9_header.flexible_mode = false;
895 vp9_header.spatial_idx = 0;
896 vp9_header.beginning_of_frame = true;
897 vp9_header.end_of_frame = true;
898 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700899
900 packet_->seqNum = 65486;
901 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100902 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200903 vp9_header.picture_id = 6;
904 vp9_header.temporal_idx = 2;
905 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700906 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
907
908 packet_->seqNum = 65487;
909 packet_->timestamp = 9000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100910 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200911 vp9_header.picture_id = 7;
912 vp9_header.temporal_idx = 1;
913 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700914 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
915
916 // Insert first frame with SS data.
917 packet_->seqNum = 65485;
918 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100919 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100920 packet_->video_header.width = 352;
921 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200922 vp9_header.picture_id = 5;
923 vp9_header.temporal_idx = 0;
924 vp9_header.temporal_up_switch = false;
925 vp9_header.ss_data_available = true;
926 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700927 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
928 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
929
930 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200931 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100932 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700933 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
934 EXPECT_FALSE(
935 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
936 jitter_buffer_->ReleaseFrame(frame_out);
937
938 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200939 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100940 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700941 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
942 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
943 jitter_buffer_->ReleaseFrame(frame_out);
944
945 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200946 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100947 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700948 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
949 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
950 jitter_buffer_->ReleaseFrame(frame_out);
951}
952
philipel85130292016-07-06 16:10:31 +0200953TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700954 // Verify that frames are updated with SS data when SS packet is reordered.
955 // -----------------------------------------
956 // | 65486 | 65487 | 65485 | 65484 |...
957 // | pid:6 | pid:6 | pid:5 | pid:5 |...
958 // | tid:1 | tid:1 | tid:0 | tid:0 |...
959 // | sid:0 | sid:1 | sid:1 | sid:0 |...
960 // | t:6000 | t:6000 | t:3000 | t:3000 |
961 // | | | | ss |
962 // -----------------------------------------
963 // |<-----------tl0idx:200------------>|
964
philipel29d88462018-08-08 14:26:00 +0200965 auto& vp9_header =
966 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
967
asapersson9a4cd872015-10-23 00:27:14 -0700968 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200969 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200970 vp9_header.flexible_mode = false;
971 vp9_header.beginning_of_frame = true;
972 vp9_header.end_of_frame = true;
973 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700974
Niels Möllerd5e02f02019-02-20 13:12:21 +0100975 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700976 packet_->markerBit = false;
977 packet_->seqNum = 65486;
978 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100979 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200980 vp9_header.spatial_idx = 0;
981 vp9_header.picture_id = 6;
982 vp9_header.temporal_idx = 1;
983 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700984 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
985
Niels Möllerd5e02f02019-02-20 13:12:21 +0100986 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700987 packet_->markerBit = true;
988 packet_->seqNum = 65487;
Niels Möller8f7ce222019-03-21 15:43:58 +0100989 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200990 vp9_header.spatial_idx = 1;
991 vp9_header.picture_id = 6;
992 vp9_header.temporal_idx = 1;
993 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700994 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
995
Niels Möllerd5e02f02019-02-20 13:12:21 +0100996 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700997 packet_->markerBit = true;
998 packet_->seqNum = 65485;
999 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001000 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001001 vp9_header.spatial_idx = 1;
1002 vp9_header.picture_id = 5;
1003 vp9_header.temporal_idx = 0;
1004 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001005 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1006
1007 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +01001008 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001009 packet_->markerBit = false;
1010 packet_->seqNum = 65484;
Niels Möller8f7ce222019-03-21 15:43:58 +01001011 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001012 packet_->video_header.width = 352;
1013 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +02001014 vp9_header.spatial_idx = 0;
1015 vp9_header.picture_id = 5;
1016 vp9_header.temporal_idx = 0;
1017 vp9_header.temporal_up_switch = false;
1018 vp9_header.ss_data_available = true;
1019 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001020 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1021 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1022
1023 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001024 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001025 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001026 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1027 EXPECT_FALSE(
1028 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1029 jitter_buffer_->ReleaseFrame(frame_out);
1030
1031 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001032 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001033 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001034 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1036 jitter_buffer_->ReleaseFrame(frame_out);
1037}
1038
philipel85130292016-07-06 16:10:31 +02001039TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001040 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001041 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001042 packet_->markerBit = false;
1043 packet_->seqNum = seq_num_;
1044 packet_->timestamp = timestamp_;
1045 packet_->insertStartCode = true;
1046
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001047 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001048 EXPECT_EQ(kIncomplete,
1049 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001050
1051 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1052
1053 // Frame should not be complete.
1054 EXPECT_TRUE(frame_out == NULL);
1055
1056 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001057 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001058 packet_->markerBit = true;
1059 packet_->seqNum = seq_num_;
1060
philipel9d3ab612015-12-21 04:12:39 -08001061 EXPECT_EQ(kCompleteSession,
1062 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001063
1064 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001065 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +01001066 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001067 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001068}
1069
stefana669a3a2016-10-06 05:04:52 -07001070TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001071 auto& h264_header =
1072 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001073 packet_->timestamp = timestamp_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001074 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001075 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001076 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001077 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001078 h264_header.nalu_type = H264::NaluType::kIdr;
1079 h264_header.nalus[0].type = H264::NaluType::kIdr;
1080 h264_header.nalus[0].sps_id = -1;
1081 h264_header.nalus[0].pps_id = 0;
1082 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001083 bool retransmitted = false;
1084 EXPECT_EQ(kCompleteSession,
1085 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1086 // Not decodable since sps and pps are missing.
1087 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1088
1089 timestamp_ += 3000;
1090 packet_->timestamp = timestamp_;
1091 ++seq_num_;
1092 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001093 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001094 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001095 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001096 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001097 h264_header.nalu_type = H264::NaluType::kStapA;
1098 h264_header.nalus[0].type = H264::NaluType::kSps;
1099 h264_header.nalus[0].sps_id = 0;
1100 h264_header.nalus[0].pps_id = -1;
1101 h264_header.nalus[1].type = H264::NaluType::kPps;
1102 h264_header.nalus[1].sps_id = 0;
1103 h264_header.nalus[1].pps_id = 0;
1104 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001105 // Not complete since the marker bit hasn't been received.
1106 EXPECT_EQ(kIncomplete,
1107 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1108
1109 ++seq_num_;
1110 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001111 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001112 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001113 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001114 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001115 h264_header.nalu_type = H264::NaluType::kIdr;
1116 h264_header.nalus[0].type = H264::NaluType::kIdr;
1117 h264_header.nalus[0].sps_id = -1;
1118 h264_header.nalus[0].pps_id = 0;
1119 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001120 // Complete and decodable since the pps and sps are received in the first
1121 // packet of this frame.
1122 EXPECT_EQ(kCompleteSession,
1123 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1124 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1125 ASSERT_NE(nullptr, frame_out);
1126 jitter_buffer_->ReleaseFrame(frame_out);
1127
1128 timestamp_ += 3000;
1129 packet_->timestamp = timestamp_;
1130 ++seq_num_;
1131 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001132 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001133 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001134 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001135 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001136 h264_header.nalu_type = H264::NaluType::kSlice;
1137 h264_header.nalus[0].type = H264::NaluType::kSlice;
1138 h264_header.nalus[0].sps_id = -1;
1139 h264_header.nalus[0].pps_id = 0;
1140 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001141 // Complete and decodable since sps, pps and key frame has been received.
1142 EXPECT_EQ(kCompleteSession,
1143 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1144 frame_out = DecodeCompleteFrame();
1145 ASSERT_NE(nullptr, frame_out);
1146 jitter_buffer_->ReleaseFrame(frame_out);
1147}
1148
philipel85130292016-07-06 16:10:31 +02001149TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001150 seq_num_ = 0xfff0;
Niels Möller8f7ce222019-03-21 15:43:58 +01001151 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001152 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001153 packet_->markerBit = false;
1154 packet_->seqNum = seq_num_;
1155 packet_->timestamp = timestamp_;
1156
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001157 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001158 EXPECT_EQ(kIncomplete,
1159 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001160
1161 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1162
1163 EXPECT_TRUE(frame_out == NULL);
1164
1165 int loop = 0;
1166 do {
1167 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001168 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001169 packet_->markerBit = false;
1170 packet_->seqNum = seq_num_;
1171
philipel9d3ab612015-12-21 04:12:39 -08001172 EXPECT_EQ(kIncomplete,
1173 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001174
1175 frame_out = DecodeCompleteFrame();
1176
1177 EXPECT_TRUE(frame_out == NULL);
1178
1179 loop++;
1180 } while (loop < 98);
1181
1182 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001183 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001184 packet_->markerBit = true;
1185 packet_->seqNum = seq_num_;
1186
philipel9d3ab612015-12-21 04:12:39 -08001187 EXPECT_EQ(kCompleteSession,
1188 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001189
1190 frame_out = DecodeCompleteFrame();
1191
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001192 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001193
Niels Möller8f7ce222019-03-21 15:43:58 +01001194 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001195 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001196}
1197
philipel85130292016-07-06 16:10:31 +02001198TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001199 // Insert "first" packet last seqnum.
1200 seq_num_ = 10;
Niels Möller8f7ce222019-03-21 15:43:58 +01001201 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001202 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001203 packet_->markerBit = true;
1204 packet_->seqNum = seq_num_;
1205
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001206 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001207 EXPECT_EQ(kIncomplete,
1208 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001209 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1210
1211 // Should not be complete.
1212 EXPECT_TRUE(frame_out == NULL);
1213
1214 // Insert 98 frames.
1215 int loop = 0;
1216 do {
1217 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001218 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001219 packet_->markerBit = false;
1220 packet_->seqNum = seq_num_;
1221
philipel9d3ab612015-12-21 04:12:39 -08001222 EXPECT_EQ(kIncomplete,
1223 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001224
1225 frame_out = DecodeCompleteFrame();
1226
1227 EXPECT_TRUE(frame_out == NULL);
1228
1229 loop++;
1230 } while (loop < 98);
1231
1232 // Insert last packet.
1233 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001234 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001235 packet_->markerBit = false;
1236 packet_->seqNum = seq_num_;
1237
philipel9d3ab612015-12-21 04:12:39 -08001238 EXPECT_EQ(kCompleteSession,
1239 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001240
1241 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001242 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001243 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001244 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001245}
1246
philipel85130292016-07-06 16:10:31 +02001247TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001248 // ------- -------
1249 // | 2 | | 1 |
1250 // ------- -------
1251 // t = 3000 t = 2000
1252 seq_num_ = 2;
1253 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001254 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001255 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001256 packet_->markerBit = true;
1257 packet_->timestamp = timestamp_;
1258 packet_->seqNum = seq_num_;
1259
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001260 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001261 EXPECT_EQ(kCompleteSession,
1262 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001263
1264 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001265 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001266 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001267 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001268 jitter_buffer_->ReleaseFrame(frame_out);
1269
1270 seq_num_--;
1271 timestamp_ = 2000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001272 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001273 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001274 packet_->markerBit = true;
1275 packet_->seqNum = seq_num_;
1276 packet_->timestamp = timestamp_;
1277
philipel9d3ab612015-12-21 04:12:39 -08001278 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001279}
1280
philipel85130292016-07-06 16:10:31 +02001281TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001282 // ------- -------
1283 // | 2 | | 1 |
1284 // ------- -------
1285 // t = 3000 t = 0xffffff00
1286
1287 seq_num_ = 2;
1288 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001289 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001290 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001291 packet_->markerBit = true;
1292 packet_->seqNum = seq_num_;
1293 packet_->timestamp = timestamp_;
1294
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001295 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001296 EXPECT_EQ(kCompleteSession,
1297 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001298
1299 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001300 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001301
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001302 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001303
Niels Möller8f7ce222019-03-21 15:43:58 +01001304 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001305
1306 jitter_buffer_->ReleaseFrame(frame_out);
1307
1308 seq_num_--;
1309 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001310 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001311 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001312 packet_->markerBit = true;
1313 packet_->seqNum = seq_num_;
1314 packet_->timestamp = timestamp_;
1315
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001316 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001317 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001318}
1319
philipel85130292016-07-06 16:10:31 +02001320TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001321 // --------------- ---------------
1322 // | 1 | 2 | | 3 | 4 |
1323 // --------------- ---------------
1324 // t = 0xffffff00 t = 33*90
1325
1326 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001327 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001328 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001329 packet_->markerBit = false;
1330 packet_->seqNum = seq_num_;
1331 packet_->timestamp = timestamp_;
1332
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001333 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001334 EXPECT_EQ(kIncomplete,
1335 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001336
1337 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001338 EXPECT_TRUE(frame_out == NULL);
1339
1340 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001341 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001342 packet_->markerBit = true;
1343 packet_->seqNum = seq_num_;
1344
philipel9d3ab612015-12-21 04:12:39 -08001345 EXPECT_EQ(kCompleteSession,
1346 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001347
1348 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001349 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001350 jitter_buffer_->ReleaseFrame(frame_out);
1351
1352 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001353 timestamp_ += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001354 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001355 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001356 packet_->markerBit = false;
1357 packet_->seqNum = seq_num_;
1358 packet_->timestamp = timestamp_;
1359
philipel9d3ab612015-12-21 04:12:39 -08001360 EXPECT_EQ(kIncomplete,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001362
1363 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001364 EXPECT_TRUE(frame_out == NULL);
1365
1366 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001367 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001368 packet_->markerBit = true;
1369 packet_->seqNum = seq_num_;
1370
philipel9d3ab612015-12-21 04:12:39 -08001371 EXPECT_EQ(kCompleteSession,
1372 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001373
1374 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001375 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001376 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001377 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001378}
1379
philipel85130292016-07-06 16:10:31 +02001380TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001381 // ------- -------
1382 // | 1 | | 2 |
1383 // ------- -------
1384 // t = 0xffffff00 t = 2700
1385
1386 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001387 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001388 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001389 packet_->markerBit = true;
1390 packet_->timestamp = timestamp_;
1391
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001392 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001393 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001394 EXPECT_EQ(kCompleteSession,
1395 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001396
1397 // Insert next frame.
1398 seq_num_++;
1399 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001400 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001401 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001402 packet_->markerBit = true;
1403 packet_->seqNum = seq_num_;
1404 packet_->timestamp = timestamp_;
1405
philipel9d3ab612015-12-21 04:12:39 -08001406 EXPECT_EQ(kCompleteSession,
1407 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001408
1409 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001410 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001411 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001412 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001413 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001414
1415 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001416 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001417 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001418 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001419 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420}
1421
philipel85130292016-07-06 16:10:31 +02001422TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001423 // ------- -------
1424 // | 2 | | 1 |
1425 // ------- -------
1426 // t = 2700 t = 0xffffff00
1427
1428 seq_num_ = 2;
1429 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001430 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001431 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001432 packet_->markerBit = true;
1433 packet_->seqNum = seq_num_;
1434 packet_->timestamp = timestamp_;
1435
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001436 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001437 EXPECT_EQ(kCompleteSession,
1438 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001439
1440 // Insert second frame
1441 seq_num_--;
1442 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001443 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001444 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001445 packet_->markerBit = true;
1446 packet_->seqNum = seq_num_;
1447 packet_->timestamp = timestamp_;
1448
philipel9d3ab612015-12-21 04:12:39 -08001449 EXPECT_EQ(kCompleteSession,
1450 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001451
1452 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001453 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001454 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001455 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001456 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001457
1458 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001459 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001460 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001461 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001462 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001463}
1464
philipel85130292016-07-06 16:10:31 +02001465TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001466 int loop = 0;
1467 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001468 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001469 // Insert kMaxPacketsInJitterBuffer into frame.
1470 do {
1471 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001472 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001473 packet_->markerBit = false;
1474 packet_->seqNum = seq_num_;
1475
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001477 EXPECT_EQ(kIncomplete,
1478 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001479 firstPacket = false;
1480 } else {
philipel9d3ab612015-12-21 04:12:39 -08001481 EXPECT_EQ(kIncomplete,
1482 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001483 }
1484
1485 loop++;
1486 } while (loop < kMaxPacketsInSession);
1487
1488 // Max number of packets inserted.
1489 // Insert one more packet.
1490 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001491 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001492 packet_->markerBit = true;
1493 packet_->seqNum = seq_num_;
1494
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001495 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001496 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001497 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001498}
1499
philipel85130292016-07-06 16:10:31 +02001500TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001501 // TEST fill JB with more than max number of frame (50 delta frames +
1502 // 51 key frames) with wrap in seq_num_
1503 //
1504 // --------------------------------------------------------------
1505 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1506 // --------------------------------------------------------------
1507 // |<-----------delta frames------------->|<------key frames----->|
1508
jbauchdb81ffd2015-11-23 03:59:02 -08001509 // Make sure the jitter doesn't request a keyframe after too much non-
1510 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001511 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001512
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001513 int loop = 0;
1514 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001515 uint32_t first_key_frame_timestamp = 0;
1516 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001517 // Insert MAX_NUMBER_OF_FRAMES frames.
1518 do {
philipel9d3ab612015-12-21 04:12:39 -08001519 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001520 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001521 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 packet_->markerBit = true;
1523 packet_->seqNum = seq_num_;
1524 packet_->timestamp = timestamp_;
1525
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001526 if (loop == 50) {
1527 first_key_frame_timestamp = packet_->timestamp;
Niels Möller8f7ce222019-03-21 15:43:58 +01001528 packet_->frameType = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001529 }
1530
1531 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001532 EXPECT_EQ(kCompleteSession,
1533 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001534
1535 loop++;
1536 } while (loop < kMaxNumberOfFrames);
1537
1538 // Max number of frames inserted.
1539
1540 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001541 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001542 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001543 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001544 packet_->markerBit = true;
1545 packet_->seqNum = seq_num_;
1546 packet_->timestamp = timestamp_;
1547
1548 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001549 EXPECT_EQ(kFlushIndicator,
1550 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001551
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001552 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001553 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001554 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001555 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001556 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001557}
1558
philipel85130292016-07-06 16:10:31 +02001559TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001560 seq_num_ = 3;
1561 // Insert one empty packet per frame, should never return the last timestamp
1562 // inserted. Only return empty frames in the presence of subsequent frames.
1563 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001564 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 for (int i = 0; i < maxSize + 10; i++) {
1566 timestamp_ += 33 * 90;
1567 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001568 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001569 packet_->markerBit = false;
1570 packet_->seqNum = seq_num_;
1571 packet_->timestamp = timestamp_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001572 packet_->frameType = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001573
philipel9d3ab612015-12-21 04:12:39 -08001574 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001575 }
1576}
1577
philipel85130292016-07-06 16:10:31 +02001578TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001579 // Test that a we cannot get incomplete frames from the JB if we haven't
1580 // received the marker bit, unless we have received a packet from a later
1581 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582 // Start with a complete key frame - insert and decode.
Niels Möller691f62c2019-04-11 15:27:17 +02001583 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möller8f7ce222019-03-21 15:43:58 +01001584 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001585 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001587 bool retransmitted = false;
1588
philipel9d3ab612015-12-21 04:12:39 -08001589 EXPECT_EQ(kCompleteSession,
1590 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001591 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1592 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001593 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001594
1595 packet_->seqNum += 2;
1596 packet_->timestamp += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001597 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001598 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001599 packet_->markerBit = false;
1600
Niels Möller375b3462019-01-10 15:35:56 +01001601 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001602 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001603
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001604 packet_->seqNum += 2;
1605 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001606 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001607
Niels Möller375b3462019-01-10 15:35:56 +01001608 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001609 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001610}
1611
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001612TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001613 // Make sure the jitter doesn't request a keyframe after too much non-
1614 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001615 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001616 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001617 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001618 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001619 DropFrame(1);
1620 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001621 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1622 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001623 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001624 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001625 // This frame will make the jitter buffer recycle frames until a key frame.
1626 // Since none is found it will have to wait until the next key frame before
1627 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001628 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001629 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001630}
1631
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001632TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001633 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001634 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001635 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001636 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001637 // Insert empty packet.
1638 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001639 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001640 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001641 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001642 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001643 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001644 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001645 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001646 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001647 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001648 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001649 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001650}
1651
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001652TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1653 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001654 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001655 // Can't decode without a key frame.
1656 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001657 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001658 // Skip to the next key frame.
1659 EXPECT_TRUE(DecodeCompleteFrame());
1660}
1661
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001662TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001663 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001664 EXPECT_TRUE(DecodeCompleteFrame());
1665 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001666 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1667 kNoError);
1668 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001669 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1670 EXPECT_TRUE(DecodeCompleteFrame());
1671 }
1672}
1673
1674TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001675 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001676 EXPECT_TRUE(DecodeCompleteFrame());
1677 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001678 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1679 kNoError);
1680 InsertFrame(VideoFrameType::kVideoFrameKey);
1681 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1682 kNoError);
1683 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001684 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1685 EXPECT_TRUE(DecodeCompleteFrame());
1686 }
1687}
1688
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001689TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001690 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001691 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001692 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001693 clock_->TimeInMilliseconds());
1694 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001695 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001696 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001697 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001698 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1699 EXPECT_FALSE(DecodeCompleteFrame());
1700 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1701 EXPECT_TRUE(DecodeCompleteFrame());
1702 EXPECT_TRUE(DecodeCompleteFrame());
1703}
1704
philipel85130292016-07-06 16:10:31 +02001705TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001706 // Make sure empty packets doesn't clog the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001707 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1708 kNoError);
1709 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001710 EXPECT_TRUE(DecodeCompleteFrame());
1711}
1712
philipel85130292016-07-06 16:10:31 +02001713TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001714 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001715 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001716 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001717
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001718 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1719 // old packet.
1720 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001721 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001722 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1723 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001724 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001725
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001726 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001727 std::vector<uint16_t> nack_list =
1728 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001729 // No key frame will be requested since the jitter buffer is empty.
1730 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001731 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001732
Niels Möller8f7ce222019-03-21 15:43:58 +01001733 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001734 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001735 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001736
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001737 // The next complete continuous frame isn't a key frame, but we're waiting
1738 // for one.
1739 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001740 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001741 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001742 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001743}
1744
philipel85130292016-07-06 16:10:31 +02001745TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001746 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001747 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001748 EXPECT_TRUE(DecodeCompleteFrame());
1749
1750 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001751 EXPECT_GE(
1752 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1753 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001754
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001755 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001756 std::vector<uint16_t> nack_list =
1757 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001758 // Verify that the jitter buffer does not request a key frame.
1759 EXPECT_FALSE(request_key_frame);
1760 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001761 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001762 // Verify that we can decode the next frame.
1763 EXPECT_TRUE(DecodeCompleteFrame());
1764}
1765
philipel85130292016-07-06 16:10:31 +02001766TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001767 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001768 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001769 EXPECT_TRUE(DecodeCompleteFrame());
1770
1771 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001772 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001773 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001774 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001775 EXPECT_FALSE(DecodeCompleteFrame());
1776
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001777 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001778 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001779 // The jitter buffer is empty, so we won't request key frames until we get a
1780 // packet.
1781 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001782
Niels Möller8f7ce222019-03-21 15:43:58 +01001783 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001784 // Now we have a packet in the jitter buffer, a key frame will be requested
1785 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001786 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001787 // The jitter buffer is empty, so we won't request key frames until we get a
1788 // packet.
1789 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001790 // The next complete continuous frame isn't a key frame, but we're waiting
1791 // for one.
1792 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001793 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001794 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001795 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001796}
1797
philipel85130292016-07-06 16:10:31 +02001798TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001799 DropFrame(10);
1800 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001801 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001802 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001803 std::vector<uint16_t> nack_list =
1804 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001805 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001806 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001807 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001808}
1809
philipel85130292016-07-06 16:10:31 +02001810TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001811 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001812 InsertFrame(VideoFrameType::kVideoFrameKey);
1813 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001814 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001815 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001816 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001817 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001818 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001819 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001820 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001821}
1822
philipel85130292016-07-06 16:10:31 +02001823TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001824 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001825 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001826 clock_->TimeInMilliseconds());
1827 VCMPacket packet;
1828 stream_generator_->PopPacket(&packet, 0);
1829 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001830 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001831 EXPECT_FALSE(retransmitted);
1832 // Drop second packet.
1833 stream_generator_->PopPacket(&packet, 1);
1834 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1835 EXPECT_FALSE(retransmitted);
1836 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001837 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001838 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001839 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001840 EXPECT_EQ(1u, nack_list.size());
1841 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001842 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001843 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001844 EXPECT_EQ(kCompleteSession,
1845 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001846 EXPECT_TRUE(retransmitted);
1847 EXPECT_TRUE(DecodeCompleteFrame());
1848}
1849
philipel85130292016-07-06 16:10:31 +02001850TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001851 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001852 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001853 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001854 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001855 // Drop second packet.
1856 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1857 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001858 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001859 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001860 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001861 ASSERT_EQ(1u, nack_list.size());
1862 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001863 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001864 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001865 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001866}
1867
philipel85130292016-07-06 16:10:31 +02001868TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001869 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001870 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001871 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001872 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001873 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001874 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001875 // Drop second packet in frame.
1876 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1877 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1878 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001879 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001880 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001881 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001882 // Drop second packet in frame.
1883 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1884 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001885 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001886 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001887 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001888 ASSERT_EQ(1u, nack_list.size());
1889 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001890 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001891 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001892}
1893
philipel85130292016-07-06 16:10:31 +02001894TEST_F(TestJitterBufferNack, NormalOperation) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001895 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001896 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001897
1898 // ----------------------------------------------------------------
1899 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1900 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001901 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001902 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001903 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001904 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001905 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001906 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001907 while (stream_generator_->PacketsRemaining() > 1) {
1908 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001909 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001910 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001911 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001912 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001913 }
Niels Möller375b3462019-01-10 15:35:56 +01001914 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001915 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001916 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001917 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001918
1919 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001920 std::vector<uint16_t> nack_list =
1921 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001922 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001923 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001924 for (size_t i = 0; i < nack_list.size(); ++i)
1925 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001926}
1927
philipel85130292016-07-06 16:10:31 +02001928TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001929 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001930 // ------- ------------------------------------------------------------
1931 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1932 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001933 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001934 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001935 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001936 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001937 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001938 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001939 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001940 while (stream_generator_->PacketsRemaining() > 1) {
1941 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001942 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001943 EXPECT_FALSE(request_key_frame);
1944 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001945 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001946 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001947 }
1948 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001949 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001950 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001951 EXPECT_FALSE(DecodeCompleteFrame());
1952 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001953 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001954 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001955 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001956 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001957 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1958 for (size_t i = 0; i < nack_list.size(); ++i)
1959 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001960}
1961
philipel85130292016-07-06 16:10:31 +02001962TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001963 bool request_key_frame = false;
1964 // -----------------------------------
1965 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1966 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001967 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001968 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001969 EXPECT_FALSE(request_key_frame);
1970 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001971 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001972 clock_->TimeInMilliseconds());
1973 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1974 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001975 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001976 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001977 EXPECT_FALSE(request_key_frame);
1978 } else {
1979 stream_generator_->NextPacket(NULL); // Drop packet
1980 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001981 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001982 clock_->TimeInMilliseconds());
1983 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1984 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001985 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001986 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001987 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001988 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001989 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001990 ASSERT_EQ(1u, nack_list.size());
1991 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001992}
1993
philipel85130292016-07-06 16:10:31 +02001994TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001995 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001996 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001997 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001998 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001999 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2000 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002001
2002 // Far-into-the-future video frame, could be caused by resetting the encoder
2003 // or otherwise restarting. This should not fail when error when the packet is
2004 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002005 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002006 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002007 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002008 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002009 nack_list = jitter_buffer_->GetNackList(&extended);
2010 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002011
2012 // Stream should be decodable from this point.
2013 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002014 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002015 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002016 nack_list = jitter_buffer_->GetNackList(&extended);
2017 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002018}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002019} // namespace webrtc