blob: 06faf2107bf6c93bf74b57fc6b08149216ca8f0a [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;
isheriff6b4b5f32016-06-08 00:24:21 -070052 packet_.video_header.codec = kRtpVideoVp9;
53 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(),
philipel83f831a2016-03-12 03:30:23 -0800217 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
218 this,
219 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000220 jitter_buffer_->Start();
221 seq_num_ = 1234;
222 timestamp_ = 0;
223 size_ = 1400;
224 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
225 data_[0] = 0;
226 data_[1] = 0;
227 data_[2] = 0x80;
228 int count = 3;
229 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
230 data_[i] = count;
231 count++;
232 if (count == 10) {
233 data_[i + 1] = 0;
234 data_[i + 2] = 0;
235 data_[i + 3] = 0x80;
236 count = 3;
237 i += 3;
238 }
239 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200240 WebRtcRTPHeader rtpHeader;
241 memset(&rtpHeader, 0, sizeof(rtpHeader));
242 rtpHeader.header.sequenceNumber = seq_num_;
243 rtpHeader.header.timestamp = timestamp_;
244 rtpHeader.header.markerBit = true;
245 rtpHeader.frameType = kVideoFrameDelta;
246 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(),
philipel83f831a2016-03-12 03:30:23 -0800335 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
336 this, 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;
803 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700804 EXPECT_EQ(kOldPacket,
805 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
806 empty_packet.seqNum += 1;
807 EXPECT_EQ(kOldPacket,
808 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
809
810 // But now Frame C should be ready!
811 frame_out = DecodeCompleteFrame();
812 EXPECT_TRUE(frame_out != NULL);
813 jitter_buffer_->ReleaseFrame(frame_out);
814}
815
philipel85130292016-07-06 16:10:31 +0200816TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000817 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800818 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000819 packet_->markerBit = false;
820 packet_->seqNum = seq_num_;
821 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000822 EXPECT_EQ(0, jitter_buffer_->num_packets());
823 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000824
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000825 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800826 EXPECT_EQ(kIncomplete,
827 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000828
829 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
830
831 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000832 EXPECT_EQ(1, jitter_buffer_->num_packets());
833 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000834
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000835 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800836 EXPECT_EQ(kDuplicatePacket,
837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000838 EXPECT_EQ(2, jitter_buffer_->num_packets());
839 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000840
841 seq_num_++;
842 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000843 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800844 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000845
philipel9d3ab612015-12-21 04:12:39 -0800846 EXPECT_EQ(kCompleteSession,
847 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000848
849 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000850 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000851 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000852
853 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000854 EXPECT_EQ(3, jitter_buffer_->num_packets());
855 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000856 jitter_buffer_->ReleaseFrame(frame_out);
857}
858
philipel85130292016-07-06 16:10:31 +0200859TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000860 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800861 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000862 packet_->markerBit = true;
863 packet_->seqNum = seq_num_;
864 packet_->timestamp = timestamp_;
865 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
866 EXPECT_EQ(0, jitter_buffer_->num_packets());
867 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
868
869 bool retransmitted = false;
870 // Insert first complete frame.
871 EXPECT_EQ(kCompleteSession,
872 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
873
874 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
875 ASSERT_TRUE(frame_out != NULL);
876 CheckOutFrame(frame_out, size_, false);
877 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
878 jitter_buffer_->ReleaseFrame(frame_out);
879
880 // Insert 3 delta frames.
881 for (uint16_t i = 1; i <= 3; ++i) {
882 packet_->seqNum = seq_num_ + i;
883 packet_->timestamp = timestamp_ + (i * 33) * 90;
884 packet_->frameType = kVideoFrameDelta;
885 EXPECT_EQ(kCompleteSession,
886 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
887 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
888 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
889 }
890
891 // Retransmit second delta frame.
892 packet_->seqNum = seq_num_ + 2;
893 packet_->timestamp = timestamp_ + 66 * 90;
894
895 EXPECT_EQ(kDuplicatePacket,
896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
897
898 EXPECT_EQ(5, jitter_buffer_->num_packets());
899 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
900
901 // Should be able to decode 3 delta frames, key frame already decoded.
902 for (size_t i = 0; i < 3; ++i) {
903 frame_out = DecodeCompleteFrame();
904 ASSERT_TRUE(frame_out != NULL);
905 CheckOutFrame(frame_out, size_, false);
906 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
907 jitter_buffer_->ReleaseFrame(frame_out);
908 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000909}
910
philipel85130292016-07-06 16:10:31 +0200911TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700912 // Verify that JB skips forward to next base layer frame.
913 // -------------------------------------------------
914 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
915 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
916 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
917 // | ss | x | x | x | |
918 // -------------------------------------------------
919 // |<----------tl0idx:200--------->|<---tl0idx:201---
920
921 bool re = false;
922 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700923 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800924 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700925 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700926 packet_->video_header.codecHeader.VP9.flexible_mode = false;
927 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
928 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
929 packet_->video_header.codecHeader.VP9.end_of_frame = true;
930 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700931
932 packet_->seqNum = 65485;
933 packet_->timestamp = 1000;
934 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700935 packet_->video_header.codecHeader.VP9.picture_id = 5;
936 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
937 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
938 packet_->video_header.codecHeader.VP9.ss_data_available = true;
939 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700940 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
941 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
942
943 // Insert next temporal layer 0.
944 packet_->seqNum = 65489;
945 packet_->timestamp = 13000;
946 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700947 packet_->video_header.codecHeader.VP9.picture_id = 9;
948 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
949 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
950 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700951 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
952
953 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
954 EXPECT_EQ(1000U, frame_out->TimeStamp());
955 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
956 jitter_buffer_->ReleaseFrame(frame_out);
957
958 frame_out = DecodeCompleteFrame();
959 EXPECT_EQ(13000U, frame_out->TimeStamp());
960 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
961 jitter_buffer_->ReleaseFrame(frame_out);
962}
963
philipel85130292016-07-06 16:10:31 +0200964TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700965 // Verify that frames are updated with SS data when SS packet is reordered.
966 // --------------------------------
967 // | 65486 | 65487 | 65485 |...
968 // | pid:6 | pid:7 | pid:5 |...
969 // | tid:2 | tid:1 | tid:0 |...
970 // | | | ss |
971 // --------------------------------
972 // |<--------tl0idx:200--------->|
973
974 bool re = false;
975 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700976 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800977 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700978 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700979 packet_->video_header.codecHeader.VP9.flexible_mode = false;
980 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
981 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
982 packet_->video_header.codecHeader.VP9.end_of_frame = true;
983 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700984
985 packet_->seqNum = 65486;
986 packet_->timestamp = 6000;
987 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700988 packet_->video_header.codecHeader.VP9.picture_id = 6;
989 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
990 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700991 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
992
993 packet_->seqNum = 65487;
994 packet_->timestamp = 9000;
995 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700996 packet_->video_header.codecHeader.VP9.picture_id = 7;
997 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
998 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700999 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1000
1001 // Insert first frame with SS data.
1002 packet_->seqNum = 65485;
1003 packet_->timestamp = 3000;
1004 packet_->frameType = kVideoFrameKey;
1005 packet_->width = 352;
1006 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001007 packet_->video_header.codecHeader.VP9.picture_id = 5;
1008 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1009 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1010 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1011 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001012 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1013 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1014
1015 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1016 EXPECT_EQ(3000U, frame_out->TimeStamp());
1017 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1018 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1019 EXPECT_FALSE(
1020 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1021 jitter_buffer_->ReleaseFrame(frame_out);
1022
1023 frame_out = DecodeCompleteFrame();
1024 EXPECT_EQ(6000U, frame_out->TimeStamp());
1025 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1026 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1027 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1028 jitter_buffer_->ReleaseFrame(frame_out);
1029
1030 frame_out = DecodeCompleteFrame();
1031 EXPECT_EQ(9000U, frame_out->TimeStamp());
1032 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1033 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1034 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1035 jitter_buffer_->ReleaseFrame(frame_out);
1036}
1037
philipel85130292016-07-06 16:10:31 +02001038TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001039 // Verify that frames are updated with SS data when SS packet is reordered.
1040 // -----------------------------------------
1041 // | 65486 | 65487 | 65485 | 65484 |...
1042 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1043 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1044 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1045 // | t:6000 | t:6000 | t:3000 | t:3000 |
1046 // | | | | ss |
1047 // -----------------------------------------
1048 // |<-----------tl0idx:200------------>|
1049
1050 bool re = false;
1051 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001052 packet_->video_header.codec = kRtpVideoVp9;
1053 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1054 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1055 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1056 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001057
johan0d1b2b62017-01-10 04:21:35 -08001058 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001059 packet_->markerBit = false;
1060 packet_->seqNum = 65486;
1061 packet_->timestamp = 6000;
1062 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001063 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1064 packet_->video_header.codecHeader.VP9.picture_id = 6;
1065 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1066 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001067 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1068
johan0d1b2b62017-01-10 04:21:35 -08001069 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001070 packet_->markerBit = true;
1071 packet_->seqNum = 65487;
1072 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001073 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1074 packet_->video_header.codecHeader.VP9.picture_id = 6;
1075 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1076 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001077 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1078
johan0d1b2b62017-01-10 04:21:35 -08001079 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001080 packet_->markerBit = true;
1081 packet_->seqNum = 65485;
1082 packet_->timestamp = 3000;
1083 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001084 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1085 packet_->video_header.codecHeader.VP9.picture_id = 5;
1086 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1087 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001088 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1089
1090 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001091 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001092 packet_->markerBit = false;
1093 packet_->seqNum = 65484;
1094 packet_->frameType = kVideoFrameKey;
1095 packet_->width = 352;
1096 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001097 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1098 packet_->video_header.codecHeader.VP9.picture_id = 5;
1099 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1100 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1101 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1102 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001103 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1104 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1105
1106 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1107 EXPECT_EQ(3000U, frame_out->TimeStamp());
1108 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1109 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1110 EXPECT_FALSE(
1111 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1112 jitter_buffer_->ReleaseFrame(frame_out);
1113
1114 frame_out = DecodeCompleteFrame();
1115 EXPECT_EQ(6000U, frame_out->TimeStamp());
1116 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1117 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1118 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1119 jitter_buffer_->ReleaseFrame(frame_out);
1120}
1121
philipel85130292016-07-06 16:10:31 +02001122TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001123 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001124 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001125 packet_->markerBit = false;
1126 packet_->seqNum = seq_num_;
1127 packet_->timestamp = timestamp_;
1128 packet_->insertStartCode = true;
1129
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001130 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001131 EXPECT_EQ(kIncomplete,
1132 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001133
1134 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1135
1136 // Frame should not be complete.
1137 EXPECT_TRUE(frame_out == NULL);
1138
1139 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001140 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001141 packet_->markerBit = true;
1142 packet_->seqNum = seq_num_;
1143
philipel9d3ab612015-12-21 04:12:39 -08001144 EXPECT_EQ(kCompleteSession,
1145 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001146
1147 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001148 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001149 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001150 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001151}
1152
stefana669a3a2016-10-06 05:04:52 -07001153TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1154 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1155
1156 packet_->timestamp = timestamp_;
1157 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001158 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001159 packet_->markerBit = true;
1160 packet_->codec = kVideoCodecH264;
1161 packet_->video_header.codec = kRtpVideoH264;
1162 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1163 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1164 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1165 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1166 packet_->video_header.codecHeader.H264.nalus_length = 1;
1167 bool retransmitted = false;
1168 EXPECT_EQ(kCompleteSession,
1169 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1170 // Not decodable since sps and pps are missing.
1171 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1172
1173 timestamp_ += 3000;
1174 packet_->timestamp = timestamp_;
1175 ++seq_num_;
1176 packet_->seqNum = seq_num_;
1177 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001178 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001179 packet_->markerBit = false;
1180 packet_->codec = kVideoCodecH264;
1181 packet_->video_header.codec = kRtpVideoH264;
1182 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
1183 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
1184 packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
1185 packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
1186 packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
1187 packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
1188 packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
1189 packet_->video_header.codecHeader.H264.nalus_length = 2;
1190 // Not complete since the marker bit hasn't been received.
1191 EXPECT_EQ(kIncomplete,
1192 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1193
1194 ++seq_num_;
1195 packet_->seqNum = seq_num_;
1196 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001197 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001198 packet_->markerBit = true;
1199 packet_->codec = kVideoCodecH264;
1200 packet_->video_header.codec = kRtpVideoH264;
1201 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1202 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1203 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1204 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1205 packet_->video_header.codecHeader.H264.nalus_length = 1;
1206 // Complete and decodable since the pps and sps are received in the first
1207 // packet of this frame.
1208 EXPECT_EQ(kCompleteSession,
1209 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1210 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1211 ASSERT_NE(nullptr, frame_out);
1212 jitter_buffer_->ReleaseFrame(frame_out);
1213
1214 timestamp_ += 3000;
1215 packet_->timestamp = timestamp_;
1216 ++seq_num_;
1217 packet_->seqNum = seq_num_;
1218 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001219 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001220 packet_->markerBit = true;
1221 packet_->codec = kVideoCodecH264;
1222 packet_->video_header.codec = kRtpVideoH264;
1223 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
1224 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
1225 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1226 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1227 packet_->video_header.codecHeader.H264.nalus_length = 1;
1228 // Complete and decodable since sps, pps and key frame has been received.
1229 EXPECT_EQ(kCompleteSession,
1230 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1231 frame_out = DecodeCompleteFrame();
1232 ASSERT_NE(nullptr, frame_out);
1233 jitter_buffer_->ReleaseFrame(frame_out);
1234}
1235
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001236// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001237TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001238 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001239 // Always start with a key frame. Use 10 packets to test Decodable State
1240 // boundaries.
1241 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001242 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001243 packet_->markerBit = false;
1244 packet_->seqNum = seq_num_;
1245 packet_->timestamp = timestamp_;
1246
1247 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001248 EXPECT_EQ(kIncomplete,
1249 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001250 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001251 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001252 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1253
johan0d1b2b62017-01-10 04:21:35 -08001254 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001255 for (int i = 1; i < 9; ++i) {
1256 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001257 EXPECT_EQ(kIncomplete,
1258 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001259 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001260 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1261 }
1262
1263 // last packet
1264 packet_->markerBit = true;
1265 packet_->seqNum++;
1266
philipel9d3ab612015-12-21 04:12:39 -08001267 EXPECT_EQ(kCompleteSession,
1268 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001269 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1270 CheckOutFrame(frame_out, 10 * size_, false);
1271 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001272 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001273
1274 // An incomplete frame can only be decoded once a subsequent frame has begun
1275 // to arrive. Insert packet in distant frame for this purpose.
1276 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001277 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001278 packet_->markerBit = false;
1279 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001280 packet_->timestamp += 33 * 90 * 8;
1281
philipel9d3ab612015-12-21 04:12:39 -08001282 EXPECT_EQ(kDecodableSession,
1283 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001284 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001285 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1286
1287 // Insert second frame
1288 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001289 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001290
philipel9d3ab612015-12-21 04:12:39 -08001291 EXPECT_EQ(kDecodableSession,
1292 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001293 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001294 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1295
johan0d1b2b62017-01-10 04:21:35 -08001296 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001297 for (int i = 1; i < 8; ++i) {
1298 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001299 EXPECT_EQ(kDecodableSession,
1300 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001301 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001302 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1303 }
1304
1305 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001306 EXPECT_EQ(kDecodableSession,
1307 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001308 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001309 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1310
1311 frame_out = DecodeIncompleteFrame();
1312 ASSERT_FALSE(NULL == frame_out);
1313 CheckOutFrame(frame_out, 9 * size_, false);
1314 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001315 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001316
1317 packet_->markerBit = true;
1318 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001319 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001320}
1321
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001322// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001323TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001324 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1325 // Always start with a key frame.
1326 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001327 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001328 packet_->markerBit = true;
1329 packet_->seqNum = seq_num_;
1330 packet_->timestamp = timestamp_;
1331
1332 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001333 EXPECT_EQ(kCompleteSession,
1334 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001335 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1336 CheckOutFrame(frame_out, size_, false);
1337 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001338 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001339
1340 // An incomplete frame can only be decoded once a subsequent frame has begun
1341 // to arrive. Insert packet in distant frame for this purpose.
1342 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001343 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001344 packet_->markerBit = false;
1345 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001346 packet_->timestamp += 33 * 90 * 8;
1347 EXPECT_EQ(kIncomplete,
1348 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001349 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001350 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001351 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1352
1353 // Insert second frame - an incomplete key frame.
1354 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001355 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001356 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001357 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001358
philipel9d3ab612015-12-21 04:12:39 -08001359 EXPECT_EQ(kIncomplete,
1360 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001361 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001362 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1363
1364 // Insert a few more packets. Make sure we're waiting for the key frame to be
1365 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001366 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001367 for (int i = 1; i < 5; ++i) {
1368 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001369 EXPECT_EQ(kIncomplete,
1370 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001371 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001372 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1373 }
1374
1375 // Complete key frame.
1376 packet_->markerBit = true;
1377 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001378 EXPECT_EQ(kCompleteSession,
1379 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001380 frame_out = DecodeCompleteFrame();
1381 CheckOutFrame(frame_out, 6 * size_, false);
1382 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001383 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001384}
1385
1386// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001387TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001388 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1389 // Always start with a key frame.
1390 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001391 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001392 packet_->markerBit = true;
1393 packet_->seqNum = seq_num_;
1394 packet_->timestamp = timestamp_;
1395
1396 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001397 EXPECT_EQ(kCompleteSession,
1398 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001399 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1400 CheckOutFrame(frame_out, size_, false);
1401 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001402 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001403
1404 // An incomplete frame can only be decoded once a subsequent frame has begun
1405 // to arrive. Insert packet in distant frame for this purpose.
1406 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001407 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001408 packet_->markerBit = false;
1409 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001410 packet_->timestamp += 33 * 90 * 8;
1411 EXPECT_EQ(kIncomplete,
1412 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001413 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001414 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001415 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1416
1417 // Insert second frame with the first packet missing. Make sure we're waiting
1418 // for the key frame to be complete.
1419 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001420 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001421
philipel9d3ab612015-12-21 04:12:39 -08001422 EXPECT_EQ(kIncomplete,
1423 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001424 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001425 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1426
1427 for (int i = 0; i < 5; ++i) {
1428 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001429 EXPECT_EQ(kIncomplete,
1430 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001431 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001432 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1433 }
1434
1435 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001436 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001437 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001438 EXPECT_EQ(kDecodableSession,
1439 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001440 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001441 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1442
1443 frame_out = DecodeIncompleteFrame();
1444 CheckOutFrame(frame_out, 7 * size_, false);
1445 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001446 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001447}
1448
philipel85130292016-07-06 16:10:31 +02001449TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001450 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001451 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001452 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001453 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001454 packet_->markerBit = true;
1455 packet_->seqNum = seq_num_;
1456 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001457 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001458 EXPECT_EQ(kCompleteSession,
1459 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001460 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001461 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1462 EXPECT_NE(frame, nullptr);
1463 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1464 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001465 EXPECT_TRUE(frame != NULL);
1466 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001467
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001468 // Drop a complete frame.
1469 timestamp_ += 2 * 33 * 90;
1470 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001471 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001472 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001473 packet_->markerBit = false;
1474 packet_->seqNum = seq_num_;
1475 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001476 EXPECT_EQ(kDecodableSession,
1477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001478 // Insert a packet (so the previous one will be released).
1479 timestamp_ += 33 * 90;
1480 seq_num_ += 2;
1481 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001482 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001483 packet_->markerBit = false;
1484 packet_->seqNum = seq_num_;
1485 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001486 EXPECT_EQ(kDecodableSession,
1487 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001488 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001489 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1490 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001491}
1492
philipel85130292016-07-06 16:10:31 +02001493TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001494 // Verify missing packets statistics and not decodable packets statistics.
1495 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1496 // The last packet is an empty (non-media) packet.
1497
1498 // Select a start seqNum which triggers a difficult wrap situation
1499 // The JB will only output (incomplete)frames if the next one has started
1500 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001501 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001502 seq_num_ = 0xffff - 4;
1503 seq_num_++;
1504 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001505 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001506 packet_->markerBit = false;
1507 packet_->seqNum = seq_num_;
1508 packet_->timestamp = timestamp_;
1509 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001510
1511 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001512 EXPECT_EQ(kDecodableSession,
1513 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001514 for (int i = 0; i < 11; ++i) {
1515 webrtc::FrameType frametype = kVideoFrameDelta;
1516 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001517 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001518 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001519 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001520 packet_->markerBit = false;
1521 packet_->seqNum = seq_num_;
1522 packet_->timestamp = timestamp_;
1523 packet_->completeNALU = kNaluStart;
1524
philipel9d3ab612015-12-21 04:12:39 -08001525 EXPECT_EQ(kDecodableSession,
1526 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001527
1528 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1529
1530 // Should not be complete.
1531 EXPECT_TRUE(frame_out == NULL);
1532
1533 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001534 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001535 packet_->markerBit = true;
1536 packet_->seqNum = seq_num_;
1537 packet_->completeNALU = kNaluEnd;
1538
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001539 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1540 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001541
1542 // Insert an empty (non-media) packet.
1543 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001544 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001545 packet_->markerBit = false;
1546 packet_->seqNum = seq_num_;
1547 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001548 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001549
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001550 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001551 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001552 frame_out = DecodeIncompleteFrame();
1553
1554 // One of the packets has been discarded by the jitter buffer.
1555 // Last frame can't be extracted yet.
1556 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001557 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001558
1559 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001560 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561 } else {
philipel9d3ab612015-12-21 04:12:39 -08001562 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001563 }
1564 EXPECT_FALSE(frame_out->Complete());
1565 EXPECT_FALSE(frame_out->MissingFrame());
1566 }
1567
1568 jitter_buffer_->ReleaseFrame(frame_out);
1569 }
1570
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571 // Insert 3 old packets and verify that we have 3 discarded packets
1572 // Match value to actual latest timestamp decoded.
1573 timestamp_ -= 33 * 90;
1574 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001575
philipel9d3ab612015-12-21 04:12:39 -08001576 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001577
1578 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001579
philipel9d3ab612015-12-21 04:12:39 -08001580 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581
1582 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001583
philipel9d3ab612015-12-21 04:12:39 -08001584 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001585
1586 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1587
1588 jitter_buffer_->Flush();
1589
1590 // This statistic shouldn't be reset by a flush.
1591 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1592}
1593
philipel85130292016-07-06 16:10:31 +02001594TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001595 seq_num_ = 0xfff0;
1596 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001597 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001598 packet_->markerBit = false;
1599 packet_->seqNum = seq_num_;
1600 packet_->timestamp = timestamp_;
1601
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001602 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001603 EXPECT_EQ(kIncomplete,
1604 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001605
1606 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1607
1608 EXPECT_TRUE(frame_out == NULL);
1609
1610 int loop = 0;
1611 do {
1612 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001613 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001614 packet_->markerBit = false;
1615 packet_->seqNum = seq_num_;
1616
philipel9d3ab612015-12-21 04:12:39 -08001617 EXPECT_EQ(kIncomplete,
1618 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001619
1620 frame_out = DecodeCompleteFrame();
1621
1622 EXPECT_TRUE(frame_out == NULL);
1623
1624 loop++;
1625 } while (loop < 98);
1626
1627 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001628 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001629 packet_->markerBit = true;
1630 packet_->seqNum = seq_num_;
1631
philipel9d3ab612015-12-21 04:12:39 -08001632 EXPECT_EQ(kCompleteSession,
1633 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001634
1635 frame_out = DecodeCompleteFrame();
1636
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001637 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001638
1639 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001640 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001641}
1642
philipel85130292016-07-06 16:10:31 +02001643TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001644 // Insert "first" packet last seqnum.
1645 seq_num_ = 10;
1646 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001647 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001648 packet_->markerBit = true;
1649 packet_->seqNum = seq_num_;
1650
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001651 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001652 EXPECT_EQ(kIncomplete,
1653 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1655
1656 // Should not be complete.
1657 EXPECT_TRUE(frame_out == NULL);
1658
1659 // Insert 98 frames.
1660 int loop = 0;
1661 do {
1662 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001663 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001664 packet_->markerBit = false;
1665 packet_->seqNum = seq_num_;
1666
philipel9d3ab612015-12-21 04:12:39 -08001667 EXPECT_EQ(kIncomplete,
1668 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001669
1670 frame_out = DecodeCompleteFrame();
1671
1672 EXPECT_TRUE(frame_out == NULL);
1673
1674 loop++;
1675 } while (loop < 98);
1676
1677 // Insert last packet.
1678 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001679 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001680 packet_->markerBit = false;
1681 packet_->seqNum = seq_num_;
1682
philipel9d3ab612015-12-21 04:12:39 -08001683 EXPECT_EQ(kCompleteSession,
1684 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001685
1686 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001687 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001688 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001689 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690}
1691
philipel85130292016-07-06 16:10:31 +02001692TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 // ------- -------
1694 // | 2 | | 1 |
1695 // ------- -------
1696 // t = 3000 t = 2000
1697 seq_num_ = 2;
1698 timestamp_ = 3000;
1699 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001700 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001701 packet_->markerBit = true;
1702 packet_->timestamp = timestamp_;
1703 packet_->seqNum = seq_num_;
1704
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001705 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001706 EXPECT_EQ(kCompleteSession,
1707 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001708
1709 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1710 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001711 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001712 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001713 jitter_buffer_->ReleaseFrame(frame_out);
1714
1715 seq_num_--;
1716 timestamp_ = 2000;
1717 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001718 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001719 packet_->markerBit = true;
1720 packet_->seqNum = seq_num_;
1721 packet_->timestamp = timestamp_;
1722
philipel9d3ab612015-12-21 04:12:39 -08001723 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001724}
1725
philipel85130292016-07-06 16:10:31 +02001726TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001727 // ------- -------
1728 // | 2 | | 1 |
1729 // ------- -------
1730 // t = 3000 t = 0xffffff00
1731
1732 seq_num_ = 2;
1733 timestamp_ = 3000;
1734 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001735 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001736 packet_->markerBit = true;
1737 packet_->seqNum = seq_num_;
1738 packet_->timestamp = timestamp_;
1739
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001740 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001741 EXPECT_EQ(kCompleteSession,
1742 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001743
1744 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1745 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1746
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001747 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001748
1749 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1750
1751 jitter_buffer_->ReleaseFrame(frame_out);
1752
1753 seq_num_--;
1754 timestamp_ = 0xffffff00;
1755 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001756 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001757 packet_->markerBit = true;
1758 packet_->seqNum = seq_num_;
1759 packet_->timestamp = timestamp_;
1760
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001761 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001762 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001763}
1764
philipel85130292016-07-06 16:10:31 +02001765TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001766 // --------------- ---------------
1767 // | 1 | 2 | | 3 | 4 |
1768 // --------------- ---------------
1769 // t = 0xffffff00 t = 33*90
1770
1771 timestamp_ = 0xffffff00;
1772 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001773 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001774 packet_->markerBit = false;
1775 packet_->seqNum = seq_num_;
1776 packet_->timestamp = timestamp_;
1777
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001778 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001779 EXPECT_EQ(kIncomplete,
1780 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001781
1782 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001783 EXPECT_TRUE(frame_out == NULL);
1784
1785 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001786 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001787 packet_->markerBit = true;
1788 packet_->seqNum = seq_num_;
1789
philipel9d3ab612015-12-21 04:12:39 -08001790 EXPECT_EQ(kCompleteSession,
1791 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001792
1793 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001794 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 jitter_buffer_->ReleaseFrame(frame_out);
1796
1797 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001798 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001799 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001800 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001801 packet_->markerBit = false;
1802 packet_->seqNum = seq_num_;
1803 packet_->timestamp = timestamp_;
1804
philipel9d3ab612015-12-21 04:12:39 -08001805 EXPECT_EQ(kIncomplete,
1806 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001807
1808 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001809 EXPECT_TRUE(frame_out == NULL);
1810
1811 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001812 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001813 packet_->markerBit = true;
1814 packet_->seqNum = seq_num_;
1815
philipel9d3ab612015-12-21 04:12:39 -08001816 EXPECT_EQ(kCompleteSession,
1817 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001818
1819 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001820 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001821 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001822 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001823}
1824
philipel85130292016-07-06 16:10:31 +02001825TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001826 // ------- -------
1827 // | 1 | | 2 |
1828 // ------- -------
1829 // t = 0xffffff00 t = 2700
1830
1831 timestamp_ = 0xffffff00;
1832 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001833 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001834 packet_->markerBit = true;
1835 packet_->timestamp = timestamp_;
1836
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001837 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001839 EXPECT_EQ(kCompleteSession,
1840 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001841
1842 // Insert next frame.
1843 seq_num_++;
1844 timestamp_ = 2700;
1845 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001846 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001847 packet_->markerBit = true;
1848 packet_->seqNum = seq_num_;
1849 packet_->timestamp = timestamp_;
1850
philipel9d3ab612015-12-21 04:12:39 -08001851 EXPECT_EQ(kCompleteSession,
1852 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001853
1854 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1855 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001856 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001857 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001858 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001859
1860 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1861 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001862 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001863 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001864 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001865}
1866
philipel85130292016-07-06 16:10:31 +02001867TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001868 // ------- -------
1869 // | 2 | | 1 |
1870 // ------- -------
1871 // t = 2700 t = 0xffffff00
1872
1873 seq_num_ = 2;
1874 timestamp_ = 2700;
1875 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001876 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001877 packet_->markerBit = true;
1878 packet_->seqNum = seq_num_;
1879 packet_->timestamp = timestamp_;
1880
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001881 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001882 EXPECT_EQ(kCompleteSession,
1883 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001884
1885 // Insert second frame
1886 seq_num_--;
1887 timestamp_ = 0xffffff00;
1888 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001889 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001890 packet_->markerBit = true;
1891 packet_->seqNum = seq_num_;
1892 packet_->timestamp = timestamp_;
1893
philipel9d3ab612015-12-21 04:12:39 -08001894 EXPECT_EQ(kCompleteSession,
1895 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001896
1897 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1898 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001899 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001900 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001901 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001902
1903 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1904 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001905 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001906 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001907 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001908}
1909
philipel85130292016-07-06 16:10:31 +02001910TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001911 int loop = 0;
1912 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001913 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001914 // Insert kMaxPacketsInJitterBuffer into frame.
1915 do {
1916 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001917 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001918 packet_->markerBit = false;
1919 packet_->seqNum = seq_num_;
1920
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001921 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001922 EXPECT_EQ(kIncomplete,
1923 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001924 firstPacket = false;
1925 } else {
philipel9d3ab612015-12-21 04:12:39 -08001926 EXPECT_EQ(kIncomplete,
1927 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928 }
1929
1930 loop++;
1931 } while (loop < kMaxPacketsInSession);
1932
1933 // Max number of packets inserted.
1934 // Insert one more packet.
1935 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001936 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001937 packet_->markerBit = true;
1938 packet_->seqNum = seq_num_;
1939
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001940 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001941 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001942 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001943}
1944
philipel85130292016-07-06 16:10:31 +02001945TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001946 // TEST fill JB with more than max number of frame (50 delta frames +
1947 // 51 key frames) with wrap in seq_num_
1948 //
1949 // --------------------------------------------------------------
1950 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1951 // --------------------------------------------------------------
1952 // |<-----------delta frames------------->|<------key frames----->|
1953
jbauchdb81ffd2015-11-23 03:59:02 -08001954 // Make sure the jitter doesn't request a keyframe after too much non-
1955 // decodable frames.
1956 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001957 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001958
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 int loop = 0;
1960 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001961 uint32_t first_key_frame_timestamp = 0;
1962 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001963 // Insert MAX_NUMBER_OF_FRAMES frames.
1964 do {
philipel9d3ab612015-12-21 04:12:39 -08001965 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001966 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001967 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001968 packet_->markerBit = true;
1969 packet_->seqNum = seq_num_;
1970 packet_->timestamp = timestamp_;
1971
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001972 if (loop == 50) {
1973 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001974 packet_->frameType = kVideoFrameKey;
1975 }
1976
1977 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001978 EXPECT_EQ(kCompleteSession,
1979 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001980
1981 loop++;
1982 } while (loop < kMaxNumberOfFrames);
1983
1984 // Max number of frames inserted.
1985
1986 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001987 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001988 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001989 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001990 packet_->markerBit = true;
1991 packet_->seqNum = seq_num_;
1992 packet_->timestamp = timestamp_;
1993
1994 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001995 EXPECT_EQ(kFlushIndicator,
1996 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001997
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001998 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1999 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002000 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002002 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002003}
2004
philipel85130292016-07-06 16:10:31 +02002005TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002006 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002007 seq_num_ = 3;
2008 // Insert one empty packet per frame, should never return the last timestamp
2009 // inserted. Only return empty frames in the presence of subsequent frames.
2010 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002011 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002012 for (int i = 0; i < maxSize + 10; i++) {
2013 timestamp_ += 33 * 90;
2014 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002015 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002016 packet_->markerBit = false;
2017 packet_->seqNum = seq_num_;
2018 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002019 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002020
philipel9d3ab612015-12-21 04:12:39 -08002021 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002022 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2023 // Timestamp should never be the last TS inserted.
2024 if (testFrame != NULL) {
2025 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002026 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 }
2028 }
2029}
2030
philipel85130292016-07-06 16:10:31 +02002031TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002032 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002033 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002034 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002035 timestamp_ += 33 * 90;
2036 int insertedLength = 0;
2037 packet_->seqNum = seq_num_;
2038 packet_->timestamp = timestamp_;
2039 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002040 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002041 packet_->completeNALU = kNaluStart;
2042 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002043 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002044
philipel9d3ab612015-12-21 04:12:39 -08002045 EXPECT_EQ(kDecodableSession,
2046 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002047
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002048 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002049 packet_->seqNum = seq_num_;
2050 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002051 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002052 packet_->completeNALU = kNaluIncomplete;
2053 packet_->markerBit = false;
2054
philipel9d3ab612015-12-21 04:12:39 -08002055 EXPECT_EQ(kDecodableSession,
2056 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002057
2058 seq_num_++;
2059 packet_->seqNum = seq_num_;
2060 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002061 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002062 packet_->completeNALU = kNaluEnd;
2063 packet_->markerBit = false;
2064
philipel9d3ab612015-12-21 04:12:39 -08002065 EXPECT_EQ(kDecodableSession,
2066 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002067
2068 seq_num_++;
2069 packet_->seqNum = seq_num_;
2070 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002071 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002072 EXPECT_EQ(kDecodableSession,
2073 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002074 // The JB will only output (incomplete) frames if a packet belonging to a
2075 // subsequent frame was already inserted. Insert one packet of a subsequent
2076 // frame. place high timestamp so the JB would always have a next frame
2077 // (otherwise, for every inserted frame we need to take care of the next
2078 // frame as well).
2079 packet_->seqNum = 1;
2080 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2081 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002082 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002083 packet_->completeNALU = kNaluStart;
2084 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002085
philipel9d3ab612015-12-21 04:12:39 -08002086 EXPECT_EQ(kDecodableSession,
2087 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002088
2089 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2090
2091 // We can decode everything from a NALU until a packet has been lost.
2092 // Thus we can decode the first packet of the first NALU and the second NALU
2093 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002094 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002095 jitter_buffer_->ReleaseFrame(frame_out);
2096
2097 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002098 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002099 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002100 insertedLength = 0;
2101
2102 packet_->seqNum = seq_num_;
2103 packet_->timestamp = timestamp_;
2104 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002105 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002106 packet_->completeNALU = kNaluEnd;
2107 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002108 EXPECT_EQ(kDecodableSession,
2109 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2110 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002111 seq_num_--;
2112 packet_->seqNum = seq_num_;
2113 packet_->timestamp = timestamp_;
2114 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002115 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002116 packet_->completeNALU = kNaluStart;
2117 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002118
philipel9d3ab612015-12-21 04:12:39 -08002119 EXPECT_EQ(kDecodableSession,
2120 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002121 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2122
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002123 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002124 packet_->seqNum = seq_num_;
2125 packet_->timestamp = timestamp_;
2126 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002127 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002128 packet_->completeNALU = kNaluComplete;
2129 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002130 EXPECT_EQ(kDecodableSession,
2131 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002132 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002133 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002134 packet_->seqNum = seq_num_;
2135 packet_->timestamp = timestamp_;
2136 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002137 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002138 packet_->completeNALU = kNaluStart;
2139 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002140 EXPECT_EQ(kDecodableSession,
2141 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002142 // This packet should be decoded since it's the beginning of a NAL.
2143 insertedLength += packet_->sizeBytes;
2144
2145 seq_num_ += 2;
2146 packet_->seqNum = seq_num_;
2147 packet_->timestamp = timestamp_;
2148 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002149 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002150 packet_->completeNALU = kNaluEnd;
2151 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002152 EXPECT_EQ(kDecodableSession,
2153 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002154 // This packet should not be decoded because it is an incomplete NAL if it
2155 // is the last.
2156 frame_out = DecodeIncompleteFrame();
2157 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002158 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002159 jitter_buffer_->ReleaseFrame(frame_out);
2160
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002161 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002162 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002163 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002164 WebRtcRTPHeader rtpHeader;
2165 memset(&rtpHeader, 0, sizeof(rtpHeader));
2166 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002167 emptypacket.seqNum = seq_num_;
2168 emptypacket.timestamp = timestamp_;
2169 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002170 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002171 emptypacket.completeNALU = kNaluComplete;
2172 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002173 EXPECT_EQ(kCompleteSession,
2174 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002175 // This packet should not be decoded because it is an incomplete NAL if it
2176 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002177
2178 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2179 // has arrived.
2180 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002181 EXPECT_TRUE(frame_out != NULL);
2182 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002183
2184 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002185 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002186 timestamp_ += 33 * 90;
2187
2188 packet_->seqNum = seq_num_;
2189 packet_->timestamp = timestamp_;
2190 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002191 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002192 packet_->completeNALU = kNaluComplete;
2193 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002194
philipel9d3ab612015-12-21 04:12:39 -08002195 EXPECT_EQ(kDecodableSession,
2196 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002197
agalusza@google.comd177c102013-08-08 01:12:33 +00002198 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002199 emptypacket.seqNum = seq_num_;
2200 emptypacket.timestamp = timestamp_;
2201 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002202 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002203 emptypacket.completeNALU = kNaluComplete;
2204 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002205 EXPECT_EQ(kCompleteSession,
2206 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002207
2208 frame_out = DecodeCompleteFrame();
2209 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002210 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002211 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002212}
2213
philipel85130292016-07-06 16:10:31 +02002214TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002215 // Test that a we cannot get incomplete frames from the JB if we haven't
2216 // received the marker bit, unless we have received a packet from a later
2217 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002218 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002219 // Start with a complete key frame - insert and decode.
2220 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002221 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002222 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002223 bool retransmitted = false;
2224
philipel9d3ab612015-12-21 04:12:39 -08002225 EXPECT_EQ(kCompleteSession,
2226 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002227 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2228 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002229 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002230
2231 packet_->seqNum += 2;
2232 packet_->timestamp += 33 * 90;
2233 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002234 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002235 packet_->markerBit = false;
2236
philipel9d3ab612015-12-21 04:12:39 -08002237 EXPECT_EQ(kDecodableSession,
2238 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002239
2240 frame_out = DecodeIncompleteFrame();
2241 EXPECT_TRUE(frame_out == NULL);
2242
2243 packet_->seqNum += 2;
2244 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002245 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002246
philipel9d3ab612015-12-21 04:12:39 -08002247 EXPECT_EQ(kDecodableSession,
2248 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002249
2250 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002251 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002252 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002253}
2254
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002255TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002256 // Make sure the jitter doesn't request a keyframe after too much non-
2257 // decodable frames.
2258 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002259 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002260 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002261 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002262 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002263 DropFrame(1);
2264 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002265 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002266 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002267 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002268 // This frame will make the jitter buffer recycle frames until a key frame.
2269 // Since none is found it will have to wait until the next key frame before
2270 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002271 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002272 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002273}
2274
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002275TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002276 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002277 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002278 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002279 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002280 // Insert empty packet.
2281 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002282 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002283 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002284 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002285 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002286 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002287 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002288 EXPECT_EQ(kCompleteSession, 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 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002291 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002292 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002293}
2294
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002295TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002296 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2297 EXPECT_EQ(0, frame_stats.delta_frames);
2298 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002299
2300 uint32_t framerate = 0;
2301 uint32_t bitrate = 0;
2302 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2303 EXPECT_EQ(0u, framerate);
2304 EXPECT_EQ(0u, bitrate);
2305
2306 // Insert a couple of key and delta frames.
2307 InsertFrame(kVideoFrameKey);
2308 InsertFrame(kVideoFrameDelta);
2309 InsertFrame(kVideoFrameDelta);
2310 InsertFrame(kVideoFrameKey);
2311 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002312 // Decode some of them to make sure the statistics doesn't depend on frames
2313 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002314 EXPECT_TRUE(DecodeCompleteFrame());
2315 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002316 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002317 EXPECT_EQ(3, frame_stats.delta_frames);
2318 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002319
2320 // Insert 20 more frames to get estimates of bitrate and framerate over
2321 // 1 second.
2322 for (int i = 0; i < 20; ++i) {
2323 InsertFrame(kVideoFrameDelta);
2324 }
2325 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2326 // TODO(holmer): The current implementation returns the average of the last
2327 // two framerate calculations, which is why it takes two calls to reach the
2328 // actual framerate. This should be fixed.
2329 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2330 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2331 // Insert 25 more frames to get estimates of bitrate and framerate over
2332 // 2 seconds.
2333 for (int i = 0; i < 25; ++i) {
2334 InsertFrame(kVideoFrameDelta);
2335 }
2336 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2337 EXPECT_EQ(kDefaultFrameRate, framerate);
2338 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2339}
2340
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002341TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2342 // Insert delta frames.
2343 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2344 // Can't decode without a key frame.
2345 EXPECT_FALSE(DecodeCompleteFrame());
2346 InsertFrame(kVideoFrameKey);
2347 // Skip to the next key frame.
2348 EXPECT_TRUE(DecodeCompleteFrame());
2349}
2350
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002351TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2352 InsertFrame(kVideoFrameKey);
2353 EXPECT_TRUE(DecodeCompleteFrame());
2354 const int kNumDeltaFrames = 5;
2355 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2356 InsertFrame(kVideoFrameKey);
2357 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2358 EXPECT_TRUE(DecodeCompleteFrame());
2359 }
2360}
2361
2362TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2363 InsertFrame(kVideoFrameKey);
2364 EXPECT_TRUE(DecodeCompleteFrame());
2365 const int kNumDeltaFrames = 5;
2366 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2367 InsertFrame(kVideoFrameKey);
2368 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2369 InsertFrame(kVideoFrameKey);
2370 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2371 EXPECT_TRUE(DecodeCompleteFrame());
2372 }
2373}
2374
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002375TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2376 InsertFrame(kVideoFrameKey);
2377 EXPECT_TRUE(DecodeCompleteFrame());
2378 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2379 clock_->TimeInMilliseconds());
2380 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2381 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2382 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002383 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002384 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2385 EXPECT_FALSE(DecodeCompleteFrame());
2386 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2387 EXPECT_TRUE(DecodeCompleteFrame());
2388 EXPECT_TRUE(DecodeCompleteFrame());
2389}
2390
philipel85130292016-07-06 16:10:31 +02002391TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002392 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002393 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002394 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002395 InsertFrame(kVideoFrameKey);
2396 EXPECT_TRUE(DecodeCompleteFrame());
2397}
2398
philipel85130292016-07-06 16:10:31 +02002399TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002400 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002401 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002402 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002403
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002404 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2405 // old packet.
2406 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002407 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002408 EXPECT_EQ(kFlushIndicator,
2409 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002410 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002411
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002412 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002413 std::vector<uint16_t> nack_list =
2414 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002415 // No key frame will be requested since the jitter buffer is empty.
2416 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002417 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002418
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002419 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002420 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002421 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002422 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002423
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002424 // The next complete continuous frame isn't a key frame, but we're waiting
2425 // for one.
2426 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002427 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002428 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002429 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002430}
2431
philipel85130292016-07-06 16:10:31 +02002432TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002433 // Insert a key frame and decode it.
2434 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2435 EXPECT_TRUE(DecodeCompleteFrame());
2436
2437 // Insert a frame which should trigger a recycle until the next key frame.
2438 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2439
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002440 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002441 std::vector<uint16_t> nack_list =
2442 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002443 // Verify that the jitter buffer does not request a key frame.
2444 EXPECT_FALSE(request_key_frame);
2445 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002446 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002447 // Verify that we can decode the next frame.
2448 EXPECT_TRUE(DecodeCompleteFrame());
2449}
2450
philipel85130292016-07-06 16:10:31 +02002451TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002452 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002453 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002454 EXPECT_TRUE(DecodeCompleteFrame());
2455
2456 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002457 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002458 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002459 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002460 EXPECT_FALSE(DecodeCompleteFrame());
2461
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002462 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002463 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002464 // The jitter buffer is empty, so we won't request key frames until we get a
2465 // packet.
2466 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002467
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002468 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002469 // Now we have a packet in the jitter buffer, a key frame will be requested
2470 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002471 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002472 // The jitter buffer is empty, so we won't request key frames until we get a
2473 // packet.
2474 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002475 // The next complete continuous frame isn't a key frame, but we're waiting
2476 // for one.
2477 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002478 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002479 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002480 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002481 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002482}
2483
philipel85130292016-07-06 16:10:31 +02002484TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002485 DropFrame(10);
2486 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002487 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002488 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002489 std::vector<uint16_t> nack_list =
2490 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002491 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002492 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002493 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002494}
2495
philipel85130292016-07-06 16:10:31 +02002496TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002497 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002498 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002499 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002500 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002501 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002502 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002503 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002504 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002505 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002506 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002507}
2508
philipel85130292016-07-06 16:10:31 +02002509TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002510 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002511 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2512 clock_->TimeInMilliseconds());
2513 VCMPacket packet;
2514 stream_generator_->PopPacket(&packet, 0);
2515 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002516 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002517 EXPECT_FALSE(retransmitted);
2518 // Drop second packet.
2519 stream_generator_->PopPacket(&packet, 1);
2520 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2521 EXPECT_FALSE(retransmitted);
2522 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002523 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002524 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002525 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002526 EXPECT_EQ(1u, nack_list.size());
2527 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002528 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002529 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002530 EXPECT_EQ(kCompleteSession,
2531 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002532 EXPECT_TRUE(retransmitted);
2533 EXPECT_TRUE(DecodeCompleteFrame());
2534}
2535
philipel85130292016-07-06 16:10:31 +02002536TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002537 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002538 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002539 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002540 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002541 // Drop second packet.
2542 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2543 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002544 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002545 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002546 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002547 ASSERT_EQ(1u, nack_list.size());
2548 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002549 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002550 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002551 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002552}
2553
philipel85130292016-07-06 16:10:31 +02002554TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002555 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002556 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002557 // First frame is delta.
2558 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2559 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002560 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002561 // Drop second packet in frame.
2562 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2563 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2564 // Second frame is key.
2565 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2566 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002567 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002568 // Drop second packet in frame.
2569 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2570 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002571 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002572 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002573 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002574 ASSERT_EQ(1u, nack_list.size());
2575 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002576 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002577 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002578}
2579
philipel85130292016-07-06 16:10:31 +02002580TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002581 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002582 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002583
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002584 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002585 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002586
2587 // ----------------------------------------------------------------
2588 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2589 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002590 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002591 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002592 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002593 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002594 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002595 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002596 while (stream_generator_->PacketsRemaining() > 1) {
2597 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002598 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002599 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002600 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002601 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002602 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002603 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002604 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002605 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002606 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002607 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002608
2609 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002610 std::vector<uint16_t> nack_list =
2611 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002612 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002613 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002614 for (size_t i = 0; i < nack_list.size(); ++i)
2615 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002616}
2617
philipel85130292016-07-06 16:10:31 +02002618TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002619 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002620 // ------- ------------------------------------------------------------
2621 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2622 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002623 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002624 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002625 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002626 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002627 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002628 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002629 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002630 while (stream_generator_->PacketsRemaining() > 1) {
2631 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002632 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002633 EXPECT_FALSE(request_key_frame);
2634 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002635 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002636 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002637 }
2638 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002639 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002640 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002641 EXPECT_FALSE(DecodeCompleteFrame());
2642 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002643 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002644 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002645 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002646 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002647 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2648 for (size_t i = 0; i < nack_list.size(); ++i)
2649 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002650}
2651
philipel85130292016-07-06 16:10:31 +02002652TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002653 bool request_key_frame = false;
2654 // -----------------------------------
2655 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2656 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002657 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002658 InsertFrame(kVideoFrameKey);
2659 EXPECT_FALSE(request_key_frame);
2660 EXPECT_TRUE(DecodeCompleteFrame());
2661 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2662 clock_->TimeInMilliseconds());
2663 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2664 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002665 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002666 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002667 EXPECT_FALSE(request_key_frame);
2668 } else {
2669 stream_generator_->NextPacket(NULL); // Drop packet
2670 }
2671 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2672 clock_->TimeInMilliseconds());
2673 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2674 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002675 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002676 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002677 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002678 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002679 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002680 ASSERT_EQ(1u, nack_list.size());
2681 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002682}
2683
philipel85130292016-07-06 16:10:31 +02002684TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002685 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002686 InsertFrame(kVideoFrameKey);
2687 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002688 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002689 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2690 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002691
2692 // Far-into-the-future video frame, could be caused by resetting the encoder
2693 // or otherwise restarting. This should not fail when error when the packet is
2694 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002695 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002696 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2697 InsertFrame(kVideoFrameKey);
2698 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002699 nack_list = jitter_buffer_->GetNackList(&extended);
2700 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002701
2702 // Stream should be decodable from this point.
2703 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2704 InsertFrame(kVideoFrameDelta);
2705 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002706 nack_list = jitter_buffer_->GetNackList(&extended);
2707 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002708}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002709} // namespace webrtc