blob: 2651565ae08432f9ca752fcfb07e8fb7089142a4 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "common_video/h264/h264_common.h"
18#include "modules/video_coding/frame_buffer.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/media_opt_util.h"
21#include "modules/video_coding/packet.h"
22#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/location.h"
24#include "system_wrappers/include/clock.h"
25#include "system_wrappers/include/field_trial.h"
26#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "test/field_trial.h"
28#include "test/gmock.h"
29#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000030
31namespace webrtc {
32
asapersson9a4cd872015-10-23 00:27:14 -070033namespace {
philipel9d3ab612015-12-21 04:12:39 -080034const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070035} // namespace
36
37class Vp9SsMapTest : public ::testing::Test {
38 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020039 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070040
41 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020042 auto& vp9_header =
43 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
Niels Möllerd5e02f02019-02-20 13:12:21 +010044 packet_.video_header.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +010051 packet_.video_header.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020052 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020053 vp9_header.flexible_mode = false;
54 vp9_header.gof_idx = 0;
55 vp9_header.temporal_idx = kNoTemporalIdx;
56 vp9_header.temporal_up_switch = false;
57 vp9_header.ss_data_available = true;
58 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020072 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
73 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070074 EXPECT_FALSE(map_.Insert(packet_));
75}
76
77TEST_F(Vp9SsMapTest, Find) {
78 EXPECT_TRUE(map_.Insert(packet_));
79 Vp9SsMap::SsMap::iterator it;
80 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
81 EXPECT_EQ(packet_.timestamp, it->first);
82}
83
84TEST_F(Vp9SsMapTest, Find_WithWrap) {
85 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
86 const uint32_t kSsTimestamp2 = 100;
87 packet_.timestamp = kSsTimestamp1;
88 EXPECT_TRUE(map_.Insert(packet_));
89 packet_.timestamp = kSsTimestamp2;
90 EXPECT_TRUE(map_.Insert(packet_));
91 Vp9SsMap::SsMap::iterator it;
92 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
93 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
94 EXPECT_EQ(kSsTimestamp1, it->first);
95 EXPECT_TRUE(map_.Find(0, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
98 EXPECT_EQ(kSsTimestamp1, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
100 EXPECT_EQ(kSsTimestamp2, it->first);
101 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
102 EXPECT_EQ(kSsTimestamp2, it->first);
103}
104
105TEST_F(Vp9SsMapTest, Reset) {
106 EXPECT_TRUE(map_.Insert(packet_));
107 Vp9SsMap::SsMap::iterator it;
108 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
109 EXPECT_EQ(packet_.timestamp, it->first);
110
111 map_.Reset();
112 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
113}
114
115TEST_F(Vp9SsMapTest, RemoveOld) {
116 Vp9SsMap::SsMap::iterator it;
117 const uint32_t kSsTimestamp1 = 10000;
118 packet_.timestamp = kSsTimestamp1;
119 EXPECT_TRUE(map_.Insert(packet_));
120
121 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
122 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
123 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
124
125 map_.RemoveOld(kTimestamp);
126 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
127 EXPECT_TRUE(map_.Find(kTimestamp, &it));
128 EXPECT_EQ(kTimestamp, it->first);
129}
130
131TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
132 Vp9SsMap::SsMap::iterator it;
133 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
134 const uint32_t kSsTimestamp2 = 10;
135 const uint32_t kSsTimestamp3 = 1000;
136 packet_.timestamp = kSsTimestamp1;
137 EXPECT_TRUE(map_.Insert(packet_));
138 packet_.timestamp = kSsTimestamp2;
139 EXPECT_TRUE(map_.Insert(packet_));
140 packet_.timestamp = kSsTimestamp3;
141 EXPECT_TRUE(map_.Insert(packet_));
142
143 map_.RemoveOld(kSsTimestamp3);
144 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
145 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
146 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
147}
148
149TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200150 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
151 0;
asapersson9a4cd872015-10-23 00:27:14 -0700152 EXPECT_FALSE(map_.UpdatePacket(&packet_));
153}
154
155TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
156 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200157 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
158 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700159 EXPECT_FALSE(map_.UpdatePacket(&packet_));
160}
161
162TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
163 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200164 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
165 4;
asapersson9a4cd872015-10-23 00:27:14 -0700166 EXPECT_FALSE(map_.UpdatePacket(&packet_));
167}
168
169TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200170 auto& vp9_header =
171 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700172 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
173
philipel29d88462018-08-08 14:26:00 +0200174 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700175 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200176 EXPECT_EQ(0, vp9_header.temporal_idx);
177 EXPECT_FALSE(vp9_header.temporal_up_switch);
178 EXPECT_EQ(1U, vp9_header.num_ref_pics);
179 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700180
philipel29d88462018-08-08 14:26:00 +0200181 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700182 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200183 EXPECT_EQ(2, vp9_header.temporal_idx);
184 EXPECT_TRUE(vp9_header.temporal_up_switch);
185 EXPECT_EQ(1U, vp9_header.num_ref_pics);
186 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700187
philipel29d88462018-08-08 14:26:00 +0200188 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700189 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200190 EXPECT_EQ(1, vp9_header.temporal_idx);
191 EXPECT_TRUE(vp9_header.temporal_up_switch);
192 EXPECT_EQ(1U, vp9_header.num_ref_pics);
193 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700194
philipel29d88462018-08-08 14:26:00 +0200195 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700196 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200197 EXPECT_EQ(2, vp9_header.temporal_idx);
198 EXPECT_TRUE(vp9_header.temporal_up_switch);
199 EXPECT_EQ(1U, vp9_header.num_ref_pics);
200 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700201}
202
philipel83f831a2016-03-12 03:30:23 -0800203class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
204 public NackSender,
205 public KeyFrameRequestSender {
206 public:
207 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
208 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
209 sequence_numbers.end());
210 }
211
212 void RequestKeyFrame() override { ++keyframe_requests_; }
213
philipel83f831a2016-03-12 03:30:23 -0800214 std::vector<uint16_t> nack_sent_;
215 int keyframe_requests_;
216
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000217 protected:
philipel85130292016-07-06 16:10:31 +0200218 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700219 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700221 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerd5659182018-11-07 13:40:24 +0100222 clock_.get(), absl::WrapUnique(EventWrapper::Create()), this, this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000223 jitter_buffer_->Start();
224 seq_num_ = 1234;
225 timestamp_ = 0;
226 size_ = 1400;
227 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
228 data_[0] = 0;
229 data_[1] = 0;
230 data_[2] = 0x80;
231 int count = 3;
232 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
233 data_[i] = count;
234 count++;
235 if (count == 10) {
236 data_[i + 1] = 0;
237 data_[i + 2] = 0;
238 data_[i + 3] = 0x80;
239 count = 3;
240 i += 3;
241 }
242 }
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;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100438 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000439 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000440 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000441
442 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000443 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800444 EXPECT_EQ(kCompleteSession,
445 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000446 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000447 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000449 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000450}
451
philipel85130292016-07-06 16:10:31 +0200452TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700453 metrics::Reset();
Åsa Perssona96f02b2015-04-24 08:52:11 +0200454 // Always start with a complete key frame when not allowing errors.
Åsa Perssona96f02b2015-04-24 08:52:11 +0200455 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100456 packet_->video_header.is_first_packet_in_frame = true;
Åsa Perssona96f02b2015-04-24 08:52:11 +0200457 packet_->markerBit = true;
458 packet_->timestamp += 123 * 90;
459
460 // Insert single packet frame to the jitter buffer and get a frame.
461 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800462 EXPECT_EQ(kCompleteSession,
463 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200464 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
465 CheckOutFrame(frame_out, size_, false);
466 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
467 jitter_buffer_->ReleaseFrame(frame_out);
468
469 // Verify that histograms are updated when the jitter buffer is stopped.
470 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
471 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700472 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
473 EXPECT_EQ(1,
474 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800475 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700476 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800477 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700478 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200479
480 // Verify that histograms are not updated if stop is called again.
481 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700482 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
483 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800484 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700485 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
486 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Åsa Perssona96f02b2015-04-24 08:52:11 +0200487}
488
philipel85130292016-07-06 16:10:31 +0200489TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000490 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100491 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000492 packet_->markerBit = false;
493
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000494 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800495 EXPECT_EQ(kIncomplete,
496 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000497 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
498 // Should not be complete.
499 EXPECT_TRUE(frame_out == NULL);
500
501 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100502 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000503 packet_->markerBit = true;
504 packet_->seqNum = seq_num_;
505
philipel9d3ab612015-12-21 04:12:39 -0800506 EXPECT_EQ(kCompleteSession,
507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000508
509 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000510 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000511
512 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000513 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000514}
515
philipel85130292016-07-06 16:10:31 +0200516TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000517 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100518 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000519 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000520
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000521 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800522 EXPECT_EQ(kIncomplete,
523 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000524
525 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
526
527 // Frame should not be complete.
528 EXPECT_TRUE(frame_out == NULL);
529
530 // Insert 98 frames.
531 int loop = 0;
532 do {
533 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100534 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000535 packet_->markerBit = false;
536 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537
philipel9d3ab612015-12-21 04:12:39 -0800538 EXPECT_EQ(kIncomplete,
539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000540 loop++;
541 } while (loop < 98);
542
543 // Insert last packet.
544 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100545 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546 packet_->markerBit = true;
547 packet_->seqNum = seq_num_;
548
philipel9d3ab612015-12-21 04:12:39 -0800549 EXPECT_EQ(kCompleteSession,
550 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000551
552 frame_out = DecodeCompleteFrame();
553
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000554 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000555 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000556 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557}
558
philipel85130292016-07-06 16:10:31 +0200559TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 // Always start with a complete key frame.
561 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100562 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000563 packet_->markerBit = true;
564
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000565 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800566 EXPECT_EQ(kCompleteSession,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
569 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000570 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000571
572 ++seq_num_;
573 packet_->seqNum = seq_num_;
574 packet_->markerBit = false;
575 packet_->frameType = kVideoFrameDelta;
576 packet_->timestamp += 33 * 90;
577
philipel9d3ab612015-12-21 04:12:39 -0800578 EXPECT_EQ(kIncomplete,
579 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000580
581 frame_out = DecodeCompleteFrame();
582
583 // Frame should not be complete.
584 EXPECT_TRUE(frame_out == NULL);
585
Niels Möllerd5e02f02019-02-20 13:12:21 +0100586 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587 // Insert 98 frames.
588 int loop = 0;
589 do {
590 ++seq_num_;
591 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000592
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800594 EXPECT_EQ(kIncomplete,
595 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596 loop++;
597 } while (loop < 98);
598
599 // Insert the last packet.
600 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100601 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602 packet_->markerBit = true;
603 packet_->seqNum = seq_num_;
604
philipel9d3ab612015-12-21 04:12:39 -0800605 EXPECT_EQ(kCompleteSession,
606 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000607
608 frame_out = DecodeCompleteFrame();
609
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000610 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000611 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000612 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613}
614
philipel85130292016-07-06 16:10:31 +0200615TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000616 // Insert the "first" packet last.
617 seq_num_ += 100;
618 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100619 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620 packet_->markerBit = true;
621 packet_->seqNum = seq_num_;
622 packet_->timestamp = timestamp_;
623
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000624 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800625 EXPECT_EQ(kIncomplete,
626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000627
628 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
629
630 EXPECT_TRUE(frame_out == NULL);
631
632 // Insert 98 packets.
633 int loop = 0;
634 do {
635 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100636 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637 packet_->markerBit = false;
638 packet_->seqNum = seq_num_;
639
philipel9d3ab612015-12-21 04:12:39 -0800640 EXPECT_EQ(kIncomplete,
641 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000642 loop++;
643 } while (loop < 98);
644
645 // Insert the last packet.
646 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100647 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648 packet_->markerBit = false;
649 packet_->seqNum = seq_num_;
650
philipel9d3ab612015-12-21 04:12:39 -0800651 EXPECT_EQ(kCompleteSession,
652 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653
philipel9d3ab612015-12-21 04:12:39 -0800654 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000655
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000656 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000657
658 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000659 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660}
661
philipel85130292016-07-06 16:10:31 +0200662TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000663 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100664 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000665 packet_->markerBit = false;
666
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000667 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800668 EXPECT_EQ(kIncomplete,
669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000670
671 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
672
673 EXPECT_TRUE(frame_out == NULL);
674
675 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100676 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000677 packet_->markerBit = true;
678 packet_->seqNum = seq_num_;
679
philipel9d3ab612015-12-21 04:12:39 -0800680 EXPECT_EQ(kCompleteSession,
681 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000682
683 // check that we fail to get frame since seqnum is not continuous
684 frame_out = DecodeCompleteFrame();
685 EXPECT_TRUE(frame_out == NULL);
686
687 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800688 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100690 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000691 packet_->markerBit = false;
692 packet_->seqNum = seq_num_;
693 packet_->timestamp = timestamp_;
694
philipel9d3ab612015-12-21 04:12:39 -0800695 EXPECT_EQ(kIncomplete,
696 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697
698 frame_out = DecodeCompleteFrame();
699
700 // It should not be complete.
701 EXPECT_TRUE(frame_out == NULL);
702
703 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100704 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000705 packet_->markerBit = true;
706 packet_->seqNum = seq_num_;
707
philipel9d3ab612015-12-21 04:12:39 -0800708 EXPECT_EQ(kCompleteSession,
709 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710
711 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000712 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000713 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000714 jitter_buffer_->ReleaseFrame(frame_out);
715
716 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000717 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000718 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000719 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000720}
721
philipel85130292016-07-06 16:10:31 +0200722TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700723 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100724 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700725 packet_->markerBit = true;
726
727 // Send in an initial good packet/frame (Frame A) to start things off.
728 bool retransmitted = false;
729 EXPECT_EQ(kCompleteSession,
730 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
731 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
732 EXPECT_TRUE(frame_out != NULL);
733 jitter_buffer_->ReleaseFrame(frame_out);
734
735 // Now send in a complete delta frame (Frame C), but with a sequence number
736 // gap. No pic index either, so no temporal scalability cheating :)
737 packet_->frameType = kVideoFrameDelta;
738 // Leave a gap of 2 sequence numbers and two frames.
739 packet_->seqNum = seq_num_ + 3;
740 packet_->timestamp = timestamp_ + (66 * 90);
741 // Still isFirst = marker = true.
742 // Session should be complete (frame is complete), but there's nothing to
743 // decode yet.
744 EXPECT_EQ(kCompleteSession,
745 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
746 frame_out = DecodeCompleteFrame();
747 EXPECT_TRUE(frame_out == NULL);
748
749 // Now send in a complete delta frame (Frame B) that is continuous from A, but
750 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
751 packet_->seqNum = seq_num_ + 1;
752 packet_->timestamp = timestamp_ + (33 * 90);
753 // Still isFirst = marker = true.
754 EXPECT_EQ(kCompleteSession,
755 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
756 frame_out = DecodeCompleteFrame();
757 EXPECT_TRUE(frame_out != NULL);
758 jitter_buffer_->ReleaseFrame(frame_out);
759
760 // But Frame C isn't continuous yet.
761 frame_out = DecodeCompleteFrame();
762 EXPECT_TRUE(frame_out == NULL);
763
764 // Add in the padding. These are empty packets (data length is 0) with no
765 // marker bit and matching the timestamp of Frame B.
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;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100787 packet_->video_header.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;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100813 packet_->video_header.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;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100830 packet_->video_header.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;
Niels Möller520ca4e2018-06-04 11:14:38 +0200893 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100894 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700895 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200896 vp9_header.flexible_mode = false;
897 vp9_header.spatial_idx = 0;
898 vp9_header.beginning_of_frame = true;
899 vp9_header.end_of_frame = true;
900 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700901
902 packet_->seqNum = 65485;
903 packet_->timestamp = 1000;
904 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200905 vp9_header.picture_id = 5;
906 vp9_header.tl0_pic_idx = 200;
907 vp9_header.temporal_idx = 0;
908 vp9_header.ss_data_available = true;
909 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700910 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
911 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
912
913 // Insert next temporal layer 0.
914 packet_->seqNum = 65489;
915 packet_->timestamp = 13000;
916 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200917 vp9_header.picture_id = 9;
918 vp9_header.tl0_pic_idx = 201;
919 vp9_header.temporal_idx = 0;
920 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700921 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
922
923 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200924 EXPECT_EQ(1000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700925 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
926 jitter_buffer_->ReleaseFrame(frame_out);
927
928 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200929 EXPECT_EQ(13000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700930 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
931 jitter_buffer_->ReleaseFrame(frame_out);
932}
933
philipel85130292016-07-06 16:10:31 +0200934TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700935 // Verify that frames are updated with SS data when SS packet is reordered.
936 // --------------------------------
937 // | 65486 | 65487 | 65485 |...
938 // | pid:6 | pid:7 | pid:5 |...
939 // | tid:2 | tid:1 | tid:0 |...
940 // | | | ss |
941 // --------------------------------
942 // |<--------tl0idx:200--------->|
943
philipel29d88462018-08-08 14:26:00 +0200944 auto& vp9_header =
945 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
946
asapersson9a4cd872015-10-23 00:27:14 -0700947 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200948 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100949 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700950 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200951 vp9_header.flexible_mode = false;
952 vp9_header.spatial_idx = 0;
953 vp9_header.beginning_of_frame = true;
954 vp9_header.end_of_frame = true;
955 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700956
957 packet_->seqNum = 65486;
958 packet_->timestamp = 6000;
959 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200960 vp9_header.picture_id = 6;
961 vp9_header.temporal_idx = 2;
962 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700963 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
964
965 packet_->seqNum = 65487;
966 packet_->timestamp = 9000;
967 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200968 vp9_header.picture_id = 7;
969 vp9_header.temporal_idx = 1;
970 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700971 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
972
973 // Insert first frame with SS data.
974 packet_->seqNum = 65485;
975 packet_->timestamp = 3000;
976 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100977 packet_->video_header.width = 352;
978 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200979 vp9_header.picture_id = 5;
980 vp9_header.temporal_idx = 0;
981 vp9_header.temporal_up_switch = false;
982 vp9_header.ss_data_available = true;
983 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700984 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
985 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
986
987 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200988 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700989 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
990 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
991 EXPECT_FALSE(
992 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
993 jitter_buffer_->ReleaseFrame(frame_out);
994
995 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200996 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -0700997 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
998 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
999 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1000 jitter_buffer_->ReleaseFrame(frame_out);
1001
1002 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001003 EXPECT_EQ(9000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001004 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1005 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1006 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1007 jitter_buffer_->ReleaseFrame(frame_out);
1008}
1009
philipel85130292016-07-06 16:10:31 +02001010TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001011 // Verify that frames are updated with SS data when SS packet is reordered.
1012 // -----------------------------------------
1013 // | 65486 | 65487 | 65485 | 65484 |...
1014 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1015 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1016 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1017 // | t:6000 | t:6000 | t:3000 | t:3000 |
1018 // | | | | ss |
1019 // -----------------------------------------
1020 // |<-----------tl0idx:200------------>|
1021
philipel29d88462018-08-08 14:26:00 +02001022 auto& vp9_header =
1023 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1024
asapersson9a4cd872015-10-23 00:27:14 -07001025 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001026 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001027 vp9_header.flexible_mode = false;
1028 vp9_header.beginning_of_frame = true;
1029 vp9_header.end_of_frame = true;
1030 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001031
Niels Möllerd5e02f02019-02-20 13:12:21 +01001032 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001033 packet_->markerBit = false;
1034 packet_->seqNum = 65486;
1035 packet_->timestamp = 6000;
1036 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001037 vp9_header.spatial_idx = 0;
1038 vp9_header.picture_id = 6;
1039 vp9_header.temporal_idx = 1;
1040 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001041 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1042
Niels Möllerd5e02f02019-02-20 13:12:21 +01001043 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001044 packet_->markerBit = true;
1045 packet_->seqNum = 65487;
1046 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001047 vp9_header.spatial_idx = 1;
1048 vp9_header.picture_id = 6;
1049 vp9_header.temporal_idx = 1;
1050 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001051 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1052
Niels Möllerd5e02f02019-02-20 13:12:21 +01001053 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001054 packet_->markerBit = true;
1055 packet_->seqNum = 65485;
1056 packet_->timestamp = 3000;
1057 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001058 vp9_header.spatial_idx = 1;
1059 vp9_header.picture_id = 5;
1060 vp9_header.temporal_idx = 0;
1061 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001062 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1063
1064 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +01001065 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001066 packet_->markerBit = false;
1067 packet_->seqNum = 65484;
1068 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001069 packet_->video_header.width = 352;
1070 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +02001071 vp9_header.spatial_idx = 0;
1072 vp9_header.picture_id = 5;
1073 vp9_header.temporal_idx = 0;
1074 vp9_header.temporal_up_switch = false;
1075 vp9_header.ss_data_available = true;
1076 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001077 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1078 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1079
1080 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001081 EXPECT_EQ(3000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001082 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1083 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1084 EXPECT_FALSE(
1085 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1086 jitter_buffer_->ReleaseFrame(frame_out);
1087
1088 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001089 EXPECT_EQ(6000U, frame_out->Timestamp());
asapersson9a4cd872015-10-23 00:27:14 -07001090 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1091 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1092 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1093 jitter_buffer_->ReleaseFrame(frame_out);
1094}
1095
philipel85130292016-07-06 16:10:31 +02001096TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001097 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001098 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001099 packet_->markerBit = false;
1100 packet_->seqNum = seq_num_;
1101 packet_->timestamp = timestamp_;
1102 packet_->insertStartCode = true;
1103
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001104 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001105 EXPECT_EQ(kIncomplete,
1106 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001107
1108 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1109
1110 // Frame should not be complete.
1111 EXPECT_TRUE(frame_out == NULL);
1112
1113 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001114 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001115 packet_->markerBit = true;
1116 packet_->seqNum = seq_num_;
1117
philipel9d3ab612015-12-21 04:12:39 -08001118 EXPECT_EQ(kCompleteSession,
1119 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001120
1121 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001122 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001123 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001124 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001125}
1126
stefana669a3a2016-10-06 05:04:52 -07001127TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +02001128 auto& h264_header =
1129 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001130 packet_->timestamp = timestamp_;
1131 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001132 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001133 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001134 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001135 h264_header.nalu_type = H264::NaluType::kIdr;
1136 h264_header.nalus[0].type = H264::NaluType::kIdr;
1137 h264_header.nalus[0].sps_id = -1;
1138 h264_header.nalus[0].pps_id = 0;
1139 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001140 bool retransmitted = false;
1141 EXPECT_EQ(kCompleteSession,
1142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1143 // Not decodable since sps and pps are missing.
1144 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1145
1146 timestamp_ += 3000;
1147 packet_->timestamp = timestamp_;
1148 ++seq_num_;
1149 packet_->seqNum = seq_num_;
1150 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001151 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001152 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +02001153 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001154 h264_header.nalu_type = H264::NaluType::kStapA;
1155 h264_header.nalus[0].type = H264::NaluType::kSps;
1156 h264_header.nalus[0].sps_id = 0;
1157 h264_header.nalus[0].pps_id = -1;
1158 h264_header.nalus[1].type = H264::NaluType::kPps;
1159 h264_header.nalus[1].sps_id = 0;
1160 h264_header.nalus[1].pps_id = 0;
1161 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001162 // Not complete since the marker bit hasn't been received.
1163 EXPECT_EQ(kIncomplete,
1164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1165
1166 ++seq_num_;
1167 packet_->seqNum = seq_num_;
1168 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001169 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001170 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001171 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001172 h264_header.nalu_type = H264::NaluType::kIdr;
1173 h264_header.nalus[0].type = H264::NaluType::kIdr;
1174 h264_header.nalus[0].sps_id = -1;
1175 h264_header.nalus[0].pps_id = 0;
1176 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001177 // Complete and decodable since the pps and sps are received in the first
1178 // packet of this frame.
1179 EXPECT_EQ(kCompleteSession,
1180 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1181 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1182 ASSERT_NE(nullptr, frame_out);
1183 jitter_buffer_->ReleaseFrame(frame_out);
1184
1185 timestamp_ += 3000;
1186 packet_->timestamp = timestamp_;
1187 ++seq_num_;
1188 packet_->seqNum = seq_num_;
1189 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001190 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001191 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +02001192 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001193 h264_header.nalu_type = H264::NaluType::kSlice;
1194 h264_header.nalus[0].type = H264::NaluType::kSlice;
1195 h264_header.nalus[0].sps_id = -1;
1196 h264_header.nalus[0].pps_id = 0;
1197 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001198 // Complete and decodable since sps, pps and key frame has been received.
1199 EXPECT_EQ(kCompleteSession,
1200 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1201 frame_out = DecodeCompleteFrame();
1202 ASSERT_NE(nullptr, frame_out);
1203 jitter_buffer_->ReleaseFrame(frame_out);
1204}
1205
philipel85130292016-07-06 16:10:31 +02001206TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001207 seq_num_ = 0xfff0;
1208 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001209 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001210 packet_->markerBit = false;
1211 packet_->seqNum = seq_num_;
1212 packet_->timestamp = timestamp_;
1213
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001214 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001215 EXPECT_EQ(kIncomplete,
1216 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001217
1218 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1219
1220 EXPECT_TRUE(frame_out == NULL);
1221
1222 int loop = 0;
1223 do {
1224 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001225 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001226 packet_->markerBit = false;
1227 packet_->seqNum = seq_num_;
1228
philipel9d3ab612015-12-21 04:12:39 -08001229 EXPECT_EQ(kIncomplete,
1230 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001231
1232 frame_out = DecodeCompleteFrame();
1233
1234 EXPECT_TRUE(frame_out == NULL);
1235
1236 loop++;
1237 } while (loop < 98);
1238
1239 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001240 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001241 packet_->markerBit = true;
1242 packet_->seqNum = seq_num_;
1243
philipel9d3ab612015-12-21 04:12:39 -08001244 EXPECT_EQ(kCompleteSession,
1245 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001246
1247 frame_out = DecodeCompleteFrame();
1248
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001249 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001250
1251 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001252 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001253}
1254
philipel85130292016-07-06 16:10:31 +02001255TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001256 // Insert "first" packet last seqnum.
1257 seq_num_ = 10;
1258 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001259 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001260 packet_->markerBit = true;
1261 packet_->seqNum = seq_num_;
1262
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001263 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001264 EXPECT_EQ(kIncomplete,
1265 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001266 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1267
1268 // Should not be complete.
1269 EXPECT_TRUE(frame_out == NULL);
1270
1271 // Insert 98 frames.
1272 int loop = 0;
1273 do {
1274 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001275 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001276 packet_->markerBit = false;
1277 packet_->seqNum = seq_num_;
1278
philipel9d3ab612015-12-21 04:12:39 -08001279 EXPECT_EQ(kIncomplete,
1280 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001281
1282 frame_out = DecodeCompleteFrame();
1283
1284 EXPECT_TRUE(frame_out == NULL);
1285
1286 loop++;
1287 } while (loop < 98);
1288
1289 // Insert last packet.
1290 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001291 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001292 packet_->markerBit = false;
1293 packet_->seqNum = seq_num_;
1294
philipel9d3ab612015-12-21 04:12:39 -08001295 EXPECT_EQ(kCompleteSession,
1296 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001297
1298 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001299 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001300 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001301 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001302}
1303
philipel85130292016-07-06 16:10:31 +02001304TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001305 // ------- -------
1306 // | 2 | | 1 |
1307 // ------- -------
1308 // t = 3000 t = 2000
1309 seq_num_ = 2;
1310 timestamp_ = 3000;
1311 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001312 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001313 packet_->markerBit = true;
1314 packet_->timestamp = timestamp_;
1315 packet_->seqNum = seq_num_;
1316
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001317 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001318 EXPECT_EQ(kCompleteSession,
1319 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001320
1321 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001322 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001323 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001324 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001325 jitter_buffer_->ReleaseFrame(frame_out);
1326
1327 seq_num_--;
1328 timestamp_ = 2000;
1329 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001330 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001331 packet_->markerBit = true;
1332 packet_->seqNum = seq_num_;
1333 packet_->timestamp = timestamp_;
1334
philipel9d3ab612015-12-21 04:12:39 -08001335 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001336}
1337
philipel85130292016-07-06 16:10:31 +02001338TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001339 // ------- -------
1340 // | 2 | | 1 |
1341 // ------- -------
1342 // t = 3000 t = 0xffffff00
1343
1344 seq_num_ = 2;
1345 timestamp_ = 3000;
1346 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001347 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001348 packet_->markerBit = true;
1349 packet_->seqNum = seq_num_;
1350 packet_->timestamp = timestamp_;
1351
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001352 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001353 EXPECT_EQ(kCompleteSession,
1354 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001355
1356 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001357 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001358
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001359 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001360
1361 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1362
1363 jitter_buffer_->ReleaseFrame(frame_out);
1364
1365 seq_num_--;
1366 timestamp_ = 0xffffff00;
1367 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001368 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001369 packet_->markerBit = true;
1370 packet_->seqNum = seq_num_;
1371 packet_->timestamp = timestamp_;
1372
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001373 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001374 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001375}
1376
philipel85130292016-07-06 16:10:31 +02001377TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001378 // --------------- ---------------
1379 // | 1 | 2 | | 3 | 4 |
1380 // --------------- ---------------
1381 // t = 0xffffff00 t = 33*90
1382
1383 timestamp_ = 0xffffff00;
1384 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001385 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001386 packet_->markerBit = false;
1387 packet_->seqNum = seq_num_;
1388 packet_->timestamp = timestamp_;
1389
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001390 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001391 EXPECT_EQ(kIncomplete,
1392 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001393
1394 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001395 EXPECT_TRUE(frame_out == NULL);
1396
1397 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001398 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001399 packet_->markerBit = true;
1400 packet_->seqNum = seq_num_;
1401
philipel9d3ab612015-12-21 04:12:39 -08001402 EXPECT_EQ(kCompleteSession,
1403 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001404
1405 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001406 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001407 jitter_buffer_->ReleaseFrame(frame_out);
1408
1409 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001410 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001411 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001412 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001413 packet_->markerBit = false;
1414 packet_->seqNum = seq_num_;
1415 packet_->timestamp = timestamp_;
1416
philipel9d3ab612015-12-21 04:12:39 -08001417 EXPECT_EQ(kIncomplete,
1418 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001419
1420 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001421 EXPECT_TRUE(frame_out == NULL);
1422
1423 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001424 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001425 packet_->markerBit = true;
1426 packet_->seqNum = seq_num_;
1427
philipel9d3ab612015-12-21 04:12:39 -08001428 EXPECT_EQ(kCompleteSession,
1429 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001430
1431 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001432 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001433 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001434 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001435}
1436
philipel85130292016-07-06 16:10:31 +02001437TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001438 // ------- -------
1439 // | 1 | | 2 |
1440 // ------- -------
1441 // t = 0xffffff00 t = 2700
1442
1443 timestamp_ = 0xffffff00;
1444 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001445 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001446 packet_->markerBit = true;
1447 packet_->timestamp = timestamp_;
1448
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001449 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001450 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001451 EXPECT_EQ(kCompleteSession,
1452 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001453
1454 // Insert next frame.
1455 seq_num_++;
1456 timestamp_ = 2700;
1457 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001458 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001459 packet_->markerBit = true;
1460 packet_->seqNum = seq_num_;
1461 packet_->timestamp = timestamp_;
1462
philipel9d3ab612015-12-21 04:12:39 -08001463 EXPECT_EQ(kCompleteSession,
1464 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001465
1466 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001467 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001468 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001469 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001470 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001471
1472 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001473 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001474 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001475 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001476 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001477}
1478
philipel85130292016-07-06 16:10:31 +02001479TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001480 // ------- -------
1481 // | 2 | | 1 |
1482 // ------- -------
1483 // t = 2700 t = 0xffffff00
1484
1485 seq_num_ = 2;
1486 timestamp_ = 2700;
1487 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001488 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001489 packet_->markerBit = true;
1490 packet_->seqNum = seq_num_;
1491 packet_->timestamp = timestamp_;
1492
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001493 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001494 EXPECT_EQ(kCompleteSession,
1495 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001496
1497 // Insert second frame
1498 seq_num_--;
1499 timestamp_ = 0xffffff00;
1500 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001501 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001502 packet_->markerBit = true;
1503 packet_->seqNum = seq_num_;
1504 packet_->timestamp = timestamp_;
1505
philipel9d3ab612015-12-21 04:12:39 -08001506 EXPECT_EQ(kCompleteSession,
1507 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001508
1509 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001510 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001511 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001512 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001513 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001514
1515 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001516 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001517 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001518 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001519 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001520}
1521
philipel85130292016-07-06 16:10:31 +02001522TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001523 int loop = 0;
1524 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001525 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001526 // Insert kMaxPacketsInJitterBuffer into frame.
1527 do {
1528 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001529 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001530 packet_->markerBit = false;
1531 packet_->seqNum = seq_num_;
1532
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001533 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001534 EXPECT_EQ(kIncomplete,
1535 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001536 firstPacket = false;
1537 } else {
philipel9d3ab612015-12-21 04:12:39 -08001538 EXPECT_EQ(kIncomplete,
1539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001540 }
1541
1542 loop++;
1543 } while (loop < kMaxPacketsInSession);
1544
1545 // Max number of packets inserted.
1546 // Insert one more packet.
1547 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001548 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001549 packet_->markerBit = true;
1550 packet_->seqNum = seq_num_;
1551
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001552 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001553 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001554 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001555}
1556
philipel85130292016-07-06 16:10:31 +02001557TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001558 // TEST fill JB with more than max number of frame (50 delta frames +
1559 // 51 key frames) with wrap in seq_num_
1560 //
1561 // --------------------------------------------------------------
1562 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1563 // --------------------------------------------------------------
1564 // |<-----------delta frames------------->|<------key frames----->|
1565
jbauchdb81ffd2015-11-23 03:59:02 -08001566 // Make sure the jitter doesn't request a keyframe after too much non-
1567 // decodable frames.
1568 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001569 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001570
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571 int loop = 0;
1572 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001573 uint32_t first_key_frame_timestamp = 0;
1574 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001575 // Insert MAX_NUMBER_OF_FRAMES frames.
1576 do {
philipel9d3ab612015-12-21 04:12:39 -08001577 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001578 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001579 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001580 packet_->markerBit = true;
1581 packet_->seqNum = seq_num_;
1582 packet_->timestamp = timestamp_;
1583
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001584 if (loop == 50) {
1585 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586 packet_->frameType = kVideoFrameKey;
1587 }
1588
1589 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001590 EXPECT_EQ(kCompleteSession,
1591 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001592
1593 loop++;
1594 } while (loop < kMaxNumberOfFrames);
1595
1596 // Max number of frames inserted.
1597
1598 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001599 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001600 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001601 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001602 packet_->markerBit = true;
1603 packet_->seqNum = seq_num_;
1604 packet_->timestamp = timestamp_;
1605
1606 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001607 EXPECT_EQ(kFlushIndicator,
1608 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001609
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001610 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001611 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001612 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001613 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001614 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615}
1616
philipel85130292016-07-06 16:10:31 +02001617TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001618 seq_num_ = 3;
1619 // Insert one empty packet per frame, should never return the last timestamp
1620 // inserted. Only return empty frames in the presence of subsequent frames.
1621 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001622 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001623 for (int i = 0; i < maxSize + 10; i++) {
1624 timestamp_ += 33 * 90;
1625 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001626 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001627 packet_->markerBit = false;
1628 packet_->seqNum = seq_num_;
1629 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001630 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001631
philipel9d3ab612015-12-21 04:12:39 -08001632 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001633 }
1634}
1635
philipel85130292016-07-06 16:10:31 +02001636TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001637 // Test that a we cannot get incomplete frames from the JB if we haven't
1638 // received the marker bit, unless we have received a packet from a later
1639 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640 // Start with a complete key frame - insert and decode.
1641 packet_->frameType = kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001642 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001643 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001644 bool retransmitted = false;
1645
philipel9d3ab612015-12-21 04:12:39 -08001646 EXPECT_EQ(kCompleteSession,
1647 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001648 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1649 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001650 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001651
1652 packet_->seqNum += 2;
1653 packet_->timestamp += 33 * 90;
1654 packet_->frameType = kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001655 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001656 packet_->markerBit = false;
1657
Niels Möller375b3462019-01-10 15:35:56 +01001658 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001659 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001660
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001661 packet_->seqNum += 2;
1662 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001663 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001664
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}
1668
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001669TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001670 // Make sure the jitter doesn't request a keyframe after too much non-
1671 // decodable frames.
1672 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001673 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001674 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001675 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001676 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001677 DropFrame(1);
1678 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001679 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001680 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001681 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001682 // This frame will make the jitter buffer recycle frames until a key frame.
1683 // Since none is found it will have to wait until the next key frame before
1684 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001685 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001686 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001687}
1688
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001689TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001690 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001691 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001692 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001693 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001694 // Insert empty packet.
1695 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001696 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001697 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001698 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001699 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001700 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001701 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001702 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001703 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001704 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001705 EXPECT_EQ(kCompleteSession, 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}
1708
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001709TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001710 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
1711 EXPECT_EQ(0, frame_stats.delta_frames);
1712 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001713
1714 uint32_t framerate = 0;
1715 uint32_t bitrate = 0;
1716 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1717 EXPECT_EQ(0u, framerate);
1718 EXPECT_EQ(0u, bitrate);
1719
1720 // Insert a couple of key and delta frames.
1721 InsertFrame(kVideoFrameKey);
1722 InsertFrame(kVideoFrameDelta);
1723 InsertFrame(kVideoFrameDelta);
1724 InsertFrame(kVideoFrameKey);
1725 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001726 // Decode some of them to make sure the statistics doesn't depend on frames
1727 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001728 EXPECT_TRUE(DecodeCompleteFrame());
1729 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001730 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00001731 EXPECT_EQ(3, frame_stats.delta_frames);
1732 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00001733
1734 // Insert 20 more frames to get estimates of bitrate and framerate over
1735 // 1 second.
1736 for (int i = 0; i < 20; ++i) {
1737 InsertFrame(kVideoFrameDelta);
1738 }
1739 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1740 // TODO(holmer): The current implementation returns the average of the last
1741 // two framerate calculations, which is why it takes two calls to reach the
1742 // actual framerate. This should be fixed.
1743 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
1744 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1745 // Insert 25 more frames to get estimates of bitrate and framerate over
1746 // 2 seconds.
1747 for (int i = 0; i < 25; ++i) {
1748 InsertFrame(kVideoFrameDelta);
1749 }
1750 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
1751 EXPECT_EQ(kDefaultFrameRate, framerate);
1752 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
1753}
1754
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001755TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1756 // Insert delta frames.
1757 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
1758 // Can't decode without a key frame.
1759 EXPECT_FALSE(DecodeCompleteFrame());
1760 InsertFrame(kVideoFrameKey);
1761 // Skip to the next key frame.
1762 EXPECT_TRUE(DecodeCompleteFrame());
1763}
1764
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001765TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
1766 InsertFrame(kVideoFrameKey);
1767 EXPECT_TRUE(DecodeCompleteFrame());
1768 const int kNumDeltaFrames = 5;
1769 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1770 InsertFrame(kVideoFrameKey);
1771 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1772 EXPECT_TRUE(DecodeCompleteFrame());
1773 }
1774}
1775
1776TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
1777 InsertFrame(kVideoFrameKey);
1778 EXPECT_TRUE(DecodeCompleteFrame());
1779 const int kNumDeltaFrames = 5;
1780 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1781 InsertFrame(kVideoFrameKey);
1782 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
1783 InsertFrame(kVideoFrameKey);
1784 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1785 EXPECT_TRUE(DecodeCompleteFrame());
1786 }
1787}
1788
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001789TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
1790 InsertFrame(kVideoFrameKey);
1791 EXPECT_TRUE(DecodeCompleteFrame());
1792 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
1793 clock_->TimeInMilliseconds());
1794 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1795 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
1796 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001797 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001798 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1799 EXPECT_FALSE(DecodeCompleteFrame());
1800 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1801 EXPECT_TRUE(DecodeCompleteFrame());
1802 EXPECT_TRUE(DecodeCompleteFrame());
1803}
1804
philipel85130292016-07-06 16:10:31 +02001805TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001806 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00001807 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07001808 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001809 InsertFrame(kVideoFrameKey);
1810 EXPECT_TRUE(DecodeCompleteFrame());
1811}
1812
philipel85130292016-07-06 16:10:31 +02001813TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001814 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001815 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001816 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001817
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001818 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1819 // old packet.
1820 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001821 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08001822 EXPECT_EQ(kFlushIndicator,
1823 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001824 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001825
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001826 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001827 std::vector<uint16_t> nack_list =
1828 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001829 // No key frame will be requested since the jitter buffer is empty.
1830 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001831 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001832
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001833 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001834 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001835 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001836
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001837 // The next complete continuous frame isn't a key frame, but we're waiting
1838 // for one.
1839 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001840 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001841 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001842 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001843}
1844
philipel85130292016-07-06 16:10:31 +02001845TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001846 // Insert a key frame and decode it.
1847 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
1848 EXPECT_TRUE(DecodeCompleteFrame());
1849
1850 // Insert a frame which should trigger a recycle until the next key frame.
1851 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
1852
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001853 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001854 std::vector<uint16_t> nack_list =
1855 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001856 // Verify that the jitter buffer does not request a key frame.
1857 EXPECT_FALSE(request_key_frame);
1858 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001859 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001860 // Verify that we can decode the next frame.
1861 EXPECT_TRUE(DecodeCompleteFrame());
1862}
1863
philipel85130292016-07-06 16:10:31 +02001864TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001865 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001866 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001867 EXPECT_TRUE(DecodeCompleteFrame());
1868
1869 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001870 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001871 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001872 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001873 EXPECT_FALSE(DecodeCompleteFrame());
1874
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001875 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001876 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001877 // The jitter buffer is empty, so we won't request key frames until we get a
1878 // packet.
1879 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001880
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001881 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001882 // Now we have a packet in the jitter buffer, a key frame will be requested
1883 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001884 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001885 // The jitter buffer is empty, so we won't request key frames until we get a
1886 // packet.
1887 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001888 // The next complete continuous frame isn't a key frame, but we're waiting
1889 // for one.
1890 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001891 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001892 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001893 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001894}
1895
philipel85130292016-07-06 16:10:31 +02001896TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001897 DropFrame(10);
1898 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001899 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001900 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001901 std::vector<uint16_t> nack_list =
1902 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001903 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001904 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001905 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001906}
1907
philipel85130292016-07-06 16:10:31 +02001908TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001909 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001910 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001911 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001912 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001913 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001914 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001915 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001916 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001917 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001918 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001919}
1920
philipel85130292016-07-06 16:10:31 +02001921TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001922 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001923 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1924 clock_->TimeInMilliseconds());
1925 VCMPacket packet;
1926 stream_generator_->PopPacket(&packet, 0);
1927 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001928 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001929 EXPECT_FALSE(retransmitted);
1930 // Drop second packet.
1931 stream_generator_->PopPacket(&packet, 1);
1932 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1933 EXPECT_FALSE(retransmitted);
1934 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001935 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001936 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001937 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001938 EXPECT_EQ(1u, nack_list.size());
1939 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001940 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001941 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001942 EXPECT_EQ(kCompleteSession,
1943 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001944 EXPECT_TRUE(retransmitted);
1945 EXPECT_TRUE(DecodeCompleteFrame());
1946}
1947
philipel85130292016-07-06 16:10:31 +02001948TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001949 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001950 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001951 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001952 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001953 // Drop second packet.
1954 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1955 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001956 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001957 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001958 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001959 ASSERT_EQ(1u, nack_list.size());
1960 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001961 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001962 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001963 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001964}
1965
philipel85130292016-07-06 16:10:31 +02001966TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001967 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001968 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001969 // First frame is delta.
1970 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
1971 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001972 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001973 // Drop second packet in frame.
1974 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1975 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1976 // Second frame is key.
1977 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
1978 clock_->TimeInMilliseconds() + 10);
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 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1982 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001983 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001984 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001985 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001986 ASSERT_EQ(1u, nack_list.size());
1987 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001988 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001989 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001990}
1991
philipel85130292016-07-06 16:10:31 +02001992TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001993 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001994
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001995 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001996 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001997
1998 // ----------------------------------------------------------------
1999 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2000 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002001 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002002 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002003 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01002004 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002005 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002006 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002007 while (stream_generator_->PacketsRemaining() > 1) {
2008 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01002009 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002010 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002011 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002012 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002013 }
Niels Möller375b3462019-01-10 15:35:56 +01002014 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002015 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002016 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002017 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002018
2019 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002020 std::vector<uint16_t> nack_list =
2021 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002022 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002023 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002024 for (size_t i = 0; i < nack_list.size(); ++i)
2025 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002026}
2027
philipel85130292016-07-06 16:10:31 +02002028TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002029 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002030 // ------- ------------------------------------------------------------
2031 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2032 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002033 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002034 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002035 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002036 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002037 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002038 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002039 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002040 while (stream_generator_->PacketsRemaining() > 1) {
2041 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002042 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002043 EXPECT_FALSE(request_key_frame);
2044 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002045 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002046 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002047 }
2048 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002049 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002050 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002051 EXPECT_FALSE(DecodeCompleteFrame());
2052 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002053 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002054 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002055 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002056 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002057 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2058 for (size_t i = 0; i < nack_list.size(); ++i)
2059 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002060}
2061
philipel85130292016-07-06 16:10:31 +02002062TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002063 bool request_key_frame = false;
2064 // -----------------------------------
2065 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2066 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002067 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002068 InsertFrame(kVideoFrameKey);
2069 EXPECT_FALSE(request_key_frame);
2070 EXPECT_TRUE(DecodeCompleteFrame());
2071 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2072 clock_->TimeInMilliseconds());
2073 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2074 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002075 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002076 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002077 EXPECT_FALSE(request_key_frame);
2078 } else {
2079 stream_generator_->NextPacket(NULL); // Drop packet
2080 }
2081 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2082 clock_->TimeInMilliseconds());
2083 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2084 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002085 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002086 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002087 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002088 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002089 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002090 ASSERT_EQ(1u, nack_list.size());
2091 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002092}
2093
philipel85130292016-07-06 16:10:31 +02002094TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002095 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002096 InsertFrame(kVideoFrameKey);
2097 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002098 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002099 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2100 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002101
2102 // Far-into-the-future video frame, could be caused by resetting the encoder
2103 // or otherwise restarting. This should not fail when error when the packet is
2104 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002105 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002106 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2107 InsertFrame(kVideoFrameKey);
2108 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002109 nack_list = jitter_buffer_->GetNackList(&extended);
2110 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002111
2112 // Stream should be decodable from this point.
2113 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2114 InsertFrame(kVideoFrameDelta);
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}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002119} // namespace webrtc