blob: 71c17ea6c827e93f4093cc873728420eaf7d5e9f [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() {
johan0d1b2b62017-01-10 04:21:35 -080044 packet_.is_first_packet_in_frame = true;
Johan Ahlers37f93af2016-06-29 18:02:54 +020045 packet_.dataPtr = data_;
46 packet_.sizeBytes = 1400;
47 packet_.seqNum = 1234;
48 packet_.timestamp = 1;
asapersson9a4cd872015-10-23 00:27:14 -070049 packet_.markerBit = true;
50 packet_.frameType = kVideoFrameKey;
51 packet_.codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +020052 packet_.video_header.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -070053 packet_.video_header.codecHeader.VP9.flexible_mode = false;
54 packet_.video_header.codecHeader.VP9.gof_idx = 0;
55 packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
56 packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
57 packet_.video_header.codecHeader.VP9.ss_data_available = true;
58 packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070059 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
60 }
61
62 Vp9SsMap map_;
63 uint8_t data_[1500];
64 VCMPacket packet_;
65};
66
67TEST_F(Vp9SsMapTest, Insert) {
68 EXPECT_TRUE(map_.Insert(packet_));
69}
70
71TEST_F(Vp9SsMapTest, Insert_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -070072 packet_.video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070073 EXPECT_FALSE(map_.Insert(packet_));
74}
75
76TEST_F(Vp9SsMapTest, Find) {
77 EXPECT_TRUE(map_.Insert(packet_));
78 Vp9SsMap::SsMap::iterator it;
79 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
80 EXPECT_EQ(packet_.timestamp, it->first);
81}
82
83TEST_F(Vp9SsMapTest, Find_WithWrap) {
84 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
85 const uint32_t kSsTimestamp2 = 100;
86 packet_.timestamp = kSsTimestamp1;
87 EXPECT_TRUE(map_.Insert(packet_));
88 packet_.timestamp = kSsTimestamp2;
89 EXPECT_TRUE(map_.Insert(packet_));
90 Vp9SsMap::SsMap::iterator it;
91 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
92 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
93 EXPECT_EQ(kSsTimestamp1, it->first);
94 EXPECT_TRUE(map_.Find(0, &it));
95 EXPECT_EQ(kSsTimestamp1, it->first);
96 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
97 EXPECT_EQ(kSsTimestamp1, it->first);
98 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
99 EXPECT_EQ(kSsTimestamp2, it->first);
100 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
101 EXPECT_EQ(kSsTimestamp2, it->first);
102}
103
104TEST_F(Vp9SsMapTest, Reset) {
105 EXPECT_TRUE(map_.Insert(packet_));
106 Vp9SsMap::SsMap::iterator it;
107 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
108 EXPECT_EQ(packet_.timestamp, it->first);
109
110 map_.Reset();
111 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
112}
113
114TEST_F(Vp9SsMapTest, RemoveOld) {
115 Vp9SsMap::SsMap::iterator it;
116 const uint32_t kSsTimestamp1 = 10000;
117 packet_.timestamp = kSsTimestamp1;
118 EXPECT_TRUE(map_.Insert(packet_));
119
120 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
121 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
122 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
123
124 map_.RemoveOld(kTimestamp);
125 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
126 EXPECT_TRUE(map_.Find(kTimestamp, &it));
127 EXPECT_EQ(kTimestamp, it->first);
128}
129
130TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
131 Vp9SsMap::SsMap::iterator it;
132 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
133 const uint32_t kSsTimestamp2 = 10;
134 const uint32_t kSsTimestamp3 = 1000;
135 packet_.timestamp = kSsTimestamp1;
136 EXPECT_TRUE(map_.Insert(packet_));
137 packet_.timestamp = kSsTimestamp2;
138 EXPECT_TRUE(map_.Insert(packet_));
139 packet_.timestamp = kSsTimestamp3;
140 EXPECT_TRUE(map_.Insert(packet_));
141
142 map_.RemoveOld(kSsTimestamp3);
143 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
144 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
145 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
146}
147
148TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -0700149 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700150 EXPECT_FALSE(map_.UpdatePacket(&packet_));
151}
152
153TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
154 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700155 packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700156 EXPECT_FALSE(map_.UpdatePacket(&packet_));
157}
158
159TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
160 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700161 packet_.video_header.codecHeader.VP9.gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700162 EXPECT_FALSE(map_.UpdatePacket(&packet_));
163}
164
165TEST_F(Vp9SsMapTest, UpdatePacket) {
166 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
167
isheriff6b4b5f32016-06-08 00:24:21 -0700168 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700169 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700170 EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
171 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
172 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
173 EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700174
isheriff6b4b5f32016-06-08 00:24:21 -0700175 packet_.video_header.codecHeader.VP9.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700177 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
178 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
179 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
180 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700181
isheriff6b4b5f32016-06-08 00:24:21 -0700182 packet_.video_header.codecHeader.VP9.gof_idx = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700184 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.temporal_idx);
185 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
186 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
187 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700188
isheriff6b4b5f32016-06-08 00:24:21 -0700189 packet_.video_header.codecHeader.VP9.gof_idx = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700190 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700191 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
Sergey Silkin377ef242018-05-07 09:17:12 +0200192 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
193 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
isheriff6b4b5f32016-06-08 00:24:21 -0700194 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700195}
196
philipel83f831a2016-03-12 03:30:23 -0800197class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
198 public NackSender,
199 public KeyFrameRequestSender {
200 public:
201 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
202 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
203 sequence_numbers.end());
204 }
205
206 void RequestKeyFrame() override { ++keyframe_requests_; }
207
philipel83f831a2016-03-12 03:30:23 -0800208 std::vector<uint16_t> nack_sent_;
209 int keyframe_requests_;
210
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000211 protected:
philipel85130292016-07-06 16:10:31 +0200212 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700213 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000214 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700215 jitter_buffer_.reset(new VCMJitterBuffer(
216 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200217 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
philipel83f831a2016-03-12 03:30:23 -0800218 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000219 jitter_buffer_->Start();
220 seq_num_ = 1234;
221 timestamp_ = 0;
222 size_ = 1400;
223 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
224 data_[0] = 0;
225 data_[1] = 0;
226 data_[2] = 0x80;
227 int count = 3;
228 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
229 data_[i] = count;
230 count++;
231 if (count == 10) {
232 data_[i + 1] = 0;
233 data_[i + 2] = 0;
234 data_[i + 3] = 0x80;
235 count = 3;
236 i += 3;
237 }
238 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200239 WebRtcRTPHeader rtpHeader;
240 memset(&rtpHeader, 0, sizeof(rtpHeader));
241 rtpHeader.header.sequenceNumber = seq_num_;
242 rtpHeader.header.timestamp = timestamp_;
243 rtpHeader.header.markerBit = true;
244 rtpHeader.frameType = kVideoFrameDelta;
Niels Möller520ca4e2018-06-04 11:14:38 +0200245 rtpHeader.type.Video.codec = kVideoCodecUnknown;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200246 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000247 }
248
249 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700250 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000251 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700252 return nullptr;
253 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000254 }
255
256 VCMEncodedFrame* DecodeIncompleteFrame() {
257 uint32_t timestamp = 0;
258 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
259 if (!found_frame)
260 return NULL;
261 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
262 return frame;
263 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000264
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000265 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800266 unsigned int size,
267 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000268 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000269
270 const uint8_t* outData = frame_out->Buffer();
271 unsigned int i = 0;
272
273 if (startCode) {
274 EXPECT_EQ(0, outData[0]);
275 EXPECT_EQ(0, outData[1]);
276 EXPECT_EQ(0, outData[2]);
277 EXPECT_EQ(1, outData[3]);
278 i += 4;
279 }
280
281 EXPECT_EQ(size, frame_out->Length());
282 int count = 3;
283 for (; i < size; i++) {
284 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
285 i += 2;
286 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
287 EXPECT_EQ(0, outData[0]);
288 EXPECT_EQ(0, outData[1]);
289 EXPECT_EQ(0, outData[2]);
290 EXPECT_EQ(1, outData[3]);
291 i += 3;
292 } else {
293 EXPECT_EQ(count, outData[i]);
294 count++;
295 if (count == 10) {
296 count = 3;
297 }
298 }
299 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000300 }
301
302 uint16_t seq_num_;
303 uint32_t timestamp_;
304 int size_;
305 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800306 std::unique_ptr<VCMPacket> packet_;
307 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000308 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800309 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000310};
311
philipel83f831a2016-03-12 03:30:23 -0800312class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
313 public NackSender,
314 public KeyFrameRequestSender {
315 public:
316 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
317 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
318 sequence_numbers.end());
319 }
320
321 void RequestKeyFrame() { ++keyframe_requests_; }
322
philipel83f831a2016-03-12 03:30:23 -0800323 std::vector<uint16_t> nack_sent_;
324 int keyframe_requests_;
325
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000326 protected:
327 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000328
329 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000330 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000331 max_nack_list_size_ = 150;
332 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700333 jitter_buffer_ = new VCMJitterBuffer(
334 clock_.get(),
Yves Gerey665174f2018-06-19 15:03:05 +0200335 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()), this,
336 this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700337 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000338 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800339 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
340 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000341 memset(data_buffer_, 0, kDataBufferSize);
342 }
343
344 virtual void TearDown() {
345 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000346 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000347 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 }
349
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000350 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000351 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000352 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000353 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000354 EXPECT_TRUE(packet_available);
355 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000356 return kGeneralError; // Return here to avoid crashes below.
357 bool retransmitted = false;
358 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000359 }
360
361 VCMFrameBufferEnum InsertPacket(int index) {
362 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000363 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000364 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000365 EXPECT_TRUE(packet_available);
366 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000367 return kGeneralError; // Return here to avoid crashes below.
368 bool retransmitted = false;
369 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000370 }
371
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000372 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700373 stream_generator_->GenerateFrame(
374 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
375 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000376 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000377 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000378 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000379 }
380
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000381 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
382 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000383 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000384 VCMFrameBufferEnum ret = InsertFrame(frame_type);
385 if (ret < kNoError) {
386 ret_for_all = ret;
387 } else if (ret_for_all >= kNoError) {
388 ret_for_all = ret;
389 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000390 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000391 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000392 }
393
394 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000395 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000396 clock_->TimeInMilliseconds());
397 for (int i = 0; i < num_packets; ++i)
398 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000399 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000400 }
401
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000402 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700403 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000404 if (!found_frame)
405 return false;
406
isheriff6b4b5f32016-06-08 00:24:21 -0700407 VCMEncodedFrame* frame =
408 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000409 bool ret = (frame != NULL);
410 jitter_buffer_->ReleaseFrame(frame);
411 return ret;
412 }
413
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000414 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000415 uint32_t timestamp = 0;
416 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
417 if (!found_frame)
418 return false;
419 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000420 bool ret = (frame != NULL);
421 jitter_buffer_->ReleaseFrame(frame);
422 return ret;
423 }
424
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000425 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000426 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800427 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000428 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000429 size_t max_nack_list_size_;
430 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000431 uint8_t data_buffer_[kDataBufferSize];
432};
433
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000434class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000435 protected:
philipel85130292016-07-06 16:10:31 +0200436 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000437 virtual void SetUp() {
438 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000439 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000440 }
441
philipel9d3ab612015-12-21 04:12:39 -0800442 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000443};
444
philipel85130292016-07-06 16:10:31 +0200445TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000446 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000447 EXPECT_TRUE(NULL == DecodeCompleteFrame());
448 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
449 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000450 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000451 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000452
453 // No packets inserted.
454 EXPECT_TRUE(NULL == DecodeCompleteFrame());
455 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
456
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000457 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000458 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000459
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460 // No packets inserted.
461 EXPECT_TRUE(NULL == DecodeCompleteFrame());
462 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
463}
464
philipel85130292016-07-06 16:10:31 +0200465TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000466 // Always start with a complete key frame when not allowing errors.
467 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000468 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800469 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000470 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000471 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000472
473 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000474 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800475 EXPECT_EQ(kCompleteSession,
476 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000477 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000478 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000479 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000480 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481}
482
philipel85130292016-07-06 16:10:31 +0200483TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700484 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200485 // Always start with a complete key frame when not allowing errors.
486 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
487 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800488 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200489 packet_->markerBit = true;
490 packet_->timestamp += 123 * 90;
491
492 // Insert single packet frame to the jitter buffer and get a frame.
493 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800494 EXPECT_EQ(kCompleteSession,
495 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200496 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
497 CheckOutFrame(frame_out, size_, false);
498 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
499 jitter_buffer_->ReleaseFrame(frame_out);
500
501 // Verify that histograms are updated when the jitter buffer is stopped.
502 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
503 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700504 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
505 EXPECT_EQ(1,
506 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800507 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700508 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800509 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700510 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200511
512 // Verify that histograms are not updated if stop is called again.
513 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700514 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
515 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800516 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700517 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
518 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200519}
520
philipel85130292016-07-06 16:10:31 +0200521TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000522 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800523 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000524 packet_->markerBit = false;
525
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000526 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800527 EXPECT_EQ(kIncomplete,
528 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000529 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
530 // Should not be complete.
531 EXPECT_TRUE(frame_out == NULL);
532
533 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800534 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000535 packet_->markerBit = true;
536 packet_->seqNum = seq_num_;
537
philipel9d3ab612015-12-21 04:12:39 -0800538 EXPECT_EQ(kCompleteSession,
539 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000540
541 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000542 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000543
544 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000545 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000546}
547
philipel85130292016-07-06 16:10:31 +0200548TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000549 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800550 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000551 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000553 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800554 EXPECT_EQ(kIncomplete,
555 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000556
557 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
558
559 // Frame should not be complete.
560 EXPECT_TRUE(frame_out == NULL);
561
562 // Insert 98 frames.
563 int loop = 0;
564 do {
565 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800566 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000567 packet_->markerBit = false;
568 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000569
philipel9d3ab612015-12-21 04:12:39 -0800570 EXPECT_EQ(kIncomplete,
571 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000572 loop++;
573 } while (loop < 98);
574
575 // Insert last packet.
576 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800577 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000578 packet_->markerBit = true;
579 packet_->seqNum = seq_num_;
580
philipel9d3ab612015-12-21 04:12:39 -0800581 EXPECT_EQ(kCompleteSession,
582 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000583
584 frame_out = DecodeCompleteFrame();
585
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000586 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000588 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000589}
590
philipel85130292016-07-06 16:10:31 +0200591TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000592 // Always start with a complete key frame.
593 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800594 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000595 packet_->markerBit = true;
596
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000597 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800598 EXPECT_EQ(kCompleteSession,
599 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000600 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
601 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000602 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000603
604 ++seq_num_;
605 packet_->seqNum = seq_num_;
606 packet_->markerBit = false;
607 packet_->frameType = kVideoFrameDelta;
608 packet_->timestamp += 33 * 90;
609
philipel9d3ab612015-12-21 04:12:39 -0800610 EXPECT_EQ(kIncomplete,
611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000612
613 frame_out = DecodeCompleteFrame();
614
615 // Frame should not be complete.
616 EXPECT_TRUE(frame_out == NULL);
617
johan0d1b2b62017-01-10 04:21:35 -0800618 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000619 // Insert 98 frames.
620 int loop = 0;
621 do {
622 ++seq_num_;
623 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000624
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000625 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800626 EXPECT_EQ(kIncomplete,
627 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000628 loop++;
629 } while (loop < 98);
630
631 // Insert the last packet.
632 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800633 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000634 packet_->markerBit = true;
635 packet_->seqNum = seq_num_;
636
philipel9d3ab612015-12-21 04:12:39 -0800637 EXPECT_EQ(kCompleteSession,
638 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000639
640 frame_out = DecodeCompleteFrame();
641
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000642 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000643 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000644 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000645}
646
philipel85130292016-07-06 16:10:31 +0200647TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648 // Insert the "first" packet last.
649 seq_num_ += 100;
650 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800651 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000652 packet_->markerBit = true;
653 packet_->seqNum = seq_num_;
654 packet_->timestamp = timestamp_;
655
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000656 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800657 EXPECT_EQ(kIncomplete,
658 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000659
660 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
661
662 EXPECT_TRUE(frame_out == NULL);
663
664 // Insert 98 packets.
665 int loop = 0;
666 do {
667 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800668 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000669 packet_->markerBit = false;
670 packet_->seqNum = seq_num_;
671
philipel9d3ab612015-12-21 04:12:39 -0800672 EXPECT_EQ(kIncomplete,
673 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000674 loop++;
675 } while (loop < 98);
676
677 // Insert the last packet.
678 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800679 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000680 packet_->markerBit = false;
681 packet_->seqNum = seq_num_;
682
philipel9d3ab612015-12-21 04:12:39 -0800683 EXPECT_EQ(kCompleteSession,
684 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000685
philipel9d3ab612015-12-21 04:12:39 -0800686 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000687
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000688 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689
690 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000691 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000692}
693
philipel85130292016-07-06 16:10:31 +0200694TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000695 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800696 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000697 packet_->markerBit = false;
698
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000699 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800700 EXPECT_EQ(kIncomplete,
701 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702
703 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
704
705 EXPECT_TRUE(frame_out == NULL);
706
707 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800708 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000709 packet_->markerBit = true;
710 packet_->seqNum = seq_num_;
711
philipel9d3ab612015-12-21 04:12:39 -0800712 EXPECT_EQ(kCompleteSession,
713 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000714
715 // check that we fail to get frame since seqnum is not continuous
716 frame_out = DecodeCompleteFrame();
717 EXPECT_TRUE(frame_out == NULL);
718
719 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800720 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000721 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800722 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000723 packet_->markerBit = false;
724 packet_->seqNum = seq_num_;
725 packet_->timestamp = timestamp_;
726
philipel9d3ab612015-12-21 04:12:39 -0800727 EXPECT_EQ(kIncomplete,
728 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000729
730 frame_out = DecodeCompleteFrame();
731
732 // It should not be complete.
733 EXPECT_TRUE(frame_out == NULL);
734
735 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800736 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000737 packet_->markerBit = true;
738 packet_->seqNum = seq_num_;
739
philipel9d3ab612015-12-21 04:12:39 -0800740 EXPECT_EQ(kCompleteSession,
741 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000742
743 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000744 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000745 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 jitter_buffer_->ReleaseFrame(frame_out);
747
748 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000749 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000750 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000751 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000752}
753
philipel85130292016-07-06 16:10:31 +0200754TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700755 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800756 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700757 packet_->markerBit = true;
758
759 // Send in an initial good packet/frame (Frame A) to start things off.
760 bool retransmitted = false;
761 EXPECT_EQ(kCompleteSession,
762 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
763 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
764 EXPECT_TRUE(frame_out != NULL);
765 jitter_buffer_->ReleaseFrame(frame_out);
766
767 // Now send in a complete delta frame (Frame C), but with a sequence number
768 // gap. No pic index either, so no temporal scalability cheating :)
769 packet_->frameType = kVideoFrameDelta;
770 // Leave a gap of 2 sequence numbers and two frames.
771 packet_->seqNum = seq_num_ + 3;
772 packet_->timestamp = timestamp_ + (66 * 90);
773 // Still isFirst = marker = true.
774 // Session should be complete (frame is complete), but there's nothing to
775 // decode yet.
776 EXPECT_EQ(kCompleteSession,
777 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
778 frame_out = DecodeCompleteFrame();
779 EXPECT_TRUE(frame_out == NULL);
780
781 // Now send in a complete delta frame (Frame B) that is continuous from A, but
782 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
783 packet_->seqNum = seq_num_ + 1;
784 packet_->timestamp = timestamp_ + (33 * 90);
785 // Still isFirst = marker = true.
786 EXPECT_EQ(kCompleteSession,
787 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
788 frame_out = DecodeCompleteFrame();
789 EXPECT_TRUE(frame_out != NULL);
790 jitter_buffer_->ReleaseFrame(frame_out);
791
792 // But Frame C isn't continuous yet.
793 frame_out = DecodeCompleteFrame();
794 EXPECT_TRUE(frame_out == NULL);
795
796 // Add in the padding. These are empty packets (data length is 0) with no
797 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200798 WebRtcRTPHeader rtpHeader;
799 memset(&rtpHeader, 0, sizeof(rtpHeader));
800 rtpHeader.header.sequenceNumber = seq_num_ + 2;
801 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
802 rtpHeader.header.markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200803 rtpHeader.type.Video.codec = kVideoCodecUnknown;
Johan Ahlers37f93af2016-06-29 18:02:54 +0200804 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700805 EXPECT_EQ(kOldPacket,
806 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
807 empty_packet.seqNum += 1;
808 EXPECT_EQ(kOldPacket,
809 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
810
811 // But now Frame C should be ready!
812 frame_out = DecodeCompleteFrame();
813 EXPECT_TRUE(frame_out != NULL);
814 jitter_buffer_->ReleaseFrame(frame_out);
815}
816
philipel85130292016-07-06 16:10:31 +0200817TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000818 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800819 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000820 packet_->markerBit = false;
821 packet_->seqNum = seq_num_;
822 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000823 EXPECT_EQ(0, jitter_buffer_->num_packets());
824 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000825
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000826 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800827 EXPECT_EQ(kIncomplete,
828 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000829
830 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
831
832 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000833 EXPECT_EQ(1, jitter_buffer_->num_packets());
834 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000835
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000836 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800837 EXPECT_EQ(kDuplicatePacket,
838 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000839 EXPECT_EQ(2, jitter_buffer_->num_packets());
840 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000841
842 seq_num_++;
843 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000844 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800845 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000846
philipel9d3ab612015-12-21 04:12:39 -0800847 EXPECT_EQ(kCompleteSession,
848 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000849
850 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000851 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000852 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000853
854 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000855 EXPECT_EQ(3, jitter_buffer_->num_packets());
856 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000857 jitter_buffer_->ReleaseFrame(frame_out);
858}
859
philipel85130292016-07-06 16:10:31 +0200860TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000861 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800862 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000863 packet_->markerBit = true;
864 packet_->seqNum = seq_num_;
865 packet_->timestamp = timestamp_;
866 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
867 EXPECT_EQ(0, jitter_buffer_->num_packets());
868 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
869
870 bool retransmitted = false;
871 // Insert first complete frame.
872 EXPECT_EQ(kCompleteSession,
873 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
874
875 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
876 ASSERT_TRUE(frame_out != NULL);
877 CheckOutFrame(frame_out, size_, false);
878 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
879 jitter_buffer_->ReleaseFrame(frame_out);
880
881 // Insert 3 delta frames.
882 for (uint16_t i = 1; i <= 3; ++i) {
883 packet_->seqNum = seq_num_ + i;
884 packet_->timestamp = timestamp_ + (i * 33) * 90;
885 packet_->frameType = kVideoFrameDelta;
886 EXPECT_EQ(kCompleteSession,
887 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
888 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
889 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
890 }
891
892 // Retransmit second delta frame.
893 packet_->seqNum = seq_num_ + 2;
894 packet_->timestamp = timestamp_ + 66 * 90;
895
896 EXPECT_EQ(kDuplicatePacket,
897 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
898
899 EXPECT_EQ(5, jitter_buffer_->num_packets());
900 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
901
902 // Should be able to decode 3 delta frames, key frame already decoded.
903 for (size_t i = 0; i < 3; ++i) {
904 frame_out = DecodeCompleteFrame();
905 ASSERT_TRUE(frame_out != NULL);
906 CheckOutFrame(frame_out, size_, false);
907 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
908 jitter_buffer_->ReleaseFrame(frame_out);
909 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000910}
911
philipel85130292016-07-06 16:10:31 +0200912TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700913 // Verify that JB skips forward to next base layer frame.
914 // -------------------------------------------------
915 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
916 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
917 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
918 // | ss | x | x | x | |
919 // -------------------------------------------------
920 // |<----------tl0idx:200--------->|<---tl0idx:201---
921
922 bool re = false;
923 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200924 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800925 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700926 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700927 packet_->video_header.codecHeader.VP9.flexible_mode = false;
928 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
929 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
930 packet_->video_header.codecHeader.VP9.end_of_frame = true;
931 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700932
933 packet_->seqNum = 65485;
934 packet_->timestamp = 1000;
935 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700936 packet_->video_header.codecHeader.VP9.picture_id = 5;
937 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
938 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
939 packet_->video_header.codecHeader.VP9.ss_data_available = true;
940 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700941 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
942 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
943
944 // Insert next temporal layer 0.
945 packet_->seqNum = 65489;
946 packet_->timestamp = 13000;
947 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700948 packet_->video_header.codecHeader.VP9.picture_id = 9;
949 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
950 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
951 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700952 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
953
954 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
955 EXPECT_EQ(1000U, frame_out->TimeStamp());
956 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
957 jitter_buffer_->ReleaseFrame(frame_out);
958
959 frame_out = DecodeCompleteFrame();
960 EXPECT_EQ(13000U, frame_out->TimeStamp());
961 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
962 jitter_buffer_->ReleaseFrame(frame_out);
963}
964
philipel85130292016-07-06 16:10:31 +0200965TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700966 // Verify that frames are updated with SS data when SS packet is reordered.
967 // --------------------------------
968 // | 65486 | 65487 | 65485 |...
969 // | pid:6 | pid:7 | pid:5 |...
970 // | tid:2 | tid:1 | tid:0 |...
971 // | | | ss |
972 // --------------------------------
973 // |<--------tl0idx:200--------->|
974
975 bool re = false;
976 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +0200977 packet_->video_header.codec = kVideoCodecVP9;
johan0d1b2b62017-01-10 04:21:35 -0800978 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700979 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700980 packet_->video_header.codecHeader.VP9.flexible_mode = false;
981 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
982 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
983 packet_->video_header.codecHeader.VP9.end_of_frame = true;
984 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700985
986 packet_->seqNum = 65486;
987 packet_->timestamp = 6000;
988 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700989 packet_->video_header.codecHeader.VP9.picture_id = 6;
990 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
991 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700992 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
993
994 packet_->seqNum = 65487;
995 packet_->timestamp = 9000;
996 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700997 packet_->video_header.codecHeader.VP9.picture_id = 7;
998 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
999 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001000 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1001
1002 // Insert first frame with SS data.
1003 packet_->seqNum = 65485;
1004 packet_->timestamp = 3000;
1005 packet_->frameType = kVideoFrameKey;
1006 packet_->width = 352;
1007 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001008 packet_->video_header.codecHeader.VP9.picture_id = 5;
1009 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1010 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1011 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1012 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001013 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1014 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1015
1016 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1017 EXPECT_EQ(3000U, frame_out->TimeStamp());
1018 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1019 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1020 EXPECT_FALSE(
1021 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1022 jitter_buffer_->ReleaseFrame(frame_out);
1023
1024 frame_out = DecodeCompleteFrame();
1025 EXPECT_EQ(6000U, frame_out->TimeStamp());
1026 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1027 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1028 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1029 jitter_buffer_->ReleaseFrame(frame_out);
1030
1031 frame_out = DecodeCompleteFrame();
1032 EXPECT_EQ(9000U, frame_out->TimeStamp());
1033 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1034 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1036 jitter_buffer_->ReleaseFrame(frame_out);
1037}
1038
philipel85130292016-07-06 16:10:31 +02001039TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001040 // Verify that frames are updated with SS data when SS packet is reordered.
1041 // -----------------------------------------
1042 // | 65486 | 65487 | 65485 | 65484 |...
1043 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1044 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1045 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1046 // | t:6000 | t:6000 | t:3000 | t:3000 |
1047 // | | | | ss |
1048 // -----------------------------------------
1049 // |<-----------tl0idx:200------------>|
1050
1051 bool re = false;
1052 packet_->codec = kVideoCodecVP9;
Niels Möller520ca4e2018-06-04 11:14:38 +02001053 packet_->video_header.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001054 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1055 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1056 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1057 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001058
johan0d1b2b62017-01-10 04:21:35 -08001059 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001060 packet_->markerBit = false;
1061 packet_->seqNum = 65486;
1062 packet_->timestamp = 6000;
1063 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001064 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1065 packet_->video_header.codecHeader.VP9.picture_id = 6;
1066 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1067 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001068 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1069
johan0d1b2b62017-01-10 04:21:35 -08001070 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001071 packet_->markerBit = true;
1072 packet_->seqNum = 65487;
1073 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001074 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1075 packet_->video_header.codecHeader.VP9.picture_id = 6;
1076 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1077 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001078 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1079
johan0d1b2b62017-01-10 04:21:35 -08001080 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001081 packet_->markerBit = true;
1082 packet_->seqNum = 65485;
1083 packet_->timestamp = 3000;
1084 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001085 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1086 packet_->video_header.codecHeader.VP9.picture_id = 5;
1087 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1088 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001089 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1090
1091 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001092 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001093 packet_->markerBit = false;
1094 packet_->seqNum = 65484;
1095 packet_->frameType = kVideoFrameKey;
1096 packet_->width = 352;
1097 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001098 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1099 packet_->video_header.codecHeader.VP9.picture_id = 5;
1100 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1101 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1102 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1103 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001104 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1105 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1106
1107 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1108 EXPECT_EQ(3000U, frame_out->TimeStamp());
1109 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1110 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1111 EXPECT_FALSE(
1112 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1113 jitter_buffer_->ReleaseFrame(frame_out);
1114
1115 frame_out = DecodeCompleteFrame();
1116 EXPECT_EQ(6000U, frame_out->TimeStamp());
1117 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1118 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1119 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1120 jitter_buffer_->ReleaseFrame(frame_out);
1121}
1122
philipel85130292016-07-06 16:10:31 +02001123TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001124 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001125 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001126 packet_->markerBit = false;
1127 packet_->seqNum = seq_num_;
1128 packet_->timestamp = timestamp_;
1129 packet_->insertStartCode = true;
1130
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001131 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001132 EXPECT_EQ(kIncomplete,
1133 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001134
1135 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1136
1137 // Frame should not be complete.
1138 EXPECT_TRUE(frame_out == NULL);
1139
1140 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001141 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001142 packet_->markerBit = true;
1143 packet_->seqNum = seq_num_;
1144
philipel9d3ab612015-12-21 04:12:39 -08001145 EXPECT_EQ(kCompleteSession,
1146 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001147
1148 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001149 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001150 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001151 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152}
1153
stefana669a3a2016-10-06 05:04:52 -07001154TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1155 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1156
1157 packet_->timestamp = timestamp_;
1158 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001159 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001160 packet_->markerBit = true;
1161 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001162 packet_->video_header.codec = kVideoCodecH264;
stefana669a3a2016-10-06 05:04:52 -07001163 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1164 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1165 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1166 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1167 packet_->video_header.codecHeader.H264.nalus_length = 1;
1168 bool retransmitted = false;
1169 EXPECT_EQ(kCompleteSession,
1170 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1171 // Not decodable since sps and pps are missing.
1172 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1173
1174 timestamp_ += 3000;
1175 packet_->timestamp = timestamp_;
1176 ++seq_num_;
1177 packet_->seqNum = seq_num_;
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 = false;
1181 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001182 packet_->video_header.codec = kVideoCodecH264;
stefana669a3a2016-10-06 05:04:52 -07001183 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
1184 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
1185 packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
1186 packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
1187 packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
1188 packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
1189 packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
1190 packet_->video_header.codecHeader.H264.nalus_length = 2;
1191 // Not complete since the marker bit hasn't been received.
1192 EXPECT_EQ(kIncomplete,
1193 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1194
1195 ++seq_num_;
1196 packet_->seqNum = seq_num_;
1197 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001198 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001199 packet_->markerBit = true;
1200 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001201 packet_->video_header.codec = kVideoCodecH264;
stefana669a3a2016-10-06 05:04:52 -07001202 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1203 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1204 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1205 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1206 packet_->video_header.codecHeader.H264.nalus_length = 1;
1207 // Complete and decodable since the pps and sps are received in the first
1208 // packet of this frame.
1209 EXPECT_EQ(kCompleteSession,
1210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1211 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1212 ASSERT_NE(nullptr, frame_out);
1213 jitter_buffer_->ReleaseFrame(frame_out);
1214
1215 timestamp_ += 3000;
1216 packet_->timestamp = timestamp_;
1217 ++seq_num_;
1218 packet_->seqNum = seq_num_;
1219 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001220 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001221 packet_->markerBit = true;
1222 packet_->codec = kVideoCodecH264;
Niels Möller520ca4e2018-06-04 11:14:38 +02001223 packet_->video_header.codec = kVideoCodecH264;
stefana669a3a2016-10-06 05:04:52 -07001224 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
1225 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
1226 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1227 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1228 packet_->video_header.codecHeader.H264.nalus_length = 1;
1229 // Complete and decodable since sps, pps and key frame has been received.
1230 EXPECT_EQ(kCompleteSession,
1231 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1232 frame_out = DecodeCompleteFrame();
1233 ASSERT_NE(nullptr, frame_out);
1234 jitter_buffer_->ReleaseFrame(frame_out);
1235}
1236
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001237// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001238TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001239 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001240 // Always start with a key frame. Use 10 packets to test Decodable State
1241 // boundaries.
1242 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001243 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001244 packet_->markerBit = false;
1245 packet_->seqNum = seq_num_;
1246 packet_->timestamp = timestamp_;
1247
1248 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001249 EXPECT_EQ(kIncomplete,
1250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001251 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001252 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001253 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1254
johan0d1b2b62017-01-10 04:21:35 -08001255 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001256 for (int i = 1; i < 9; ++i) {
1257 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001258 EXPECT_EQ(kIncomplete,
1259 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001260 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001261 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1262 }
1263
1264 // last packet
1265 packet_->markerBit = true;
1266 packet_->seqNum++;
1267
philipel9d3ab612015-12-21 04:12:39 -08001268 EXPECT_EQ(kCompleteSession,
1269 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001270 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1271 CheckOutFrame(frame_out, 10 * size_, false);
1272 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001273 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001274
1275 // An incomplete frame can only be decoded once a subsequent frame has begun
1276 // to arrive. Insert packet in distant frame for this purpose.
1277 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001278 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001279 packet_->markerBit = false;
1280 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001281 packet_->timestamp += 33 * 90 * 8;
1282
philipel9d3ab612015-12-21 04:12:39 -08001283 EXPECT_EQ(kDecodableSession,
1284 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001285 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001286 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1287
1288 // Insert second frame
1289 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001290 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001291
philipel9d3ab612015-12-21 04:12:39 -08001292 EXPECT_EQ(kDecodableSession,
1293 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001294 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001295 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1296
johan0d1b2b62017-01-10 04:21:35 -08001297 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001298 for (int i = 1; i < 8; ++i) {
1299 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001300 EXPECT_EQ(kDecodableSession,
1301 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001302 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001303 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1304 }
1305
1306 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001307 EXPECT_EQ(kDecodableSession,
1308 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001309 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001310 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1311
1312 frame_out = DecodeIncompleteFrame();
1313 ASSERT_FALSE(NULL == frame_out);
1314 CheckOutFrame(frame_out, 9 * size_, false);
1315 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001316 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001317
1318 packet_->markerBit = true;
1319 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001320 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001321}
1322
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001323// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001324TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001325 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1326 // Always start with a key frame.
1327 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001328 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001329 packet_->markerBit = true;
1330 packet_->seqNum = seq_num_;
1331 packet_->timestamp = timestamp_;
1332
1333 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001334 EXPECT_EQ(kCompleteSession,
1335 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001336 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1337 CheckOutFrame(frame_out, size_, false);
1338 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001339 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001340
1341 // An incomplete frame can only be decoded once a subsequent frame has begun
1342 // to arrive. Insert packet in distant frame for this purpose.
1343 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001344 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001345 packet_->markerBit = false;
1346 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001347 packet_->timestamp += 33 * 90 * 8;
1348 EXPECT_EQ(kIncomplete,
1349 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001350 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001351 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001352 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1353
1354 // Insert second frame - an incomplete key frame.
1355 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001356 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001358 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001359
philipel9d3ab612015-12-21 04:12:39 -08001360 EXPECT_EQ(kIncomplete,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001362 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001363 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1364
1365 // Insert a few more packets. Make sure we're waiting for the key frame to be
1366 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001367 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001368 for (int i = 1; i < 5; ++i) {
1369 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001370 EXPECT_EQ(kIncomplete,
1371 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001372 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001373 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1374 }
1375
1376 // Complete key frame.
1377 packet_->markerBit = true;
1378 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001379 EXPECT_EQ(kCompleteSession,
1380 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001381 frame_out = DecodeCompleteFrame();
1382 CheckOutFrame(frame_out, 6 * size_, false);
1383 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001384 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001385}
1386
1387// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001388TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001389 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1390 // Always start with a key frame.
1391 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001392 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 packet_->markerBit = true;
1394 packet_->seqNum = seq_num_;
1395 packet_->timestamp = timestamp_;
1396
1397 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001398 EXPECT_EQ(kCompleteSession,
1399 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001400 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1401 CheckOutFrame(frame_out, size_, false);
1402 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001403 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001404
1405 // An incomplete frame can only be decoded once a subsequent frame has begun
1406 // to arrive. Insert packet in distant frame for this purpose.
1407 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001408 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001409 packet_->markerBit = false;
1410 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001411 packet_->timestamp += 33 * 90 * 8;
1412 EXPECT_EQ(kIncomplete,
1413 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001414 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001415 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001416 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1417
1418 // Insert second frame with the first packet missing. Make sure we're waiting
1419 // for the key frame to be complete.
1420 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001421 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001422
philipel9d3ab612015-12-21 04:12:39 -08001423 EXPECT_EQ(kIncomplete,
1424 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001425 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001426 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1427
1428 for (int i = 0; i < 5; ++i) {
1429 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001430 EXPECT_EQ(kIncomplete,
1431 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001432 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001433 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1434 }
1435
1436 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001437 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001438 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001439 EXPECT_EQ(kDecodableSession,
1440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001441 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001442 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1443
1444 frame_out = DecodeIncompleteFrame();
1445 CheckOutFrame(frame_out, 7 * size_, false);
1446 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001447 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001448}
1449
philipel85130292016-07-06 16:10:31 +02001450TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001451 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001452 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001453 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001454 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001455 packet_->markerBit = true;
1456 packet_->seqNum = seq_num_;
1457 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001458 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001459 EXPECT_EQ(kCompleteSession,
1460 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001461 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001462 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1463 EXPECT_NE(frame, nullptr);
1464 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1465 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001466 EXPECT_TRUE(frame != NULL);
1467 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001468
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001469 // Drop a complete frame.
1470 timestamp_ += 2 * 33 * 90;
1471 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001472 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001473 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001474 packet_->markerBit = false;
1475 packet_->seqNum = seq_num_;
1476 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001477 EXPECT_EQ(kDecodableSession,
1478 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001479 // Insert a packet (so the previous one will be released).
1480 timestamp_ += 33 * 90;
1481 seq_num_ += 2;
1482 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001483 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001484 packet_->markerBit = false;
1485 packet_->seqNum = seq_num_;
1486 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001487 EXPECT_EQ(kDecodableSession,
1488 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001489 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001490 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1491 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001492}
1493
philipel85130292016-07-06 16:10:31 +02001494TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001495 // Verify missing packets statistics and not decodable packets statistics.
1496 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1497 // The last packet is an empty (non-media) packet.
1498
1499 // Select a start seqNum which triggers a difficult wrap situation
1500 // The JB will only output (incomplete)frames if the next one has started
1501 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001502 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 seq_num_ = 0xffff - 4;
1504 seq_num_++;
1505 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001506 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001507 packet_->markerBit = false;
1508 packet_->seqNum = seq_num_;
1509 packet_->timestamp = timestamp_;
1510 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001511
1512 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001513 EXPECT_EQ(kDecodableSession,
1514 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515 for (int i = 0; i < 11; ++i) {
1516 webrtc::FrameType frametype = kVideoFrameDelta;
1517 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001518 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001520 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001521 packet_->markerBit = false;
1522 packet_->seqNum = seq_num_;
1523 packet_->timestamp = timestamp_;
1524 packet_->completeNALU = kNaluStart;
1525
philipel9d3ab612015-12-21 04:12:39 -08001526 EXPECT_EQ(kDecodableSession,
1527 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001528
1529 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1530
1531 // Should not be complete.
1532 EXPECT_TRUE(frame_out == NULL);
1533
1534 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001535 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001536 packet_->markerBit = true;
1537 packet_->seqNum = seq_num_;
1538 packet_->completeNALU = kNaluEnd;
1539
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001540 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1541 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001542
1543 // Insert an empty (non-media) packet.
1544 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001545 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001546 packet_->markerBit = false;
1547 packet_->seqNum = seq_num_;
1548 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001549 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001550
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001551 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001552 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001553 frame_out = DecodeIncompleteFrame();
1554
1555 // One of the packets has been discarded by the jitter buffer.
1556 // Last frame can't be extracted yet.
1557 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001558 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559
1560 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001561 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562 } else {
philipel9d3ab612015-12-21 04:12:39 -08001563 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001564 }
1565 EXPECT_FALSE(frame_out->Complete());
1566 EXPECT_FALSE(frame_out->MissingFrame());
1567 }
1568
1569 jitter_buffer_->ReleaseFrame(frame_out);
1570 }
1571
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001572 // Insert 3 old packets and verify that we have 3 discarded packets
1573 // Match value to actual latest timestamp decoded.
1574 timestamp_ -= 33 * 90;
1575 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001576
philipel9d3ab612015-12-21 04:12:39 -08001577 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001578
1579 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001580
philipel9d3ab612015-12-21 04:12:39 -08001581 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582
1583 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001584
philipel9d3ab612015-12-21 04:12:39 -08001585 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586
1587 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1588
1589 jitter_buffer_->Flush();
1590
1591 // This statistic shouldn't be reset by a flush.
1592 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1593}
1594
philipel85130292016-07-06 16:10:31 +02001595TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001596 seq_num_ = 0xfff0;
1597 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001598 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001599 packet_->markerBit = false;
1600 packet_->seqNum = seq_num_;
1601 packet_->timestamp = timestamp_;
1602
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001603 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001604 EXPECT_EQ(kIncomplete,
1605 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001606
1607 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1608
1609 EXPECT_TRUE(frame_out == NULL);
1610
1611 int loop = 0;
1612 do {
1613 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001614 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 packet_->markerBit = false;
1616 packet_->seqNum = seq_num_;
1617
philipel9d3ab612015-12-21 04:12:39 -08001618 EXPECT_EQ(kIncomplete,
1619 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620
1621 frame_out = DecodeCompleteFrame();
1622
1623 EXPECT_TRUE(frame_out == NULL);
1624
1625 loop++;
1626 } while (loop < 98);
1627
1628 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001629 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001630 packet_->markerBit = true;
1631 packet_->seqNum = seq_num_;
1632
philipel9d3ab612015-12-21 04:12:39 -08001633 EXPECT_EQ(kCompleteSession,
1634 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001635
1636 frame_out = DecodeCompleteFrame();
1637
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001638 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001639
1640 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001641 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001642}
1643
philipel85130292016-07-06 16:10:31 +02001644TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001645 // Insert "first" packet last seqnum.
1646 seq_num_ = 10;
1647 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001648 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001649 packet_->markerBit = true;
1650 packet_->seqNum = seq_num_;
1651
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001652 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001653 EXPECT_EQ(kIncomplete,
1654 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1656
1657 // Should not be complete.
1658 EXPECT_TRUE(frame_out == NULL);
1659
1660 // Insert 98 frames.
1661 int loop = 0;
1662 do {
1663 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001664 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001665 packet_->markerBit = false;
1666 packet_->seqNum = seq_num_;
1667
philipel9d3ab612015-12-21 04:12:39 -08001668 EXPECT_EQ(kIncomplete,
1669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001670
1671 frame_out = DecodeCompleteFrame();
1672
1673 EXPECT_TRUE(frame_out == NULL);
1674
1675 loop++;
1676 } while (loop < 98);
1677
1678 // Insert last packet.
1679 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001680 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001681 packet_->markerBit = false;
1682 packet_->seqNum = seq_num_;
1683
philipel9d3ab612015-12-21 04:12:39 -08001684 EXPECT_EQ(kCompleteSession,
1685 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001686
1687 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001688 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001690 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001691}
1692
philipel85130292016-07-06 16:10:31 +02001693TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001694 // ------- -------
1695 // | 2 | | 1 |
1696 // ------- -------
1697 // t = 3000 t = 2000
1698 seq_num_ = 2;
1699 timestamp_ = 3000;
1700 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001701 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001702 packet_->markerBit = true;
1703 packet_->timestamp = timestamp_;
1704 packet_->seqNum = seq_num_;
1705
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001706 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001707 EXPECT_EQ(kCompleteSession,
1708 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001709
1710 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1711 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001712 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001713 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 jitter_buffer_->ReleaseFrame(frame_out);
1715
1716 seq_num_--;
1717 timestamp_ = 2000;
1718 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001719 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001720 packet_->markerBit = true;
1721 packet_->seqNum = seq_num_;
1722 packet_->timestamp = timestamp_;
1723
philipel9d3ab612015-12-21 04:12:39 -08001724 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725}
1726
philipel85130292016-07-06 16:10:31 +02001727TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001728 // ------- -------
1729 // | 2 | | 1 |
1730 // ------- -------
1731 // t = 3000 t = 0xffffff00
1732
1733 seq_num_ = 2;
1734 timestamp_ = 3000;
1735 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001736 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737 packet_->markerBit = true;
1738 packet_->seqNum = seq_num_;
1739 packet_->timestamp = timestamp_;
1740
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001741 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001742 EXPECT_EQ(kCompleteSession,
1743 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001744
1745 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1746 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1747
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001748 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749
1750 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1751
1752 jitter_buffer_->ReleaseFrame(frame_out);
1753
1754 seq_num_--;
1755 timestamp_ = 0xffffff00;
1756 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001757 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001758 packet_->markerBit = true;
1759 packet_->seqNum = seq_num_;
1760 packet_->timestamp = timestamp_;
1761
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001762 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001763 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001764}
1765
philipel85130292016-07-06 16:10:31 +02001766TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001767 // --------------- ---------------
1768 // | 1 | 2 | | 3 | 4 |
1769 // --------------- ---------------
1770 // t = 0xffffff00 t = 33*90
1771
1772 timestamp_ = 0xffffff00;
1773 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001774 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001775 packet_->markerBit = false;
1776 packet_->seqNum = seq_num_;
1777 packet_->timestamp = timestamp_;
1778
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001779 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001780 EXPECT_EQ(kIncomplete,
1781 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001782
1783 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001784 EXPECT_TRUE(frame_out == NULL);
1785
1786 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001787 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001788 packet_->markerBit = true;
1789 packet_->seqNum = seq_num_;
1790
philipel9d3ab612015-12-21 04:12:39 -08001791 EXPECT_EQ(kCompleteSession,
1792 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001793
1794 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001795 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796 jitter_buffer_->ReleaseFrame(frame_out);
1797
1798 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001799 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001800 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001801 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001802 packet_->markerBit = false;
1803 packet_->seqNum = seq_num_;
1804 packet_->timestamp = timestamp_;
1805
philipel9d3ab612015-12-21 04:12:39 -08001806 EXPECT_EQ(kIncomplete,
1807 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001808
1809 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001810 EXPECT_TRUE(frame_out == NULL);
1811
1812 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001813 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001814 packet_->markerBit = true;
1815 packet_->seqNum = seq_num_;
1816
philipel9d3ab612015-12-21 04:12:39 -08001817 EXPECT_EQ(kCompleteSession,
1818 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001819
1820 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001821 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001823 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001824}
1825
philipel85130292016-07-06 16:10:31 +02001826TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827 // ------- -------
1828 // | 1 | | 2 |
1829 // ------- -------
1830 // t = 0xffffff00 t = 2700
1831
1832 timestamp_ = 0xffffff00;
1833 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001834 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001835 packet_->markerBit = true;
1836 packet_->timestamp = timestamp_;
1837
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001838 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001840 EXPECT_EQ(kCompleteSession,
1841 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842
1843 // Insert next frame.
1844 seq_num_++;
1845 timestamp_ = 2700;
1846 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001847 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001848 packet_->markerBit = true;
1849 packet_->seqNum = seq_num_;
1850 packet_->timestamp = timestamp_;
1851
philipel9d3ab612015-12-21 04:12:39 -08001852 EXPECT_EQ(kCompleteSession,
1853 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001854
1855 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1856 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001857 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001858 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001859 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001860
1861 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1862 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001863 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001864 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001865 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001866}
1867
philipel85130292016-07-06 16:10:31 +02001868TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869 // ------- -------
1870 // | 2 | | 1 |
1871 // ------- -------
1872 // t = 2700 t = 0xffffff00
1873
1874 seq_num_ = 2;
1875 timestamp_ = 2700;
1876 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001877 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878 packet_->markerBit = true;
1879 packet_->seqNum = seq_num_;
1880 packet_->timestamp = timestamp_;
1881
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001882 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001883 EXPECT_EQ(kCompleteSession,
1884 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001885
1886 // Insert second frame
1887 seq_num_--;
1888 timestamp_ = 0xffffff00;
1889 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001890 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001891 packet_->markerBit = true;
1892 packet_->seqNum = seq_num_;
1893 packet_->timestamp = timestamp_;
1894
philipel9d3ab612015-12-21 04:12:39 -08001895 EXPECT_EQ(kCompleteSession,
1896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001897
1898 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1899 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001900 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001901 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001902 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001903
1904 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1905 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001906 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001907 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001908 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001909}
1910
philipel85130292016-07-06 16:10:31 +02001911TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912 int loop = 0;
1913 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001914 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915 // Insert kMaxPacketsInJitterBuffer into frame.
1916 do {
1917 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001918 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001919 packet_->markerBit = false;
1920 packet_->seqNum = seq_num_;
1921
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001922 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001923 EXPECT_EQ(kIncomplete,
1924 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001925 firstPacket = false;
1926 } else {
philipel9d3ab612015-12-21 04:12:39 -08001927 EXPECT_EQ(kIncomplete,
1928 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929 }
1930
1931 loop++;
1932 } while (loop < kMaxPacketsInSession);
1933
1934 // Max number of packets inserted.
1935 // Insert one more packet.
1936 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001937 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001938 packet_->markerBit = true;
1939 packet_->seqNum = seq_num_;
1940
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001942 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001943 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944}
1945
philipel85130292016-07-06 16:10:31 +02001946TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001947 // TEST fill JB with more than max number of frame (50 delta frames +
1948 // 51 key frames) with wrap in seq_num_
1949 //
1950 // --------------------------------------------------------------
1951 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1952 // --------------------------------------------------------------
1953 // |<-----------delta frames------------->|<------key frames----->|
1954
jbauchdb81ffd2015-11-23 03:59:02 -08001955 // Make sure the jitter doesn't request a keyframe after too much non-
1956 // decodable frames.
1957 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001958 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001959
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001960 int loop = 0;
1961 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001962 uint32_t first_key_frame_timestamp = 0;
1963 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001964 // Insert MAX_NUMBER_OF_FRAMES frames.
1965 do {
philipel9d3ab612015-12-21 04:12:39 -08001966 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001967 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001968 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001969 packet_->markerBit = true;
1970 packet_->seqNum = seq_num_;
1971 packet_->timestamp = timestamp_;
1972
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001973 if (loop == 50) {
1974 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001975 packet_->frameType = kVideoFrameKey;
1976 }
1977
1978 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001979 EXPECT_EQ(kCompleteSession,
1980 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001981
1982 loop++;
1983 } while (loop < kMaxNumberOfFrames);
1984
1985 // Max number of frames inserted.
1986
1987 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001988 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001989 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001990 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001991 packet_->markerBit = true;
1992 packet_->seqNum = seq_num_;
1993 packet_->timestamp = timestamp_;
1994
1995 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001996 EXPECT_EQ(kFlushIndicator,
1997 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001998
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001999 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2000 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002001 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002002 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002003 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002004}
2005
philipel85130292016-07-06 16:10:31 +02002006TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002007 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002008 seq_num_ = 3;
2009 // Insert one empty packet per frame, should never return the last timestamp
2010 // inserted. Only return empty frames in the presence of subsequent frames.
2011 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002012 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002013 for (int i = 0; i < maxSize + 10; i++) {
2014 timestamp_ += 33 * 90;
2015 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002016 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002017 packet_->markerBit = false;
2018 packet_->seqNum = seq_num_;
2019 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002020 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002021
philipel9d3ab612015-12-21 04:12:39 -08002022 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002023 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2024 // Timestamp should never be the last TS inserted.
2025 if (testFrame != NULL) {
2026 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002027 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002028 }
2029 }
2030}
2031
philipel85130292016-07-06 16:10:31 +02002032TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002033 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002034 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002035 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002036 timestamp_ += 33 * 90;
2037 int insertedLength = 0;
2038 packet_->seqNum = seq_num_;
2039 packet_->timestamp = timestamp_;
2040 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002041 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002042 packet_->completeNALU = kNaluStart;
2043 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002044 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002045
philipel9d3ab612015-12-21 04:12:39 -08002046 EXPECT_EQ(kDecodableSession,
2047 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002049 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002050 packet_->seqNum = seq_num_;
2051 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002052 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 packet_->completeNALU = kNaluIncomplete;
2054 packet_->markerBit = false;
2055
philipel9d3ab612015-12-21 04:12:39 -08002056 EXPECT_EQ(kDecodableSession,
2057 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002058
2059 seq_num_++;
2060 packet_->seqNum = seq_num_;
2061 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002062 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002063 packet_->completeNALU = kNaluEnd;
2064 packet_->markerBit = false;
2065
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
2069 seq_num_++;
2070 packet_->seqNum = seq_num_;
2071 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002072 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002073 EXPECT_EQ(kDecodableSession,
2074 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002075 // The JB will only output (incomplete) frames if a packet belonging to a
2076 // subsequent frame was already inserted. Insert one packet of a subsequent
2077 // frame. place high timestamp so the JB would always have a next frame
2078 // (otherwise, for every inserted frame we need to take care of the next
2079 // frame as well).
2080 packet_->seqNum = 1;
2081 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2082 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002083 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002084 packet_->completeNALU = kNaluStart;
2085 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002086
philipel9d3ab612015-12-21 04:12:39 -08002087 EXPECT_EQ(kDecodableSession,
2088 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002089
2090 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2091
2092 // We can decode everything from a NALU until a packet has been lost.
2093 // Thus we can decode the first packet of the first NALU and the second NALU
2094 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002095 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 jitter_buffer_->ReleaseFrame(frame_out);
2097
2098 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002099 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002100 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101 insertedLength = 0;
2102
2103 packet_->seqNum = seq_num_;
2104 packet_->timestamp = timestamp_;
2105 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002106 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002107 packet_->completeNALU = kNaluEnd;
2108 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002109 EXPECT_EQ(kDecodableSession,
2110 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2111 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002112 seq_num_--;
2113 packet_->seqNum = seq_num_;
2114 packet_->timestamp = timestamp_;
2115 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002116 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002117 packet_->completeNALU = kNaluStart;
2118 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002119
philipel9d3ab612015-12-21 04:12:39 -08002120 EXPECT_EQ(kDecodableSession,
2121 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002122 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2123
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002124 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002125 packet_->seqNum = seq_num_;
2126 packet_->timestamp = timestamp_;
2127 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002128 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002129 packet_->completeNALU = kNaluComplete;
2130 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002131 EXPECT_EQ(kDecodableSession,
2132 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002133 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002134 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002135 packet_->seqNum = seq_num_;
2136 packet_->timestamp = timestamp_;
2137 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002138 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002139 packet_->completeNALU = kNaluStart;
2140 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002141 EXPECT_EQ(kDecodableSession,
2142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002143 // This packet should be decoded since it's the beginning of a NAL.
2144 insertedLength += packet_->sizeBytes;
2145
2146 seq_num_ += 2;
2147 packet_->seqNum = seq_num_;
2148 packet_->timestamp = timestamp_;
2149 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002150 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002151 packet_->completeNALU = kNaluEnd;
2152 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002153 EXPECT_EQ(kDecodableSession,
2154 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155 // This packet should not be decoded because it is an incomplete NAL if it
2156 // is the last.
2157 frame_out = DecodeIncompleteFrame();
2158 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002159 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002160 jitter_buffer_->ReleaseFrame(frame_out);
2161
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002162 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002163 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002164 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002165 WebRtcRTPHeader rtpHeader;
2166 memset(&rtpHeader, 0, sizeof(rtpHeader));
Niels Möller520ca4e2018-06-04 11:14:38 +02002167 rtpHeader.type.Video.codec = kVideoCodecUnknown;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002168 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002169 emptypacket.seqNum = seq_num_;
2170 emptypacket.timestamp = timestamp_;
2171 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002172 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002173 emptypacket.completeNALU = kNaluComplete;
2174 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002175 EXPECT_EQ(kCompleteSession,
2176 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002177 // This packet should not be decoded because it is an incomplete NAL if it
2178 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002179
2180 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2181 // has arrived.
2182 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002183 EXPECT_TRUE(frame_out != NULL);
2184 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002185
2186 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002187 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002188 timestamp_ += 33 * 90;
2189
2190 packet_->seqNum = seq_num_;
2191 packet_->timestamp = timestamp_;
2192 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002193 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002194 packet_->completeNALU = kNaluComplete;
2195 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002196
philipel9d3ab612015-12-21 04:12:39 -08002197 EXPECT_EQ(kDecodableSession,
2198 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002199
agalusza@google.comd177c102013-08-08 01:12:33 +00002200 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002201 emptypacket.seqNum = seq_num_;
2202 emptypacket.timestamp = timestamp_;
2203 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002204 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002205 emptypacket.completeNALU = kNaluComplete;
2206 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002207 EXPECT_EQ(kCompleteSession,
2208 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002209
2210 frame_out = DecodeCompleteFrame();
2211 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002212 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002213 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002214}
2215
philipel85130292016-07-06 16:10:31 +02002216TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002217 // Test that a we cannot get incomplete frames from the JB if we haven't
2218 // received the marker bit, unless we have received a packet from a later
2219 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002220 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002221 // Start with a complete key frame - insert and decode.
2222 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002223 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002224 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002225 bool retransmitted = false;
2226
philipel9d3ab612015-12-21 04:12:39 -08002227 EXPECT_EQ(kCompleteSession,
2228 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002229 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2230 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002231 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002232
2233 packet_->seqNum += 2;
2234 packet_->timestamp += 33 * 90;
2235 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002236 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002237 packet_->markerBit = false;
2238
philipel9d3ab612015-12-21 04:12:39 -08002239 EXPECT_EQ(kDecodableSession,
2240 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002241
2242 frame_out = DecodeIncompleteFrame();
2243 EXPECT_TRUE(frame_out == NULL);
2244
2245 packet_->seqNum += 2;
2246 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002247 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002248
philipel9d3ab612015-12-21 04:12:39 -08002249 EXPECT_EQ(kDecodableSession,
2250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002251
2252 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002253 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002254 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002255}
2256
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002257TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002258 // Make sure the jitter doesn't request a keyframe after too much non-
2259 // decodable frames.
2260 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002261 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002262 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002263 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002264 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002265 DropFrame(1);
2266 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002267 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002268 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002269 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002270 // This frame will make the jitter buffer recycle frames until a key frame.
2271 // Since none is found it will have to wait until the next key frame before
2272 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002273 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002274 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002275}
2276
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002277TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002278 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002279 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002280 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002281 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002282 // Insert empty packet.
2283 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002284 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002285 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002286 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002287 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002288 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002289 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002290 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002291 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002292 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002293 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002294 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002295}
2296
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002297TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002298 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2299 EXPECT_EQ(0, frame_stats.delta_frames);
2300 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002301
2302 uint32_t framerate = 0;
2303 uint32_t bitrate = 0;
2304 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2305 EXPECT_EQ(0u, framerate);
2306 EXPECT_EQ(0u, bitrate);
2307
2308 // Insert a couple of key and delta frames.
2309 InsertFrame(kVideoFrameKey);
2310 InsertFrame(kVideoFrameDelta);
2311 InsertFrame(kVideoFrameDelta);
2312 InsertFrame(kVideoFrameKey);
2313 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002314 // Decode some of them to make sure the statistics doesn't depend on frames
2315 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002316 EXPECT_TRUE(DecodeCompleteFrame());
2317 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002318 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002319 EXPECT_EQ(3, frame_stats.delta_frames);
2320 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002321
2322 // Insert 20 more frames to get estimates of bitrate and framerate over
2323 // 1 second.
2324 for (int i = 0; i < 20; ++i) {
2325 InsertFrame(kVideoFrameDelta);
2326 }
2327 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2328 // TODO(holmer): The current implementation returns the average of the last
2329 // two framerate calculations, which is why it takes two calls to reach the
2330 // actual framerate. This should be fixed.
2331 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2332 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2333 // Insert 25 more frames to get estimates of bitrate and framerate over
2334 // 2 seconds.
2335 for (int i = 0; i < 25; ++i) {
2336 InsertFrame(kVideoFrameDelta);
2337 }
2338 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2339 EXPECT_EQ(kDefaultFrameRate, framerate);
2340 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2341}
2342
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002343TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2344 // Insert delta frames.
2345 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2346 // Can't decode without a key frame.
2347 EXPECT_FALSE(DecodeCompleteFrame());
2348 InsertFrame(kVideoFrameKey);
2349 // Skip to the next key frame.
2350 EXPECT_TRUE(DecodeCompleteFrame());
2351}
2352
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002353TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2354 InsertFrame(kVideoFrameKey);
2355 EXPECT_TRUE(DecodeCompleteFrame());
2356 const int kNumDeltaFrames = 5;
2357 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2358 InsertFrame(kVideoFrameKey);
2359 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2360 EXPECT_TRUE(DecodeCompleteFrame());
2361 }
2362}
2363
2364TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2365 InsertFrame(kVideoFrameKey);
2366 EXPECT_TRUE(DecodeCompleteFrame());
2367 const int kNumDeltaFrames = 5;
2368 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2369 InsertFrame(kVideoFrameKey);
2370 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2371 InsertFrame(kVideoFrameKey);
2372 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2373 EXPECT_TRUE(DecodeCompleteFrame());
2374 }
2375}
2376
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002377TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2378 InsertFrame(kVideoFrameKey);
2379 EXPECT_TRUE(DecodeCompleteFrame());
2380 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2381 clock_->TimeInMilliseconds());
2382 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2383 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2384 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002385 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002386 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2387 EXPECT_FALSE(DecodeCompleteFrame());
2388 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2389 EXPECT_TRUE(DecodeCompleteFrame());
2390 EXPECT_TRUE(DecodeCompleteFrame());
2391}
2392
philipel85130292016-07-06 16:10:31 +02002393TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002394 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002395 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002396 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002397 InsertFrame(kVideoFrameKey);
2398 EXPECT_TRUE(DecodeCompleteFrame());
2399}
2400
philipel85130292016-07-06 16:10:31 +02002401TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002402 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002403 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002404 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002405
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002406 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2407 // old packet.
2408 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002409 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002410 EXPECT_EQ(kFlushIndicator,
2411 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002412 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002413
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002414 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002415 std::vector<uint16_t> nack_list =
2416 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002417 // No key frame will be requested since the jitter buffer is empty.
2418 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002419 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002420
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002421 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002422 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002423 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002424 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002425
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002426 // The next complete continuous frame isn't a key frame, but we're waiting
2427 // for one.
2428 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002429 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002430 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002431 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002432}
2433
philipel85130292016-07-06 16:10:31 +02002434TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002435 // Insert a key frame and decode it.
2436 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2437 EXPECT_TRUE(DecodeCompleteFrame());
2438
2439 // Insert a frame which should trigger a recycle until the next key frame.
2440 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2441
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002442 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002443 std::vector<uint16_t> nack_list =
2444 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002445 // Verify that the jitter buffer does not request a key frame.
2446 EXPECT_FALSE(request_key_frame);
2447 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002448 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002449 // Verify that we can decode the next frame.
2450 EXPECT_TRUE(DecodeCompleteFrame());
2451}
2452
philipel85130292016-07-06 16:10:31 +02002453TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002454 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002455 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002456 EXPECT_TRUE(DecodeCompleteFrame());
2457
2458 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002459 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002460 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002461 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002462 EXPECT_FALSE(DecodeCompleteFrame());
2463
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002464 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002465 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002466 // The jitter buffer is empty, so we won't request key frames until we get a
2467 // packet.
2468 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002469
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002470 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002471 // Now we have a packet in the jitter buffer, a key frame will be requested
2472 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002473 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002474 // The jitter buffer is empty, so we won't request key frames until we get a
2475 // packet.
2476 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002477 // The next complete continuous frame isn't a key frame, but we're waiting
2478 // for one.
2479 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002480 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002481 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002482 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002483 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002484}
2485
philipel85130292016-07-06 16:10:31 +02002486TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002487 DropFrame(10);
2488 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002489 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002490 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002491 std::vector<uint16_t> nack_list =
2492 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002493 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002494 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002495 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002496}
2497
philipel85130292016-07-06 16:10:31 +02002498TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002499 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002500 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002501 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002502 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002503 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002504 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002505 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002506 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002507 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002508 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002509}
2510
philipel85130292016-07-06 16:10:31 +02002511TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002512 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002513 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2514 clock_->TimeInMilliseconds());
2515 VCMPacket packet;
2516 stream_generator_->PopPacket(&packet, 0);
2517 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002518 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002519 EXPECT_FALSE(retransmitted);
2520 // Drop second packet.
2521 stream_generator_->PopPacket(&packet, 1);
2522 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2523 EXPECT_FALSE(retransmitted);
2524 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002525 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002526 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002527 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002528 EXPECT_EQ(1u, nack_list.size());
2529 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002530 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002531 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002532 EXPECT_EQ(kCompleteSession,
2533 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002534 EXPECT_TRUE(retransmitted);
2535 EXPECT_TRUE(DecodeCompleteFrame());
2536}
2537
philipel85130292016-07-06 16:10:31 +02002538TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002539 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002540 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002541 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002542 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002543 // Drop second packet.
2544 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2545 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002546 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002547 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002548 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002549 ASSERT_EQ(1u, nack_list.size());
2550 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002551 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002552 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002553 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002554}
2555
philipel85130292016-07-06 16:10:31 +02002556TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002557 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002558 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002559 // First frame is delta.
2560 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2561 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002562 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002563 // Drop second packet in frame.
2564 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2565 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2566 // Second frame is key.
2567 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2568 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002569 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002570 // Drop second packet in frame.
2571 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2572 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002573 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002574 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002575 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002576 ASSERT_EQ(1u, nack_list.size());
2577 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002578 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002579 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002580}
2581
philipel85130292016-07-06 16:10:31 +02002582TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002583 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002584 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002585
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002586 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002587 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002588
2589 // ----------------------------------------------------------------
2590 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2591 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002592 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002593 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002594 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002595 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002596 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002597 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002598 while (stream_generator_->PacketsRemaining() > 1) {
2599 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002600 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002601 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002602 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002603 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002604 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002605 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002606 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002607 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002608 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002609 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002610
2611 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002612 std::vector<uint16_t> nack_list =
2613 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002614 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002615 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002616 for (size_t i = 0; i < nack_list.size(); ++i)
2617 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002618}
2619
philipel85130292016-07-06 16:10:31 +02002620TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002621 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002622 // ------- ------------------------------------------------------------
2623 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2624 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002625 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002626 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002627 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002628 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002629 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002630 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002631 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002632 while (stream_generator_->PacketsRemaining() > 1) {
2633 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002634 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002635 EXPECT_FALSE(request_key_frame);
2636 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002637 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002638 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002639 }
2640 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002641 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002642 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002643 EXPECT_FALSE(DecodeCompleteFrame());
2644 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002645 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002646 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002647 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002648 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002649 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2650 for (size_t i = 0; i < nack_list.size(); ++i)
2651 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002652}
2653
philipel85130292016-07-06 16:10:31 +02002654TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002655 bool request_key_frame = false;
2656 // -----------------------------------
2657 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2658 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002659 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002660 InsertFrame(kVideoFrameKey);
2661 EXPECT_FALSE(request_key_frame);
2662 EXPECT_TRUE(DecodeCompleteFrame());
2663 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2664 clock_->TimeInMilliseconds());
2665 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2666 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002667 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002668 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002669 EXPECT_FALSE(request_key_frame);
2670 } else {
2671 stream_generator_->NextPacket(NULL); // Drop packet
2672 }
2673 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2674 clock_->TimeInMilliseconds());
2675 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2676 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002677 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002678 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002679 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002680 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002681 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002682 ASSERT_EQ(1u, nack_list.size());
2683 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002684}
2685
philipel85130292016-07-06 16:10:31 +02002686TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002687 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002688 InsertFrame(kVideoFrameKey);
2689 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002690 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002691 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2692 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002693
2694 // Far-into-the-future video frame, could be caused by resetting the encoder
2695 // or otherwise restarting. This should not fail when error when the packet is
2696 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002697 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002698 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2699 InsertFrame(kVideoFrameKey);
2700 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002701 nack_list = jitter_buffer_->GetNackList(&extended);
2702 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002703
2704 // Stream should be decodable from this point.
2705 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2706 InsertFrame(kVideoFrameDelta);
2707 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002708 nack_list = jitter_buffer_->GetNackList(&extended);
2709 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002710}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002711} // namespace webrtc