blob: bc2395e992cb3fb1a7b8d80174528e218fa40b38 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/location.h"
24#include "system_wrappers/include/clock.h"
25#include "system_wrappers/include/field_trial.h"
26#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "test/field_trial.h"
28#include "test/gmock.h"
29#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000030
31namespace webrtc {
32
asapersson9a4cd872015-10-23 00:27:14 -070033namespace {
philipel9d3ab612015-12-21 04:12:39 -080034const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070035} // namespace
36
37class Vp9SsMapTest : public ::testing::Test {
38 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020039 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070040
41 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020042 auto& vp9_header =
43 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
johan0d1b2b62017-01-10 04:21:35 -080044 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
51 packet_.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020052 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020053 vp9_header.flexible_mode = false;
54 vp9_header.gof_idx = 0;
55 vp9_header.temporal_idx = kNoTemporalIdx;
56 vp9_header.temporal_up_switch = false;
57 vp9_header.ss_data_available = true;
58 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020072 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
73 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070074 EXPECT_FALSE(map_.Insert(packet_));
75}
76
77TEST_F(Vp9SsMapTest, Find) {
78 EXPECT_TRUE(map_.Insert(packet_));
79 Vp9SsMap::SsMap::iterator it;
80 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
81 EXPECT_EQ(packet_.timestamp, it->first);
82}
83
84TEST_F(Vp9SsMapTest, Find_WithWrap) {
85 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
86 const uint32_t kSsTimestamp2 = 100;
87 packet_.timestamp = kSsTimestamp1;
88 EXPECT_TRUE(map_.Insert(packet_));
89 packet_.timestamp = kSsTimestamp2;
90 EXPECT_TRUE(map_.Insert(packet_));
91 Vp9SsMap::SsMap::iterator it;
92 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
93 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(0, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
98 EXPECT_EQ(kSsTimestamp1, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
100 EXPECT_EQ(kSsTimestamp2, it->first);
101 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
102 EXPECT_EQ(kSsTimestamp2, it->first);
103}
104
105TEST_F(Vp9SsMapTest, Reset) {
106 EXPECT_TRUE(map_.Insert(packet_));
107 Vp9SsMap::SsMap::iterator it;
108 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
109 EXPECT_EQ(packet_.timestamp, it->first);
110
111 map_.Reset();
112 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
113}
114
115TEST_F(Vp9SsMapTest, RemoveOld) {
116 Vp9SsMap::SsMap::iterator it;
117 const uint32_t kSsTimestamp1 = 10000;
118 packet_.timestamp = kSsTimestamp1;
119 EXPECT_TRUE(map_.Insert(packet_));
120
121 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
122 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
123 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
124
125 map_.RemoveOld(kTimestamp);
126 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
127 EXPECT_TRUE(map_.Find(kTimestamp, &it));
128 EXPECT_EQ(kTimestamp, it->first);
129}
130
131TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
132 Vp9SsMap::SsMap::iterator it;
133 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
134 const uint32_t kSsTimestamp2 = 10;
135 const uint32_t kSsTimestamp3 = 1000;
136 packet_.timestamp = kSsTimestamp1;
137 EXPECT_TRUE(map_.Insert(packet_));
138 packet_.timestamp = kSsTimestamp2;
139 EXPECT_TRUE(map_.Insert(packet_));
140 packet_.timestamp = kSsTimestamp3;
141 EXPECT_TRUE(map_.Insert(packet_));
142
143 map_.RemoveOld(kSsTimestamp3);
144 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
145 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
146 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
147}
148
149TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200150 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
151 0;
asapersson9a4cd872015-10-23 00:27:14 -0700152 EXPECT_FALSE(map_.UpdatePacket(&packet_));
153}
154
155TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
156 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200157 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
158 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700159 EXPECT_FALSE(map_.UpdatePacket(&packet_));
160}
161
162TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
163 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200164 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
165 4;
asapersson9a4cd872015-10-23 00:27:14 -0700166 EXPECT_FALSE(map_.UpdatePacket(&packet_));
167}
168
169TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200170 auto& vp9_header =
171 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700172 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
173
philipel29d88462018-08-08 14:26:00 +0200174 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700175 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200176 EXPECT_EQ(0, vp9_header.temporal_idx);
177 EXPECT_FALSE(vp9_header.temporal_up_switch);
178 EXPECT_EQ(1U, vp9_header.num_ref_pics);
179 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700180
philipel29d88462018-08-08 14:26:00 +0200181 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700182 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200183 EXPECT_EQ(2, vp9_header.temporal_idx);
184 EXPECT_TRUE(vp9_header.temporal_up_switch);
185 EXPECT_EQ(1U, vp9_header.num_ref_pics);
186 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700187
philipel29d88462018-08-08 14:26:00 +0200188 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700189 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200190 EXPECT_EQ(1, vp9_header.temporal_idx);
191 EXPECT_TRUE(vp9_header.temporal_up_switch);
192 EXPECT_EQ(1U, vp9_header.num_ref_pics);
193 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700194
philipel29d88462018-08-08 14:26:00 +0200195 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700196 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200197 EXPECT_EQ(2, vp9_header.temporal_idx);
198 EXPECT_TRUE(vp9_header.temporal_up_switch);
199 EXPECT_EQ(1U, vp9_header.num_ref_pics);
200 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700201}
202
philipel83f831a2016-03-12 03:30:23 -0800203class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
204 public NackSender,
205 public KeyFrameRequestSender {
206 public:
207 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
208 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
209 sequence_numbers.end());
210 }
211
212 void RequestKeyFrame() override { ++keyframe_requests_; }
213
philipel83f831a2016-03-12 03:30:23 -0800214 std::vector<uint16_t> nack_sent_;
215 int keyframe_requests_;
216
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000217 protected:
philipel85130292016-07-06 16:10:31 +0200218 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700219 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700221 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100222 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 jitter_buffer_->Start();
224 seq_num_ = 1234;
225 timestamp_ = 0;
226 size_ = 1400;
227 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
228 data_[0] = 0;
229 data_[1] = 0;
230 data_[2] = 0x80;
231 int count = 3;
232 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
233 data_[i] = count;
234 count++;
235 if (count == 10) {
236 data_[i + 1] = 0;
237 data_[i + 2] = 0;
238 data_[i + 3] = 0x80;
239 count = 3;
240 i += 3;
241 }
242 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200243 WebRtcRTPHeader rtpHeader;
244 memset(&rtpHeader, 0, sizeof(rtpHeader));
245 rtpHeader.header.sequenceNumber = seq_num_;
246 rtpHeader.header.timestamp = timestamp_;
247 rtpHeader.header.markerBit = true;
248 rtpHeader.frameType = kVideoFrameDelta;
Magnus Jedvert22341212018-07-11 14:27:49 +0200249 rtpHeader.video_header().codec = kVideoCodecGeneric;
250 rtpHeader.video_header().is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200251 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000252 }
253
254 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700255 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700257 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +0200258 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000259 }
260
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
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000365 VCMFrameBufferEnum InsertFrame(FrameType 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
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000374 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
375 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;
johan0d1b2b62017-01-10 04:21:35 -0800438 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800456 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800491 packet_->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_;
johan0d1b2b62017-01-10 04:21:35 -0800502 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800518 packet_->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_++;
johan0d1b2b62017-01-10 04:21:35 -0800534 packet_->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_;
johan0d1b2b62017-01-10 04:21:35 -0800545 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800562 packet_->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
johan0d1b2b62017-01-10 04:21:35 -0800586 packet_->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_;
johan0d1b2b62017-01-10 04:21:35 -0800601 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800619 packet_->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_--;
johan0d1b2b62017-01-10 04:21:35 -0800636 packet_->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_--;
johan0d1b2b62017-01-10 04:21:35 -0800647 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800664 packet_->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_++;
johan0d1b2b62017-01-10 04:21:35 -0800676 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800690 packet_->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_++;
johan0d1b2b62017-01-10 04:21:35 -0800704 packet_->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;
johan0d1b2b62017-01-10 04:21:35 -0800724 packet_->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.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200766 WebRtcRTPHeader rtpHeader;
767 memset(&rtpHeader, 0, sizeof(rtpHeader));
768 rtpHeader.header.sequenceNumber = seq_num_ + 2;
769 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
770 rtpHeader.header.markerBit = false;
Magnus Jedvert22341212018-07-11 14:27:49 +0200771 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200772 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700773 EXPECT_EQ(kOldPacket,
774 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
775 empty_packet.seqNum += 1;
776 EXPECT_EQ(kOldPacket,
777 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
778
779 // But now Frame C should be ready!
780 frame_out = DecodeCompleteFrame();
781 EXPECT_TRUE(frame_out != NULL);
782 jitter_buffer_->ReleaseFrame(frame_out);
783}
784
philipel85130292016-07-06 16:10:31 +0200785TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000786 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800787 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000788 packet_->markerBit = false;
789 packet_->seqNum = seq_num_;
790 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000791 EXPECT_EQ(0, jitter_buffer_->num_packets());
792 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000793
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000794 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800795 EXPECT_EQ(kIncomplete,
796 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000797
798 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
799
800 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000801 EXPECT_EQ(1, jitter_buffer_->num_packets());
802 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000803
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000804 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800805 EXPECT_EQ(kDuplicatePacket,
806 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000807 EXPECT_EQ(2, jitter_buffer_->num_packets());
808 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000809
810 seq_num_++;
811 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000812 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800813 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000814
philipel9d3ab612015-12-21 04:12:39 -0800815 EXPECT_EQ(kCompleteSession,
816 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000817
818 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000819 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000820 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000821
822 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000823 EXPECT_EQ(3, jitter_buffer_->num_packets());
824 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000825 jitter_buffer_->ReleaseFrame(frame_out);
826}
827
philipel85130292016-07-06 16:10:31 +0200828TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000829 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800830 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000831 packet_->markerBit = true;
832 packet_->seqNum = seq_num_;
833 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000834 EXPECT_EQ(0, jitter_buffer_->num_packets());
835 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
836
837 bool retransmitted = false;
838 // Insert first complete frame.
839 EXPECT_EQ(kCompleteSession,
840 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
841
842 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
843 ASSERT_TRUE(frame_out != NULL);
844 CheckOutFrame(frame_out, size_, false);
845 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
846 jitter_buffer_->ReleaseFrame(frame_out);
847
848 // Insert 3 delta frames.
849 for (uint16_t i = 1; i <= 3; ++i) {
850 packet_->seqNum = seq_num_ + i;
851 packet_->timestamp = timestamp_ + (i * 33) * 90;
852 packet_->frameType = kVideoFrameDelta;
853 EXPECT_EQ(kCompleteSession,
854 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
855 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
856 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
857 }
858
859 // Retransmit second delta frame.
860 packet_->seqNum = seq_num_ + 2;
861 packet_->timestamp = timestamp_ + 66 * 90;
862
863 EXPECT_EQ(kDuplicatePacket,
864 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
865
866 EXPECT_EQ(5, jitter_buffer_->num_packets());
867 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
868
869 // Should be able to decode 3 delta frames, key frame already decoded.
870 for (size_t i = 0; i < 3; ++i) {
871 frame_out = DecodeCompleteFrame();
872 ASSERT_TRUE(frame_out != NULL);
873 CheckOutFrame(frame_out, size_, false);
874 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
875 jitter_buffer_->ReleaseFrame(frame_out);
876 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000877}
878
philipel85130292016-07-06 16:10:31 +0200879TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700880 // Verify that JB skips forward to next base layer frame.
881 // -------------------------------------------------
882 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
883 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
884 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
885 // | ss | x | x | x | |
886 // -------------------------------------------------
887 // |<----------tl0idx:200--------->|<---tl0idx:201---
888
philipel29d88462018-08-08 14:26:00 +0200889 auto& vp9_header =
890 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
891
asapersson9a4cd872015-10-23 00:27:14 -0700892 bool re = false;
893 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200894 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800895 packet_->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;
949 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200950 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800951 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700952 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200953 vp9_header.flexible_mode = false;
954 vp9_header.spatial_idx = 0;
955 vp9_header.beginning_of_frame = true;
956 vp9_header.end_of_frame = true;
957 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700958
959 packet_->seqNum = 65486;
960 packet_->timestamp = 6000;
961 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200962 vp9_header.picture_id = 6;
963 vp9_header.temporal_idx = 2;
964 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700965 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
966
967 packet_->seqNum = 65487;
968 packet_->timestamp = 9000;
969 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200970 vp9_header.picture_id = 7;
971 vp9_header.temporal_idx = 1;
972 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700973 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
974
975 // Insert first frame with SS data.
976 packet_->seqNum = 65485;
977 packet_->timestamp = 3000;
978 packet_->frameType = kVideoFrameKey;
979 packet_->width = 352;
980 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +0200981 vp9_header.picture_id = 5;
982 vp9_header.temporal_idx = 0;
983 vp9_header.temporal_up_switch = false;
984 vp9_header.ss_data_available = true;
985 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700986 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
987 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
988
989 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200990 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700991 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
992 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
993 EXPECT_FALSE(
994 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
995 jitter_buffer_->ReleaseFrame(frame_out);
996
997 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200998 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700999 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1000 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1001 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1002 jitter_buffer_->ReleaseFrame(frame_out);
1003
1004 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001005 EXPECT_EQ(9000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001006 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1007 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1008 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1009 jitter_buffer_->ReleaseFrame(frame_out);
1010}
1011
philipel85130292016-07-06 16:10:31 +02001012TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001013 // Verify that frames are updated with SS data when SS packet is reordered.
1014 // -----------------------------------------
1015 // | 65486 | 65487 | 65485 | 65484 |...
1016 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1017 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1018 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1019 // | t:6000 | t:6000 | t:3000 | t:3000 |
1020 // | | | | ss |
1021 // -----------------------------------------
1022 // |<-----------tl0idx:200------------>|
1023
philipel29d88462018-08-08 14:26:00 +02001024 auto& vp9_header =
1025 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1026
asapersson9a4cd872015-10-23 00:27:14 -07001027 bool re = false;
1028 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001029 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001030 vp9_header.flexible_mode = false;
1031 vp9_header.beginning_of_frame = true;
1032 vp9_header.end_of_frame = true;
1033 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001034
johan0d1b2b62017-01-10 04:21:35 -08001035 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001036 packet_->markerBit = false;
1037 packet_->seqNum = 65486;
1038 packet_->timestamp = 6000;
1039 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001040 vp9_header.spatial_idx = 0;
1041 vp9_header.picture_id = 6;
1042 vp9_header.temporal_idx = 1;
1043 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001044 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1045
johan0d1b2b62017-01-10 04:21:35 -08001046 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001047 packet_->markerBit = true;
1048 packet_->seqNum = 65487;
1049 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001050 vp9_header.spatial_idx = 1;
1051 vp9_header.picture_id = 6;
1052 vp9_header.temporal_idx = 1;
1053 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001054 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1055
johan0d1b2b62017-01-10 04:21:35 -08001056 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001057 packet_->markerBit = true;
1058 packet_->seqNum = 65485;
1059 packet_->timestamp = 3000;
1060 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001061 vp9_header.spatial_idx = 1;
1062 vp9_header.picture_id = 5;
1063 vp9_header.temporal_idx = 0;
1064 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001065 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1066
1067 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001068 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001069 packet_->markerBit = false;
1070 packet_->seqNum = 65484;
1071 packet_->frameType = kVideoFrameKey;
1072 packet_->width = 352;
1073 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001074 vp9_header.spatial_idx = 0;
1075 vp9_header.picture_id = 5;
1076 vp9_header.temporal_idx = 0;
1077 vp9_header.temporal_up_switch = false;
1078 vp9_header.ss_data_available = true;
1079 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001080 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1081 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1082
1083 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001084 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001085 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1086 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1087 EXPECT_FALSE(
1088 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1089 jitter_buffer_->ReleaseFrame(frame_out);
1090
1091 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001092 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001093 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1094 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1095 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1096 jitter_buffer_->ReleaseFrame(frame_out);
1097}
1098
philipel85130292016-07-06 16:10:31 +02001099TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001100 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001101 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001102 packet_->markerBit = false;
1103 packet_->seqNum = seq_num_;
1104 packet_->timestamp = timestamp_;
1105 packet_->insertStartCode = true;
1106
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001107 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001108 EXPECT_EQ(kIncomplete,
1109 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001110
1111 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1112
1113 // Frame should not be complete.
1114 EXPECT_TRUE(frame_out == NULL);
1115
1116 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001117 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001118 packet_->markerBit = true;
1119 packet_->seqNum = seq_num_;
1120
philipel9d3ab612015-12-21 04:12:39 -08001121 EXPECT_EQ(kCompleteSession,
1122 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001123
1124 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001125 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001126 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001127 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001128}
1129
stefana669a3a2016-10-06 05:04:52 -07001130TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001131 auto& h264_header =
1132 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001133 packet_->timestamp = timestamp_;
1134 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001135 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001136 packet_->markerBit = true;
1137 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001138 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001139 h264_header.nalu_type = H264::NaluType::kIdr;
1140 h264_header.nalus[0].type = H264::NaluType::kIdr;
1141 h264_header.nalus[0].sps_id = -1;
1142 h264_header.nalus[0].pps_id = 0;
1143 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001144 bool retransmitted = false;
1145 EXPECT_EQ(kCompleteSession,
1146 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1147 // Not decodable since sps and pps are missing.
1148 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1149
1150 timestamp_ += 3000;
1151 packet_->timestamp = timestamp_;
1152 ++seq_num_;
1153 packet_->seqNum = seq_num_;
1154 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001155 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001156 packet_->markerBit = false;
1157 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001158 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001159 h264_header.nalu_type = H264::NaluType::kStapA;
1160 h264_header.nalus[0].type = H264::NaluType::kSps;
1161 h264_header.nalus[0].sps_id = 0;
1162 h264_header.nalus[0].pps_id = -1;
1163 h264_header.nalus[1].type = H264::NaluType::kPps;
1164 h264_header.nalus[1].sps_id = 0;
1165 h264_header.nalus[1].pps_id = 0;
1166 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001167 // Not complete since the marker bit hasn't been received.
1168 EXPECT_EQ(kIncomplete,
1169 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1170
1171 ++seq_num_;
1172 packet_->seqNum = seq_num_;
1173 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001174 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001175 packet_->markerBit = true;
1176 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001177 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001178 h264_header.nalu_type = H264::NaluType::kIdr;
1179 h264_header.nalus[0].type = H264::NaluType::kIdr;
1180 h264_header.nalus[0].sps_id = -1;
1181 h264_header.nalus[0].pps_id = 0;
1182 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001183 // Complete and decodable since the pps and sps are received in the first
1184 // packet of this frame.
1185 EXPECT_EQ(kCompleteSession,
1186 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1187 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1188 ASSERT_NE(nullptr, frame_out);
1189 jitter_buffer_->ReleaseFrame(frame_out);
1190
1191 timestamp_ += 3000;
1192 packet_->timestamp = timestamp_;
1193 ++seq_num_;
1194 packet_->seqNum = seq_num_;
1195 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001196 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001197 packet_->markerBit = true;
1198 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001199 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001200 h264_header.nalu_type = H264::NaluType::kSlice;
1201 h264_header.nalus[0].type = H264::NaluType::kSlice;
1202 h264_header.nalus[0].sps_id = -1;
1203 h264_header.nalus[0].pps_id = 0;
1204 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001205 // Complete and decodable since sps, pps and key frame has been received.
1206 EXPECT_EQ(kCompleteSession,
1207 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1208 frame_out = DecodeCompleteFrame();
1209 ASSERT_NE(nullptr, frame_out);
1210 jitter_buffer_->ReleaseFrame(frame_out);
1211}
1212
philipel85130292016-07-06 16:10:31 +02001213TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001214 seq_num_ = 0xfff0;
1215 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001216 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001217 packet_->markerBit = false;
1218 packet_->seqNum = seq_num_;
1219 packet_->timestamp = timestamp_;
1220
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001221 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001222 EXPECT_EQ(kIncomplete,
1223 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001224
1225 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1226
1227 EXPECT_TRUE(frame_out == NULL);
1228
1229 int loop = 0;
1230 do {
1231 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001232 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001233 packet_->markerBit = false;
1234 packet_->seqNum = seq_num_;
1235
philipel9d3ab612015-12-21 04:12:39 -08001236 EXPECT_EQ(kIncomplete,
1237 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001238
1239 frame_out = DecodeCompleteFrame();
1240
1241 EXPECT_TRUE(frame_out == NULL);
1242
1243 loop++;
1244 } while (loop < 98);
1245
1246 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001247 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001248 packet_->markerBit = true;
1249 packet_->seqNum = seq_num_;
1250
philipel9d3ab612015-12-21 04:12:39 -08001251 EXPECT_EQ(kCompleteSession,
1252 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001253
1254 frame_out = DecodeCompleteFrame();
1255
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001256 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001257
1258 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001259 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001260}
1261
philipel85130292016-07-06 16:10:31 +02001262TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001263 // Insert "first" packet last seqnum.
1264 seq_num_ = 10;
1265 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001266 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001267 packet_->markerBit = true;
1268 packet_->seqNum = seq_num_;
1269
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001270 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001271 EXPECT_EQ(kIncomplete,
1272 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001273 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1274
1275 // Should not be complete.
1276 EXPECT_TRUE(frame_out == NULL);
1277
1278 // Insert 98 frames.
1279 int loop = 0;
1280 do {
1281 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001282 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001283 packet_->markerBit = false;
1284 packet_->seqNum = seq_num_;
1285
philipel9d3ab612015-12-21 04:12:39 -08001286 EXPECT_EQ(kIncomplete,
1287 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001288
1289 frame_out = DecodeCompleteFrame();
1290
1291 EXPECT_TRUE(frame_out == NULL);
1292
1293 loop++;
1294 } while (loop < 98);
1295
1296 // Insert last packet.
1297 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001298 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001299 packet_->markerBit = false;
1300 packet_->seqNum = seq_num_;
1301
philipel9d3ab612015-12-21 04:12:39 -08001302 EXPECT_EQ(kCompleteSession,
1303 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001304
1305 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001306 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001307 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001308 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001309}
1310
philipel85130292016-07-06 16:10:31 +02001311TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001312 // ------- -------
1313 // | 2 | | 1 |
1314 // ------- -------
1315 // t = 3000 t = 2000
1316 seq_num_ = 2;
1317 timestamp_ = 3000;
1318 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001319 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001320 packet_->markerBit = true;
1321 packet_->timestamp = timestamp_;
1322 packet_->seqNum = seq_num_;
1323
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001324 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001325 EXPECT_EQ(kCompleteSession,
1326 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001327
1328 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001329 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001330 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001331 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001332 jitter_buffer_->ReleaseFrame(frame_out);
1333
1334 seq_num_--;
1335 timestamp_ = 2000;
1336 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001337 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001338 packet_->markerBit = true;
1339 packet_->seqNum = seq_num_;
1340 packet_->timestamp = timestamp_;
1341
philipel9d3ab612015-12-21 04:12:39 -08001342 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001343}
1344
philipel85130292016-07-06 16:10:31 +02001345TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001346 // ------- -------
1347 // | 2 | | 1 |
1348 // ------- -------
1349 // t = 3000 t = 0xffffff00
1350
1351 seq_num_ = 2;
1352 timestamp_ = 3000;
1353 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001354 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001355 packet_->markerBit = true;
1356 packet_->seqNum = seq_num_;
1357 packet_->timestamp = timestamp_;
1358
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001359 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001360 EXPECT_EQ(kCompleteSession,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001362
1363 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001364 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001365
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001366 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001367
1368 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1369
1370 jitter_buffer_->ReleaseFrame(frame_out);
1371
1372 seq_num_--;
1373 timestamp_ = 0xffffff00;
1374 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001375 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001376 packet_->markerBit = true;
1377 packet_->seqNum = seq_num_;
1378 packet_->timestamp = timestamp_;
1379
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001380 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001381 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001382}
1383
philipel85130292016-07-06 16:10:31 +02001384TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001385 // --------------- ---------------
1386 // | 1 | 2 | | 3 | 4 |
1387 // --------------- ---------------
1388 // t = 0xffffff00 t = 33*90
1389
1390 timestamp_ = 0xffffff00;
1391 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001392 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001393 packet_->markerBit = false;
1394 packet_->seqNum = seq_num_;
1395 packet_->timestamp = timestamp_;
1396
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001397 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001398 EXPECT_EQ(kIncomplete,
1399 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001400
1401 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001402 EXPECT_TRUE(frame_out == NULL);
1403
1404 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001405 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001406 packet_->markerBit = true;
1407 packet_->seqNum = seq_num_;
1408
philipel9d3ab612015-12-21 04:12:39 -08001409 EXPECT_EQ(kCompleteSession,
1410 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001411
1412 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001413 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001414 jitter_buffer_->ReleaseFrame(frame_out);
1415
1416 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001417 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001418 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001419 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420 packet_->markerBit = false;
1421 packet_->seqNum = seq_num_;
1422 packet_->timestamp = timestamp_;
1423
philipel9d3ab612015-12-21 04:12:39 -08001424 EXPECT_EQ(kIncomplete,
1425 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001426
1427 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001428 EXPECT_TRUE(frame_out == NULL);
1429
1430 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001431 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001432 packet_->markerBit = true;
1433 packet_->seqNum = seq_num_;
1434
philipel9d3ab612015-12-21 04:12:39 -08001435 EXPECT_EQ(kCompleteSession,
1436 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001437
1438 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001439 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001440 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001441 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001442}
1443
philipel85130292016-07-06 16:10:31 +02001444TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001445 // ------- -------
1446 // | 1 | | 2 |
1447 // ------- -------
1448 // t = 0xffffff00 t = 2700
1449
1450 timestamp_ = 0xffffff00;
1451 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001452 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001453 packet_->markerBit = true;
1454 packet_->timestamp = timestamp_;
1455
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001456 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001457 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001458 EXPECT_EQ(kCompleteSession,
1459 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001460
1461 // Insert next frame.
1462 seq_num_++;
1463 timestamp_ = 2700;
1464 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001465 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001466 packet_->markerBit = true;
1467 packet_->seqNum = seq_num_;
1468 packet_->timestamp = timestamp_;
1469
philipel9d3ab612015-12-21 04:12:39 -08001470 EXPECT_EQ(kCompleteSession,
1471 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001472
1473 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001474 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001475 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001477 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001478
1479 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001480 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001481 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001482 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001483 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001484}
1485
philipel85130292016-07-06 16:10:31 +02001486TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001487 // ------- -------
1488 // | 2 | | 1 |
1489 // ------- -------
1490 // t = 2700 t = 0xffffff00
1491
1492 seq_num_ = 2;
1493 timestamp_ = 2700;
1494 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001495 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001496 packet_->markerBit = true;
1497 packet_->seqNum = seq_num_;
1498 packet_->timestamp = timestamp_;
1499
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001500 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001501 EXPECT_EQ(kCompleteSession,
1502 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503
1504 // Insert second frame
1505 seq_num_--;
1506 timestamp_ = 0xffffff00;
1507 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001508 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001509 packet_->markerBit = true;
1510 packet_->seqNum = seq_num_;
1511 packet_->timestamp = timestamp_;
1512
philipel9d3ab612015-12-21 04:12:39 -08001513 EXPECT_EQ(kCompleteSession,
1514 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515
1516 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001517 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001518 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001520 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001521
1522 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001523 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001524 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001525 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001526 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527}
1528
philipel85130292016-07-06 16:10:31 +02001529TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001530 int loop = 0;
1531 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001532 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001533 // Insert kMaxPacketsInJitterBuffer into frame.
1534 do {
1535 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001536 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001537 packet_->markerBit = false;
1538 packet_->seqNum = seq_num_;
1539
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001541 EXPECT_EQ(kIncomplete,
1542 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001543 firstPacket = false;
1544 } else {
philipel9d3ab612015-12-21 04:12:39 -08001545 EXPECT_EQ(kIncomplete,
1546 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001547 }
1548
1549 loop++;
1550 } while (loop < kMaxPacketsInSession);
1551
1552 // Max number of packets inserted.
1553 // Insert one more packet.
1554 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001555 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001556 packet_->markerBit = true;
1557 packet_->seqNum = seq_num_;
1558
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001560 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562}
1563
philipel85130292016-07-06 16:10:31 +02001564TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565 // TEST fill JB with more than max number of frame (50 delta frames +
1566 // 51 key frames) with wrap in seq_num_
1567 //
1568 // --------------------------------------------------------------
1569 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1570 // --------------------------------------------------------------
1571 // |<-----------delta frames------------->|<------key frames----->|
1572
jbauchdb81ffd2015-11-23 03:59:02 -08001573 // Make sure the jitter doesn't request a keyframe after too much non-
1574 // decodable frames.
1575 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001576 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001577
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001578 int loop = 0;
1579 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001580 uint32_t first_key_frame_timestamp = 0;
1581 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582 // Insert MAX_NUMBER_OF_FRAMES frames.
1583 do {
philipel9d3ab612015-12-21 04:12:39 -08001584 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001585 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001586 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001587 packet_->markerBit = true;
1588 packet_->seqNum = seq_num_;
1589 packet_->timestamp = timestamp_;
1590
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001591 if (loop == 50) {
1592 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001593 packet_->frameType = kVideoFrameKey;
1594 }
1595
1596 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001597 EXPECT_EQ(kCompleteSession,
1598 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001599
1600 loop++;
1601 } while (loop < kMaxNumberOfFrames);
1602
1603 // Max number of frames inserted.
1604
1605 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001606 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001607 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001608 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001609 packet_->markerBit = true;
1610 packet_->seqNum = seq_num_;
1611 packet_->timestamp = timestamp_;
1612
1613 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001614 EXPECT_EQ(kFlushIndicator,
1615 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001616
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001617 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001618 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001619 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001621 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001622}
1623
philipel85130292016-07-06 16:10:31 +02001624TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001625 seq_num_ = 3;
1626 // Insert one empty packet per frame, should never return the last timestamp
1627 // inserted. Only return empty frames in the presence of subsequent frames.
1628 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001629 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001630 for (int i = 0; i < maxSize + 10; i++) {
1631 timestamp_ += 33 * 90;
1632 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001633 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634 packet_->markerBit = false;
1635 packet_->seqNum = seq_num_;
1636 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001637 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001638
philipel9d3ab612015-12-21 04:12:39 -08001639 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640 }
1641}
1642
philipel85130292016-07-06 16:10:31 +02001643TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001644 // Test that a we cannot get incomplete frames from the JB if we haven't
1645 // received the marker bit, unless we have received a packet from a later
1646 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001647 // Start with a complete key frame - insert and decode.
1648 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001649 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001650 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001651 bool retransmitted = false;
1652
philipel9d3ab612015-12-21 04:12:39 -08001653 EXPECT_EQ(kCompleteSession,
1654 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1656 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001657 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001658
1659 packet_->seqNum += 2;
1660 packet_->timestamp += 33 * 90;
1661 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001662 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001663 packet_->markerBit = false;
1664
Niels Möller375b3462019-01-10 15:35:56 +01001665 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001666 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001667
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001668 packet_->seqNum += 2;
1669 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08001670 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001671
Niels Möller375b3462019-01-10 15:35:56 +01001672 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001673 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001674}
1675
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001676TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001677 // Make sure the jitter doesn't request a keyframe after too much non-
1678 // decodable frames.
1679 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001680 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001681 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001682 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001683 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001684 DropFrame(1);
1685 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001686 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001687 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001688 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001689 // This frame will make the jitter buffer recycle frames until a key frame.
1690 // Since none is found it will have to wait until the next key frame before
1691 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001692 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001693 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001694}
1695
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001696TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001697 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001698 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001699 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001700 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001701 // Insert empty packet.
1702 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001703 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001704 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001705 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001706 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001707 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001708 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001709 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001710 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001711 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001712 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001713 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001714}
1715
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001716TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001717 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
1718 EXPECT_EQ(0, frame_stats.delta_frames);
1719 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001720
1721 uint32_t framerate = 0;
1722 uint32_t bitrate = 0;
1723 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1724 EXPECT_EQ(0u, framerate);
1725 EXPECT_EQ(0u, bitrate);
1726
1727 // Insert a couple of key and delta frames.
1728 InsertFrame(kVideoFrameKey);
1729 InsertFrame(kVideoFrameDelta);
1730 InsertFrame(kVideoFrameDelta);
1731 InsertFrame(kVideoFrameKey);
1732 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001733 // Decode some of them to make sure the statistics doesn't depend on frames
1734 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001735 EXPECT_TRUE(DecodeCompleteFrame());
1736 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001737 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001738 EXPECT_EQ(3, frame_stats.delta_frames);
1739 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001740
1741 // Insert 20 more frames to get estimates of bitrate and framerate over
1742 // 1 second.
1743 for (int i = 0; i < 20; ++i) {
1744 InsertFrame(kVideoFrameDelta);
1745 }
1746 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1747 // TODO(holmer): The current implementation returns the average of the last
1748 // two framerate calculations, which is why it takes two calls to reach the
1749 // actual framerate. This should be fixed.
1750 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
1751 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1752 // Insert 25 more frames to get estimates of bitrate and framerate over
1753 // 2 seconds.
1754 for (int i = 0; i < 25; ++i) {
1755 InsertFrame(kVideoFrameDelta);
1756 }
1757 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1758 EXPECT_EQ(kDefaultFrameRate, framerate);
1759 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1760}
1761
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001762TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1763 // Insert delta frames.
1764 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
1765 // Can't decode without a key frame.
1766 EXPECT_FALSE(DecodeCompleteFrame());
1767 InsertFrame(kVideoFrameKey);
1768 // Skip to the next key frame.
1769 EXPECT_TRUE(DecodeCompleteFrame());
1770}
1771
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001772TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
1773 InsertFrame(kVideoFrameKey);
1774 EXPECT_TRUE(DecodeCompleteFrame());
1775 const int kNumDeltaFrames = 5;
1776 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1777 InsertFrame(kVideoFrameKey);
1778 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1779 EXPECT_TRUE(DecodeCompleteFrame());
1780 }
1781}
1782
1783TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
1784 InsertFrame(kVideoFrameKey);
1785 EXPECT_TRUE(DecodeCompleteFrame());
1786 const int kNumDeltaFrames = 5;
1787 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1788 InsertFrame(kVideoFrameKey);
1789 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1790 InsertFrame(kVideoFrameKey);
1791 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1792 EXPECT_TRUE(DecodeCompleteFrame());
1793 }
1794}
1795
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001796TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
1797 InsertFrame(kVideoFrameKey);
1798 EXPECT_TRUE(DecodeCompleteFrame());
1799 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
1800 clock_->TimeInMilliseconds());
1801 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1802 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
1803 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001804 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001805 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1806 EXPECT_FALSE(DecodeCompleteFrame());
1807 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1808 EXPECT_TRUE(DecodeCompleteFrame());
1809 EXPECT_TRUE(DecodeCompleteFrame());
1810}
1811
philipel85130292016-07-06 16:10:31 +02001812TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001813 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00001814 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07001815 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001816 InsertFrame(kVideoFrameKey);
1817 EXPECT_TRUE(DecodeCompleteFrame());
1818}
1819
philipel85130292016-07-06 16:10:31 +02001820TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001821 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001822 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001823 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001824
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001825 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1826 // old packet.
1827 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001828 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08001829 EXPECT_EQ(kFlushIndicator,
1830 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001831 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001832
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001833 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001834 std::vector<uint16_t> nack_list =
1835 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001836 // No key frame will be requested since the jitter buffer is empty.
1837 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001838 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001839
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001840 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001841 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001842 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001843
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001844 // The next complete continuous frame isn't a key frame, but we're waiting
1845 // for one.
1846 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001847 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001848 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001849 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001850}
1851
philipel85130292016-07-06 16:10:31 +02001852TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001853 // Insert a key frame and decode it.
1854 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
1855 EXPECT_TRUE(DecodeCompleteFrame());
1856
1857 // Insert a frame which should trigger a recycle until the next key frame.
1858 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
1859
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001860 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001861 std::vector<uint16_t> nack_list =
1862 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001863 // Verify that the jitter buffer does not request a key frame.
1864 EXPECT_FALSE(request_key_frame);
1865 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001866 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001867 // Verify that we can decode the next frame.
1868 EXPECT_TRUE(DecodeCompleteFrame());
1869}
1870
philipel85130292016-07-06 16:10:31 +02001871TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001872 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001873 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001874 EXPECT_TRUE(DecodeCompleteFrame());
1875
1876 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001877 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001878 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001879 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001880 EXPECT_FALSE(DecodeCompleteFrame());
1881
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001882 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001883 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001884 // The jitter buffer is empty, so we won't request key frames until we get a
1885 // packet.
1886 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001887
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001888 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001889 // Now we have a packet in the jitter buffer, a key frame will be requested
1890 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001891 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001892 // The jitter buffer is empty, so we won't request key frames until we get a
1893 // packet.
1894 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001895 // The next complete continuous frame isn't a key frame, but we're waiting
1896 // for one.
1897 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001898 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001899 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001900 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001901}
1902
philipel85130292016-07-06 16:10:31 +02001903TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001904 DropFrame(10);
1905 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001906 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001907 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001908 std::vector<uint16_t> nack_list =
1909 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001910 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001911 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001912 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001913}
1914
philipel85130292016-07-06 16:10:31 +02001915TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001916 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001917 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001918 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001919 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001920 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001921 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001922 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001923 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001924 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001925 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001926}
1927
philipel85130292016-07-06 16:10:31 +02001928TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001929 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001930 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1931 clock_->TimeInMilliseconds());
1932 VCMPacket packet;
1933 stream_generator_->PopPacket(&packet, 0);
1934 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001935 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001936 EXPECT_FALSE(retransmitted);
1937 // Drop second packet.
1938 stream_generator_->PopPacket(&packet, 1);
1939 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1940 EXPECT_FALSE(retransmitted);
1941 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001942 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001943 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001944 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001945 EXPECT_EQ(1u, nack_list.size());
1946 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001947 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001948 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001949 EXPECT_EQ(kCompleteSession,
1950 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001951 EXPECT_TRUE(retransmitted);
1952 EXPECT_TRUE(DecodeCompleteFrame());
1953}
1954
philipel85130292016-07-06 16:10:31 +02001955TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001956 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001957 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001958 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001959 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001960 // Drop second packet.
1961 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1962 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001963 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001964 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001965 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001966 ASSERT_EQ(1u, nack_list.size());
1967 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001968 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001969 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001970 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001971}
1972
philipel85130292016-07-06 16:10:31 +02001973TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001974 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001975 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001976 // First frame is delta.
1977 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
1978 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001979 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001980 // Drop second packet in frame.
1981 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1982 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1983 // Second frame is key.
1984 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1985 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001986 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001987 // Drop second packet in frame.
1988 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1989 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001990 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001991 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001992 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001993 ASSERT_EQ(1u, nack_list.size());
1994 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001995 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001996 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001997}
1998
philipel85130292016-07-06 16:10:31 +02001999TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002000 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002001
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002002 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01002003 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002004
2005 // ----------------------------------------------------------------
2006 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2007 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002008 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002009 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002010 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01002011 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002012 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002013 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002014 while (stream_generator_->PacketsRemaining() > 1) {
2015 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01002016 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002017 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002018 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002019 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002020 }
Niels Möller375b3462019-01-10 15:35:56 +01002021 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002022 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002023 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002024 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002025
2026 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002027 std::vector<uint16_t> nack_list =
2028 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002029 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002030 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002031 for (size_t i = 0; i < nack_list.size(); ++i)
2032 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002033}
2034
philipel85130292016-07-06 16:10:31 +02002035TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002036 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002037 // ------- ------------------------------------------------------------
2038 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2039 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002040 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002041 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002042 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002043 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002044 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002045 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002046 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002047 while (stream_generator_->PacketsRemaining() > 1) {
2048 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002049 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002050 EXPECT_FALSE(request_key_frame);
2051 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002052 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002053 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002054 }
2055 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002056 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002057 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002058 EXPECT_FALSE(DecodeCompleteFrame());
2059 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002060 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002061 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002062 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002063 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002064 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2065 for (size_t i = 0; i < nack_list.size(); ++i)
2066 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002067}
2068
philipel85130292016-07-06 16:10:31 +02002069TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002070 bool request_key_frame = false;
2071 // -----------------------------------
2072 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2073 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002074 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002075 InsertFrame(kVideoFrameKey);
2076 EXPECT_FALSE(request_key_frame);
2077 EXPECT_TRUE(DecodeCompleteFrame());
2078 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2079 clock_->TimeInMilliseconds());
2080 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2081 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002082 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002083 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002084 EXPECT_FALSE(request_key_frame);
2085 } else {
2086 stream_generator_->NextPacket(NULL); // Drop packet
2087 }
2088 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2089 clock_->TimeInMilliseconds());
2090 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2091 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002092 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002093 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002094 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002095 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002096 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002097 ASSERT_EQ(1u, nack_list.size());
2098 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002099}
2100
philipel85130292016-07-06 16:10:31 +02002101TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002102 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002103 InsertFrame(kVideoFrameKey);
2104 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002105 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002106 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2107 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002108
2109 // Far-into-the-future video frame, could be caused by resetting the encoder
2110 // or otherwise restarting. This should not fail when error when the packet is
2111 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002112 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002113 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2114 InsertFrame(kVideoFrameKey);
2115 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002116 nack_list = jitter_buffer_->GetNackList(&extended);
2117 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002118
2119 // Stream should be decodable from this point.
2120 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2121 InsertFrame(kVideoFrameDelta);
2122 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002123 nack_list = jitter_buffer_->GetNackList(&extended);
2124 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002125}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002126} // namespace webrtc