blob: d1744d549aadfc61a9808427e9128c67252604fc [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"
23#include "modules/video_coding/test/test_util.h"
24#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
28#include "system_wrappers/include/metrics_default.h"
29#include "test/field_trial.h"
30#include "test/gmock.h"
31#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000032
33namespace webrtc {
34
asapersson9a4cd872015-10-23 00:27:14 -070035namespace {
philipel9d3ab612015-12-21 04:12:39 -080036const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070037} // namespace
38
39class Vp9SsMapTest : public ::testing::Test {
40 protected:
Johan Ahlers37f93af2016-06-29 18:02:54 +020041 Vp9SsMapTest() : packet_() {}
asapersson9a4cd872015-10-23 00:27:14 -070042
43 virtual void SetUp() {
philipel29d88462018-08-08 14:26:00 +020044 auto& vp9_header =
45 packet_.video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
johan0d1b2b62017-01-10 04:21:35 -080046 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020047 packet_.dataPtr = data_;
48 packet_.sizeBytes = 1400;
49 packet_.seqNum = 1234;
50 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070051 packet_.markerBit = true;
52 packet_.frameType = kVideoFrameKey;
53 packet_.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020054 packet_.video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +020055 vp9_header.flexible_mode = false;
56 vp9_header.gof_idx = 0;
57 vp9_header.temporal_idx = kNoTemporalIdx;
58 vp9_header.temporal_up_switch = false;
59 vp9_header.ss_data_available = true;
60 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070061 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
62 }
63
64 Vp9SsMap map_;
65 uint8_t data_[1500];
66 VCMPacket packet_;
67};
68
69TEST_F(Vp9SsMapTest, Insert) {
70 EXPECT_TRUE(map_.Insert(packet_));
71}
72
73TEST_F(Vp9SsMapTest, Insert_NoSsData) {
philipel29d88462018-08-08 14:26:00 +020074 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header)
75 .ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070076 EXPECT_FALSE(map_.Insert(packet_));
77}
78
79TEST_F(Vp9SsMapTest, Find) {
80 EXPECT_TRUE(map_.Insert(packet_));
81 Vp9SsMap::SsMap::iterator it;
82 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
83 EXPECT_EQ(packet_.timestamp, it->first);
84}
85
86TEST_F(Vp9SsMapTest, Find_WithWrap) {
87 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
88 const uint32_t kSsTimestamp2 = 100;
89 packet_.timestamp = kSsTimestamp1;
90 EXPECT_TRUE(map_.Insert(packet_));
91 packet_.timestamp = kSsTimestamp2;
92 EXPECT_TRUE(map_.Insert(packet_));
93 Vp9SsMap::SsMap::iterator it;
94 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
95 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
96 EXPECT_EQ(kSsTimestamp1, it->first);
97 EXPECT_TRUE(map_.Find(0, &it));
98 EXPECT_EQ(kSsTimestamp1, it->first);
99 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
100 EXPECT_EQ(kSsTimestamp1, it->first);
101 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
102 EXPECT_EQ(kSsTimestamp2, it->first);
103 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
104 EXPECT_EQ(kSsTimestamp2, it->first);
105}
106
107TEST_F(Vp9SsMapTest, Reset) {
108 EXPECT_TRUE(map_.Insert(packet_));
109 Vp9SsMap::SsMap::iterator it;
110 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
111 EXPECT_EQ(packet_.timestamp, it->first);
112
113 map_.Reset();
114 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
115}
116
117TEST_F(Vp9SsMapTest, RemoveOld) {
118 Vp9SsMap::SsMap::iterator it;
119 const uint32_t kSsTimestamp1 = 10000;
120 packet_.timestamp = kSsTimestamp1;
121 EXPECT_TRUE(map_.Insert(packet_));
122
123 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
124 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
125 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
126
127 map_.RemoveOld(kTimestamp);
128 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
129 EXPECT_TRUE(map_.Find(kTimestamp, &it));
130 EXPECT_EQ(kTimestamp, it->first);
131}
132
133TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
134 Vp9SsMap::SsMap::iterator it;
135 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
136 const uint32_t kSsTimestamp2 = 10;
137 const uint32_t kSsTimestamp3 = 1000;
138 packet_.timestamp = kSsTimestamp1;
139 EXPECT_TRUE(map_.Insert(packet_));
140 packet_.timestamp = kSsTimestamp2;
141 EXPECT_TRUE(map_.Insert(packet_));
142 packet_.timestamp = kSsTimestamp3;
143 EXPECT_TRUE(map_.Insert(packet_));
144
145 map_.RemoveOld(kSsTimestamp3);
146 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
147 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
148 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
149}
150
151TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
philipel29d88462018-08-08 14:26:00 +0200152 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
153 0;
asapersson9a4cd872015-10-23 00:27:14 -0700154 EXPECT_FALSE(map_.UpdatePacket(&packet_));
155}
156
157TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
158 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200159 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
160 kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700161 EXPECT_FALSE(map_.UpdatePacket(&packet_));
162}
163
164TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
165 EXPECT_TRUE(map_.Insert(packet_));
philipel29d88462018-08-08 14:26:00 +0200166 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header).gof_idx =
167 4;
asapersson9a4cd872015-10-23 00:27:14 -0700168 EXPECT_FALSE(map_.UpdatePacket(&packet_));
169}
170
171TEST_F(Vp9SsMapTest, UpdatePacket) {
philipel29d88462018-08-08 14:26:00 +0200172 auto& vp9_header =
173 absl::get<RTPVideoHeaderVP9>(packet_.video_header.video_type_header);
asapersson9a4cd872015-10-23 00:27:14 -0700174 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
175
philipel29d88462018-08-08 14:26:00 +0200176 vp9_header.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700177 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200178 EXPECT_EQ(0, vp9_header.temporal_idx);
179 EXPECT_FALSE(vp9_header.temporal_up_switch);
180 EXPECT_EQ(1U, vp9_header.num_ref_pics);
181 EXPECT_EQ(4, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700182
philipel29d88462018-08-08 14:26:00 +0200183 vp9_header.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700184 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200185 EXPECT_EQ(2, vp9_header.temporal_idx);
186 EXPECT_TRUE(vp9_header.temporal_up_switch);
187 EXPECT_EQ(1U, vp9_header.num_ref_pics);
188 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700189
philipel29d88462018-08-08 14:26:00 +0200190 vp9_header.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700191 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200192 EXPECT_EQ(1, vp9_header.temporal_idx);
193 EXPECT_TRUE(vp9_header.temporal_up_switch);
194 EXPECT_EQ(1U, vp9_header.num_ref_pics);
195 EXPECT_EQ(2, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700196
philipel29d88462018-08-08 14:26:00 +0200197 vp9_header.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700198 EXPECT_TRUE(map_.UpdatePacket(&packet_));
philipel29d88462018-08-08 14:26:00 +0200199 EXPECT_EQ(2, vp9_header.temporal_idx);
200 EXPECT_TRUE(vp9_header.temporal_up_switch);
201 EXPECT_EQ(1U, vp9_header.num_ref_pics);
202 EXPECT_EQ(1, vp9_header.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700203}
204
philipel83f831a2016-03-12 03:30:23 -0800205class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
206 public NackSender,
207 public KeyFrameRequestSender {
208 public:
209 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
210 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
211 sequence_numbers.end());
212 }
213
214 void RequestKeyFrame() override { ++keyframe_requests_; }
215
philipel83f831a2016-03-12 03:30:23 -0800216 std::vector<uint16_t> nack_sent_;
217 int keyframe_requests_;
218
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000219 protected:
philipel85130292016-07-06 16:10:31 +0200220 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700221 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000222 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700223 jitter_buffer_.reset(new VCMJitterBuffer(
224 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200225 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
philipel83f831a2016-03-12 03:30:23 -0800226 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000227 jitter_buffer_->Start();
228 seq_num_ = 1234;
229 timestamp_ = 0;
230 size_ = 1400;
231 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
232 data_[0] = 0;
233 data_[1] = 0;
234 data_[2] = 0x80;
235 int count = 3;
236 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
237 data_[i] = count;
238 count++;
239 if (count == 10) {
240 data_[i + 1] = 0;
241 data_[i + 2] = 0;
242 data_[i + 3] = 0x80;
243 count = 3;
244 i += 3;
245 }
246 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200247 WebRtcRTPHeader rtpHeader;
248 memset(&rtpHeader, 0, sizeof(rtpHeader));
249 rtpHeader.header.sequenceNumber = seq_num_;
250 rtpHeader.header.timestamp = timestamp_;
251 rtpHeader.header.markerBit = true;
252 rtpHeader.frameType = kVideoFrameDelta;
Magnus Jedvert22341212018-07-11 14:27:49 +0200253 rtpHeader.video_header().codec = kVideoCodecGeneric;
254 rtpHeader.video_header().is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200255 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256 }
257
258 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700259 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000260 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700261 return nullptr;
Björn Terelius52f53d52018-06-26 11:52:33 +0000262 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000263 }
264
265 VCMEncodedFrame* DecodeIncompleteFrame() {
266 uint32_t timestamp = 0;
267 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
268 if (!found_frame)
269 return NULL;
270 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
271 return frame;
272 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000273
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000274 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800275 unsigned int size,
276 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000277 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000278
279 const uint8_t* outData = frame_out->Buffer();
280 unsigned int i = 0;
281
282 if (startCode) {
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 += 4;
288 }
289
290 EXPECT_EQ(size, frame_out->Length());
291 int count = 3;
292 for (; i < size; i++) {
293 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
294 i += 2;
295 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
296 EXPECT_EQ(0, outData[0]);
297 EXPECT_EQ(0, outData[1]);
298 EXPECT_EQ(0, outData[2]);
299 EXPECT_EQ(1, outData[3]);
300 i += 3;
301 } else {
302 EXPECT_EQ(count, outData[i]);
303 count++;
304 if (count == 10) {
305 count = 3;
306 }
307 }
308 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 }
310
311 uint16_t seq_num_;
312 uint32_t timestamp_;
313 int size_;
314 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800315 std::unique_ptr<VCMPacket> packet_;
316 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000317 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800318 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000319};
320
philipel83f831a2016-03-12 03:30:23 -0800321class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
322 public NackSender,
323 public KeyFrameRequestSender {
324 public:
325 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
326 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
327 sequence_numbers.end());
328 }
329
330 void RequestKeyFrame() { ++keyframe_requests_; }
331
philipel83f831a2016-03-12 03:30:23 -0800332 std::vector<uint16_t> nack_sent_;
333 int keyframe_requests_;
334
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000335 protected:
336 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000337
338 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000339 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000340 max_nack_list_size_ = 150;
341 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700342 jitter_buffer_ = new VCMJitterBuffer(
343 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200344 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
345 this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700346 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000347 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800348 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
349 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000350 memset(data_buffer_, 0, kDataBufferSize);
351 }
352
353 virtual void TearDown() {
354 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000355 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000356 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000357 }
358
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000359 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000360 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000361 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000362 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000363 EXPECT_TRUE(packet_available);
364 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000365 return kGeneralError; // Return here to avoid crashes below.
366 bool retransmitted = false;
367 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000368 }
369
370 VCMFrameBufferEnum InsertPacket(int index) {
371 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000372 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000373 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000374 EXPECT_TRUE(packet_available);
375 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000376 return kGeneralError; // Return here to avoid crashes below.
377 bool retransmitted = false;
378 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000379 }
380
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000381 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700382 stream_generator_->GenerateFrame(
383 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
384 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000386 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000387 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000388 }
389
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000390 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
391 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000393 VCMFrameBufferEnum ret = InsertFrame(frame_type);
394 if (ret < kNoError) {
395 ret_for_all = ret;
396 } else if (ret_for_all >= kNoError) {
397 ret_for_all = ret;
398 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000399 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000400 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000401 }
402
403 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000404 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000405 clock_->TimeInMilliseconds());
406 for (int i = 0; i < num_packets; ++i)
407 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000408 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000409 }
410
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000411 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700412 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000413 if (!found_frame)
414 return false;
415
isheriff6b4b5f32016-06-08 00:24:21 -0700416 VCMEncodedFrame* frame =
Björn Terelius52f53d52018-06-26 11:52:33 +0000417 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000418 bool ret = (frame != NULL);
419 jitter_buffer_->ReleaseFrame(frame);
420 return ret;
421 }
422
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000423 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000424 uint32_t timestamp = 0;
425 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
426 if (!found_frame)
427 return false;
428 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000429 bool ret = (frame != NULL);
430 jitter_buffer_->ReleaseFrame(frame);
431 return ret;
432 }
433
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000434 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000435 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800436 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000437 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000438 size_t max_nack_list_size_;
439 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000440 uint8_t data_buffer_[kDataBufferSize];
441};
442
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000443class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444 protected:
philipel85130292016-07-06 16:10:31 +0200445 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000446 virtual void SetUp() {
447 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000448 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000449 }
450
philipel9d3ab612015-12-21 04:12:39 -0800451 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000452};
453
philipel85130292016-07-06 16:10:31 +0200454TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000455 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000456 EXPECT_TRUE(NULL == DecodeCompleteFrame());
457 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
458 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000459 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000460 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000461
462 // No packets inserted.
463 EXPECT_TRUE(NULL == DecodeCompleteFrame());
464 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
465
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000466 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000467 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000468
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469 // No packets inserted.
470 EXPECT_TRUE(NULL == DecodeCompleteFrame());
471 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
472}
473
philipel85130292016-07-06 16:10:31 +0200474TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000475 // Always start with a complete key frame when not allowing errors.
476 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000477 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800478 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000479 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000480 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481
482 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000483 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800484 EXPECT_EQ(kCompleteSession,
485 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000486 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000487 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000488 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000489 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000490}
491
philipel85130292016-07-06 16:10:31 +0200492TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700493 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200494 // Always start with a complete key frame when not allowing errors.
495 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
496 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800497 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200498 packet_->markerBit = true;
499 packet_->timestamp += 123 * 90;
500
501 // Insert single packet frame to the jitter buffer and get a frame.
502 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800503 EXPECT_EQ(kCompleteSession,
504 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200505 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
506 CheckOutFrame(frame_out, size_, false);
507 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
508 jitter_buffer_->ReleaseFrame(frame_out);
509
510 // Verify that histograms are updated when the jitter buffer is stopped.
511 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
512 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700513 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
514 EXPECT_EQ(1,
515 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800516 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700517 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800518 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700519 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200520
521 // Verify that histograms are not updated if stop is called again.
522 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700523 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
524 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800525 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700526 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
527 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200528}
529
philipel85130292016-07-06 16:10:31 +0200530TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000531 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800532 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000533 packet_->markerBit = false;
534
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000535 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800536 EXPECT_EQ(kIncomplete,
537 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000538 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
539 // Should not be complete.
540 EXPECT_TRUE(frame_out == NULL);
541
542 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800543 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000544 packet_->markerBit = true;
545 packet_->seqNum = seq_num_;
546
philipel9d3ab612015-12-21 04:12:39 -0800547 EXPECT_EQ(kCompleteSession,
548 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000549
550 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000551 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552
553 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000554 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000555}
556
philipel85130292016-07-06 16:10:31 +0200557TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000558 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800559 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000562 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800563 EXPECT_EQ(kIncomplete,
564 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000565
566 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
567
568 // Frame should not be complete.
569 EXPECT_TRUE(frame_out == NULL);
570
571 // Insert 98 frames.
572 int loop = 0;
573 do {
574 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800575 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000576 packet_->markerBit = false;
577 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000578
philipel9d3ab612015-12-21 04:12:39 -0800579 EXPECT_EQ(kIncomplete,
580 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000581 loop++;
582 } while (loop < 98);
583
584 // Insert last packet.
585 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800586 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587 packet_->markerBit = true;
588 packet_->seqNum = seq_num_;
589
philipel9d3ab612015-12-21 04:12:39 -0800590 EXPECT_EQ(kCompleteSession,
591 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000592
593 frame_out = DecodeCompleteFrame();
594
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000595 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000597 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000598}
599
philipel85130292016-07-06 16:10:31 +0200600TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000601 // Always start with a complete key frame.
602 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800603 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604 packet_->markerBit = true;
605
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000606 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800607 EXPECT_EQ(kCompleteSession,
608 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000609 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
610 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000611 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000612
613 ++seq_num_;
614 packet_->seqNum = seq_num_;
615 packet_->markerBit = false;
616 packet_->frameType = kVideoFrameDelta;
617 packet_->timestamp += 33 * 90;
618
philipel9d3ab612015-12-21 04:12:39 -0800619 EXPECT_EQ(kIncomplete,
620 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000621
622 frame_out = DecodeCompleteFrame();
623
624 // Frame should not be complete.
625 EXPECT_TRUE(frame_out == NULL);
626
johan0d1b2b62017-01-10 04:21:35 -0800627 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000628 // Insert 98 frames.
629 int loop = 0;
630 do {
631 ++seq_num_;
632 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000633
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000634 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800635 EXPECT_EQ(kIncomplete,
636 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000637 loop++;
638 } while (loop < 98);
639
640 // Insert the last packet.
641 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800642 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000643 packet_->markerBit = true;
644 packet_->seqNum = seq_num_;
645
philipel9d3ab612015-12-21 04:12:39 -0800646 EXPECT_EQ(kCompleteSession,
647 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648
649 frame_out = DecodeCompleteFrame();
650
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000651 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000652 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000653 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000654}
655
philipel85130292016-07-06 16:10:31 +0200656TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000657 // Insert the "first" packet last.
658 seq_num_ += 100;
659 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800660 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000661 packet_->markerBit = true;
662 packet_->seqNum = seq_num_;
663 packet_->timestamp = timestamp_;
664
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000665 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800666 EXPECT_EQ(kIncomplete,
667 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000668
669 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
670
671 EXPECT_TRUE(frame_out == NULL);
672
673 // Insert 98 packets.
674 int loop = 0;
675 do {
676 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800677 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000678 packet_->markerBit = false;
679 packet_->seqNum = seq_num_;
680
philipel9d3ab612015-12-21 04:12:39 -0800681 EXPECT_EQ(kIncomplete,
682 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000683 loop++;
684 } while (loop < 98);
685
686 // Insert the last packet.
687 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800688 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689 packet_->markerBit = false;
690 packet_->seqNum = seq_num_;
691
philipel9d3ab612015-12-21 04:12:39 -0800692 EXPECT_EQ(kCompleteSession,
693 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000694
philipel9d3ab612015-12-21 04:12:39 -0800695 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000696
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000697 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000698
699 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000700 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000701}
702
philipel85130292016-07-06 16:10:31 +0200703TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000704 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800705 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000706 packet_->markerBit = false;
707
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000708 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800709 EXPECT_EQ(kIncomplete,
710 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000711
712 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
713
714 EXPECT_TRUE(frame_out == NULL);
715
716 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800717 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000718 packet_->markerBit = true;
719 packet_->seqNum = seq_num_;
720
philipel9d3ab612015-12-21 04:12:39 -0800721 EXPECT_EQ(kCompleteSession,
722 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000723
724 // check that we fail to get frame since seqnum is not continuous
725 frame_out = DecodeCompleteFrame();
726 EXPECT_TRUE(frame_out == NULL);
727
728 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800729 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000730 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800731 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000732 packet_->markerBit = false;
733 packet_->seqNum = seq_num_;
734 packet_->timestamp = timestamp_;
735
philipel9d3ab612015-12-21 04:12:39 -0800736 EXPECT_EQ(kIncomplete,
737 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000738
739 frame_out = DecodeCompleteFrame();
740
741 // It should not be complete.
742 EXPECT_TRUE(frame_out == NULL);
743
744 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800745 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 packet_->markerBit = true;
747 packet_->seqNum = seq_num_;
748
philipel9d3ab612015-12-21 04:12:39 -0800749 EXPECT_EQ(kCompleteSession,
750 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000751
752 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000753 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000754 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000755 jitter_buffer_->ReleaseFrame(frame_out);
756
757 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000758 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000759 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000760 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000761}
762
philipel85130292016-07-06 16:10:31 +0200763TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700764 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800765 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700766 packet_->markerBit = true;
767
768 // Send in an initial good packet/frame (Frame A) to start things off.
769 bool retransmitted = false;
770 EXPECT_EQ(kCompleteSession,
771 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
772 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
773 EXPECT_TRUE(frame_out != NULL);
774 jitter_buffer_->ReleaseFrame(frame_out);
775
776 // Now send in a complete delta frame (Frame C), but with a sequence number
777 // gap. No pic index either, so no temporal scalability cheating :)
778 packet_->frameType = kVideoFrameDelta;
779 // Leave a gap of 2 sequence numbers and two frames.
780 packet_->seqNum = seq_num_ + 3;
781 packet_->timestamp = timestamp_ + (66 * 90);
782 // Still isFirst = marker = true.
783 // Session should be complete (frame is complete), but there's nothing to
784 // decode yet.
785 EXPECT_EQ(kCompleteSession,
786 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
787 frame_out = DecodeCompleteFrame();
788 EXPECT_TRUE(frame_out == NULL);
789
790 // Now send in a complete delta frame (Frame B) that is continuous from A, but
791 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
792 packet_->seqNum = seq_num_ + 1;
793 packet_->timestamp = timestamp_ + (33 * 90);
794 // Still isFirst = marker = true.
795 EXPECT_EQ(kCompleteSession,
796 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
797 frame_out = DecodeCompleteFrame();
798 EXPECT_TRUE(frame_out != NULL);
799 jitter_buffer_->ReleaseFrame(frame_out);
800
801 // But Frame C isn't continuous yet.
802 frame_out = DecodeCompleteFrame();
803 EXPECT_TRUE(frame_out == NULL);
804
805 // Add in the padding. These are empty packets (data length is 0) with no
806 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200807 WebRtcRTPHeader rtpHeader;
808 memset(&rtpHeader, 0, sizeof(rtpHeader));
809 rtpHeader.header.sequenceNumber = seq_num_ + 2;
810 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
811 rtpHeader.header.markerBit = false;
Magnus Jedvert22341212018-07-11 14:27:49 +0200812 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200813 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700814 EXPECT_EQ(kOldPacket,
815 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
816 empty_packet.seqNum += 1;
817 EXPECT_EQ(kOldPacket,
818 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
819
820 // But now Frame C should be ready!
821 frame_out = DecodeCompleteFrame();
822 EXPECT_TRUE(frame_out != NULL);
823 jitter_buffer_->ReleaseFrame(frame_out);
824}
825
philipel85130292016-07-06 16:10:31 +0200826TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000827 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800828 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000829 packet_->markerBit = false;
830 packet_->seqNum = seq_num_;
831 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000832 EXPECT_EQ(0, jitter_buffer_->num_packets());
833 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000834
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000835 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800836 EXPECT_EQ(kIncomplete,
837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000838
839 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
840
841 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000842 EXPECT_EQ(1, jitter_buffer_->num_packets());
843 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000845 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800846 EXPECT_EQ(kDuplicatePacket,
847 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000848 EXPECT_EQ(2, jitter_buffer_->num_packets());
849 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000850
851 seq_num_++;
852 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000853 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800854 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000855
philipel9d3ab612015-12-21 04:12:39 -0800856 EXPECT_EQ(kCompleteSession,
857 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000858
859 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000860 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000861 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000862
863 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000864 EXPECT_EQ(3, jitter_buffer_->num_packets());
865 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000866 jitter_buffer_->ReleaseFrame(frame_out);
867}
868
philipel85130292016-07-06 16:10:31 +0200869TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000870 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800871 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000872 packet_->markerBit = true;
873 packet_->seqNum = seq_num_;
874 packet_->timestamp = timestamp_;
875 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
876 EXPECT_EQ(0, jitter_buffer_->num_packets());
877 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
878
879 bool retransmitted = false;
880 // Insert first complete frame.
881 EXPECT_EQ(kCompleteSession,
882 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
883
884 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
885 ASSERT_TRUE(frame_out != NULL);
886 CheckOutFrame(frame_out, size_, false);
887 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
888 jitter_buffer_->ReleaseFrame(frame_out);
889
890 // Insert 3 delta frames.
891 for (uint16_t i = 1; i <= 3; ++i) {
892 packet_->seqNum = seq_num_ + i;
893 packet_->timestamp = timestamp_ + (i * 33) * 90;
894 packet_->frameType = kVideoFrameDelta;
895 EXPECT_EQ(kCompleteSession,
896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
897 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
898 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
899 }
900
901 // Retransmit second delta frame.
902 packet_->seqNum = seq_num_ + 2;
903 packet_->timestamp = timestamp_ + 66 * 90;
904
905 EXPECT_EQ(kDuplicatePacket,
906 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
907
908 EXPECT_EQ(5, jitter_buffer_->num_packets());
909 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
910
911 // Should be able to decode 3 delta frames, key frame already decoded.
912 for (size_t i = 0; i < 3; ++i) {
913 frame_out = DecodeCompleteFrame();
914 ASSERT_TRUE(frame_out != NULL);
915 CheckOutFrame(frame_out, size_, false);
916 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
917 jitter_buffer_->ReleaseFrame(frame_out);
918 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000919}
920
philipel85130292016-07-06 16:10:31 +0200921TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700922 // Verify that JB skips forward to next base layer frame.
923 // -------------------------------------------------
924 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
925 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
926 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
927 // | ss | x | x | x | |
928 // -------------------------------------------------
929 // |<----------tl0idx:200--------->|<---tl0idx:201---
930
philipel29d88462018-08-08 14:26:00 +0200931 auto& vp9_header =
932 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
933
asapersson9a4cd872015-10-23 00:27:14 -0700934 bool re = false;
935 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200936 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800937 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700938 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200939 vp9_header.flexible_mode = false;
940 vp9_header.spatial_idx = 0;
941 vp9_header.beginning_of_frame = true;
942 vp9_header.end_of_frame = true;
943 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700944
945 packet_->seqNum = 65485;
946 packet_->timestamp = 1000;
947 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200948 vp9_header.picture_id = 5;
949 vp9_header.tl0_pic_idx = 200;
950 vp9_header.temporal_idx = 0;
951 vp9_header.ss_data_available = true;
952 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700953 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
954 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
955
956 // Insert next temporal layer 0.
957 packet_->seqNum = 65489;
958 packet_->timestamp = 13000;
959 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200960 vp9_header.picture_id = 9;
961 vp9_header.tl0_pic_idx = 201;
962 vp9_header.temporal_idx = 0;
963 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700964 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
965
966 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +0000967 EXPECT_EQ(1000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -0700968 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
969 jitter_buffer_->ReleaseFrame(frame_out);
970
971 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +0000972 EXPECT_EQ(13000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -0700973 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
974 jitter_buffer_->ReleaseFrame(frame_out);
975}
976
philipel85130292016-07-06 16:10:31 +0200977TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700978 // Verify that frames are updated with SS data when SS packet is reordered.
979 // --------------------------------
980 // | 65486 | 65487 | 65485 |...
981 // | pid:6 | pid:7 | pid:5 |...
982 // | tid:2 | tid:1 | tid:0 |...
983 // | | | ss |
984 // --------------------------------
985 // |<--------tl0idx:200--------->|
986
philipel29d88462018-08-08 14:26:00 +0200987 auto& vp9_header =
988 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
989
asapersson9a4cd872015-10-23 00:27:14 -0700990 bool re = false;
991 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200992 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800993 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700994 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200995 vp9_header.flexible_mode = false;
996 vp9_header.spatial_idx = 0;
997 vp9_header.beginning_of_frame = true;
998 vp9_header.end_of_frame = true;
999 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001000
1001 packet_->seqNum = 65486;
1002 packet_->timestamp = 6000;
1003 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001004 vp9_header.picture_id = 6;
1005 vp9_header.temporal_idx = 2;
1006 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001007 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1008
1009 packet_->seqNum = 65487;
1010 packet_->timestamp = 9000;
1011 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001012 vp9_header.picture_id = 7;
1013 vp9_header.temporal_idx = 1;
1014 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001015 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1016
1017 // Insert first frame with SS data.
1018 packet_->seqNum = 65485;
1019 packet_->timestamp = 3000;
1020 packet_->frameType = kVideoFrameKey;
1021 packet_->width = 352;
1022 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001023 vp9_header.picture_id = 5;
1024 vp9_header.temporal_idx = 0;
1025 vp9_header.temporal_up_switch = false;
1026 vp9_header.ss_data_available = true;
1027 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001028 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1029 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1030
1031 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001032 EXPECT_EQ(3000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001033 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1034 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_FALSE(
1036 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1037 jitter_buffer_->ReleaseFrame(frame_out);
1038
1039 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001040 EXPECT_EQ(6000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001041 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1042 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1043 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1044 jitter_buffer_->ReleaseFrame(frame_out);
1045
1046 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001047 EXPECT_EQ(9000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001048 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1049 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1050 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1051 jitter_buffer_->ReleaseFrame(frame_out);
1052}
1053
philipel85130292016-07-06 16:10:31 +02001054TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001055 // Verify that frames are updated with SS data when SS packet is reordered.
1056 // -----------------------------------------
1057 // | 65486 | 65487 | 65485 | 65484 |...
1058 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1059 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1060 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1061 // | t:6000 | t:6000 | t:3000 | t:3000 |
1062 // | | | | ss |
1063 // -----------------------------------------
1064 // |<-----------tl0idx:200------------>|
1065
philipel29d88462018-08-08 14:26:00 +02001066 auto& vp9_header =
1067 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
1068
asapersson9a4cd872015-10-23 00:27:14 -07001069 bool re = false;
1070 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001071 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +02001072 vp9_header.flexible_mode = false;
1073 vp9_header.beginning_of_frame = true;
1074 vp9_header.end_of_frame = true;
1075 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001076
johan0d1b2b62017-01-10 04:21:35 -08001077 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001078 packet_->markerBit = false;
1079 packet_->seqNum = 65486;
1080 packet_->timestamp = 6000;
1081 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001082 vp9_header.spatial_idx = 0;
1083 vp9_header.picture_id = 6;
1084 vp9_header.temporal_idx = 1;
1085 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001086 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1087
johan0d1b2b62017-01-10 04:21:35 -08001088 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001089 packet_->markerBit = true;
1090 packet_->seqNum = 65487;
1091 packet_->frameType = kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +02001092 vp9_header.spatial_idx = 1;
1093 vp9_header.picture_id = 6;
1094 vp9_header.temporal_idx = 1;
1095 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001096 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1097
johan0d1b2b62017-01-10 04:21:35 -08001098 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001099 packet_->markerBit = true;
1100 packet_->seqNum = 65485;
1101 packet_->timestamp = 3000;
1102 packet_->frameType = kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +02001103 vp9_header.spatial_idx = 1;
1104 vp9_header.picture_id = 5;
1105 vp9_header.temporal_idx = 0;
1106 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001107 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1108
1109 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001110 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001111 packet_->markerBit = false;
1112 packet_->seqNum = 65484;
1113 packet_->frameType = kVideoFrameKey;
1114 packet_->width = 352;
1115 packet_->height = 288;
philipel29d88462018-08-08 14:26:00 +02001116 vp9_header.spatial_idx = 0;
1117 vp9_header.picture_id = 5;
1118 vp9_header.temporal_idx = 0;
1119 vp9_header.temporal_up_switch = false;
1120 vp9_header.ss_data_available = true;
1121 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001122 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1123 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1124
1125 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001126 EXPECT_EQ(3000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001127 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1128 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1129 EXPECT_FALSE(
1130 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1131 jitter_buffer_->ReleaseFrame(frame_out);
1132
1133 frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001134 EXPECT_EQ(6000U, frame_out->TimeStamp());
asapersson9a4cd872015-10-23 00:27:14 -07001135 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1136 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1137 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1138 jitter_buffer_->ReleaseFrame(frame_out);
1139}
1140
philipel85130292016-07-06 16:10:31 +02001141TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001142 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001143 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001144 packet_->markerBit = false;
1145 packet_->seqNum = seq_num_;
1146 packet_->timestamp = timestamp_;
1147 packet_->insertStartCode = true;
1148
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001149 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001150 EXPECT_EQ(kIncomplete,
1151 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152
1153 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1154
1155 // Frame should not be complete.
1156 EXPECT_TRUE(frame_out == NULL);
1157
1158 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001159 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001160 packet_->markerBit = true;
1161 packet_->seqNum = seq_num_;
1162
philipel9d3ab612015-12-21 04:12:39 -08001163 EXPECT_EQ(kCompleteSession,
1164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001165
1166 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001167 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001168 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001169 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001170}
1171
stefana669a3a2016-10-06 05:04:52 -07001172TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1173 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1174
philipel7d745e52018-08-02 14:03:53 +02001175 auto& h264_header =
1176 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -07001177 packet_->timestamp = timestamp_;
1178 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001179 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001180 packet_->markerBit = true;
1181 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001182 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001183 h264_header.nalu_type = H264::NaluType::kIdr;
1184 h264_header.nalus[0].type = H264::NaluType::kIdr;
1185 h264_header.nalus[0].sps_id = -1;
1186 h264_header.nalus[0].pps_id = 0;
1187 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001188 bool retransmitted = false;
1189 EXPECT_EQ(kCompleteSession,
1190 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1191 // Not decodable since sps and pps are missing.
1192 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1193
1194 timestamp_ += 3000;
1195 packet_->timestamp = timestamp_;
1196 ++seq_num_;
1197 packet_->seqNum = seq_num_;
1198 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001199 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001200 packet_->markerBit = false;
1201 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001202 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001203 h264_header.nalu_type = H264::NaluType::kStapA;
1204 h264_header.nalus[0].type = H264::NaluType::kSps;
1205 h264_header.nalus[0].sps_id = 0;
1206 h264_header.nalus[0].pps_id = -1;
1207 h264_header.nalus[1].type = H264::NaluType::kPps;
1208 h264_header.nalus[1].sps_id = 0;
1209 h264_header.nalus[1].pps_id = 0;
1210 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -07001211 // Not complete since the marker bit hasn't been received.
1212 EXPECT_EQ(kIncomplete,
1213 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1214
1215 ++seq_num_;
1216 packet_->seqNum = seq_num_;
1217 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001218 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001219 packet_->markerBit = true;
1220 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001221 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001222 h264_header.nalu_type = H264::NaluType::kIdr;
1223 h264_header.nalus[0].type = H264::NaluType::kIdr;
1224 h264_header.nalus[0].sps_id = -1;
1225 h264_header.nalus[0].pps_id = 0;
1226 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001227 // Complete and decodable since the pps and sps are received in the first
1228 // packet of this frame.
1229 EXPECT_EQ(kCompleteSession,
1230 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1231 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1232 ASSERT_NE(nullptr, frame_out);
1233 jitter_buffer_->ReleaseFrame(frame_out);
1234
1235 timestamp_ += 3000;
1236 packet_->timestamp = timestamp_;
1237 ++seq_num_;
1238 packet_->seqNum = seq_num_;
1239 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001240 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001241 packet_->markerBit = true;
1242 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001243 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +02001244 h264_header.nalu_type = H264::NaluType::kSlice;
1245 h264_header.nalus[0].type = H264::NaluType::kSlice;
1246 h264_header.nalus[0].sps_id = -1;
1247 h264_header.nalus[0].pps_id = 0;
1248 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -07001249 // Complete and decodable since sps, pps and key frame has been received.
1250 EXPECT_EQ(kCompleteSession,
1251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1252 frame_out = DecodeCompleteFrame();
1253 ASSERT_NE(nullptr, frame_out);
1254 jitter_buffer_->ReleaseFrame(frame_out);
1255}
1256
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001257// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001258TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001259 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001260 // Always start with a key frame. Use 10 packets to test Decodable State
1261 // boundaries.
1262 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001263 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001264 packet_->markerBit = false;
1265 packet_->seqNum = seq_num_;
1266 packet_->timestamp = timestamp_;
1267
1268 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001269 EXPECT_EQ(kIncomplete,
1270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001271 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001272 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001273 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1274
johan0d1b2b62017-01-10 04:21:35 -08001275 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001276 for (int i = 1; i < 9; ++i) {
1277 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001278 EXPECT_EQ(kIncomplete,
1279 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001280 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001281 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1282 }
1283
1284 // last packet
1285 packet_->markerBit = true;
1286 packet_->seqNum++;
1287
philipel9d3ab612015-12-21 04:12:39 -08001288 EXPECT_EQ(kCompleteSession,
1289 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001290 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1291 CheckOutFrame(frame_out, 10 * size_, false);
1292 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001293 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001294
1295 // An incomplete frame can only be decoded once a subsequent frame has begun
1296 // to arrive. Insert packet in distant frame for this purpose.
1297 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001298 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001299 packet_->markerBit = false;
1300 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001301 packet_->timestamp += 33 * 90 * 8;
1302
philipel9d3ab612015-12-21 04:12:39 -08001303 EXPECT_EQ(kDecodableSession,
1304 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001305 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001306 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1307
1308 // Insert second frame
1309 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001310 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001311
philipel9d3ab612015-12-21 04:12:39 -08001312 EXPECT_EQ(kDecodableSession,
1313 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001314 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001315 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1316
johan0d1b2b62017-01-10 04:21:35 -08001317 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001318 for (int i = 1; i < 8; ++i) {
1319 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001320 EXPECT_EQ(kDecodableSession,
1321 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001322 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001323 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1324 }
1325
1326 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001327 EXPECT_EQ(kDecodableSession,
1328 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001329 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001330 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1331
1332 frame_out = DecodeIncompleteFrame();
1333 ASSERT_FALSE(NULL == frame_out);
1334 CheckOutFrame(frame_out, 9 * size_, false);
1335 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001336 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001337
1338 packet_->markerBit = true;
1339 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001340 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001341}
1342
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001343// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001344TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001345 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1346 // Always start with a key frame.
1347 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001348 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001349 packet_->markerBit = true;
1350 packet_->seqNum = seq_num_;
1351 packet_->timestamp = timestamp_;
1352
1353 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001354 EXPECT_EQ(kCompleteSession,
1355 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001356 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1357 CheckOutFrame(frame_out, size_, false);
1358 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001359 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001360
1361 // An incomplete frame can only be decoded once a subsequent frame has begun
1362 // to arrive. Insert packet in distant frame for this purpose.
1363 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001364 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001365 packet_->markerBit = false;
1366 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001367 packet_->timestamp += 33 * 90 * 8;
1368 EXPECT_EQ(kIncomplete,
1369 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001370 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001371 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001372 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1373
1374 // Insert second frame - an incomplete key frame.
1375 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001376 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001377 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001378 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001379
philipel9d3ab612015-12-21 04:12:39 -08001380 EXPECT_EQ(kIncomplete,
1381 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001382 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001383 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1384
1385 // Insert a few more packets. Make sure we're waiting for the key frame to be
1386 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001387 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001388 for (int i = 1; i < 5; ++i) {
1389 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001390 EXPECT_EQ(kIncomplete,
1391 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001392 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1394 }
1395
1396 // Complete key frame.
1397 packet_->markerBit = true;
1398 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001399 EXPECT_EQ(kCompleteSession,
1400 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001401 frame_out = DecodeCompleteFrame();
1402 CheckOutFrame(frame_out, 6 * size_, false);
1403 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001404 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001405}
1406
1407// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001408TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001409 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1410 // Always start with a key frame.
1411 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001412 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001413 packet_->markerBit = true;
1414 packet_->seqNum = seq_num_;
1415 packet_->timestamp = timestamp_;
1416
1417 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kCompleteSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001420 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1421 CheckOutFrame(frame_out, size_, false);
1422 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001423 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001424
1425 // An incomplete frame can only be decoded once a subsequent frame has begun
1426 // to arrive. Insert packet in distant frame for this purpose.
1427 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001428 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001429 packet_->markerBit = false;
1430 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001431 packet_->timestamp += 33 * 90 * 8;
1432 EXPECT_EQ(kIncomplete,
1433 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001434 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001435 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001436 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1437
1438 // Insert second frame with the first packet missing. Make sure we're waiting
1439 // for the key frame to be complete.
1440 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001441 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001442
philipel9d3ab612015-12-21 04:12:39 -08001443 EXPECT_EQ(kIncomplete,
1444 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001445 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001446 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1447
1448 for (int i = 0; i < 5; ++i) {
1449 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001450 EXPECT_EQ(kIncomplete,
1451 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001452 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001453 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1454 }
1455
1456 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001457 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001458 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001459 EXPECT_EQ(kDecodableSession,
1460 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001461 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001462 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1463
1464 frame_out = DecodeIncompleteFrame();
1465 CheckOutFrame(frame_out, 7 * size_, false);
1466 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001467 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001468}
1469
philipel85130292016-07-06 16:10:31 +02001470TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001471 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001472 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001473 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001474 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001475 packet_->markerBit = true;
1476 packet_->seqNum = seq_num_;
1477 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001478 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001479 EXPECT_EQ(kCompleteSession,
1480 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001481 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001482 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1483 EXPECT_NE(frame, nullptr);
Björn Terelius52f53d52018-06-26 11:52:33 +00001484 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1485 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001486 EXPECT_TRUE(frame != NULL);
1487 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001488
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001489 // Drop a complete frame.
1490 timestamp_ += 2 * 33 * 90;
1491 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001492 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001493 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001494 packet_->markerBit = false;
1495 packet_->seqNum = seq_num_;
1496 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001497 EXPECT_EQ(kDecodableSession,
1498 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001499 // Insert a packet (so the previous one will be released).
1500 timestamp_ += 33 * 90;
1501 seq_num_ += 2;
1502 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001503 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001504 packet_->markerBit = false;
1505 packet_->seqNum = seq_num_;
1506 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001507 EXPECT_EQ(kDecodableSession,
1508 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001509 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001510 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1511 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001512}
1513
philipel85130292016-07-06 16:10:31 +02001514TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515 // Verify missing packets statistics and not decodable packets statistics.
1516 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1517 // The last packet is an empty (non-media) packet.
1518
1519 // Select a start seqNum which triggers a difficult wrap situation
1520 // The JB will only output (incomplete)frames if the next one has started
1521 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001522 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001523 seq_num_ = 0xffff - 4;
1524 seq_num_++;
1525 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001526 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527 packet_->markerBit = false;
1528 packet_->seqNum = seq_num_;
1529 packet_->timestamp = timestamp_;
1530 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001531
1532 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001533 EXPECT_EQ(kDecodableSession,
1534 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001535 for (int i = 0; i < 11; ++i) {
1536 webrtc::FrameType frametype = kVideoFrameDelta;
1537 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001538 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001539 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001540 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001541 packet_->markerBit = false;
1542 packet_->seqNum = seq_num_;
1543 packet_->timestamp = timestamp_;
1544 packet_->completeNALU = kNaluStart;
1545
philipel9d3ab612015-12-21 04:12:39 -08001546 EXPECT_EQ(kDecodableSession,
1547 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001548
1549 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1550
1551 // Should not be complete.
1552 EXPECT_TRUE(frame_out == NULL);
1553
1554 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001555 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001556 packet_->markerBit = true;
1557 packet_->seqNum = seq_num_;
1558 packet_->completeNALU = kNaluEnd;
1559
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001560 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1561 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562
1563 // Insert an empty (non-media) packet.
1564 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001565 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001566 packet_->markerBit = false;
1567 packet_->seqNum = seq_num_;
1568 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001569 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001570
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001571 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001572 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001573 frame_out = DecodeIncompleteFrame();
1574
1575 // One of the packets has been discarded by the jitter buffer.
1576 // Last frame can't be extracted yet.
1577 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001578 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001579
1580 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001581 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582 } else {
philipel9d3ab612015-12-21 04:12:39 -08001583 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001584 }
1585 EXPECT_FALSE(frame_out->Complete());
1586 EXPECT_FALSE(frame_out->MissingFrame());
1587 }
1588
1589 jitter_buffer_->ReleaseFrame(frame_out);
1590 }
1591
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001592 // Insert 3 old packets and verify that we have 3 discarded packets
1593 // Match value to actual latest timestamp decoded.
1594 timestamp_ -= 33 * 90;
1595 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001596
philipel9d3ab612015-12-21 04:12:39 -08001597 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001598
1599 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001600
philipel9d3ab612015-12-21 04:12:39 -08001601 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001602
1603 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001604
philipel9d3ab612015-12-21 04:12:39 -08001605 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001606
1607 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1608
1609 jitter_buffer_->Flush();
1610
1611 // This statistic shouldn't be reset by a flush.
1612 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1613}
1614
philipel85130292016-07-06 16:10:31 +02001615TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001616 seq_num_ = 0xfff0;
1617 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001618 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001619 packet_->markerBit = false;
1620 packet_->seqNum = seq_num_;
1621 packet_->timestamp = timestamp_;
1622
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001623 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001624 EXPECT_EQ(kIncomplete,
1625 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001626
1627 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1628
1629 EXPECT_TRUE(frame_out == NULL);
1630
1631 int loop = 0;
1632 do {
1633 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001634 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001635 packet_->markerBit = false;
1636 packet_->seqNum = seq_num_;
1637
philipel9d3ab612015-12-21 04:12:39 -08001638 EXPECT_EQ(kIncomplete,
1639 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640
1641 frame_out = DecodeCompleteFrame();
1642
1643 EXPECT_TRUE(frame_out == NULL);
1644
1645 loop++;
1646 } while (loop < 98);
1647
1648 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001649 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001650 packet_->markerBit = true;
1651 packet_->seqNum = seq_num_;
1652
philipel9d3ab612015-12-21 04:12:39 -08001653 EXPECT_EQ(kCompleteSession,
1654 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655
1656 frame_out = DecodeCompleteFrame();
1657
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001658 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001659
1660 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001661 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001662}
1663
philipel85130292016-07-06 16:10:31 +02001664TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001665 // Insert "first" packet last seqnum.
1666 seq_num_ = 10;
1667 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001668 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001669 packet_->markerBit = true;
1670 packet_->seqNum = seq_num_;
1671
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001672 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001673 EXPECT_EQ(kIncomplete,
1674 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001675 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1676
1677 // Should not be complete.
1678 EXPECT_TRUE(frame_out == NULL);
1679
1680 // Insert 98 frames.
1681 int loop = 0;
1682 do {
1683 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001684 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001685 packet_->markerBit = false;
1686 packet_->seqNum = seq_num_;
1687
philipel9d3ab612015-12-21 04:12:39 -08001688 EXPECT_EQ(kIncomplete,
1689 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690
1691 frame_out = DecodeCompleteFrame();
1692
1693 EXPECT_TRUE(frame_out == NULL);
1694
1695 loop++;
1696 } while (loop < 98);
1697
1698 // Insert last packet.
1699 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001700 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001701 packet_->markerBit = false;
1702 packet_->seqNum = seq_num_;
1703
philipel9d3ab612015-12-21 04:12:39 -08001704 EXPECT_EQ(kCompleteSession,
1705 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001706
1707 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001708 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001709 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001710 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001711}
1712
philipel85130292016-07-06 16:10:31 +02001713TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 // ------- -------
1715 // | 2 | | 1 |
1716 // ------- -------
1717 // t = 3000 t = 2000
1718 seq_num_ = 2;
1719 timestamp_ = 3000;
1720 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001721 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001722 packet_->markerBit = true;
1723 packet_->timestamp = timestamp_;
1724 packet_->seqNum = seq_num_;
1725
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001726 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001727 EXPECT_EQ(kCompleteSession,
1728 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001729
1730 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001731 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001732 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001733 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734 jitter_buffer_->ReleaseFrame(frame_out);
1735
1736 seq_num_--;
1737 timestamp_ = 2000;
1738 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001739 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001740 packet_->markerBit = true;
1741 packet_->seqNum = seq_num_;
1742 packet_->timestamp = timestamp_;
1743
philipel9d3ab612015-12-21 04:12:39 -08001744 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001745}
1746
philipel85130292016-07-06 16:10:31 +02001747TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001748 // ------- -------
1749 // | 2 | | 1 |
1750 // ------- -------
1751 // t = 3000 t = 0xffffff00
1752
1753 seq_num_ = 2;
1754 timestamp_ = 3000;
1755 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001756 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001757 packet_->markerBit = true;
1758 packet_->seqNum = seq_num_;
1759 packet_->timestamp = timestamp_;
1760
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001761 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001762 EXPECT_EQ(kCompleteSession,
1763 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001764
1765 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001766 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001767
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001768 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001769
1770 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1771
1772 jitter_buffer_->ReleaseFrame(frame_out);
1773
1774 seq_num_--;
1775 timestamp_ = 0xffffff00;
1776 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001777 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001778 packet_->markerBit = true;
1779 packet_->seqNum = seq_num_;
1780 packet_->timestamp = timestamp_;
1781
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001782 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001783 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001784}
1785
philipel85130292016-07-06 16:10:31 +02001786TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 // --------------- ---------------
1788 // | 1 | 2 | | 3 | 4 |
1789 // --------------- ---------------
1790 // t = 0xffffff00 t = 33*90
1791
1792 timestamp_ = 0xffffff00;
1793 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001794 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 packet_->markerBit = false;
1796 packet_->seqNum = seq_num_;
1797 packet_->timestamp = timestamp_;
1798
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001799 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001800 EXPECT_EQ(kIncomplete,
1801 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001802
1803 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001804 EXPECT_TRUE(frame_out == NULL);
1805
1806 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001807 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001808 packet_->markerBit = true;
1809 packet_->seqNum = seq_num_;
1810
philipel9d3ab612015-12-21 04:12:39 -08001811 EXPECT_EQ(kCompleteSession,
1812 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001813
1814 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001815 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001816 jitter_buffer_->ReleaseFrame(frame_out);
1817
1818 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001819 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001820 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001821 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822 packet_->markerBit = false;
1823 packet_->seqNum = seq_num_;
1824 packet_->timestamp = timestamp_;
1825
philipel9d3ab612015-12-21 04:12:39 -08001826 EXPECT_EQ(kIncomplete,
1827 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001828
1829 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001830 EXPECT_TRUE(frame_out == NULL);
1831
1832 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001833 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 packet_->markerBit = true;
1835 packet_->seqNum = seq_num_;
1836
philipel9d3ab612015-12-21 04:12:39 -08001837 EXPECT_EQ(kCompleteSession,
1838 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839
1840 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001841 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001843 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001844}
1845
philipel85130292016-07-06 16:10:31 +02001846TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001847 // ------- -------
1848 // | 1 | | 2 |
1849 // ------- -------
1850 // t = 0xffffff00 t = 2700
1851
1852 timestamp_ = 0xffffff00;
1853 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001854 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001855 packet_->markerBit = true;
1856 packet_->timestamp = timestamp_;
1857
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001858 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001859 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001860 EXPECT_EQ(kCompleteSession,
1861 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001862
1863 // Insert next frame.
1864 seq_num_++;
1865 timestamp_ = 2700;
1866 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001867 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001868 packet_->markerBit = true;
1869 packet_->seqNum = seq_num_;
1870 packet_->timestamp = timestamp_;
1871
philipel9d3ab612015-12-21 04:12:39 -08001872 EXPECT_EQ(kCompleteSession,
1873 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001874
1875 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001876 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001877 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001879 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001880
1881 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001882 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001883 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001884 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001885 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001886}
1887
philipel85130292016-07-06 16:10:31 +02001888TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001889 // ------- -------
1890 // | 2 | | 1 |
1891 // ------- -------
1892 // t = 2700 t = 0xffffff00
1893
1894 seq_num_ = 2;
1895 timestamp_ = 2700;
1896 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001897 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001898 packet_->markerBit = true;
1899 packet_->seqNum = seq_num_;
1900 packet_->timestamp = timestamp_;
1901
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001902 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001903 EXPECT_EQ(kCompleteSession,
1904 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001905
1906 // Insert second frame
1907 seq_num_--;
1908 timestamp_ = 0xffffff00;
1909 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001910 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001911 packet_->markerBit = true;
1912 packet_->seqNum = seq_num_;
1913 packet_->timestamp = timestamp_;
1914
philipel9d3ab612015-12-21 04:12:39 -08001915 EXPECT_EQ(kCompleteSession,
1916 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001917
1918 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001919 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001920 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001921 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001922 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001923
1924 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00001925 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001926 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001927 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001928 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929}
1930
philipel85130292016-07-06 16:10:31 +02001931TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001932 int loop = 0;
1933 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001934 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001935 // Insert kMaxPacketsInJitterBuffer into frame.
1936 do {
1937 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001938 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939 packet_->markerBit = false;
1940 packet_->seqNum = seq_num_;
1941
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001942 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001943 EXPECT_EQ(kIncomplete,
1944 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001945 firstPacket = false;
1946 } else {
philipel9d3ab612015-12-21 04:12:39 -08001947 EXPECT_EQ(kIncomplete,
1948 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001949 }
1950
1951 loop++;
1952 } while (loop < kMaxPacketsInSession);
1953
1954 // Max number of packets inserted.
1955 // Insert one more packet.
1956 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001957 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001958 packet_->markerBit = true;
1959 packet_->seqNum = seq_num_;
1960
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001961 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001962 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001963 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001964}
1965
philipel85130292016-07-06 16:10:31 +02001966TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001967 // TEST fill JB with more than max number of frame (50 delta frames +
1968 // 51 key frames) with wrap in seq_num_
1969 //
1970 // --------------------------------------------------------------
1971 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1972 // --------------------------------------------------------------
1973 // |<-----------delta frames------------->|<------key frames----->|
1974
jbauchdb81ffd2015-11-23 03:59:02 -08001975 // Make sure the jitter doesn't request a keyframe after too much non-
1976 // decodable frames.
1977 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001978 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001979
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001980 int loop = 0;
1981 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001982 uint32_t first_key_frame_timestamp = 0;
1983 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001984 // Insert MAX_NUMBER_OF_FRAMES frames.
1985 do {
philipel9d3ab612015-12-21 04:12:39 -08001986 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001987 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001988 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001989 packet_->markerBit = true;
1990 packet_->seqNum = seq_num_;
1991 packet_->timestamp = timestamp_;
1992
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001993 if (loop == 50) {
1994 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001995 packet_->frameType = kVideoFrameKey;
1996 }
1997
1998 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001999 EXPECT_EQ(kCompleteSession,
2000 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001
2002 loop++;
2003 } while (loop < kMaxNumberOfFrames);
2004
2005 // Max number of frames inserted.
2006
2007 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08002008 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002009 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002010 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002011 packet_->markerBit = true;
2012 packet_->seqNum = seq_num_;
2013 packet_->timestamp = timestamp_;
2014
2015 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002016 EXPECT_EQ(kFlushIndicator,
2017 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002018
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002019 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Björn Terelius52f53d52018-06-26 11:52:33 +00002020 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002021 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002022 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002023 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002024}
2025
philipel85130292016-07-06 16:10:31 +02002026TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002027 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002028 seq_num_ = 3;
2029 // Insert one empty packet per frame, should never return the last timestamp
2030 // inserted. Only return empty frames in the presence of subsequent frames.
2031 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002032 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002033 for (int i = 0; i < maxSize + 10; i++) {
2034 timestamp_ += 33 * 90;
2035 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002036 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002037 packet_->markerBit = false;
2038 packet_->seqNum = seq_num_;
2039 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002040 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002041
philipel9d3ab612015-12-21 04:12:39 -08002042 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002043 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2044 // Timestamp should never be the last TS inserted.
2045 if (testFrame != NULL) {
Björn Terelius52f53d52018-06-26 11:52:33 +00002046 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002047 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048 }
2049 }
2050}
2051
philipel85130292016-07-06 16:10:31 +02002052TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002054 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002055 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002056 timestamp_ += 33 * 90;
2057 int insertedLength = 0;
2058 packet_->seqNum = seq_num_;
2059 packet_->timestamp = timestamp_;
2060 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002061 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002062 packet_->completeNALU = kNaluStart;
2063 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002064 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002065
philipel9d3ab612015-12-21 04:12:39 -08002066 EXPECT_EQ(kDecodableSession,
2067 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002068
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002069 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002070 packet_->seqNum = seq_num_;
2071 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002072 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002073 packet_->completeNALU = kNaluIncomplete;
2074 packet_->markerBit = false;
2075
philipel9d3ab612015-12-21 04:12:39 -08002076 EXPECT_EQ(kDecodableSession,
2077 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002078
2079 seq_num_++;
2080 packet_->seqNum = seq_num_;
2081 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002082 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002083 packet_->completeNALU = kNaluEnd;
2084 packet_->markerBit = false;
2085
philipel9d3ab612015-12-21 04:12:39 -08002086 EXPECT_EQ(kDecodableSession,
2087 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002088
2089 seq_num_++;
2090 packet_->seqNum = seq_num_;
2091 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002092 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002093 EXPECT_EQ(kDecodableSession,
2094 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002095 // The JB will only output (incomplete) frames if a packet belonging to a
2096 // subsequent frame was already inserted. Insert one packet of a subsequent
2097 // frame. place high timestamp so the JB would always have a next frame
2098 // (otherwise, for every inserted frame we need to take care of the next
2099 // frame as well).
2100 packet_->seqNum = 1;
2101 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2102 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002103 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002104 packet_->completeNALU = kNaluStart;
2105 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002106
philipel9d3ab612015-12-21 04:12:39 -08002107 EXPECT_EQ(kDecodableSession,
2108 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002109
2110 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2111
2112 // We can decode everything from a NALU until a packet has been lost.
2113 // Thus we can decode the first packet of the first NALU and the second NALU
2114 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002115 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002116 jitter_buffer_->ReleaseFrame(frame_out);
2117
2118 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002119 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002120 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002121 insertedLength = 0;
2122
2123 packet_->seqNum = seq_num_;
2124 packet_->timestamp = timestamp_;
2125 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002126 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002127 packet_->completeNALU = kNaluEnd;
2128 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002129 EXPECT_EQ(kDecodableSession,
2130 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2131 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002132 seq_num_--;
2133 packet_->seqNum = seq_num_;
2134 packet_->timestamp = timestamp_;
2135 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002136 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137 packet_->completeNALU = kNaluStart;
2138 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002139
philipel9d3ab612015-12-21 04:12:39 -08002140 EXPECT_EQ(kDecodableSession,
2141 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002142 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2143
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002144 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002145 packet_->seqNum = seq_num_;
2146 packet_->timestamp = timestamp_;
2147 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002148 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002149 packet_->completeNALU = kNaluComplete;
2150 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002151 EXPECT_EQ(kDecodableSession,
2152 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002153 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002154 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155 packet_->seqNum = seq_num_;
2156 packet_->timestamp = timestamp_;
2157 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002158 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002159 packet_->completeNALU = kNaluStart;
2160 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002161 EXPECT_EQ(kDecodableSession,
2162 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 // This packet should be decoded since it's the beginning of a NAL.
2164 insertedLength += packet_->sizeBytes;
2165
2166 seq_num_ += 2;
2167 packet_->seqNum = seq_num_;
2168 packet_->timestamp = timestamp_;
2169 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002170 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002171 packet_->completeNALU = kNaluEnd;
2172 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002173 EXPECT_EQ(kDecodableSession,
2174 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002175 // This packet should not be decoded because it is an incomplete NAL if it
2176 // is the last.
2177 frame_out = DecodeIncompleteFrame();
2178 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002179 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002180 jitter_buffer_->ReleaseFrame(frame_out);
2181
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002182 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002183 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002184 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002185 WebRtcRTPHeader rtpHeader;
2186 memset(&rtpHeader, 0, sizeof(rtpHeader));
Magnus Jedvert22341212018-07-11 14:27:49 +02002187 rtpHeader.video_header().codec = kVideoCodecGeneric;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002188 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002189 emptypacket.seqNum = seq_num_;
2190 emptypacket.timestamp = timestamp_;
2191 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002192 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002193 emptypacket.completeNALU = kNaluComplete;
2194 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002195 EXPECT_EQ(kCompleteSession,
2196 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002197 // This packet should not be decoded because it is an incomplete NAL if it
2198 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002199
2200 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2201 // has arrived.
2202 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002203 EXPECT_TRUE(frame_out != NULL);
2204 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002205
2206 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002207 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002208 timestamp_ += 33 * 90;
2209
2210 packet_->seqNum = seq_num_;
2211 packet_->timestamp = timestamp_;
2212 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002213 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002214 packet_->completeNALU = kNaluComplete;
2215 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002216
philipel9d3ab612015-12-21 04:12:39 -08002217 EXPECT_EQ(kDecodableSession,
2218 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002219
agalusza@google.comd177c102013-08-08 01:12:33 +00002220 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002221 emptypacket.seqNum = seq_num_;
2222 emptypacket.timestamp = timestamp_;
2223 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002224 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002225 emptypacket.completeNALU = kNaluComplete;
2226 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002227 EXPECT_EQ(kCompleteSession,
2228 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002229
2230 frame_out = DecodeCompleteFrame();
2231 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002232 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002233 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002234}
2235
philipel85130292016-07-06 16:10:31 +02002236TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002237 // Test that a we cannot get incomplete frames from the JB if we haven't
2238 // received the marker bit, unless we have received a packet from a later
2239 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002240 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002241 // Start with a complete key frame - insert and decode.
2242 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002243 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002244 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002245 bool retransmitted = false;
2246
philipel9d3ab612015-12-21 04:12:39 -08002247 EXPECT_EQ(kCompleteSession,
2248 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002249 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2250 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002251 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002252
2253 packet_->seqNum += 2;
2254 packet_->timestamp += 33 * 90;
2255 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002256 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002257 packet_->markerBit = false;
2258
philipel9d3ab612015-12-21 04:12:39 -08002259 EXPECT_EQ(kDecodableSession,
2260 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002261
2262 frame_out = DecodeIncompleteFrame();
2263 EXPECT_TRUE(frame_out == NULL);
2264
2265 packet_->seqNum += 2;
2266 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002267 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002268
philipel9d3ab612015-12-21 04:12:39 -08002269 EXPECT_EQ(kDecodableSession,
2270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002271
2272 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002273 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002274 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002275}
2276
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002277TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002278 // Make sure the jitter doesn't request a keyframe after too much non-
2279 // decodable frames.
2280 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002281 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002282 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002283 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002284 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002285 DropFrame(1);
2286 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002287 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002288 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002289 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002290 // This frame will make the jitter buffer recycle frames until a key frame.
2291 // Since none is found it will have to wait until the next key frame before
2292 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002293 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002294 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002295}
2296
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002297TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002298 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002299 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002300 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002301 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002302 // Insert empty packet.
2303 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002304 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002305 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002306 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002307 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002308 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002309 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002310 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002311 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002312 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002313 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002314 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002315}
2316
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002317TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002318 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2319 EXPECT_EQ(0, frame_stats.delta_frames);
2320 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002321
2322 uint32_t framerate = 0;
2323 uint32_t bitrate = 0;
2324 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2325 EXPECT_EQ(0u, framerate);
2326 EXPECT_EQ(0u, bitrate);
2327
2328 // Insert a couple of key and delta frames.
2329 InsertFrame(kVideoFrameKey);
2330 InsertFrame(kVideoFrameDelta);
2331 InsertFrame(kVideoFrameDelta);
2332 InsertFrame(kVideoFrameKey);
2333 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002334 // Decode some of them to make sure the statistics doesn't depend on frames
2335 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002336 EXPECT_TRUE(DecodeCompleteFrame());
2337 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002338 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002339 EXPECT_EQ(3, frame_stats.delta_frames);
2340 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002341
2342 // Insert 20 more frames to get estimates of bitrate and framerate over
2343 // 1 second.
2344 for (int i = 0; i < 20; ++i) {
2345 InsertFrame(kVideoFrameDelta);
2346 }
2347 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2348 // TODO(holmer): The current implementation returns the average of the last
2349 // two framerate calculations, which is why it takes two calls to reach the
2350 // actual framerate. This should be fixed.
2351 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2352 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2353 // Insert 25 more frames to get estimates of bitrate and framerate over
2354 // 2 seconds.
2355 for (int i = 0; i < 25; ++i) {
2356 InsertFrame(kVideoFrameDelta);
2357 }
2358 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2359 EXPECT_EQ(kDefaultFrameRate, framerate);
2360 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2361}
2362
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002363TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2364 // Insert delta frames.
2365 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2366 // Can't decode without a key frame.
2367 EXPECT_FALSE(DecodeCompleteFrame());
2368 InsertFrame(kVideoFrameKey);
2369 // Skip to the next key frame.
2370 EXPECT_TRUE(DecodeCompleteFrame());
2371}
2372
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002373TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2374 InsertFrame(kVideoFrameKey);
2375 EXPECT_TRUE(DecodeCompleteFrame());
2376 const int kNumDeltaFrames = 5;
2377 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2378 InsertFrame(kVideoFrameKey);
2379 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2380 EXPECT_TRUE(DecodeCompleteFrame());
2381 }
2382}
2383
2384TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2385 InsertFrame(kVideoFrameKey);
2386 EXPECT_TRUE(DecodeCompleteFrame());
2387 const int kNumDeltaFrames = 5;
2388 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2389 InsertFrame(kVideoFrameKey);
2390 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2391 InsertFrame(kVideoFrameKey);
2392 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2393 EXPECT_TRUE(DecodeCompleteFrame());
2394 }
2395}
2396
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002397TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2398 InsertFrame(kVideoFrameKey);
2399 EXPECT_TRUE(DecodeCompleteFrame());
2400 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2401 clock_->TimeInMilliseconds());
2402 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2403 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2404 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002405 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002406 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2407 EXPECT_FALSE(DecodeCompleteFrame());
2408 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2409 EXPECT_TRUE(DecodeCompleteFrame());
2410 EXPECT_TRUE(DecodeCompleteFrame());
2411}
2412
philipel85130292016-07-06 16:10:31 +02002413TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002414 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002415 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002416 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002417 InsertFrame(kVideoFrameKey);
2418 EXPECT_TRUE(DecodeCompleteFrame());
2419}
2420
philipel85130292016-07-06 16:10:31 +02002421TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002422 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002423 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002424 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002425
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002426 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2427 // old packet.
2428 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002429 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002430 EXPECT_EQ(kFlushIndicator,
2431 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002432 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002433
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002434 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002435 std::vector<uint16_t> nack_list =
2436 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002437 // No key frame will be requested since the jitter buffer is empty.
2438 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002439 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002440
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002441 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002442 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002443 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002444 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002445
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002446 // The next complete continuous frame isn't a key frame, but we're waiting
2447 // for one.
2448 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002449 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002450 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002451 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002452}
2453
philipel85130292016-07-06 16:10:31 +02002454TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002455 // Insert a key frame and decode it.
2456 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2457 EXPECT_TRUE(DecodeCompleteFrame());
2458
2459 // Insert a frame which should trigger a recycle until the next key frame.
2460 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2461
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002462 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002463 std::vector<uint16_t> nack_list =
2464 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002465 // Verify that the jitter buffer does not request a key frame.
2466 EXPECT_FALSE(request_key_frame);
2467 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002468 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002469 // Verify that we can decode the next frame.
2470 EXPECT_TRUE(DecodeCompleteFrame());
2471}
2472
philipel85130292016-07-06 16:10:31 +02002473TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002474 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002475 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002476 EXPECT_TRUE(DecodeCompleteFrame());
2477
2478 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002479 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002480 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002481 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002482 EXPECT_FALSE(DecodeCompleteFrame());
2483
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002484 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002485 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002486 // The jitter buffer is empty, so we won't request key frames until we get a
2487 // packet.
2488 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002489
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002490 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002491 // Now we have a packet in the jitter buffer, a key frame will be requested
2492 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002493 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002494 // The jitter buffer is empty, so we won't request key frames until we get a
2495 // packet.
2496 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002497 // The next complete continuous frame isn't a key frame, but we're waiting
2498 // for one.
2499 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002500 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002501 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002502 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002503 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002504}
2505
philipel85130292016-07-06 16:10:31 +02002506TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002507 DropFrame(10);
2508 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002509 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002510 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002511 std::vector<uint16_t> nack_list =
2512 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002513 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002514 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002515 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002516}
2517
philipel85130292016-07-06 16:10:31 +02002518TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002519 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002520 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002521 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002522 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002523 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002524 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002525 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002526 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002527 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002528 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002529}
2530
philipel85130292016-07-06 16:10:31 +02002531TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002532 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002533 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2534 clock_->TimeInMilliseconds());
2535 VCMPacket packet;
2536 stream_generator_->PopPacket(&packet, 0);
2537 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002538 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002539 EXPECT_FALSE(retransmitted);
2540 // Drop second packet.
2541 stream_generator_->PopPacket(&packet, 1);
2542 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2543 EXPECT_FALSE(retransmitted);
2544 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002545 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002546 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002547 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002548 EXPECT_EQ(1u, nack_list.size());
2549 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002550 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002551 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002552 EXPECT_EQ(kCompleteSession,
2553 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002554 EXPECT_TRUE(retransmitted);
2555 EXPECT_TRUE(DecodeCompleteFrame());
2556}
2557
philipel85130292016-07-06 16:10:31 +02002558TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002559 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002560 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002561 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002562 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002563 // Drop second packet.
2564 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2565 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002566 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002567 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002568 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002569 ASSERT_EQ(1u, nack_list.size());
2570 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002571 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002572 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002573 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002574}
2575
philipel85130292016-07-06 16:10:31 +02002576TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002577 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002578 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002579 // First frame is delta.
2580 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2581 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002582 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002583 // Drop second packet in frame.
2584 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2585 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2586 // Second frame is key.
2587 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2588 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002589 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002590 // Drop second packet in frame.
2591 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2592 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002593 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002594 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002595 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002596 ASSERT_EQ(1u, nack_list.size());
2597 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002598 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002599 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002600}
2601
philipel85130292016-07-06 16:10:31 +02002602TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002603 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002604 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002605
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002606 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002607 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002608
2609 // ----------------------------------------------------------------
2610 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2611 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002612 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002613 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002614 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002615 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002616 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002617 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002618 while (stream_generator_->PacketsRemaining() > 1) {
2619 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002620 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002621 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002622 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002623 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002624 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002625 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002626 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002627 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002628 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002629 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002630
2631 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002632 std::vector<uint16_t> nack_list =
2633 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002634 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002635 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002636 for (size_t i = 0; i < nack_list.size(); ++i)
2637 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002638}
2639
philipel85130292016-07-06 16:10:31 +02002640TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002641 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002642 // ------- ------------------------------------------------------------
2643 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2644 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002645 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002646 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002647 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002648 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002649 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002650 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002651 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002652 while (stream_generator_->PacketsRemaining() > 1) {
2653 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002654 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002655 EXPECT_FALSE(request_key_frame);
2656 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002657 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002658 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002659 }
2660 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002661 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002662 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002663 EXPECT_FALSE(DecodeCompleteFrame());
2664 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002665 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002666 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002667 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002668 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002669 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2670 for (size_t i = 0; i < nack_list.size(); ++i)
2671 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002672}
2673
philipel85130292016-07-06 16:10:31 +02002674TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002675 bool request_key_frame = false;
2676 // -----------------------------------
2677 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2678 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002679 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002680 InsertFrame(kVideoFrameKey);
2681 EXPECT_FALSE(request_key_frame);
2682 EXPECT_TRUE(DecodeCompleteFrame());
2683 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2684 clock_->TimeInMilliseconds());
2685 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2686 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002687 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002688 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002689 EXPECT_FALSE(request_key_frame);
2690 } else {
2691 stream_generator_->NextPacket(NULL); // Drop packet
2692 }
2693 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2694 clock_->TimeInMilliseconds());
2695 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2696 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002697 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002698 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002699 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002700 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002701 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002702 ASSERT_EQ(1u, nack_list.size());
2703 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002704}
2705
philipel85130292016-07-06 16:10:31 +02002706TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002707 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002708 InsertFrame(kVideoFrameKey);
2709 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002710 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002711 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2712 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002713
2714 // Far-into-the-future video frame, could be caused by resetting the encoder
2715 // or otherwise restarting. This should not fail when error when the packet is
2716 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002717 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002718 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2719 InsertFrame(kVideoFrameKey);
2720 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002721 nack_list = jitter_buffer_->GetNackList(&extended);
2722 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002723
2724 // Stream should be decodable from this point.
2725 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2726 InsertFrame(kVideoFrameDelta);
2727 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002728 nack_list = jitter_buffer_->GetNackList(&extended);
2729 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002730}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002731} // namespace webrtc