blob: 68a4b84a939eb6300dcbd0e86773a172eea04dc2 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/location.h"
24#include "system_wrappers/include/clock.h"
25#include "system_wrappers/include/field_trial.h"
26#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "test/field_trial.h"
28#include "test/gmock.h"
29#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000030
31namespace webrtc {
32
asapersson9a4cd872015-10-23 00:27:14 -070033namespace {
philipel9d3ab612015-12-21 04:12:39 -080034const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070035} // namespace
36
37class Vp9SsMapTest : public ::testing::Test {
38 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020039 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070040
41 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020042 auto& vp9_header =
43 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
Niels Möllerd5e02f02019-02-20 13:12:21 +010044 packet_.video_header.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +010051 packet_.video_header.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020052 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020053 vp9_header.flexible_mode = false;
54 vp9_header.gof_idx = 0;
55 vp9_header.temporal_idx = kNoTemporalIdx;
56 vp9_header.temporal_up_switch = false;
57 vp9_header.ss_data_available = true;
58 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020072 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
73 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070074 EXPECT_FALSE(map_.Insert(packet_));
75}
76
77TEST_F(Vp9SsMapTest, Find) {
78 EXPECT_TRUE(map_.Insert(packet_));
79 Vp9SsMap::SsMap::iterator it;
80 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
81 EXPECT_EQ(packet_.timestamp, it->first);
82}
83
84TEST_F(Vp9SsMapTest, Find_WithWrap) {
85 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
86 const uint32_t kSsTimestamp2 = 100;
87 packet_.timestamp = kSsTimestamp1;
88 EXPECT_TRUE(map_.Insert(packet_));
89 packet_.timestamp = kSsTimestamp2;
90 EXPECT_TRUE(map_.Insert(packet_));
91 Vp9SsMap::SsMap::iterator it;
92 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
93 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(0, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
98 EXPECT_EQ(kSsTimestamp1, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
100 EXPECT_EQ(kSsTimestamp2, it->first);
101 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
102 EXPECT_EQ(kSsTimestamp2, it->first);
103}
104
105TEST_F(Vp9SsMapTest, Reset) {
106 EXPECT_TRUE(map_.Insert(packet_));
107 Vp9SsMap::SsMap::iterator it;
108 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
109 EXPECT_EQ(packet_.timestamp, it->first);
110
111 map_.Reset();
112 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
113}
114
115TEST_F(Vp9SsMapTest, RemoveOld) {
116 Vp9SsMap::SsMap::iterator it;
117 const uint32_t kSsTimestamp1 = 10000;
118 packet_.timestamp = kSsTimestamp1;
119 EXPECT_TRUE(map_.Insert(packet_));
120
121 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
122 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
123 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
124
125 map_.RemoveOld(kTimestamp);
126 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
127 EXPECT_TRUE(map_.Find(kTimestamp, &it));
128 EXPECT_EQ(kTimestamp, it->first);
129}
130
131TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
132 Vp9SsMap::SsMap::iterator it;
133 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
134 const uint32_t kSsTimestamp2 = 10;
135 const uint32_t kSsTimestamp3 = 1000;
136 packet_.timestamp = kSsTimestamp1;
137 EXPECT_TRUE(map_.Insert(packet_));
138 packet_.timestamp = kSsTimestamp2;
139 EXPECT_TRUE(map_.Insert(packet_));
140 packet_.timestamp = kSsTimestamp3;
141 EXPECT_TRUE(map_.Insert(packet_));
142
143 map_.RemoveOld(kSsTimestamp3);
144 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
145 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
146 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
147}
148
149TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200150 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
151 0;
asapersson9a4cd872015-10-23 00:27:14 -0700152 EXPECT_FALSE(map_.UpdatePacket(&packet_));
153}
154
155TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
156 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200157 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
158 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700159 EXPECT_FALSE(map_.UpdatePacket(&packet_));
160}
161
162TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
163 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200164 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
165 4;
asapersson9a4cd872015-10-23 00:27:14 -0700166 EXPECT_FALSE(map_.UpdatePacket(&packet_));
167}
168
169TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200170 auto& vp9_header =
171 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700172 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
173
philipel29d88462018-08-08 14:26:00 +0200174 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700175 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200176 EXPECT_EQ(0, vp9_header.temporal_idx);
177 EXPECT_FALSE(vp9_header.temporal_up_switch);
178 EXPECT_EQ(1U, vp9_header.num_ref_pics);
179 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700180
philipel29d88462018-08-08 14:26:00 +0200181 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700182 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200183 EXPECT_EQ(2, vp9_header.temporal_idx);
184 EXPECT_TRUE(vp9_header.temporal_up_switch);
185 EXPECT_EQ(1U, vp9_header.num_ref_pics);
186 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700187
philipel29d88462018-08-08 14:26:00 +0200188 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700189 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200190 EXPECT_EQ(1, vp9_header.temporal_idx);
191 EXPECT_TRUE(vp9_header.temporal_up_switch);
192 EXPECT_EQ(1U, vp9_header.num_ref_pics);
193 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700194
philipel29d88462018-08-08 14:26:00 +0200195 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700196 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200197 EXPECT_EQ(2, vp9_header.temporal_idx);
198 EXPECT_TRUE(vp9_header.temporal_up_switch);
199 EXPECT_EQ(1U, vp9_header.num_ref_pics);
200 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700201}
202
philipel83f831a2016-03-12 03:30:23 -0800203class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
204 public NackSender,
205 public KeyFrameRequestSender {
206 public:
207 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
208 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
209 sequence_numbers.end());
210 }
211
212 void RequestKeyFrame() override { ++keyframe_requests_; }
213
philipel83f831a2016-03-12 03:30:23 -0800214 std::vector<uint16_t> nack_sent_;
215 int keyframe_requests_;
216
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000217 protected:
philipel85130292016-07-06 16:10:31 +0200218 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700219 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700221 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100222 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 jitter_buffer_->Start();
224 seq_num_ = 1234;
225 timestamp_ = 0;
226 size_ = 1400;
227 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
228 data_[0] = 0;
229 data_[1] = 0;
230 data_[2] = 0x80;
231 int count = 3;
232 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
233 data_[i] = count;
234 count++;
235 if (count == 10) {
236 data_[i + 1] = 0;
237 data_[i + 2] = 0;
238 data_[i + 3] = 0x80;
239 count = 3;
240 i += 3;
241 }
242 }
Niels Möller075e7fd2019-03-12 12:29:22 +0100243 RTPHeader rtp_header;
244 RTPVideoHeader video_header;
245 rtp_header.sequenceNumber = seq_num_;
246 rtp_header.timestamp = timestamp_;
247 rtp_header.markerBit = true;
248 video_header.codec = kVideoCodecGeneric;
249 video_header.is_first_packet_in_frame = true;
250 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
251 kVideoFrameDelta, /*ntp_time_ms=*/0));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000252 }
253
254 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700255 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700257 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200258 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000259 }
260
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000261 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800262 unsigned int size,
263 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000264 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000265
Niels Möller9c843902019-01-11 10:21:35 +0100266 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000267 unsigned int i = 0;
268
269 if (startCode) {
270 EXPECT_EQ(0, outData[0]);
271 EXPECT_EQ(0, outData[1]);
272 EXPECT_EQ(0, outData[2]);
273 EXPECT_EQ(1, outData[3]);
274 i += 4;
275 }
276
Niels Möllerf0eee002018-11-28 16:31:29 +0100277 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000278 int count = 3;
279 for (; i < size; i++) {
280 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
281 i += 2;
282 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
283 EXPECT_EQ(0, outData[0]);
284 EXPECT_EQ(0, outData[1]);
285 EXPECT_EQ(0, outData[2]);
286 EXPECT_EQ(1, outData[3]);
287 i += 3;
288 } else {
289 EXPECT_EQ(count, outData[i]);
290 count++;
291 if (count == 10) {
292 count = 3;
293 }
294 }
295 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000296 }
297
298 uint16_t seq_num_;
299 uint32_t timestamp_;
300 int size_;
301 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800302 std::unique_ptr<VCMPacket> packet_;
303 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800304 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000305};
306
philipel83f831a2016-03-12 03:30:23 -0800307class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
308 public NackSender,
309 public KeyFrameRequestSender {
310 public:
311 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
312 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
313 sequence_numbers.end());
314 }
315
316 void RequestKeyFrame() { ++keyframe_requests_; }
317
philipel83f831a2016-03-12 03:30:23 -0800318 std::vector<uint16_t> nack_sent_;
319 int keyframe_requests_;
320
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000321 protected:
322 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000323
324 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000325 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000326 max_nack_list_size_ = 150;
327 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700328 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100329 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700330 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000331 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800332 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
333 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000334 memset(data_buffer_, 0, kDataBufferSize);
335 }
336
337 virtual void TearDown() {
338 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000339 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000340 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000341 }
342
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000343 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000344 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000345 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000346 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000347 EXPECT_TRUE(packet_available);
348 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000349 return kGeneralError; // Return here to avoid crashes below.
350 bool retransmitted = false;
351 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000352 }
353
354 VCMFrameBufferEnum InsertPacket(int index) {
355 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000356 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000357 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000358 EXPECT_TRUE(packet_available);
359 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000360 return kGeneralError; // Return here to avoid crashes below.
361 bool retransmitted = false;
362 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000363 }
364
Niels Möller87e2d782019-03-07 10:18:23 +0100365 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700366 stream_generator_->GenerateFrame(
367 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
368 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000369 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000370 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000371 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000372 }
373
Niels Möller87e2d782019-03-07 10:18:23 +0100374 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000375 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000376 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000377 VCMFrameBufferEnum ret = InsertFrame(frame_type);
378 if (ret < kNoError) {
379 ret_for_all = ret;
380 } else if (ret_for_all >= kNoError) {
381 ret_for_all = ret;
382 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000383 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000384 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000385 }
386
387 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000388 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000389 clock_->TimeInMilliseconds());
390 for (int i = 0; i < num_packets; ++i)
391 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000392 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000393 }
394
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000395 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700396 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000397 if (!found_frame)
398 return false;
399
isheriff6b4b5f32016-06-08 00:24:21 -0700400 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200401 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000402 bool ret = (frame != NULL);
403 jitter_buffer_->ReleaseFrame(frame);
404 return ret;
405 }
406
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000407 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000408 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800409 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000410 size_t max_nack_list_size_;
411 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000412 uint8_t data_buffer_[kDataBufferSize];
413};
414
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000415class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000416 protected:
philipel85130292016-07-06 16:10:31 +0200417 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000418 virtual void SetUp() {
419 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000420 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000421 }
422
philipel9d3ab612015-12-21 04:12:39 -0800423 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000424};
425
philipel85130292016-07-06 16:10:31 +0200426TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000427 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000428 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000429 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000430
431 // No packets inserted.
432 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000433}
434
philipel85130292016-07-06 16:10:31 +0200435TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000436 // Always start with a complete key frame when not allowing errors.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000437 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100438 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000439 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000440 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000441
442 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000443 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800444 EXPECT_EQ(kCompleteSession,
445 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000446 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000447 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000449 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000450}
451
philipel85130292016-07-06 16:10:31 +0200452TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700453 metrics::Reset();
Åsa Perssona96f02b2015-04-24 08:52:11 +0200454 // Always start with a complete key frame when not allowing errors.
Åsa Perssona96f02b2015-04-24 08:52:11 +0200455 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100456 packet_->video_header.is_first_packet_in_frame = true;
Åsa Perssona96f02b2015-04-24 08:52:11 +0200457 packet_->markerBit = true;
458 packet_->timestamp += 123 * 90;
459
460 // Insert single packet frame to the jitter buffer and get a frame.
461 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800462 EXPECT_EQ(kCompleteSession,
463 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200464 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
465 CheckOutFrame(frame_out, size_, false);
466 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
467 jitter_buffer_->ReleaseFrame(frame_out);
468
469 // Verify that histograms are updated when the jitter buffer is stopped.
470 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
471 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700472 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
473 EXPECT_EQ(1,
474 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800475 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700476 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800477 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700478 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200479
480 // Verify that histograms are not updated if stop is called again.
481 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700482 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
483 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800484 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700485 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
486 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200487}
488
philipel85130292016-07-06 16:10:31 +0200489TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000490 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100491 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000492 packet_->markerBit = false;
493
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000494 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800495 EXPECT_EQ(kIncomplete,
496 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000497 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
498 // Should not be complete.
499 EXPECT_TRUE(frame_out == NULL);
500
501 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100502 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503 packet_->markerBit = true;
504 packet_->seqNum = seq_num_;
505
philipel9d3ab612015-12-21 04:12:39 -0800506 EXPECT_EQ(kCompleteSession,
507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000508
509 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000510 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000511
512 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000513 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000514}
515
philipel85130292016-07-06 16:10:31 +0200516TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000517 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100518 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000519 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000520
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000521 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800522 EXPECT_EQ(kIncomplete,
523 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000524
525 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
526
527 // Frame should not be complete.
528 EXPECT_TRUE(frame_out == NULL);
529
530 // Insert 98 frames.
531 int loop = 0;
532 do {
533 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100534 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000535 packet_->markerBit = false;
536 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537
philipel9d3ab612015-12-21 04:12:39 -0800538 EXPECT_EQ(kIncomplete,
539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000540 loop++;
541 } while (loop < 98);
542
543 // Insert last packet.
544 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100545 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546 packet_->markerBit = true;
547 packet_->seqNum = seq_num_;
548
philipel9d3ab612015-12-21 04:12:39 -0800549 EXPECT_EQ(kCompleteSession,
550 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000551
552 frame_out = DecodeCompleteFrame();
553
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000554 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000555 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000556 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557}
558
philipel85130292016-07-06 16:10:31 +0200559TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 // Always start with a complete key frame.
561 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100562 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000563 packet_->markerBit = true;
564
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000565 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800566 EXPECT_EQ(kCompleteSession,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
569 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000570 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000571
572 ++seq_num_;
573 packet_->seqNum = seq_num_;
574 packet_->markerBit = false;
575 packet_->frameType = kVideoFrameDelta;
576 packet_->timestamp += 33 * 90;
577
philipel9d3ab612015-12-21 04:12:39 -0800578 EXPECT_EQ(kIncomplete,
579 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000580
581 frame_out = DecodeCompleteFrame();
582
583 // Frame should not be complete.
584 EXPECT_TRUE(frame_out == NULL);
585
Niels Möllerd5e02f02019-02-20 13:12:21 +0100586 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587 // Insert 98 frames.
588 int loop = 0;
589 do {
590 ++seq_num_;
591 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000592
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800594 EXPECT_EQ(kIncomplete,
595 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596 loop++;
597 } while (loop < 98);
598
599 // Insert the last packet.
600 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100601 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602 packet_->markerBit = true;
603 packet_->seqNum = seq_num_;
604
philipel9d3ab612015-12-21 04:12:39 -0800605 EXPECT_EQ(kCompleteSession,
606 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000607
608 frame_out = DecodeCompleteFrame();
609
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000610 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000611 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000612 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613}
614
philipel85130292016-07-06 16:10:31 +0200615TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000616 // Insert the "first" packet last.
617 seq_num_ += 100;
618 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100619 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620 packet_->markerBit = true;
621 packet_->seqNum = seq_num_;
622 packet_->timestamp = timestamp_;
623
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000624 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800625 EXPECT_EQ(kIncomplete,
626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000627
628 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
629
630 EXPECT_TRUE(frame_out == NULL);
631
632 // Insert 98 packets.
633 int loop = 0;
634 do {
635 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100636 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637 packet_->markerBit = false;
638 packet_->seqNum = seq_num_;
639
philipel9d3ab612015-12-21 04:12:39 -0800640 EXPECT_EQ(kIncomplete,
641 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000642 loop++;
643 } while (loop < 98);
644
645 // Insert the last packet.
646 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100647 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648 packet_->markerBit = false;
649 packet_->seqNum = seq_num_;
650
philipel9d3ab612015-12-21 04:12:39 -0800651 EXPECT_EQ(kCompleteSession,
652 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653
philipel9d3ab612015-12-21 04:12:39 -0800654 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000656 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000657
658 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000659 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660}
661
philipel85130292016-07-06 16:10:31 +0200662TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000663 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100664 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000665 packet_->markerBit = false;
666
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000667 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800668 EXPECT_EQ(kIncomplete,
669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000670
671 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
672
673 EXPECT_TRUE(frame_out == NULL);
674
675 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100676 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000677 packet_->markerBit = true;
678 packet_->seqNum = seq_num_;
679
philipel9d3ab612015-12-21 04:12:39 -0800680 EXPECT_EQ(kCompleteSession,
681 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000682
683 // check that we fail to get frame since seqnum is not continuous
684 frame_out = DecodeCompleteFrame();
685 EXPECT_TRUE(frame_out == NULL);
686
687 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800688 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100690 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000691 packet_->markerBit = false;
692 packet_->seqNum = seq_num_;
693 packet_->timestamp = timestamp_;
694
philipel9d3ab612015-12-21 04:12:39 -0800695 EXPECT_EQ(kIncomplete,
696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697
698 frame_out = DecodeCompleteFrame();
699
700 // It should not be complete.
701 EXPECT_TRUE(frame_out == NULL);
702
703 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100704 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705 packet_->markerBit = true;
706 packet_->seqNum = seq_num_;
707
philipel9d3ab612015-12-21 04:12:39 -0800708 EXPECT_EQ(kCompleteSession,
709 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710
711 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000712 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000713 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000714 jitter_buffer_->ReleaseFrame(frame_out);
715
716 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000717 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000718 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000719 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000720}
721
philipel85130292016-07-06 16:10:31 +0200722TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700723 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100724 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700725 packet_->markerBit = true;
726
727 // Send in an initial good packet/frame (Frame A) to start things off.
728 bool retransmitted = false;
729 EXPECT_EQ(kCompleteSession,
730 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
731 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
732 EXPECT_TRUE(frame_out != NULL);
733 jitter_buffer_->ReleaseFrame(frame_out);
734
735 // Now send in a complete delta frame (Frame C), but with a sequence number
736 // gap. No pic index either, so no temporal scalability cheating :)
737 packet_->frameType = kVideoFrameDelta;
738 // Leave a gap of 2 sequence numbers and two frames.
739 packet_->seqNum = seq_num_ + 3;
740 packet_->timestamp = timestamp_ + (66 * 90);
741 // Still isFirst = marker = true.
742 // Session should be complete (frame is complete), but there's nothing to
743 // decode yet.
744 EXPECT_EQ(kCompleteSession,
745 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
746 frame_out = DecodeCompleteFrame();
747 EXPECT_TRUE(frame_out == NULL);
748
749 // Now send in a complete delta frame (Frame B) that is continuous from A, but
750 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
751 packet_->seqNum = seq_num_ + 1;
752 packet_->timestamp = timestamp_ + (33 * 90);
753 // Still isFirst = marker = true.
754 EXPECT_EQ(kCompleteSession,
755 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
756 frame_out = DecodeCompleteFrame();
757 EXPECT_TRUE(frame_out != NULL);
758 jitter_buffer_->ReleaseFrame(frame_out);
759
760 // But Frame C isn't continuous yet.
761 frame_out = DecodeCompleteFrame();
762 EXPECT_TRUE(frame_out == NULL);
763
764 // Add in the padding. These are empty packets (data length is 0) with no
765 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100766 RTPHeader rtp_header;
767 RTPVideoHeader video_header;
768 rtp_header.sequenceNumber = seq_num_ + 2;
769 rtp_header.timestamp = timestamp_ + (33 * 90);
770 rtp_header.markerBit = false;
771 video_header.codec = kVideoCodecGeneric;
772 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
773 VideoFrameType::kEmptyFrame, /*ntp_time_ms=*/0);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700774 EXPECT_EQ(kOldPacket,
775 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
776 empty_packet.seqNum += 1;
777 EXPECT_EQ(kOldPacket,
778 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
779
780 // But now Frame C should be ready!
781 frame_out = DecodeCompleteFrame();
782 EXPECT_TRUE(frame_out != NULL);
783 jitter_buffer_->ReleaseFrame(frame_out);
784}
785
philipel85130292016-07-06 16:10:31 +0200786TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000787 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100788 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000789 packet_->markerBit = false;
790 packet_->seqNum = seq_num_;
791 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000792 EXPECT_EQ(0, jitter_buffer_->num_packets());
793 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000794
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000795 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800796 EXPECT_EQ(kIncomplete,
797 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000798
799 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
800
801 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000802 EXPECT_EQ(1, jitter_buffer_->num_packets());
803 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000804
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000805 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800806 EXPECT_EQ(kDuplicatePacket,
807 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000808 EXPECT_EQ(2, jitter_buffer_->num_packets());
809 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000810
811 seq_num_++;
812 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000813 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100814 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000815
philipel9d3ab612015-12-21 04:12:39 -0800816 EXPECT_EQ(kCompleteSession,
817 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000818
819 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000820 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000821 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000822
823 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000824 EXPECT_EQ(3, jitter_buffer_->num_packets());
825 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000826 jitter_buffer_->ReleaseFrame(frame_out);
827}
828
philipel85130292016-07-06 16:10:31 +0200829TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000830 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100831 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000832 packet_->markerBit = true;
833 packet_->seqNum = seq_num_;
834 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000835 EXPECT_EQ(0, jitter_buffer_->num_packets());
836 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
837
838 bool retransmitted = false;
839 // Insert first complete frame.
840 EXPECT_EQ(kCompleteSession,
841 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
842
843 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
844 ASSERT_TRUE(frame_out != NULL);
845 CheckOutFrame(frame_out, size_, false);
846 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
847 jitter_buffer_->ReleaseFrame(frame_out);
848
849 // Insert 3 delta frames.
850 for (uint16_t i = 1; i <= 3; ++i) {
851 packet_->seqNum = seq_num_ + i;
852 packet_->timestamp = timestamp_ + (i * 33) * 90;
853 packet_->frameType = kVideoFrameDelta;
854 EXPECT_EQ(kCompleteSession,
855 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
856 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
857 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
858 }
859
860 // Retransmit second delta frame.
861 packet_->seqNum = seq_num_ + 2;
862 packet_->timestamp = timestamp_ + 66 * 90;
863
864 EXPECT_EQ(kDuplicatePacket,
865 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
866
867 EXPECT_EQ(5, jitter_buffer_->num_packets());
868 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
869
870 // Should be able to decode 3 delta frames, key frame already decoded.
871 for (size_t i = 0; i < 3; ++i) {
872 frame_out = DecodeCompleteFrame();
873 ASSERT_TRUE(frame_out != NULL);
874 CheckOutFrame(frame_out, size_, false);
875 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
876 jitter_buffer_->ReleaseFrame(frame_out);
877 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000878}
879
philipel85130292016-07-06 16:10:31 +0200880TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700881 // Verify that JB skips forward to next base layer frame.
882 // -------------------------------------------------
883 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
884 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
885 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
886 // | ss | x | x | x | |
887 // -------------------------------------------------
888 // |<----------tl0idx:200--------->|<---tl0idx:201---
889
philipel29d88462018-08-08 14:26:00 +0200890 auto& vp9_header =
891 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
892
asapersson9a4cd872015-10-23 00:27:14 -0700893 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200894 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100895 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700896 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200897 vp9_header.flexible_mode = false;
898 vp9_header.spatial_idx = 0;
899 vp9_header.beginning_of_frame = true;
900 vp9_header.end_of_frame = true;
901 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700902
903 packet_->seqNum = 65485;
904 packet_->timestamp = 1000;
905 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200906 vp9_header.picture_id = 5;
907 vp9_header.tl0_pic_idx = 200;
908 vp9_header.temporal_idx = 0;
909 vp9_header.ss_data_available = true;
910 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700911 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
912 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
913
914 // Insert next temporal layer 0.
915 packet_->seqNum = 65489;
916 packet_->timestamp = 13000;
917 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200918 vp9_header.picture_id = 9;
919 vp9_header.tl0_pic_idx = 201;
920 vp9_header.temporal_idx = 0;
921 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700922 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
923
924 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200925 EXPECT_EQ(1000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700926 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
927 jitter_buffer_->ReleaseFrame(frame_out);
928
929 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200930 EXPECT_EQ(13000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700931 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
932 jitter_buffer_->ReleaseFrame(frame_out);
933}
934
philipel85130292016-07-06 16:10:31 +0200935TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700936 // Verify that frames are updated with SS data when SS packet is reordered.
937 // --------------------------------
938 // | 65486 | 65487 | 65485 |...
939 // | pid:6 | pid:7 | pid:5 |...
940 // | tid:2 | tid:1 | tid:0 |...
941 // | | | ss |
942 // --------------------------------
943 // |<--------tl0idx:200--------->|
944
philipel29d88462018-08-08 14:26:00 +0200945 auto& vp9_header =
946 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
947
asapersson9a4cd872015-10-23 00:27:14 -0700948 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200949 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100950 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700951 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200952 vp9_header.flexible_mode = false;
953 vp9_header.spatial_idx = 0;
954 vp9_header.beginning_of_frame = true;
955 vp9_header.end_of_frame = true;
956 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700957
958 packet_->seqNum = 65486;
959 packet_->timestamp = 6000;
960 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200961 vp9_header.picture_id = 6;
962 vp9_header.temporal_idx = 2;
963 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700964 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
965
966 packet_->seqNum = 65487;
967 packet_->timestamp = 9000;
968 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200969 vp9_header.picture_id = 7;
970 vp9_header.temporal_idx = 1;
971 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700972 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
973
974 // Insert first frame with SS data.
975 packet_->seqNum = 65485;
976 packet_->timestamp = 3000;
977 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100978 packet_->video_header.width = 352;
979 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200980 vp9_header.picture_id = 5;
981 vp9_header.temporal_idx = 0;
982 vp9_header.temporal_up_switch = false;
983 vp9_header.ss_data_available = true;
984 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700985 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
986 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
987
988 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200989 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700990 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
991 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
992 EXPECT_FALSE(
993 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
994 jitter_buffer_->ReleaseFrame(frame_out);
995
996 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200997 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700998 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
999 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1000 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1001 jitter_buffer_->ReleaseFrame(frame_out);
1002
1003 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001004 EXPECT_EQ(9000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001005 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1006 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1007 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1008 jitter_buffer_->ReleaseFrame(frame_out);
1009}
1010
philipel85130292016-07-06 16:10:31 +02001011TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001012 // Verify that frames are updated with SS data when SS packet is reordered.
1013 // -----------------------------------------
1014 // | 65486 | 65487 | 65485 | 65484 |...
1015 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1016 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1017 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1018 // | t:6000 | t:6000 | t:3000 | t:3000 |
1019 // | | | | ss |
1020 // -----------------------------------------
1021 // |<-----------tl0idx:200------------>|
1022
philipel29d88462018-08-08 14:26:00 +02001023 auto& vp9_header =
1024 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1025
asapersson9a4cd872015-10-23 00:27:14 -07001026 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001027 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001028 vp9_header.flexible_mode = false;
1029 vp9_header.beginning_of_frame = true;
1030 vp9_header.end_of_frame = true;
1031 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001032
Niels Möllerd5e02f02019-02-20 13:12:21 +01001033 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001034 packet_->markerBit = false;
1035 packet_->seqNum = 65486;
1036 packet_->timestamp = 6000;
1037 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001038 vp9_header.spatial_idx = 0;
1039 vp9_header.picture_id = 6;
1040 vp9_header.temporal_idx = 1;
1041 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001042 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1043
Niels Möllerd5e02f02019-02-20 13:12:21 +01001044 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001045 packet_->markerBit = true;
1046 packet_->seqNum = 65487;
1047 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001048 vp9_header.spatial_idx = 1;
1049 vp9_header.picture_id = 6;
1050 vp9_header.temporal_idx = 1;
1051 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001052 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1053
Niels Möllerd5e02f02019-02-20 13:12:21 +01001054 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001055 packet_->markerBit = true;
1056 packet_->seqNum = 65485;
1057 packet_->timestamp = 3000;
1058 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001059 vp9_header.spatial_idx = 1;
1060 vp9_header.picture_id = 5;
1061 vp9_header.temporal_idx = 0;
1062 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001063 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1064
1065 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +01001066 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001067 packet_->markerBit = false;
1068 packet_->seqNum = 65484;
1069 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001070 packet_->video_header.width = 352;
1071 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +02001072 vp9_header.spatial_idx = 0;
1073 vp9_header.picture_id = 5;
1074 vp9_header.temporal_idx = 0;
1075 vp9_header.temporal_up_switch = false;
1076 vp9_header.ss_data_available = true;
1077 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001078 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1079 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1080
1081 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001082 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001083 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1084 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1085 EXPECT_FALSE(
1086 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1087 jitter_buffer_->ReleaseFrame(frame_out);
1088
1089 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001090 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001091 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1092 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1093 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1094 jitter_buffer_->ReleaseFrame(frame_out);
1095}
1096
philipel85130292016-07-06 16:10:31 +02001097TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001098 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001099 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001100 packet_->markerBit = false;
1101 packet_->seqNum = seq_num_;
1102 packet_->timestamp = timestamp_;
1103 packet_->insertStartCode = true;
1104
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001105 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001106 EXPECT_EQ(kIncomplete,
1107 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001108
1109 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1110
1111 // Frame should not be complete.
1112 EXPECT_TRUE(frame_out == NULL);
1113
1114 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001115 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001116 packet_->markerBit = true;
1117 packet_->seqNum = seq_num_;
1118
philipel9d3ab612015-12-21 04:12:39 -08001119 EXPECT_EQ(kCompleteSession,
1120 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001121
1122 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001123 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001124 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001125 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001126}
1127
stefana669a3a2016-10-06 05:04:52 -07001128TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001129 auto& h264_header =
1130 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001131 packet_->timestamp = timestamp_;
1132 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001133 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001134 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001135 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001136 h264_header.nalu_type = H264::NaluType::kIdr;
1137 h264_header.nalus[0].type = H264::NaluType::kIdr;
1138 h264_header.nalus[0].sps_id = -1;
1139 h264_header.nalus[0].pps_id = 0;
1140 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001141 bool retransmitted = false;
1142 EXPECT_EQ(kCompleteSession,
1143 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1144 // Not decodable since sps and pps are missing.
1145 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1146
1147 timestamp_ += 3000;
1148 packet_->timestamp = timestamp_;
1149 ++seq_num_;
1150 packet_->seqNum = seq_num_;
1151 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001152 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001153 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001154 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001155 h264_header.nalu_type = H264::NaluType::kStapA;
1156 h264_header.nalus[0].type = H264::NaluType::kSps;
1157 h264_header.nalus[0].sps_id = 0;
1158 h264_header.nalus[0].pps_id = -1;
1159 h264_header.nalus[1].type = H264::NaluType::kPps;
1160 h264_header.nalus[1].sps_id = 0;
1161 h264_header.nalus[1].pps_id = 0;
1162 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001163 // Not complete since the marker bit hasn't been received.
1164 EXPECT_EQ(kIncomplete,
1165 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1166
1167 ++seq_num_;
1168 packet_->seqNum = seq_num_;
1169 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001170 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001171 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001172 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001173 h264_header.nalu_type = H264::NaluType::kIdr;
1174 h264_header.nalus[0].type = H264::NaluType::kIdr;
1175 h264_header.nalus[0].sps_id = -1;
1176 h264_header.nalus[0].pps_id = 0;
1177 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001178 // Complete and decodable since the pps and sps are received in the first
1179 // packet of this frame.
1180 EXPECT_EQ(kCompleteSession,
1181 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1182 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1183 ASSERT_NE(nullptr, frame_out);
1184 jitter_buffer_->ReleaseFrame(frame_out);
1185
1186 timestamp_ += 3000;
1187 packet_->timestamp = timestamp_;
1188 ++seq_num_;
1189 packet_->seqNum = seq_num_;
1190 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001191 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001192 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001193 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001194 h264_header.nalu_type = H264::NaluType::kSlice;
1195 h264_header.nalus[0].type = H264::NaluType::kSlice;
1196 h264_header.nalus[0].sps_id = -1;
1197 h264_header.nalus[0].pps_id = 0;
1198 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001199 // Complete and decodable since sps, pps and key frame has been received.
1200 EXPECT_EQ(kCompleteSession,
1201 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1202 frame_out = DecodeCompleteFrame();
1203 ASSERT_NE(nullptr, frame_out);
1204 jitter_buffer_->ReleaseFrame(frame_out);
1205}
1206
philipel85130292016-07-06 16:10:31 +02001207TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001208 seq_num_ = 0xfff0;
1209 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001210 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001211 packet_->markerBit = false;
1212 packet_->seqNum = seq_num_;
1213 packet_->timestamp = timestamp_;
1214
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001215 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001216 EXPECT_EQ(kIncomplete,
1217 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001218
1219 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1220
1221 EXPECT_TRUE(frame_out == NULL);
1222
1223 int loop = 0;
1224 do {
1225 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001226 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001227 packet_->markerBit = false;
1228 packet_->seqNum = seq_num_;
1229
philipel9d3ab612015-12-21 04:12:39 -08001230 EXPECT_EQ(kIncomplete,
1231 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001232
1233 frame_out = DecodeCompleteFrame();
1234
1235 EXPECT_TRUE(frame_out == NULL);
1236
1237 loop++;
1238 } while (loop < 98);
1239
1240 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001241 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001242 packet_->markerBit = true;
1243 packet_->seqNum = seq_num_;
1244
philipel9d3ab612015-12-21 04:12:39 -08001245 EXPECT_EQ(kCompleteSession,
1246 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001247
1248 frame_out = DecodeCompleteFrame();
1249
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001250 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001251
1252 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001253 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001254}
1255
philipel85130292016-07-06 16:10:31 +02001256TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001257 // Insert "first" packet last seqnum.
1258 seq_num_ = 10;
1259 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001260 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001261 packet_->markerBit = true;
1262 packet_->seqNum = seq_num_;
1263
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001264 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001265 EXPECT_EQ(kIncomplete,
1266 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001267 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1268
1269 // Should not be complete.
1270 EXPECT_TRUE(frame_out == NULL);
1271
1272 // Insert 98 frames.
1273 int loop = 0;
1274 do {
1275 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001276 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001277 packet_->markerBit = false;
1278 packet_->seqNum = seq_num_;
1279
philipel9d3ab612015-12-21 04:12:39 -08001280 EXPECT_EQ(kIncomplete,
1281 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001282
1283 frame_out = DecodeCompleteFrame();
1284
1285 EXPECT_TRUE(frame_out == NULL);
1286
1287 loop++;
1288 } while (loop < 98);
1289
1290 // Insert last packet.
1291 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001292 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001293 packet_->markerBit = false;
1294 packet_->seqNum = seq_num_;
1295
philipel9d3ab612015-12-21 04:12:39 -08001296 EXPECT_EQ(kCompleteSession,
1297 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001298
1299 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001300 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001301 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001302 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001303}
1304
philipel85130292016-07-06 16:10:31 +02001305TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001306 // ------- -------
1307 // | 2 | | 1 |
1308 // ------- -------
1309 // t = 3000 t = 2000
1310 seq_num_ = 2;
1311 timestamp_ = 3000;
1312 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001313 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001314 packet_->markerBit = true;
1315 packet_->timestamp = timestamp_;
1316 packet_->seqNum = seq_num_;
1317
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001318 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001319 EXPECT_EQ(kCompleteSession,
1320 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001321
1322 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001323 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001324 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001325 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001326 jitter_buffer_->ReleaseFrame(frame_out);
1327
1328 seq_num_--;
1329 timestamp_ = 2000;
1330 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001331 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001332 packet_->markerBit = true;
1333 packet_->seqNum = seq_num_;
1334 packet_->timestamp = timestamp_;
1335
philipel9d3ab612015-12-21 04:12:39 -08001336 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001337}
1338
philipel85130292016-07-06 16:10:31 +02001339TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001340 // ------- -------
1341 // | 2 | | 1 |
1342 // ------- -------
1343 // t = 3000 t = 0xffffff00
1344
1345 seq_num_ = 2;
1346 timestamp_ = 3000;
1347 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001348 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001349 packet_->markerBit = true;
1350 packet_->seqNum = seq_num_;
1351 packet_->timestamp = timestamp_;
1352
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001353 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001354 EXPECT_EQ(kCompleteSession,
1355 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001356
1357 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001358 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001359
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001360 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001361
1362 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1363
1364 jitter_buffer_->ReleaseFrame(frame_out);
1365
1366 seq_num_--;
1367 timestamp_ = 0xffffff00;
1368 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001369 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001370 packet_->markerBit = true;
1371 packet_->seqNum = seq_num_;
1372 packet_->timestamp = timestamp_;
1373
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001374 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001375 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001376}
1377
philipel85130292016-07-06 16:10:31 +02001378TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001379 // --------------- ---------------
1380 // | 1 | 2 | | 3 | 4 |
1381 // --------------- ---------------
1382 // t = 0xffffff00 t = 33*90
1383
1384 timestamp_ = 0xffffff00;
1385 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001386 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001387 packet_->markerBit = false;
1388 packet_->seqNum = seq_num_;
1389 packet_->timestamp = timestamp_;
1390
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001391 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001392 EXPECT_EQ(kIncomplete,
1393 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001394
1395 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001396 EXPECT_TRUE(frame_out == NULL);
1397
1398 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001399 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001400 packet_->markerBit = true;
1401 packet_->seqNum = seq_num_;
1402
philipel9d3ab612015-12-21 04:12:39 -08001403 EXPECT_EQ(kCompleteSession,
1404 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001405
1406 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001407 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001408 jitter_buffer_->ReleaseFrame(frame_out);
1409
1410 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001411 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001412 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001413 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001414 packet_->markerBit = false;
1415 packet_->seqNum = seq_num_;
1416 packet_->timestamp = timestamp_;
1417
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kIncomplete,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420
1421 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001422 EXPECT_TRUE(frame_out == NULL);
1423
1424 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001425 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001426 packet_->markerBit = true;
1427 packet_->seqNum = seq_num_;
1428
philipel9d3ab612015-12-21 04:12:39 -08001429 EXPECT_EQ(kCompleteSession,
1430 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001431
1432 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001433 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001434 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001435 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001436}
1437
philipel85130292016-07-06 16:10:31 +02001438TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001439 // ------- -------
1440 // | 1 | | 2 |
1441 // ------- -------
1442 // t = 0xffffff00 t = 2700
1443
1444 timestamp_ = 0xffffff00;
1445 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001446 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001447 packet_->markerBit = true;
1448 packet_->timestamp = timestamp_;
1449
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001450 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001451 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001452 EXPECT_EQ(kCompleteSession,
1453 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001454
1455 // Insert next frame.
1456 seq_num_++;
1457 timestamp_ = 2700;
1458 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001459 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001460 packet_->markerBit = true;
1461 packet_->seqNum = seq_num_;
1462 packet_->timestamp = timestamp_;
1463
philipel9d3ab612015-12-21 04:12:39 -08001464 EXPECT_EQ(kCompleteSession,
1465 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001466
1467 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001468 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001469 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001470 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001471 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001472
1473 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001474 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001475 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001477 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001478}
1479
philipel85130292016-07-06 16:10:31 +02001480TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001481 // ------- -------
1482 // | 2 | | 1 |
1483 // ------- -------
1484 // t = 2700 t = 0xffffff00
1485
1486 seq_num_ = 2;
1487 timestamp_ = 2700;
1488 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001489 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490 packet_->markerBit = true;
1491 packet_->seqNum = seq_num_;
1492 packet_->timestamp = timestamp_;
1493
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001494 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001495 EXPECT_EQ(kCompleteSession,
1496 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001497
1498 // Insert second frame
1499 seq_num_--;
1500 timestamp_ = 0xffffff00;
1501 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001502 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 packet_->markerBit = true;
1504 packet_->seqNum = seq_num_;
1505 packet_->timestamp = timestamp_;
1506
philipel9d3ab612015-12-21 04:12:39 -08001507 EXPECT_EQ(kCompleteSession,
1508 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001509
1510 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001511 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001512 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001513 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001514 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515
1516 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001517 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001518 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001520 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001521}
1522
philipel85130292016-07-06 16:10:31 +02001523TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001524 int loop = 0;
1525 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001526 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527 // Insert kMaxPacketsInJitterBuffer into frame.
1528 do {
1529 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001530 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001531 packet_->markerBit = false;
1532 packet_->seqNum = seq_num_;
1533
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001534 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001535 EXPECT_EQ(kIncomplete,
1536 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001537 firstPacket = false;
1538 } else {
philipel9d3ab612015-12-21 04:12:39 -08001539 EXPECT_EQ(kIncomplete,
1540 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001541 }
1542
1543 loop++;
1544 } while (loop < kMaxPacketsInSession);
1545
1546 // Max number of packets inserted.
1547 // Insert one more packet.
1548 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001549 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001550 packet_->markerBit = true;
1551 packet_->seqNum = seq_num_;
1552
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001553 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001554 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001555 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001556}
1557
philipel85130292016-07-06 16:10:31 +02001558TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559 // TEST fill JB with more than max number of frame (50 delta frames +
1560 // 51 key frames) with wrap in seq_num_
1561 //
1562 // --------------------------------------------------------------
1563 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1564 // --------------------------------------------------------------
1565 // |<-----------delta frames------------->|<------key frames----->|
1566
jbauchdb81ffd2015-11-23 03:59:02 -08001567 // Make sure the jitter doesn't request a keyframe after too much non-
1568 // decodable frames.
1569 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001570 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001571
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001572 int loop = 0;
1573 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001574 uint32_t first_key_frame_timestamp = 0;
1575 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001576 // Insert MAX_NUMBER_OF_FRAMES frames.
1577 do {
philipel9d3ab612015-12-21 04:12:39 -08001578 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001579 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001580 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581 packet_->markerBit = true;
1582 packet_->seqNum = seq_num_;
1583 packet_->timestamp = timestamp_;
1584
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001585 if (loop == 50) {
1586 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001587 packet_->frameType = kVideoFrameKey;
1588 }
1589
1590 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001591 EXPECT_EQ(kCompleteSession,
1592 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001593
1594 loop++;
1595 } while (loop < kMaxNumberOfFrames);
1596
1597 // Max number of frames inserted.
1598
1599 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001600 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001601 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001602 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001603 packet_->markerBit = true;
1604 packet_->seqNum = seq_num_;
1605 packet_->timestamp = timestamp_;
1606
1607 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001608 EXPECT_EQ(kFlushIndicator,
1609 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001610
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001611 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001612 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001613 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001614 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001615 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001616}
1617
philipel85130292016-07-06 16:10:31 +02001618TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001619 seq_num_ = 3;
1620 // Insert one empty packet per frame, should never return the last timestamp
1621 // inserted. Only return empty frames in the presence of subsequent frames.
1622 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001623 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001624 for (int i = 0; i < maxSize + 10; i++) {
1625 timestamp_ += 33 * 90;
1626 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001627 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001628 packet_->markerBit = false;
1629 packet_->seqNum = seq_num_;
1630 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001631 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001632
philipel9d3ab612015-12-21 04:12:39 -08001633 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634 }
1635}
1636
philipel85130292016-07-06 16:10:31 +02001637TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001638 // Test that a we cannot get incomplete frames from the JB if we haven't
1639 // received the marker bit, unless we have received a packet from a later
1640 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001641 // Start with a complete key frame - insert and decode.
1642 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001643 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001644 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001645 bool retransmitted = false;
1646
philipel9d3ab612015-12-21 04:12:39 -08001647 EXPECT_EQ(kCompleteSession,
1648 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001649 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1650 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001651 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001652
1653 packet_->seqNum += 2;
1654 packet_->timestamp += 33 * 90;
1655 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001656 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001657 packet_->markerBit = false;
1658
Niels Möller375b3462019-01-10 15:35:56 +01001659 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001660 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001661
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001662 packet_->seqNum += 2;
1663 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001664 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001665
Niels Möller375b3462019-01-10 15:35:56 +01001666 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001667 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001668}
1669
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001670TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001671 // Make sure the jitter doesn't request a keyframe after too much non-
1672 // decodable frames.
1673 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001674 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001675 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001676 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001677 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001678 DropFrame(1);
1679 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001680 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001681 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001682 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001683 // This frame will make the jitter buffer recycle frames until a key frame.
1684 // Since none is found it will have to wait until the next key frame before
1685 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001686 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001687 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001688}
1689
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001690TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001691 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001692 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001693 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001694 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001695 // Insert empty packet.
1696 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001697 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001698 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001699 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001700 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001701 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001702 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001703 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001704 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001705 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001706 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001707 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001708}
1709
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001710TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001711 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
1712 EXPECT_EQ(0, frame_stats.delta_frames);
1713 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001714
1715 uint32_t framerate = 0;
1716 uint32_t bitrate = 0;
1717 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1718 EXPECT_EQ(0u, framerate);
1719 EXPECT_EQ(0u, bitrate);
1720
1721 // Insert a couple of key and delta frames.
1722 InsertFrame(kVideoFrameKey);
1723 InsertFrame(kVideoFrameDelta);
1724 InsertFrame(kVideoFrameDelta);
1725 InsertFrame(kVideoFrameKey);
1726 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001727 // Decode some of them to make sure the statistics doesn't depend on frames
1728 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001729 EXPECT_TRUE(DecodeCompleteFrame());
1730 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001731 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001732 EXPECT_EQ(3, frame_stats.delta_frames);
1733 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001734
1735 // Insert 20 more frames to get estimates of bitrate and framerate over
1736 // 1 second.
1737 for (int i = 0; i < 20; ++i) {
1738 InsertFrame(kVideoFrameDelta);
1739 }
1740 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1741 // TODO(holmer): The current implementation returns the average of the last
1742 // two framerate calculations, which is why it takes two calls to reach the
1743 // actual framerate. This should be fixed.
1744 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
1745 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1746 // Insert 25 more frames to get estimates of bitrate and framerate over
1747 // 2 seconds.
1748 for (int i = 0; i < 25; ++i) {
1749 InsertFrame(kVideoFrameDelta);
1750 }
1751 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1752 EXPECT_EQ(kDefaultFrameRate, framerate);
1753 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1754}
1755
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001756TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1757 // Insert delta frames.
1758 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
1759 // Can't decode without a key frame.
1760 EXPECT_FALSE(DecodeCompleteFrame());
1761 InsertFrame(kVideoFrameKey);
1762 // Skip to the next key frame.
1763 EXPECT_TRUE(DecodeCompleteFrame());
1764}
1765
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001766TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
1767 InsertFrame(kVideoFrameKey);
1768 EXPECT_TRUE(DecodeCompleteFrame());
1769 const int kNumDeltaFrames = 5;
1770 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1771 InsertFrame(kVideoFrameKey);
1772 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1773 EXPECT_TRUE(DecodeCompleteFrame());
1774 }
1775}
1776
1777TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
1778 InsertFrame(kVideoFrameKey);
1779 EXPECT_TRUE(DecodeCompleteFrame());
1780 const int kNumDeltaFrames = 5;
1781 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1782 InsertFrame(kVideoFrameKey);
1783 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1784 InsertFrame(kVideoFrameKey);
1785 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1786 EXPECT_TRUE(DecodeCompleteFrame());
1787 }
1788}
1789
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001790TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
1791 InsertFrame(kVideoFrameKey);
1792 EXPECT_TRUE(DecodeCompleteFrame());
1793 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
1794 clock_->TimeInMilliseconds());
1795 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1796 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
1797 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001798 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001799 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1800 EXPECT_FALSE(DecodeCompleteFrame());
1801 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1802 EXPECT_TRUE(DecodeCompleteFrame());
1803 EXPECT_TRUE(DecodeCompleteFrame());
1804}
1805
philipel85130292016-07-06 16:10:31 +02001806TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001807 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00001808 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07001809 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001810 InsertFrame(kVideoFrameKey);
1811 EXPECT_TRUE(DecodeCompleteFrame());
1812}
1813
philipel85130292016-07-06 16:10:31 +02001814TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001815 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001816 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001817 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001818
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001819 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1820 // old packet.
1821 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001822 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08001823 EXPECT_EQ(kFlushIndicator,
1824 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001825 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001826
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001827 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001828 std::vector<uint16_t> nack_list =
1829 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001830 // No key frame will be requested since the jitter buffer is empty.
1831 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001832 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001833
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001834 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001835 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001836 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001837
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001838 // The next complete continuous frame isn't a key frame, but we're waiting
1839 // for one.
1840 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001841 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001842 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001843 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001844}
1845
philipel85130292016-07-06 16:10:31 +02001846TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001847 // Insert a key frame and decode it.
1848 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
1849 EXPECT_TRUE(DecodeCompleteFrame());
1850
1851 // Insert a frame which should trigger a recycle until the next key frame.
1852 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
1853
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001854 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001855 std::vector<uint16_t> nack_list =
1856 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001857 // Verify that the jitter buffer does not request a key frame.
1858 EXPECT_FALSE(request_key_frame);
1859 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001860 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001861 // Verify that we can decode the next frame.
1862 EXPECT_TRUE(DecodeCompleteFrame());
1863}
1864
philipel85130292016-07-06 16:10:31 +02001865TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001866 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001867 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001868 EXPECT_TRUE(DecodeCompleteFrame());
1869
1870 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001871 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001872 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001873 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001874 EXPECT_FALSE(DecodeCompleteFrame());
1875
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001876 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001877 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001878 // The jitter buffer is empty, so we won't request key frames until we get a
1879 // packet.
1880 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001881
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001882 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001883 // Now we have a packet in the jitter buffer, a key frame will be requested
1884 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001885 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001886 // The jitter buffer is empty, so we won't request key frames until we get a
1887 // packet.
1888 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001889 // The next complete continuous frame isn't a key frame, but we're waiting
1890 // for one.
1891 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001892 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001893 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001894 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001895}
1896
philipel85130292016-07-06 16:10:31 +02001897TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001898 DropFrame(10);
1899 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001900 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001901 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001902 std::vector<uint16_t> nack_list =
1903 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001904 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001905 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001906 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001907}
1908
philipel85130292016-07-06 16:10:31 +02001909TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001910 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001911 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001912 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001913 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001914 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001915 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001916 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001917 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001918 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001919 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001920}
1921
philipel85130292016-07-06 16:10:31 +02001922TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001923 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001924 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1925 clock_->TimeInMilliseconds());
1926 VCMPacket packet;
1927 stream_generator_->PopPacket(&packet, 0);
1928 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001929 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001930 EXPECT_FALSE(retransmitted);
1931 // Drop second packet.
1932 stream_generator_->PopPacket(&packet, 1);
1933 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1934 EXPECT_FALSE(retransmitted);
1935 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001936 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001937 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001938 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001939 EXPECT_EQ(1u, nack_list.size());
1940 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001941 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001942 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001943 EXPECT_EQ(kCompleteSession,
1944 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001945 EXPECT_TRUE(retransmitted);
1946 EXPECT_TRUE(DecodeCompleteFrame());
1947}
1948
philipel85130292016-07-06 16:10:31 +02001949TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001950 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001951 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001952 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001953 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001954 // Drop second packet.
1955 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1956 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001957 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001958 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001959 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001960 ASSERT_EQ(1u, nack_list.size());
1961 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001962 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001963 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001964 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001965}
1966
philipel85130292016-07-06 16:10:31 +02001967TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001968 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001969 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001970 // First frame is delta.
1971 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
1972 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001973 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001974 // Drop second packet in frame.
1975 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1976 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1977 // Second frame is key.
1978 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1979 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001980 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001981 // Drop second packet in frame.
1982 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1983 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001984 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001985 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001986 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001987 ASSERT_EQ(1u, nack_list.size());
1988 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001989 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001990 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001991}
1992
philipel85130292016-07-06 16:10:31 +02001993TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001994 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001995
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001996 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001997 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001998
1999 // ----------------------------------------------------------------
2000 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2001 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002002 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002003 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002004 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01002005 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002006 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002007 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002008 while (stream_generator_->PacketsRemaining() > 1) {
2009 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01002010 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002011 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002012 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002013 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002014 }
Niels Möller375b3462019-01-10 15:35:56 +01002015 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002016 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002017 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002018 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002019
2020 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002021 std::vector<uint16_t> nack_list =
2022 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002023 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002024 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002025 for (size_t i = 0; i < nack_list.size(); ++i)
2026 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002027}
2028
philipel85130292016-07-06 16:10:31 +02002029TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002030 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002031 // ------- ------------------------------------------------------------
2032 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2033 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002034 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002035 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002036 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002037 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002038 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002039 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002040 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002041 while (stream_generator_->PacketsRemaining() > 1) {
2042 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002043 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002044 EXPECT_FALSE(request_key_frame);
2045 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002046 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002047 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002048 }
2049 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002050 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002051 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002052 EXPECT_FALSE(DecodeCompleteFrame());
2053 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002054 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002055 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002056 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002057 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002058 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2059 for (size_t i = 0; i < nack_list.size(); ++i)
2060 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002061}
2062
philipel85130292016-07-06 16:10:31 +02002063TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002064 bool request_key_frame = false;
2065 // -----------------------------------
2066 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2067 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002068 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002069 InsertFrame(kVideoFrameKey);
2070 EXPECT_FALSE(request_key_frame);
2071 EXPECT_TRUE(DecodeCompleteFrame());
2072 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2073 clock_->TimeInMilliseconds());
2074 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2075 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002076 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002077 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002078 EXPECT_FALSE(request_key_frame);
2079 } else {
2080 stream_generator_->NextPacket(NULL); // Drop packet
2081 }
2082 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2083 clock_->TimeInMilliseconds());
2084 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2085 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002086 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002087 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002088 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002089 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002090 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002091 ASSERT_EQ(1u, nack_list.size());
2092 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002093}
2094
philipel85130292016-07-06 16:10:31 +02002095TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002096 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002097 InsertFrame(kVideoFrameKey);
2098 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002099 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002100 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2101 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002102
2103 // Far-into-the-future video frame, could be caused by resetting the encoder
2104 // or otherwise restarting. This should not fail when error when the packet is
2105 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002106 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002107 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2108 InsertFrame(kVideoFrameKey);
2109 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002110 nack_list = jitter_buffer_->GetNackList(&extended);
2111 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002112
2113 // Stream should be decodable from this point.
2114 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2115 InsertFrame(kVideoFrameDelta);
2116 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002117 nack_list = jitter_buffer_->GetNackList(&extended);
2118 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002119}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002120} // namespace webrtc