blob: 2ff66fe18a3392e043d31d6a6caf1594a0573cdc [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.orga64300a2013-03-04 15:24:40 +0000398 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000399 }
400
philipel9d3ab612015-12-21 04:12:39 -0800401 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000402};
403
philipel85130292016-07-06 16:10:31 +0200404TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000405 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000406 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000407 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000408
409 // No packets inserted.
410 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000411}
412
philipel85130292016-07-06 16:10:31 +0200413TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000414 // Always start with a complete key frame when not allowing errors.
Niels Möller8f7ce222019-03-21 15:43:58 +0100415 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100416 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000417 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000418 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000419
420 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000421 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800422 EXPECT_EQ(kCompleteSession,
423 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000424 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000425 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100426 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000427 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000428}
429
philipel85130292016-07-06 16:10:31 +0200430TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100431 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100432 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000433 packet_->markerBit = false;
434
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000435 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800436 EXPECT_EQ(kIncomplete,
437 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000438 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
439 // Should not be complete.
440 EXPECT_TRUE(frame_out == NULL);
441
442 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100443 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000444 packet_->markerBit = true;
445 packet_->seqNum = seq_num_;
446
philipel9d3ab612015-12-21 04:12:39 -0800447 EXPECT_EQ(kCompleteSession,
448 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000449
450 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000451 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000452
Niels Möller8f7ce222019-03-21 15:43:58 +0100453 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000454 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000455}
456
philipel85130292016-07-06 16:10:31 +0200457TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100458 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100459 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000461
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000462 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800463 EXPECT_EQ(kIncomplete,
464 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000465
466 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
467
468 // Frame should not be complete.
469 EXPECT_TRUE(frame_out == NULL);
470
471 // Insert 98 frames.
472 int loop = 0;
473 do {
474 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100475 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000476 packet_->markerBit = false;
477 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000478
philipel9d3ab612015-12-21 04:12:39 -0800479 EXPECT_EQ(kIncomplete,
480 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481 loop++;
482 } while (loop < 98);
483
484 // Insert last packet.
485 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100486 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000487 packet_->markerBit = true;
488 packet_->seqNum = seq_num_;
489
philipel9d3ab612015-12-21 04:12:39 -0800490 EXPECT_EQ(kCompleteSession,
491 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000492
493 frame_out = DecodeCompleteFrame();
494
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000495 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100496 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000497 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000498}
499
philipel85130292016-07-06 16:10:31 +0200500TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000501 // Always start with a complete key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +0100502 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100503 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000504 packet_->markerBit = true;
505
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000506 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800507 EXPECT_EQ(kCompleteSession,
508 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000509 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
510 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000511 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000512
513 ++seq_num_;
514 packet_->seqNum = seq_num_;
515 packet_->markerBit = false;
Niels Möller8f7ce222019-03-21 15:43:58 +0100516 packet_->frameType = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000517 packet_->timestamp += 33 * 90;
518
philipel9d3ab612015-12-21 04:12:39 -0800519 EXPECT_EQ(kIncomplete,
520 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000521
522 frame_out = DecodeCompleteFrame();
523
524 // Frame should not be complete.
525 EXPECT_TRUE(frame_out == NULL);
526
Niels Möllerd5e02f02019-02-20 13:12:21 +0100527 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000528 // Insert 98 frames.
529 int loop = 0;
530 do {
531 ++seq_num_;
532 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000533
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000534 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800535 EXPECT_EQ(kIncomplete,
536 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537 loop++;
538 } while (loop < 98);
539
540 // Insert the last packet.
541 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100542 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000543 packet_->markerBit = true;
544 packet_->seqNum = seq_num_;
545
philipel9d3ab612015-12-21 04:12:39 -0800546 EXPECT_EQ(kCompleteSession,
547 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000548
549 frame_out = DecodeCompleteFrame();
550
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000551 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100552 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000553 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000554}
555
philipel85130292016-07-06 16:10:31 +0200556TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557 // Insert the "first" packet last.
558 seq_num_ += 100;
Niels Möller8f7ce222019-03-21 15:43:58 +0100559 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100560 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561 packet_->markerBit = true;
562 packet_->seqNum = seq_num_;
563 packet_->timestamp = timestamp_;
564
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000565 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800566 EXPECT_EQ(kIncomplete,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568
569 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
570
571 EXPECT_TRUE(frame_out == NULL);
572
573 // Insert 98 packets.
574 int loop = 0;
575 do {
576 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100577 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000578 packet_->markerBit = false;
579 packet_->seqNum = seq_num_;
580
philipel9d3ab612015-12-21 04:12:39 -0800581 EXPECT_EQ(kIncomplete,
582 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000583 loop++;
584 } while (loop < 98);
585
586 // Insert the last packet.
587 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100588 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000589 packet_->markerBit = false;
590 packet_->seqNum = seq_num_;
591
philipel9d3ab612015-12-21 04:12:39 -0800592 EXPECT_EQ(kCompleteSession,
593 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000594
philipel9d3ab612015-12-21 04:12:39 -0800595 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000597 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000598
Niels Möller8f7ce222019-03-21 15:43:58 +0100599 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000600 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000601}
602
philipel85130292016-07-06 16:10:31 +0200603TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100604 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100605 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000606 packet_->markerBit = false;
607
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000608 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800609 EXPECT_EQ(kIncomplete,
610 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000611
612 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
613
614 EXPECT_TRUE(frame_out == NULL);
615
616 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100617 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000618 packet_->markerBit = true;
619 packet_->seqNum = seq_num_;
620
philipel9d3ab612015-12-21 04:12:39 -0800621 EXPECT_EQ(kCompleteSession,
622 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000623
624 // check that we fail to get frame since seqnum is not continuous
625 frame_out = DecodeCompleteFrame();
626 EXPECT_TRUE(frame_out == NULL);
627
628 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800629 timestamp_ -= 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +0100630 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100631 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000632 packet_->markerBit = false;
633 packet_->seqNum = seq_num_;
634 packet_->timestamp = timestamp_;
635
philipel9d3ab612015-12-21 04:12:39 -0800636 EXPECT_EQ(kIncomplete,
637 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000638
639 frame_out = DecodeCompleteFrame();
640
641 // It should not be complete.
642 EXPECT_TRUE(frame_out == NULL);
643
644 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100645 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000646 packet_->markerBit = true;
647 packet_->seqNum = seq_num_;
648
philipel9d3ab612015-12-21 04:12:39 -0800649 EXPECT_EQ(kCompleteSession,
650 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000651
652 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000653 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100654 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655 jitter_buffer_->ReleaseFrame(frame_out);
656
657 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000658 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100659 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000660 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000661}
662
philipel85130292016-07-06 16:10:31 +0200663TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
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
philipel29d88462018-08-08 14:26:00 +0200831 auto& vp9_header =
832 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
833
asapersson9a4cd872015-10-23 00:27:14 -0700834 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200835 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100836 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700837 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200838 vp9_header.flexible_mode = false;
839 vp9_header.spatial_idx = 0;
840 vp9_header.beginning_of_frame = true;
841 vp9_header.end_of_frame = true;
842 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700843
844 packet_->seqNum = 65485;
845 packet_->timestamp = 1000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100846 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200847 vp9_header.picture_id = 5;
848 vp9_header.tl0_pic_idx = 200;
849 vp9_header.temporal_idx = 0;
850 vp9_header.ss_data_available = true;
851 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700852 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
853 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
854
855 // Insert next temporal layer 0.
856 packet_->seqNum = 65489;
857 packet_->timestamp = 13000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100858 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200859 vp9_header.picture_id = 9;
860 vp9_header.tl0_pic_idx = 201;
861 vp9_header.temporal_idx = 0;
862 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700863 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
864
865 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200866 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100867 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700868 jitter_buffer_->ReleaseFrame(frame_out);
869
870 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200871 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100872 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700873 jitter_buffer_->ReleaseFrame(frame_out);
874}
875
philipel85130292016-07-06 16:10:31 +0200876TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700877 // Verify that frames are updated with SS data when SS packet is reordered.
878 // --------------------------------
879 // | 65486 | 65487 | 65485 |...
880 // | pid:6 | pid:7 | pid:5 |...
881 // | tid:2 | tid:1 | tid:0 |...
882 // | | | ss |
883 // --------------------------------
884 // |<--------tl0idx:200--------->|
885
philipel29d88462018-08-08 14:26:00 +0200886 auto& vp9_header =
887 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
888
asapersson9a4cd872015-10-23 00:27:14 -0700889 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200890 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100891 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700892 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200893 vp9_header.flexible_mode = false;
894 vp9_header.spatial_idx = 0;
895 vp9_header.beginning_of_frame = true;
896 vp9_header.end_of_frame = true;
897 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700898
899 packet_->seqNum = 65486;
900 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100901 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200902 vp9_header.picture_id = 6;
903 vp9_header.temporal_idx = 2;
904 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700905 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
906
907 packet_->seqNum = 65487;
908 packet_->timestamp = 9000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100909 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200910 vp9_header.picture_id = 7;
911 vp9_header.temporal_idx = 1;
912 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700913 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
914
915 // Insert first frame with SS data.
916 packet_->seqNum = 65485;
917 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100918 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100919 packet_->video_header.width = 352;
920 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200921 vp9_header.picture_id = 5;
922 vp9_header.temporal_idx = 0;
923 vp9_header.temporal_up_switch = false;
924 vp9_header.ss_data_available = true;
925 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700926 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
927 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
928
929 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200930 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100931 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700932 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
933 EXPECT_FALSE(
934 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
935 jitter_buffer_->ReleaseFrame(frame_out);
936
937 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200938 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100939 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700940 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
941 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
942 jitter_buffer_->ReleaseFrame(frame_out);
943
944 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200945 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100946 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700947 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
948 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
949 jitter_buffer_->ReleaseFrame(frame_out);
950}
951
philipel85130292016-07-06 16:10:31 +0200952TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700953 // Verify that frames are updated with SS data when SS packet is reordered.
954 // -----------------------------------------
955 // | 65486 | 65487 | 65485 | 65484 |...
956 // | pid:6 | pid:6 | pid:5 | pid:5 |...
957 // | tid:1 | tid:1 | tid:0 | tid:0 |...
958 // | sid:0 | sid:1 | sid:1 | sid:0 |...
959 // | t:6000 | t:6000 | t:3000 | t:3000 |
960 // | | | | ss |
961 // -----------------------------------------
962 // |<-----------tl0idx:200------------>|
963
philipel29d88462018-08-08 14:26:00 +0200964 auto& vp9_header =
965 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
966
asapersson9a4cd872015-10-23 00:27:14 -0700967 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200968 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200969 vp9_header.flexible_mode = false;
970 vp9_header.beginning_of_frame = true;
971 vp9_header.end_of_frame = true;
972 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700973
Niels Möllerd5e02f02019-02-20 13:12:21 +0100974 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700975 packet_->markerBit = false;
976 packet_->seqNum = 65486;
977 packet_->timestamp = 6000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100978 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200979 vp9_header.spatial_idx = 0;
980 vp9_header.picture_id = 6;
981 vp9_header.temporal_idx = 1;
982 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700983 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
984
Niels Möllerd5e02f02019-02-20 13:12:21 +0100985 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700986 packet_->markerBit = true;
987 packet_->seqNum = 65487;
Niels Möller8f7ce222019-03-21 15:43:58 +0100988 packet_->frameType = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200989 vp9_header.spatial_idx = 1;
990 vp9_header.picture_id = 6;
991 vp9_header.temporal_idx = 1;
992 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700993 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
994
Niels Möllerd5e02f02019-02-20 13:12:21 +0100995 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700996 packet_->markerBit = true;
997 packet_->seqNum = 65485;
998 packet_->timestamp = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +0100999 packet_->frameType = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001000 vp9_header.spatial_idx = 1;
1001 vp9_header.picture_id = 5;
1002 vp9_header.temporal_idx = 0;
1003 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001004 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1005
1006 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +01001007 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001008 packet_->markerBit = false;
1009 packet_->seqNum = 65484;
Niels Möller8f7ce222019-03-21 15:43:58 +01001010 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001011 packet_->video_header.width = 352;
1012 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +02001013 vp9_header.spatial_idx = 0;
1014 vp9_header.picture_id = 5;
1015 vp9_header.temporal_idx = 0;
1016 vp9_header.temporal_up_switch = false;
1017 vp9_header.ss_data_available = true;
1018 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001019 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1020 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1021
1022 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001023 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001024 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001025 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1026 EXPECT_FALSE(
1027 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1028 jitter_buffer_->ReleaseFrame(frame_out);
1029
1030 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001031 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +01001032 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -07001033 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1034 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1035 jitter_buffer_->ReleaseFrame(frame_out);
1036}
1037
philipel85130292016-07-06 16:10:31 +02001038TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001039 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001040 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001041 packet_->markerBit = false;
1042 packet_->seqNum = seq_num_;
1043 packet_->timestamp = timestamp_;
1044 packet_->insertStartCode = true;
1045
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001046 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001047 EXPECT_EQ(kIncomplete,
1048 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001049
1050 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1051
1052 // Frame should not be complete.
1053 EXPECT_TRUE(frame_out == NULL);
1054
1055 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001056 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001057 packet_->markerBit = true;
1058 packet_->seqNum = seq_num_;
1059
philipel9d3ab612015-12-21 04:12:39 -08001060 EXPECT_EQ(kCompleteSession,
1061 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001062
1063 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001064 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +01001065 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001066 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001067}
1068
stefana669a3a2016-10-06 05:04:52 -07001069TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001070 auto& h264_header =
1071 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001072 packet_->timestamp = timestamp_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001073 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001074 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001075 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001076 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001077 h264_header.nalu_type = H264::NaluType::kIdr;
1078 h264_header.nalus[0].type = H264::NaluType::kIdr;
1079 h264_header.nalus[0].sps_id = -1;
1080 h264_header.nalus[0].pps_id = 0;
1081 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001082 bool retransmitted = false;
1083 EXPECT_EQ(kCompleteSession,
1084 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1085 // Not decodable since sps and pps are missing.
1086 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1087
1088 timestamp_ += 3000;
1089 packet_->timestamp = timestamp_;
1090 ++seq_num_;
1091 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001092 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001093 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001094 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001095 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001096 h264_header.nalu_type = H264::NaluType::kStapA;
1097 h264_header.nalus[0].type = H264::NaluType::kSps;
1098 h264_header.nalus[0].sps_id = 0;
1099 h264_header.nalus[0].pps_id = -1;
1100 h264_header.nalus[1].type = H264::NaluType::kPps;
1101 h264_header.nalus[1].sps_id = 0;
1102 h264_header.nalus[1].pps_id = 0;
1103 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001104 // Not complete since the marker bit hasn't been received.
1105 EXPECT_EQ(kIncomplete,
1106 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1107
1108 ++seq_num_;
1109 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001110 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001111 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001112 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001113 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001114 h264_header.nalu_type = H264::NaluType::kIdr;
1115 h264_header.nalus[0].type = H264::NaluType::kIdr;
1116 h264_header.nalus[0].sps_id = -1;
1117 h264_header.nalus[0].pps_id = 0;
1118 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001119 // Complete and decodable since the pps and sps are received in the first
1120 // packet of this frame.
1121 EXPECT_EQ(kCompleteSession,
1122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1123 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1124 ASSERT_NE(nullptr, frame_out);
1125 jitter_buffer_->ReleaseFrame(frame_out);
1126
1127 timestamp_ += 3000;
1128 packet_->timestamp = timestamp_;
1129 ++seq_num_;
1130 packet_->seqNum = seq_num_;
Niels Möller8f7ce222019-03-21 15:43:58 +01001131 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001132 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001133 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001134 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001135 h264_header.nalu_type = H264::NaluType::kSlice;
1136 h264_header.nalus[0].type = H264::NaluType::kSlice;
1137 h264_header.nalus[0].sps_id = -1;
1138 h264_header.nalus[0].pps_id = 0;
1139 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001140 // Complete and decodable since sps, pps and key frame has been received.
1141 EXPECT_EQ(kCompleteSession,
1142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1143 frame_out = DecodeCompleteFrame();
1144 ASSERT_NE(nullptr, frame_out);
1145 jitter_buffer_->ReleaseFrame(frame_out);
1146}
1147
philipel85130292016-07-06 16:10:31 +02001148TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001149 seq_num_ = 0xfff0;
Niels Möller8f7ce222019-03-21 15:43:58 +01001150 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001151 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152 packet_->markerBit = false;
1153 packet_->seqNum = seq_num_;
1154 packet_->timestamp = timestamp_;
1155
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001156 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001157 EXPECT_EQ(kIncomplete,
1158 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159
1160 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1161
1162 EXPECT_TRUE(frame_out == NULL);
1163
1164 int loop = 0;
1165 do {
1166 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001167 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001168 packet_->markerBit = false;
1169 packet_->seqNum = seq_num_;
1170
philipel9d3ab612015-12-21 04:12:39 -08001171 EXPECT_EQ(kIncomplete,
1172 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001173
1174 frame_out = DecodeCompleteFrame();
1175
1176 EXPECT_TRUE(frame_out == NULL);
1177
1178 loop++;
1179 } while (loop < 98);
1180
1181 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001182 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001183 packet_->markerBit = true;
1184 packet_->seqNum = seq_num_;
1185
philipel9d3ab612015-12-21 04:12:39 -08001186 EXPECT_EQ(kCompleteSession,
1187 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001188
1189 frame_out = DecodeCompleteFrame();
1190
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001191 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001192
Niels Möller8f7ce222019-03-21 15:43:58 +01001193 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001194 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001195}
1196
philipel85130292016-07-06 16:10:31 +02001197TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001198 // Insert "first" packet last seqnum.
1199 seq_num_ = 10;
Niels Möller8f7ce222019-03-21 15:43:58 +01001200 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001201 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001202 packet_->markerBit = true;
1203 packet_->seqNum = seq_num_;
1204
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001205 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001206 EXPECT_EQ(kIncomplete,
1207 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001208 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1209
1210 // Should not be complete.
1211 EXPECT_TRUE(frame_out == NULL);
1212
1213 // Insert 98 frames.
1214 int loop = 0;
1215 do {
1216 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001217 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001218 packet_->markerBit = false;
1219 packet_->seqNum = seq_num_;
1220
philipel9d3ab612015-12-21 04:12:39 -08001221 EXPECT_EQ(kIncomplete,
1222 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001223
1224 frame_out = DecodeCompleteFrame();
1225
1226 EXPECT_TRUE(frame_out == NULL);
1227
1228 loop++;
1229 } while (loop < 98);
1230
1231 // Insert last packet.
1232 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001233 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001234 packet_->markerBit = false;
1235 packet_->seqNum = seq_num_;
1236
philipel9d3ab612015-12-21 04:12:39 -08001237 EXPECT_EQ(kCompleteSession,
1238 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001239
1240 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001241 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001242 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001243 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001244}
1245
philipel85130292016-07-06 16:10:31 +02001246TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001247 // ------- -------
1248 // | 2 | | 1 |
1249 // ------- -------
1250 // t = 3000 t = 2000
1251 seq_num_ = 2;
1252 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001253 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001254 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001255 packet_->markerBit = true;
1256 packet_->timestamp = timestamp_;
1257 packet_->seqNum = seq_num_;
1258
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001259 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001260 EXPECT_EQ(kCompleteSession,
1261 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001262
1263 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001264 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001265 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001266 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001267 jitter_buffer_->ReleaseFrame(frame_out);
1268
1269 seq_num_--;
1270 timestamp_ = 2000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001271 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001272 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001273 packet_->markerBit = true;
1274 packet_->seqNum = seq_num_;
1275 packet_->timestamp = timestamp_;
1276
philipel9d3ab612015-12-21 04:12:39 -08001277 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001278}
1279
philipel85130292016-07-06 16:10:31 +02001280TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001281 // ------- -------
1282 // | 2 | | 1 |
1283 // ------- -------
1284 // t = 3000 t = 0xffffff00
1285
1286 seq_num_ = 2;
1287 timestamp_ = 3000;
Niels Möller8f7ce222019-03-21 15:43:58 +01001288 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001289 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001290 packet_->markerBit = true;
1291 packet_->seqNum = seq_num_;
1292 packet_->timestamp = timestamp_;
1293
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001294 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001295 EXPECT_EQ(kCompleteSession,
1296 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001297
1298 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001299 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001300
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001301 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001302
Niels Möller8f7ce222019-03-21 15:43:58 +01001303 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001304
1305 jitter_buffer_->ReleaseFrame(frame_out);
1306
1307 seq_num_--;
1308 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001309 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001310 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001311 packet_->markerBit = true;
1312 packet_->seqNum = seq_num_;
1313 packet_->timestamp = timestamp_;
1314
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001315 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001316 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001317}
1318
philipel85130292016-07-06 16:10:31 +02001319TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001320 // --------------- ---------------
1321 // | 1 | 2 | | 3 | 4 |
1322 // --------------- ---------------
1323 // t = 0xffffff00 t = 33*90
1324
1325 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001326 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001327 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001328 packet_->markerBit = false;
1329 packet_->seqNum = seq_num_;
1330 packet_->timestamp = timestamp_;
1331
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001332 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001333 EXPECT_EQ(kIncomplete,
1334 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001335
1336 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001337 EXPECT_TRUE(frame_out == NULL);
1338
1339 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001340 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001341 packet_->markerBit = true;
1342 packet_->seqNum = seq_num_;
1343
philipel9d3ab612015-12-21 04:12:39 -08001344 EXPECT_EQ(kCompleteSession,
1345 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001346
1347 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001348 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001349 jitter_buffer_->ReleaseFrame(frame_out);
1350
1351 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001352 timestamp_ += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001353 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001354 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001355 packet_->markerBit = false;
1356 packet_->seqNum = seq_num_;
1357 packet_->timestamp = timestamp_;
1358
philipel9d3ab612015-12-21 04:12:39 -08001359 EXPECT_EQ(kIncomplete,
1360 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001361
1362 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001363 EXPECT_TRUE(frame_out == NULL);
1364
1365 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001366 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001367 packet_->markerBit = true;
1368 packet_->seqNum = seq_num_;
1369
philipel9d3ab612015-12-21 04:12:39 -08001370 EXPECT_EQ(kCompleteSession,
1371 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001372
1373 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001374 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001375 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001376 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001377}
1378
philipel85130292016-07-06 16:10:31 +02001379TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001380 // ------- -------
1381 // | 1 | | 2 |
1382 // ------- -------
1383 // t = 0xffffff00 t = 2700
1384
1385 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001386 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001387 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001388 packet_->markerBit = true;
1389 packet_->timestamp = timestamp_;
1390
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001391 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001392 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001393 EXPECT_EQ(kCompleteSession,
1394 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001395
1396 // Insert next frame.
1397 seq_num_++;
1398 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001399 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001400 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001401 packet_->markerBit = true;
1402 packet_->seqNum = seq_num_;
1403 packet_->timestamp = timestamp_;
1404
philipel9d3ab612015-12-21 04:12:39 -08001405 EXPECT_EQ(kCompleteSession,
1406 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001407
1408 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001409 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001410 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001411 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001412 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001413
1414 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001415 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001416 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001417 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001418 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001419}
1420
philipel85130292016-07-06 16:10:31 +02001421TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001422 // ------- -------
1423 // | 2 | | 1 |
1424 // ------- -------
1425 // t = 2700 t = 0xffffff00
1426
1427 seq_num_ = 2;
1428 timestamp_ = 2700;
Niels Möller8f7ce222019-03-21 15:43:58 +01001429 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001430 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001431 packet_->markerBit = true;
1432 packet_->seqNum = seq_num_;
1433 packet_->timestamp = timestamp_;
1434
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001435 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001436 EXPECT_EQ(kCompleteSession,
1437 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001438
1439 // Insert second frame
1440 seq_num_--;
1441 timestamp_ = 0xffffff00;
Niels Möller8f7ce222019-03-21 15:43:58 +01001442 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001443 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001444 packet_->markerBit = true;
1445 packet_->seqNum = seq_num_;
1446 packet_->timestamp = timestamp_;
1447
philipel9d3ab612015-12-21 04:12:39 -08001448 EXPECT_EQ(kCompleteSession,
1449 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001450
1451 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001452 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001453 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001454 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001455 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001456
1457 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001458 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001459 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001460 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001461 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001462}
1463
philipel85130292016-07-06 16:10:31 +02001464TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001465 int loop = 0;
1466 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001467 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001468 // Insert kMaxPacketsInJitterBuffer into frame.
1469 do {
1470 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001471 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001472 packet_->markerBit = false;
1473 packet_->seqNum = seq_num_;
1474
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001475 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001476 EXPECT_EQ(kIncomplete,
1477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001478 firstPacket = false;
1479 } else {
philipel9d3ab612015-12-21 04:12:39 -08001480 EXPECT_EQ(kIncomplete,
1481 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001482 }
1483
1484 loop++;
1485 } while (loop < kMaxPacketsInSession);
1486
1487 // Max number of packets inserted.
1488 // Insert one more packet.
1489 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001490 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001491 packet_->markerBit = true;
1492 packet_->seqNum = seq_num_;
1493
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001494 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001495 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001496 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001497}
1498
philipel85130292016-07-06 16:10:31 +02001499TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001500 // TEST fill JB with more than max number of frame (50 delta frames +
1501 // 51 key frames) with wrap in seq_num_
1502 //
1503 // --------------------------------------------------------------
1504 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1505 // --------------------------------------------------------------
1506 // |<-----------delta frames------------->|<------key frames----->|
1507
jbauchdb81ffd2015-11-23 03:59:02 -08001508 // Make sure the jitter doesn't request a keyframe after too much non-
1509 // decodable frames.
1510 jitter_buffer_->SetNackMode(kNack, -1, -1);
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öller8f7ce222019-03-21 15:43:58 +01001583 packet_->frameType = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001584 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001585 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001586 bool retransmitted = false;
1587
philipel9d3ab612015-12-21 04:12:39 -08001588 EXPECT_EQ(kCompleteSession,
1589 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001590 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1591 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001592 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001593
1594 packet_->seqNum += 2;
1595 packet_->timestamp += 33 * 90;
Niels Möller8f7ce222019-03-21 15:43:58 +01001596 packet_->frameType = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001597 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001598 packet_->markerBit = false;
1599
Niels Möller375b3462019-01-10 15:35:56 +01001600 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001601 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001602
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001603 packet_->seqNum += 2;
1604 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001605 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001606
Niels Möller375b3462019-01-10 15:35:56 +01001607 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001608 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001609}
1610
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001611TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001612 // Make sure the jitter doesn't request a keyframe after too much non-
1613 // decodable frames.
1614 jitter_buffer_->SetNackMode(kNack, -1, -1);
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.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00001707 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
Niels Möller8f7ce222019-03-21 15:43:58 +01001708 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1709 kNoError);
1710 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001711 EXPECT_TRUE(DecodeCompleteFrame());
1712}
1713
philipel85130292016-07-06 16:10:31 +02001714TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001715 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001716 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001717 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001718
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001719 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1720 // old packet.
1721 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001722 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001723 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1724 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001725 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001726
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001727 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001728 std::vector<uint16_t> nack_list =
1729 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001730 // No key frame will be requested since the jitter buffer is empty.
1731 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001732 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001733
Niels Möller8f7ce222019-03-21 15:43:58 +01001734 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001735 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001736 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001737
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001738 // The next complete continuous frame isn't a key frame, but we're waiting
1739 // for one.
1740 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001741 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001742 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001743 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001744}
1745
philipel85130292016-07-06 16:10:31 +02001746TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001747 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001748 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001749 EXPECT_TRUE(DecodeCompleteFrame());
1750
1751 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001752 EXPECT_GE(
1753 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1754 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001755
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001756 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001757 std::vector<uint16_t> nack_list =
1758 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001759 // Verify that the jitter buffer does not request a key frame.
1760 EXPECT_FALSE(request_key_frame);
1761 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001762 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001763 // Verify that we can decode the next frame.
1764 EXPECT_TRUE(DecodeCompleteFrame());
1765}
1766
philipel85130292016-07-06 16:10:31 +02001767TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001768 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001769 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001770 EXPECT_TRUE(DecodeCompleteFrame());
1771
1772 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001773 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001774 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001775 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001776 EXPECT_FALSE(DecodeCompleteFrame());
1777
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001778 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001779 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001780 // The jitter buffer is empty, so we won't request key frames until we get a
1781 // packet.
1782 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001783
Niels Möller8f7ce222019-03-21 15:43:58 +01001784 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001785 // Now we have a packet in the jitter buffer, a key frame will be requested
1786 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001787 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001788 // The jitter buffer is empty, so we won't request key frames until we get a
1789 // packet.
1790 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001791 // The next complete continuous frame isn't a key frame, but we're waiting
1792 // for one.
1793 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001794 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001795 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001796 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001797}
1798
philipel85130292016-07-06 16:10:31 +02001799TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001800 DropFrame(10);
1801 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001802 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001803 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001804 std::vector<uint16_t> nack_list =
1805 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001806 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001807 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001808 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001809}
1810
philipel85130292016-07-06 16:10:31 +02001811TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001812 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001813 InsertFrame(VideoFrameType::kVideoFrameKey);
1814 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001815 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001816 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001817 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001818 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001819 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001820 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001821 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001822}
1823
philipel85130292016-07-06 16:10:31 +02001824TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001825 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001826 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001827 clock_->TimeInMilliseconds());
1828 VCMPacket packet;
1829 stream_generator_->PopPacket(&packet, 0);
1830 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001831 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001832 EXPECT_FALSE(retransmitted);
1833 // Drop second packet.
1834 stream_generator_->PopPacket(&packet, 1);
1835 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1836 EXPECT_FALSE(retransmitted);
1837 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001838 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001839 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001840 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001841 EXPECT_EQ(1u, nack_list.size());
1842 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001843 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001844 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001845 EXPECT_EQ(kCompleteSession,
1846 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001847 EXPECT_TRUE(retransmitted);
1848 EXPECT_TRUE(DecodeCompleteFrame());
1849}
1850
philipel85130292016-07-06 16:10:31 +02001851TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001852 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001853 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001854 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001855 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001856 // Drop second packet.
1857 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1858 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001859 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001860 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001861 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001862 ASSERT_EQ(1u, nack_list.size());
1863 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001864 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001865 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001866 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001867}
1868
philipel85130292016-07-06 16:10:31 +02001869TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001870 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001871 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001872 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001873 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001874 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001875 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001876 // Drop second packet in frame.
1877 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1878 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1879 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001880 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001881 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001882 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001883 // Drop second packet in frame.
1884 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1885 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001886 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001887 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001888 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001889 ASSERT_EQ(1u, nack_list.size());
1890 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001891 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001892 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001893}
1894
philipel85130292016-07-06 16:10:31 +02001895TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001896 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001897
Niels Möller8f7ce222019-03-21 15:43:58 +01001898 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001899 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001900
1901 // ----------------------------------------------------------------
1902 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1903 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001904 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001905 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001906 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001907 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001908 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001909 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001910 while (stream_generator_->PacketsRemaining() > 1) {
1911 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001912 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001913 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001914 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001915 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001916 }
Niels Möller375b3462019-01-10 15:35:56 +01001917 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001918 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001919 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001920 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001921
1922 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001923 std::vector<uint16_t> nack_list =
1924 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001925 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001926 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001927 for (size_t i = 0; i < nack_list.size(); ++i)
1928 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001929}
1930
philipel85130292016-07-06 16:10:31 +02001931TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001932 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001933 // ------- ------------------------------------------------------------
1934 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1935 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001936 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001937 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001938 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001939 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001940 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001941 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001942 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001943 while (stream_generator_->PacketsRemaining() > 1) {
1944 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001945 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001946 EXPECT_FALSE(request_key_frame);
1947 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001948 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001949 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001950 }
1951 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001952 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001953 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001954 EXPECT_FALSE(DecodeCompleteFrame());
1955 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001956 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001957 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001958 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001959 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001960 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1961 for (size_t i = 0; i < nack_list.size(); ++i)
1962 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001963}
1964
philipel85130292016-07-06 16:10:31 +02001965TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001966 bool request_key_frame = false;
1967 // -----------------------------------
1968 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1969 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001970 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001971 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001972 EXPECT_FALSE(request_key_frame);
1973 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001974 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001975 clock_->TimeInMilliseconds());
1976 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1977 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001978 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001979 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001980 EXPECT_FALSE(request_key_frame);
1981 } else {
1982 stream_generator_->NextPacket(NULL); // Drop packet
1983 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001984 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001985 clock_->TimeInMilliseconds());
1986 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1987 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001988 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001989 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001990 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001991 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001992 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001993 ASSERT_EQ(1u, nack_list.size());
1994 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001995}
1996
philipel85130292016-07-06 16:10:31 +02001997TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001998 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001999 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002000 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002001 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002002 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2003 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002004
2005 // Far-into-the-future video frame, could be caused by resetting the encoder
2006 // or otherwise restarting. This should not fail when error when the packet is
2007 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002008 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002009 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002010 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002011 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002012 nack_list = jitter_buffer_->GetNackList(&extended);
2013 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002014
2015 // Stream should be decodable from this point.
2016 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01002017 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002018 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002019 nack_list = jitter_buffer_->GetNackList(&extended);
2020 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002021}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002022} // namespace webrtc