blob: f9dffc032213be25e8c20917d2b3dc3bf409c68e [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);
192 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
193 EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
194 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
195 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
asapersson9a4cd872015-10-23 00:27:14 -0700196}
197
philipel83f831a2016-03-12 03:30:23 -0800198class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
199 public NackSender,
200 public KeyFrameRequestSender {
201 public:
202 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
203 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
204 sequence_numbers.end());
205 }
206
207 void RequestKeyFrame() override { ++keyframe_requests_; }
208
philipel83f831a2016-03-12 03:30:23 -0800209 std::vector<uint16_t> nack_sent_;
210 int keyframe_requests_;
211
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000212 protected:
philipel85130292016-07-06 16:10:31 +0200213 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -0700214 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000215 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700216 jitter_buffer_.reset(new VCMJitterBuffer(
217 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800218 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
219 this,
220 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000221 jitter_buffer_->Start();
222 seq_num_ = 1234;
223 timestamp_ = 0;
224 size_ = 1400;
225 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
226 data_[0] = 0;
227 data_[1] = 0;
228 data_[2] = 0x80;
229 int count = 3;
230 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
231 data_[i] = count;
232 count++;
233 if (count == 10) {
234 data_[i + 1] = 0;
235 data_[i + 2] = 0;
236 data_[i + 3] = 0x80;
237 count = 3;
238 i += 3;
239 }
240 }
Johan Ahlers37f93af2016-06-29 18:02:54 +0200241 WebRtcRTPHeader rtpHeader;
242 memset(&rtpHeader, 0, sizeof(rtpHeader));
243 rtpHeader.header.sequenceNumber = seq_num_;
244 rtpHeader.header.timestamp = timestamp_;
245 rtpHeader.header.markerBit = true;
246 rtpHeader.frameType = kVideoFrameDelta;
247 packet_.reset(new VCMPacket(data_, size_, rtpHeader));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000248 }
249
250 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700251 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000252 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700253 return nullptr;
254 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000255 }
256
257 VCMEncodedFrame* DecodeIncompleteFrame() {
258 uint32_t timestamp = 0;
259 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
260 if (!found_frame)
261 return NULL;
262 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
263 return frame;
264 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000265
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000266 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800267 unsigned int size,
268 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000269 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000270
271 const uint8_t* outData = frame_out->Buffer();
272 unsigned int i = 0;
273
274 if (startCode) {
275 EXPECT_EQ(0, outData[0]);
276 EXPECT_EQ(0, outData[1]);
277 EXPECT_EQ(0, outData[2]);
278 EXPECT_EQ(1, outData[3]);
279 i += 4;
280 }
281
282 EXPECT_EQ(size, frame_out->Length());
283 int count = 3;
284 for (; i < size; i++) {
285 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
286 i += 2;
287 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
288 EXPECT_EQ(0, outData[0]);
289 EXPECT_EQ(0, outData[1]);
290 EXPECT_EQ(0, outData[2]);
291 EXPECT_EQ(1, outData[3]);
292 i += 3;
293 } else {
294 EXPECT_EQ(count, outData[i]);
295 count++;
296 if (count == 10) {
297 count = 3;
298 }
299 }
300 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000301 }
302
303 uint16_t seq_num_;
304 uint32_t timestamp_;
305 int size_;
306 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800307 std::unique_ptr<VCMPacket> packet_;
308 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800310 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000311};
312
philipel83f831a2016-03-12 03:30:23 -0800313class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
314 public NackSender,
315 public KeyFrameRequestSender {
316 public:
317 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
318 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
319 sequence_numbers.end());
320 }
321
322 void RequestKeyFrame() { ++keyframe_requests_; }
323
philipel83f831a2016-03-12 03:30:23 -0800324 std::vector<uint16_t> nack_sent_;
325 int keyframe_requests_;
326
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000327 protected:
328 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000329
330 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000331 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000332 max_nack_list_size_ = 150;
333 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700334 jitter_buffer_ = new VCMJitterBuffer(
335 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800336 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
337 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700338 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000339 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800340 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
341 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000342 memset(data_buffer_, 0, kDataBufferSize);
343 }
344
345 virtual void TearDown() {
346 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000347 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000349 }
350
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000351 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000352 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000353 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000354 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000355 EXPECT_TRUE(packet_available);
356 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000357 return kGeneralError; // Return here to avoid crashes below.
358 bool retransmitted = false;
359 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000360 }
361
362 VCMFrameBufferEnum InsertPacket(int index) {
363 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000364 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000365 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000366 EXPECT_TRUE(packet_available);
367 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000368 return kGeneralError; // Return here to avoid crashes below.
369 bool retransmitted = false;
370 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000371 }
372
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000373 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700374 stream_generator_->GenerateFrame(
375 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
376 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000377 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000378 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000379 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000380 }
381
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000382 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
383 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000384 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 VCMFrameBufferEnum ret = InsertFrame(frame_type);
386 if (ret < kNoError) {
387 ret_for_all = ret;
388 } else if (ret_for_all >= kNoError) {
389 ret_for_all = ret;
390 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000391 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000392 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000393 }
394
395 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000396 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000397 clock_->TimeInMilliseconds());
398 for (int i = 0; i < num_packets; ++i)
399 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000400 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000401 }
402
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000403 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700404 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000405 if (!found_frame)
406 return false;
407
isheriff6b4b5f32016-06-08 00:24:21 -0700408 VCMEncodedFrame* frame =
409 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000410 bool ret = (frame != NULL);
411 jitter_buffer_->ReleaseFrame(frame);
412 return ret;
413 }
414
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000415 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000416 uint32_t timestamp = 0;
417 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
418 if (!found_frame)
419 return false;
420 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000421 bool ret = (frame != NULL);
422 jitter_buffer_->ReleaseFrame(frame);
423 return ret;
424 }
425
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000426 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000427 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800428 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000429 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000430 size_t max_nack_list_size_;
431 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000432 uint8_t data_buffer_[kDataBufferSize];
433};
434
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000435class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000436 protected:
philipel85130292016-07-06 16:10:31 +0200437 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000438 virtual void SetUp() {
439 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000440 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000441 }
442
philipel9d3ab612015-12-21 04:12:39 -0800443 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444};
445
philipel85130292016-07-06 16:10:31 +0200446TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000447 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448 EXPECT_TRUE(NULL == DecodeCompleteFrame());
449 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
450 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000451 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000452 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000453
454 // No packets inserted.
455 EXPECT_TRUE(NULL == DecodeCompleteFrame());
456 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
457
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000458 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000459 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000461 // No packets inserted.
462 EXPECT_TRUE(NULL == DecodeCompleteFrame());
463 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
464}
465
philipel85130292016-07-06 16:10:31 +0200466TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000467 // Always start with a complete key frame when not allowing errors.
468 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000469 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800470 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000471 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000472 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000473
474 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000475 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800476 EXPECT_EQ(kCompleteSession,
477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000478 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000479 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000481 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000482}
483
philipel85130292016-07-06 16:10:31 +0200484TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700485 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200486 // Always start with a complete key frame when not allowing errors.
487 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
488 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800489 packet_->is_first_packet_in_frame = true;
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200490 packet_->markerBit = true;
491 packet_->timestamp += 123 * 90;
492
493 // Insert single packet frame to the jitter buffer and get a frame.
494 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800495 EXPECT_EQ(kCompleteSession,
496 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200497 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
498 CheckOutFrame(frame_out, size_, false);
499 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
500 jitter_buffer_->ReleaseFrame(frame_out);
501
502 // Verify that histograms are updated when the jitter buffer is stopped.
503 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
504 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700505 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
506 EXPECT_EQ(1,
507 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800508 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700509 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800510 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700511 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200512
513 // Verify that histograms are not updated if stop is called again.
514 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700515 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
516 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800517 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700518 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
519 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200520}
521
philipel85130292016-07-06 16:10:31 +0200522TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000523 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800524 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000525 packet_->markerBit = false;
526
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000527 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800528 EXPECT_EQ(kIncomplete,
529 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000530 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
531 // Should not be complete.
532 EXPECT_TRUE(frame_out == NULL);
533
534 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800535 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000536 packet_->markerBit = true;
537 packet_->seqNum = seq_num_;
538
philipel9d3ab612015-12-21 04:12:39 -0800539 EXPECT_EQ(kCompleteSession,
540 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000541
542 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000543 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000544
545 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000546 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000547}
548
philipel85130292016-07-06 16:10:31 +0200549TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000550 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800551 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000552 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000553
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000554 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800555 EXPECT_EQ(kIncomplete,
556 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000557
558 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
559
560 // Frame should not be complete.
561 EXPECT_TRUE(frame_out == NULL);
562
563 // Insert 98 frames.
564 int loop = 0;
565 do {
566 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800567 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568 packet_->markerBit = false;
569 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000570
philipel9d3ab612015-12-21 04:12:39 -0800571 EXPECT_EQ(kIncomplete,
572 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000573 loop++;
574 } while (loop < 98);
575
576 // Insert last packet.
577 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800578 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000579 packet_->markerBit = true;
580 packet_->seqNum = seq_num_;
581
philipel9d3ab612015-12-21 04:12:39 -0800582 EXPECT_EQ(kCompleteSession,
583 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000584
585 frame_out = DecodeCompleteFrame();
586
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000587 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000589 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000590}
591
philipel85130292016-07-06 16:10:31 +0200592TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593 // Always start with a complete key frame.
594 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800595 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000596 packet_->markerBit = true;
597
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000598 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800599 EXPECT_EQ(kCompleteSession,
600 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000601 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
602 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000603 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604
605 ++seq_num_;
606 packet_->seqNum = seq_num_;
607 packet_->markerBit = false;
608 packet_->frameType = kVideoFrameDelta;
609 packet_->timestamp += 33 * 90;
610
philipel9d3ab612015-12-21 04:12:39 -0800611 EXPECT_EQ(kIncomplete,
612 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000613
614 frame_out = DecodeCompleteFrame();
615
616 // Frame should not be complete.
617 EXPECT_TRUE(frame_out == NULL);
618
johan0d1b2b62017-01-10 04:21:35 -0800619 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000620 // Insert 98 frames.
621 int loop = 0;
622 do {
623 ++seq_num_;
624 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000625
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000626 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800627 EXPECT_EQ(kIncomplete,
628 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000629 loop++;
630 } while (loop < 98);
631
632 // Insert the last packet.
633 ++seq_num_;
johan0d1b2b62017-01-10 04:21:35 -0800634 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000635 packet_->markerBit = true;
636 packet_->seqNum = seq_num_;
637
philipel9d3ab612015-12-21 04:12:39 -0800638 EXPECT_EQ(kCompleteSession,
639 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000640
641 frame_out = DecodeCompleteFrame();
642
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000643 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000644 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000645 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000646}
647
philipel85130292016-07-06 16:10:31 +0200648TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649 // Insert the "first" packet last.
650 seq_num_ += 100;
651 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800652 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000653 packet_->markerBit = true;
654 packet_->seqNum = seq_num_;
655 packet_->timestamp = timestamp_;
656
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000657 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800658 EXPECT_EQ(kIncomplete,
659 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660
661 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
662
663 EXPECT_TRUE(frame_out == NULL);
664
665 // Insert 98 packets.
666 int loop = 0;
667 do {
668 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800669 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000670 packet_->markerBit = false;
671 packet_->seqNum = seq_num_;
672
philipel9d3ab612015-12-21 04:12:39 -0800673 EXPECT_EQ(kIncomplete,
674 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000675 loop++;
676 } while (loop < 98);
677
678 // Insert the last packet.
679 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -0800680 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000681 packet_->markerBit = false;
682 packet_->seqNum = seq_num_;
683
philipel9d3ab612015-12-21 04:12:39 -0800684 EXPECT_EQ(kCompleteSession,
685 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000686
philipel9d3ab612015-12-21 04:12:39 -0800687 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000688
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000689 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000690
691 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000692 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000693}
694
philipel85130292016-07-06 16:10:31 +0200695TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000696 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -0800697 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000698 packet_->markerBit = false;
699
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000700 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800701 EXPECT_EQ(kIncomplete,
702 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000703
704 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
705
706 EXPECT_TRUE(frame_out == NULL);
707
708 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800709 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710 packet_->markerBit = true;
711 packet_->seqNum = seq_num_;
712
philipel9d3ab612015-12-21 04:12:39 -0800713 EXPECT_EQ(kCompleteSession,
714 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000715
716 // check that we fail to get frame since seqnum is not continuous
717 frame_out = DecodeCompleteFrame();
718 EXPECT_TRUE(frame_out == NULL);
719
720 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800721 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000722 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800723 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000724 packet_->markerBit = false;
725 packet_->seqNum = seq_num_;
726 packet_->timestamp = timestamp_;
727
philipel9d3ab612015-12-21 04:12:39 -0800728 EXPECT_EQ(kIncomplete,
729 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000730
731 frame_out = DecodeCompleteFrame();
732
733 // It should not be complete.
734 EXPECT_TRUE(frame_out == NULL);
735
736 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -0800737 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000738 packet_->markerBit = true;
739 packet_->seqNum = seq_num_;
740
philipel9d3ab612015-12-21 04:12:39 -0800741 EXPECT_EQ(kCompleteSession,
742 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000743
744 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000745 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000746 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000747 jitter_buffer_->ReleaseFrame(frame_out);
748
749 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000750 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000751 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000752 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000753}
754
philipel85130292016-07-06 16:10:31 +0200755TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700756 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800757 packet_->is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700758 packet_->markerBit = true;
759
760 // Send in an initial good packet/frame (Frame A) to start things off.
761 bool retransmitted = false;
762 EXPECT_EQ(kCompleteSession,
763 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
764 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
765 EXPECT_TRUE(frame_out != NULL);
766 jitter_buffer_->ReleaseFrame(frame_out);
767
768 // Now send in a complete delta frame (Frame C), but with a sequence number
769 // gap. No pic index either, so no temporal scalability cheating :)
770 packet_->frameType = kVideoFrameDelta;
771 // Leave a gap of 2 sequence numbers and two frames.
772 packet_->seqNum = seq_num_ + 3;
773 packet_->timestamp = timestamp_ + (66 * 90);
774 // Still isFirst = marker = true.
775 // Session should be complete (frame is complete), but there's nothing to
776 // decode yet.
777 EXPECT_EQ(kCompleteSession,
778 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
779 frame_out = DecodeCompleteFrame();
780 EXPECT_TRUE(frame_out == NULL);
781
782 // Now send in a complete delta frame (Frame B) that is continuous from A, but
783 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
784 packet_->seqNum = seq_num_ + 1;
785 packet_->timestamp = timestamp_ + (33 * 90);
786 // Still isFirst = marker = true.
787 EXPECT_EQ(kCompleteSession,
788 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
789 frame_out = DecodeCompleteFrame();
790 EXPECT_TRUE(frame_out != NULL);
791 jitter_buffer_->ReleaseFrame(frame_out);
792
793 // But Frame C isn't continuous yet.
794 frame_out = DecodeCompleteFrame();
795 EXPECT_TRUE(frame_out == NULL);
796
797 // Add in the padding. These are empty packets (data length is 0) with no
798 // marker bit and matching the timestamp of Frame B.
Johan Ahlers37f93af2016-06-29 18:02:54 +0200799 WebRtcRTPHeader rtpHeader;
800 memset(&rtpHeader, 0, sizeof(rtpHeader));
801 rtpHeader.header.sequenceNumber = seq_num_ + 2;
802 rtpHeader.header.timestamp = timestamp_ + (33 * 90);
803 rtpHeader.header.markerBit = false;
804 VCMPacket empty_packet(data_, 0, rtpHeader);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700805 EXPECT_EQ(kOldPacket,
806 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
807 empty_packet.seqNum += 1;
808 EXPECT_EQ(kOldPacket,
809 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
810
811 // But now Frame C should be ready!
812 frame_out = DecodeCompleteFrame();
813 EXPECT_TRUE(frame_out != NULL);
814 jitter_buffer_->ReleaseFrame(frame_out);
815}
816
philipel85130292016-07-06 16:10:31 +0200817TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000818 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800819 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000820 packet_->markerBit = false;
821 packet_->seqNum = seq_num_;
822 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000823 EXPECT_EQ(0, jitter_buffer_->num_packets());
824 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000825
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000826 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800827 EXPECT_EQ(kIncomplete,
828 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000829
830 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
831
832 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000833 EXPECT_EQ(1, jitter_buffer_->num_packets());
834 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000835
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000836 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800837 EXPECT_EQ(kDuplicatePacket,
838 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000839 EXPECT_EQ(2, jitter_buffer_->num_packets());
840 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000841
842 seq_num_++;
843 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000844 packet_->markerBit = true;
johan0d1b2b62017-01-10 04:21:35 -0800845 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000846
philipel9d3ab612015-12-21 04:12:39 -0800847 EXPECT_EQ(kCompleteSession,
848 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000849
850 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000851 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000852 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000853
854 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000855 EXPECT_EQ(3, jitter_buffer_->num_packets());
856 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000857 jitter_buffer_->ReleaseFrame(frame_out);
858}
859
philipel85130292016-07-06 16:10:31 +0200860TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000861 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -0800862 packet_->is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000863 packet_->markerBit = true;
864 packet_->seqNum = seq_num_;
865 packet_->timestamp = timestamp_;
866 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
867 EXPECT_EQ(0, jitter_buffer_->num_packets());
868 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
869
870 bool retransmitted = false;
871 // Insert first complete frame.
872 EXPECT_EQ(kCompleteSession,
873 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
874
875 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
876 ASSERT_TRUE(frame_out != NULL);
877 CheckOutFrame(frame_out, size_, false);
878 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
879 jitter_buffer_->ReleaseFrame(frame_out);
880
881 // Insert 3 delta frames.
882 for (uint16_t i = 1; i <= 3; ++i) {
883 packet_->seqNum = seq_num_ + i;
884 packet_->timestamp = timestamp_ + (i * 33) * 90;
885 packet_->frameType = kVideoFrameDelta;
886 EXPECT_EQ(kCompleteSession,
887 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
888 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
889 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
890 }
891
892 // Retransmit second delta frame.
893 packet_->seqNum = seq_num_ + 2;
894 packet_->timestamp = timestamp_ + 66 * 90;
895
896 EXPECT_EQ(kDuplicatePacket,
897 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
898
899 EXPECT_EQ(5, jitter_buffer_->num_packets());
900 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
901
902 // Should be able to decode 3 delta frames, key frame already decoded.
903 for (size_t i = 0; i < 3; ++i) {
904 frame_out = DecodeCompleteFrame();
905 ASSERT_TRUE(frame_out != NULL);
906 CheckOutFrame(frame_out, size_, false);
907 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
908 jitter_buffer_->ReleaseFrame(frame_out);
909 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000910}
911
philipel85130292016-07-06 16:10:31 +0200912TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700913 // Verify that JB skips forward to next base layer frame.
914 // -------------------------------------------------
915 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
916 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
917 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
918 // | ss | x | x | x | |
919 // -------------------------------------------------
920 // |<----------tl0idx:200--------->|<---tl0idx:201---
921
922 bool re = false;
923 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700924 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800925 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700926 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700927 packet_->video_header.codecHeader.VP9.flexible_mode = false;
928 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
929 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
930 packet_->video_header.codecHeader.VP9.end_of_frame = true;
931 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700932
933 packet_->seqNum = 65485;
934 packet_->timestamp = 1000;
935 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700936 packet_->video_header.codecHeader.VP9.picture_id = 5;
937 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
938 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
939 packet_->video_header.codecHeader.VP9.ss_data_available = true;
940 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700941 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
942 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
943
944 // Insert next temporal layer 0.
945 packet_->seqNum = 65489;
946 packet_->timestamp = 13000;
947 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700948 packet_->video_header.codecHeader.VP9.picture_id = 9;
949 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
950 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
951 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700952 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
953
954 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
955 EXPECT_EQ(1000U, frame_out->TimeStamp());
956 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
957 jitter_buffer_->ReleaseFrame(frame_out);
958
959 frame_out = DecodeCompleteFrame();
960 EXPECT_EQ(13000U, frame_out->TimeStamp());
961 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
962 jitter_buffer_->ReleaseFrame(frame_out);
963}
964
philipel85130292016-07-06 16:10:31 +0200965TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700966 // Verify that frames are updated with SS data when SS packet is reordered.
967 // --------------------------------
968 // | 65486 | 65487 | 65485 |...
969 // | pid:6 | pid:7 | pid:5 |...
970 // | tid:2 | tid:1 | tid:0 |...
971 // | | | ss |
972 // --------------------------------
973 // |<--------tl0idx:200--------->|
974
975 bool re = false;
976 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700977 packet_->video_header.codec = kRtpVideoVp9;
johan0d1b2b62017-01-10 04:21:35 -0800978 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700979 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700980 packet_->video_header.codecHeader.VP9.flexible_mode = false;
981 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
982 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
983 packet_->video_header.codecHeader.VP9.end_of_frame = true;
984 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700985
986 packet_->seqNum = 65486;
987 packet_->timestamp = 6000;
988 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700989 packet_->video_header.codecHeader.VP9.picture_id = 6;
990 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
991 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700992 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
993
994 packet_->seqNum = 65487;
995 packet_->timestamp = 9000;
996 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700997 packet_->video_header.codecHeader.VP9.picture_id = 7;
998 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
999 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001000 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1001
1002 // Insert first frame with SS data.
1003 packet_->seqNum = 65485;
1004 packet_->timestamp = 3000;
1005 packet_->frameType = kVideoFrameKey;
1006 packet_->width = 352;
1007 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001008 packet_->video_header.codecHeader.VP9.picture_id = 5;
1009 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1010 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1011 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1012 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001013 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1014 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1015
1016 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1017 EXPECT_EQ(3000U, frame_out->TimeStamp());
1018 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1019 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1020 EXPECT_FALSE(
1021 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1022 jitter_buffer_->ReleaseFrame(frame_out);
1023
1024 frame_out = DecodeCompleteFrame();
1025 EXPECT_EQ(6000U, frame_out->TimeStamp());
1026 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1027 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1028 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1029 jitter_buffer_->ReleaseFrame(frame_out);
1030
1031 frame_out = DecodeCompleteFrame();
1032 EXPECT_EQ(9000U, frame_out->TimeStamp());
1033 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1034 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1035 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1036 jitter_buffer_->ReleaseFrame(frame_out);
1037}
1038
philipel85130292016-07-06 16:10:31 +02001039TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001040 // Verify that frames are updated with SS data when SS packet is reordered.
1041 // -----------------------------------------
1042 // | 65486 | 65487 | 65485 | 65484 |...
1043 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1044 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1045 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1046 // | t:6000 | t:6000 | t:3000 | t:3000 |
1047 // | | | | ss |
1048 // -----------------------------------------
1049 // |<-----------tl0idx:200------------>|
1050
1051 bool re = false;
1052 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001053 packet_->video_header.codec = kRtpVideoVp9;
1054 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1055 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1056 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1057 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001058
johan0d1b2b62017-01-10 04:21:35 -08001059 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001060 packet_->markerBit = false;
1061 packet_->seqNum = 65486;
1062 packet_->timestamp = 6000;
1063 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001064 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1065 packet_->video_header.codecHeader.VP9.picture_id = 6;
1066 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1067 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001068 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1069
johan0d1b2b62017-01-10 04:21:35 -08001070 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001071 packet_->markerBit = true;
1072 packet_->seqNum = 65487;
1073 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001074 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1075 packet_->video_header.codecHeader.VP9.picture_id = 6;
1076 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1077 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001078 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1079
johan0d1b2b62017-01-10 04:21:35 -08001080 packet_->is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -07001081 packet_->markerBit = true;
1082 packet_->seqNum = 65485;
1083 packet_->timestamp = 3000;
1084 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001085 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1086 packet_->video_header.codecHeader.VP9.picture_id = 5;
1087 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1088 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001089 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1090
1091 // Insert first frame with SS data.
johan0d1b2b62017-01-10 04:21:35 -08001092 packet_->is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -07001093 packet_->markerBit = false;
1094 packet_->seqNum = 65484;
1095 packet_->frameType = kVideoFrameKey;
1096 packet_->width = 352;
1097 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001098 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1099 packet_->video_header.codecHeader.VP9.picture_id = 5;
1100 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1101 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1102 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1103 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001104 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1105 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1106
1107 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1108 EXPECT_EQ(3000U, frame_out->TimeStamp());
1109 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1110 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1111 EXPECT_FALSE(
1112 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1113 jitter_buffer_->ReleaseFrame(frame_out);
1114
1115 frame_out = DecodeCompleteFrame();
1116 EXPECT_EQ(6000U, frame_out->TimeStamp());
1117 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1118 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1119 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1120 jitter_buffer_->ReleaseFrame(frame_out);
1121}
1122
philipel85130292016-07-06 16:10:31 +02001123TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001124 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001125 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001126 packet_->markerBit = false;
1127 packet_->seqNum = seq_num_;
1128 packet_->timestamp = timestamp_;
1129 packet_->insertStartCode = true;
1130
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001131 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001132 EXPECT_EQ(kIncomplete,
1133 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001134
1135 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1136
1137 // Frame should not be complete.
1138 EXPECT_TRUE(frame_out == NULL);
1139
1140 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001141 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001142 packet_->markerBit = true;
1143 packet_->seqNum = seq_num_;
1144
philipel9d3ab612015-12-21 04:12:39 -08001145 EXPECT_EQ(kCompleteSession,
1146 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001147
1148 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001149 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001150 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001151 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152}
1153
stefana669a3a2016-10-06 05:04:52 -07001154TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
1155 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
1156
1157 packet_->timestamp = timestamp_;
1158 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001159 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001160 packet_->markerBit = true;
1161 packet_->codec = kVideoCodecH264;
1162 packet_->video_header.codec = kRtpVideoH264;
1163 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1164 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1165 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1166 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1167 packet_->video_header.codecHeader.H264.nalus_length = 1;
1168 bool retransmitted = false;
1169 EXPECT_EQ(kCompleteSession,
1170 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1171 // Not decodable since sps and pps are missing.
1172 EXPECT_EQ(nullptr, DecodeCompleteFrame());
1173
1174 timestamp_ += 3000;
1175 packet_->timestamp = timestamp_;
1176 ++seq_num_;
1177 packet_->seqNum = seq_num_;
1178 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001179 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001180 packet_->markerBit = false;
1181 packet_->codec = kVideoCodecH264;
1182 packet_->video_header.codec = kRtpVideoH264;
1183 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
1184 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
1185 packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
1186 packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
1187 packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
1188 packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
1189 packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
1190 packet_->video_header.codecHeader.H264.nalus_length = 2;
1191 // Not complete since the marker bit hasn't been received.
1192 EXPECT_EQ(kIncomplete,
1193 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1194
1195 ++seq_num_;
1196 packet_->seqNum = seq_num_;
1197 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001198 packet_->is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -07001199 packet_->markerBit = true;
1200 packet_->codec = kVideoCodecH264;
1201 packet_->video_header.codec = kRtpVideoH264;
1202 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
1203 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
1204 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1205 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1206 packet_->video_header.codecHeader.H264.nalus_length = 1;
1207 // Complete and decodable since the pps and sps are received in the first
1208 // packet of this frame.
1209 EXPECT_EQ(kCompleteSession,
1210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1211 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1212 ASSERT_NE(nullptr, frame_out);
1213 jitter_buffer_->ReleaseFrame(frame_out);
1214
1215 timestamp_ += 3000;
1216 packet_->timestamp = timestamp_;
1217 ++seq_num_;
1218 packet_->seqNum = seq_num_;
1219 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001220 packet_->is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -07001221 packet_->markerBit = true;
1222 packet_->codec = kVideoCodecH264;
1223 packet_->video_header.codec = kRtpVideoH264;
1224 packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
1225 packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
1226 packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
1227 packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
1228 packet_->video_header.codecHeader.H264.nalus_length = 1;
1229 // Complete and decodable since sps, pps and key frame has been received.
1230 EXPECT_EQ(kCompleteSession,
1231 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1232 frame_out = DecodeCompleteFrame();
1233 ASSERT_NE(nullptr, frame_out);
1234 jitter_buffer_->ReleaseFrame(frame_out);
1235}
1236
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001237// Test threshold conditions of decodable state.
philipel85130292016-07-06 16:10:31 +02001238TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001239 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001240 // Always start with a key frame. Use 10 packets to test Decodable State
1241 // boundaries.
1242 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001243 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001244 packet_->markerBit = false;
1245 packet_->seqNum = seq_num_;
1246 packet_->timestamp = timestamp_;
1247
1248 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001249 EXPECT_EQ(kIncomplete,
1250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001251 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001252 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001253 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1254
johan0d1b2b62017-01-10 04:21:35 -08001255 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001256 for (int i = 1; i < 9; ++i) {
1257 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001258 EXPECT_EQ(kIncomplete,
1259 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001260 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001261 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1262 }
1263
1264 // last packet
1265 packet_->markerBit = true;
1266 packet_->seqNum++;
1267
philipel9d3ab612015-12-21 04:12:39 -08001268 EXPECT_EQ(kCompleteSession,
1269 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001270 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1271 CheckOutFrame(frame_out, 10 * size_, false);
1272 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001273 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001274
1275 // An incomplete frame can only be decoded once a subsequent frame has begun
1276 // to arrive. Insert packet in distant frame for this purpose.
1277 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001278 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001279 packet_->markerBit = false;
1280 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001281 packet_->timestamp += 33 * 90 * 8;
1282
philipel9d3ab612015-12-21 04:12:39 -08001283 EXPECT_EQ(kDecodableSession,
1284 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001285 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001286 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1287
1288 // Insert second frame
1289 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001290 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001291
philipel9d3ab612015-12-21 04:12:39 -08001292 EXPECT_EQ(kDecodableSession,
1293 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001294 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001295 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1296
johan0d1b2b62017-01-10 04:21:35 -08001297 packet_->is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +00001298 for (int i = 1; i < 8; ++i) {
1299 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001300 EXPECT_EQ(kDecodableSession,
1301 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001302 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001303 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1304 }
1305
1306 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001307 EXPECT_EQ(kDecodableSession,
1308 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001309 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001310 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1311
1312 frame_out = DecodeIncompleteFrame();
1313 ASSERT_FALSE(NULL == frame_out);
1314 CheckOutFrame(frame_out, 9 * size_, false);
1315 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001316 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001317
1318 packet_->markerBit = true;
1319 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001320 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001321}
1322
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001323// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001324TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001325 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1326 // Always start with a key frame.
1327 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001328 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001329 packet_->markerBit = true;
1330 packet_->seqNum = seq_num_;
1331 packet_->timestamp = timestamp_;
1332
1333 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001334 EXPECT_EQ(kCompleteSession,
1335 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001336 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1337 CheckOutFrame(frame_out, size_, false);
1338 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001339 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001340
1341 // An incomplete frame can only be decoded once a subsequent frame has begun
1342 // to arrive. Insert packet in distant frame for this purpose.
1343 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001344 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001345 packet_->markerBit = false;
1346 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001347 packet_->timestamp += 33 * 90 * 8;
1348 EXPECT_EQ(kIncomplete,
1349 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001350 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001351 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001352 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1353
1354 // Insert second frame - an incomplete key frame.
1355 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001356 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001357 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001358 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001359
philipel9d3ab612015-12-21 04:12:39 -08001360 EXPECT_EQ(kIncomplete,
1361 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001362 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001363 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1364
1365 // Insert a few more packets. Make sure we're waiting for the key frame to be
1366 // complete.
johan0d1b2b62017-01-10 04:21:35 -08001367 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001368 for (int i = 1; i < 5; ++i) {
1369 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001370 EXPECT_EQ(kIncomplete,
1371 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001372 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001373 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1374 }
1375
1376 // Complete key frame.
1377 packet_->markerBit = true;
1378 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001379 EXPECT_EQ(kCompleteSession,
1380 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001381 frame_out = DecodeCompleteFrame();
1382 CheckOutFrame(frame_out, 6 * size_, false);
1383 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001384 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001385}
1386
1387// Make sure first packet is present before a frame can be decoded.
philipel85130292016-07-06 16:10:31 +02001388TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001389 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1390 // Always start with a key frame.
1391 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001392 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001393 packet_->markerBit = true;
1394 packet_->seqNum = seq_num_;
1395 packet_->timestamp = timestamp_;
1396
1397 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001398 EXPECT_EQ(kCompleteSession,
1399 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001400 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1401 CheckOutFrame(frame_out, size_, false);
1402 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001403 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001404
1405 // An incomplete frame can only be decoded once a subsequent frame has begun
1406 // to arrive. Insert packet in distant frame for this purpose.
1407 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001408 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001409 packet_->markerBit = false;
1410 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001411 packet_->timestamp += 33 * 90 * 8;
1412 EXPECT_EQ(kIncomplete,
1413 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001414 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001415 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001416 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1417
1418 // Insert second frame with the first packet missing. Make sure we're waiting
1419 // for the key frame to be complete.
1420 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001421 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001422
philipel9d3ab612015-12-21 04:12:39 -08001423 EXPECT_EQ(kIncomplete,
1424 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001425 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001426 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1427
1428 for (int i = 0; i < 5; ++i) {
1429 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001430 EXPECT_EQ(kIncomplete,
1431 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001432 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001433 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1434 }
1435
1436 // Add first packet. Frame should now be decodable, but incomplete.
johan0d1b2b62017-01-10 04:21:35 -08001437 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001438 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001439 EXPECT_EQ(kDecodableSession,
1440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001441 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001442 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1443
1444 frame_out = DecodeIncompleteFrame();
1445 CheckOutFrame(frame_out, 7 * size_, false);
1446 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001447 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001448}
1449
philipel85130292016-07-06 16:10:31 +02001450TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001451 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001452 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001453 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001454 packet_->is_first_packet_in_frame = true;
agalusza@google.comd177c102013-08-08 01:12:33 +00001455 packet_->markerBit = true;
1456 packet_->seqNum = seq_num_;
1457 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001458 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001459 EXPECT_EQ(kCompleteSession,
1460 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001461 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001462 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1463 EXPECT_NE(frame, nullptr);
1464 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1465 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001466 EXPECT_TRUE(frame != NULL);
1467 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001468
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001469 // Drop a complete frame.
1470 timestamp_ += 2 * 33 * 90;
1471 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001472 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001473 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001474 packet_->markerBit = false;
1475 packet_->seqNum = seq_num_;
1476 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001477 EXPECT_EQ(kDecodableSession,
1478 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001479 // Insert a packet (so the previous one will be released).
1480 timestamp_ += 33 * 90;
1481 seq_num_ += 2;
1482 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001483 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001484 packet_->markerBit = false;
1485 packet_->seqNum = seq_num_;
1486 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001487 EXPECT_EQ(kDecodableSession,
1488 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001489 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001490 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1491 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001492}
1493
philipel85130292016-07-06 16:10:31 +02001494TEST_F(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001495 // Verify missing packets statistics and not decodable packets statistics.
1496 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1497 // The last packet is an empty (non-media) packet.
1498
1499 // Select a start seqNum which triggers a difficult wrap situation
1500 // The JB will only output (incomplete)frames if the next one has started
1501 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001502 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001503 seq_num_ = 0xffff - 4;
1504 seq_num_++;
1505 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001506 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001507 packet_->markerBit = false;
1508 packet_->seqNum = seq_num_;
1509 packet_->timestamp = timestamp_;
1510 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001511
1512 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001513 EXPECT_EQ(kDecodableSession,
1514 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001515 for (int i = 0; i < 11; ++i) {
1516 webrtc::FrameType frametype = kVideoFrameDelta;
1517 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001518 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001519 packet_->frameType = frametype;
johan0d1b2b62017-01-10 04:21:35 -08001520 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001521 packet_->markerBit = false;
1522 packet_->seqNum = seq_num_;
1523 packet_->timestamp = timestamp_;
1524 packet_->completeNALU = kNaluStart;
1525
philipel9d3ab612015-12-21 04:12:39 -08001526 EXPECT_EQ(kDecodableSession,
1527 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001528
1529 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1530
1531 // Should not be complete.
1532 EXPECT_TRUE(frame_out == NULL);
1533
1534 seq_num_ += 2;
johan0d1b2b62017-01-10 04:21:35 -08001535 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001536 packet_->markerBit = true;
1537 packet_->seqNum = seq_num_;
1538 packet_->completeNALU = kNaluEnd;
1539
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001540 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1541 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001542
1543 // Insert an empty (non-media) packet.
1544 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001545 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001546 packet_->markerBit = false;
1547 packet_->seqNum = seq_num_;
1548 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001549 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001550
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001551 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001552 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001553 frame_out = DecodeIncompleteFrame();
1554
1555 // One of the packets has been discarded by the jitter buffer.
1556 // Last frame can't be extracted yet.
1557 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001558 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001559
1560 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001561 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001562 } else {
philipel9d3ab612015-12-21 04:12:39 -08001563 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001564 }
1565 EXPECT_FALSE(frame_out->Complete());
1566 EXPECT_FALSE(frame_out->MissingFrame());
1567 }
1568
1569 jitter_buffer_->ReleaseFrame(frame_out);
1570 }
1571
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001572 // Insert 3 old packets and verify that we have 3 discarded packets
1573 // Match value to actual latest timestamp decoded.
1574 timestamp_ -= 33 * 90;
1575 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001576
philipel9d3ab612015-12-21 04:12:39 -08001577 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001578
1579 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001580
philipel9d3ab612015-12-21 04:12:39 -08001581 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001582
1583 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001584
philipel9d3ab612015-12-21 04:12:39 -08001585 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001586
1587 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1588
1589 jitter_buffer_->Flush();
1590
1591 // This statistic shouldn't be reset by a flush.
1592 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1593}
1594
philipel85130292016-07-06 16:10:31 +02001595TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001596 seq_num_ = 0xfff0;
1597 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001598 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001599 packet_->markerBit = false;
1600 packet_->seqNum = seq_num_;
1601 packet_->timestamp = timestamp_;
1602
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001603 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001604 EXPECT_EQ(kIncomplete,
1605 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001606
1607 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1608
1609 EXPECT_TRUE(frame_out == NULL);
1610
1611 int loop = 0;
1612 do {
1613 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001614 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 packet_->markerBit = false;
1616 packet_->seqNum = seq_num_;
1617
philipel9d3ab612015-12-21 04:12:39 -08001618 EXPECT_EQ(kIncomplete,
1619 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620
1621 frame_out = DecodeCompleteFrame();
1622
1623 EXPECT_TRUE(frame_out == NULL);
1624
1625 loop++;
1626 } while (loop < 98);
1627
1628 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001629 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001630 packet_->markerBit = true;
1631 packet_->seqNum = seq_num_;
1632
philipel9d3ab612015-12-21 04:12:39 -08001633 EXPECT_EQ(kCompleteSession,
1634 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001635
1636 frame_out = DecodeCompleteFrame();
1637
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001638 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001639
1640 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001641 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001642}
1643
philipel85130292016-07-06 16:10:31 +02001644TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001645 // Insert "first" packet last seqnum.
1646 seq_num_ = 10;
1647 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001648 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001649 packet_->markerBit = true;
1650 packet_->seqNum = seq_num_;
1651
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001652 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001653 EXPECT_EQ(kIncomplete,
1654 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001655 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1656
1657 // Should not be complete.
1658 EXPECT_TRUE(frame_out == NULL);
1659
1660 // Insert 98 frames.
1661 int loop = 0;
1662 do {
1663 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001664 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001665 packet_->markerBit = false;
1666 packet_->seqNum = seq_num_;
1667
philipel9d3ab612015-12-21 04:12:39 -08001668 EXPECT_EQ(kIncomplete,
1669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001670
1671 frame_out = DecodeCompleteFrame();
1672
1673 EXPECT_TRUE(frame_out == NULL);
1674
1675 loop++;
1676 } while (loop < 98);
1677
1678 // Insert last packet.
1679 seq_num_--;
johan0d1b2b62017-01-10 04:21:35 -08001680 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001681 packet_->markerBit = false;
1682 packet_->seqNum = seq_num_;
1683
philipel9d3ab612015-12-21 04:12:39 -08001684 EXPECT_EQ(kCompleteSession,
1685 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001686
1687 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001688 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001689 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001690 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001691}
1692
philipel85130292016-07-06 16:10:31 +02001693TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001694 // ------- -------
1695 // | 2 | | 1 |
1696 // ------- -------
1697 // t = 3000 t = 2000
1698 seq_num_ = 2;
1699 timestamp_ = 3000;
1700 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001701 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001702 packet_->markerBit = true;
1703 packet_->timestamp = timestamp_;
1704 packet_->seqNum = seq_num_;
1705
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001706 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001707 EXPECT_EQ(kCompleteSession,
1708 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001709
1710 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1711 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001712 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001713 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001714 jitter_buffer_->ReleaseFrame(frame_out);
1715
1716 seq_num_--;
1717 timestamp_ = 2000;
1718 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001719 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001720 packet_->markerBit = true;
1721 packet_->seqNum = seq_num_;
1722 packet_->timestamp = timestamp_;
1723
philipel9d3ab612015-12-21 04:12:39 -08001724 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001725}
1726
philipel85130292016-07-06 16:10:31 +02001727TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001728 // ------- -------
1729 // | 2 | | 1 |
1730 // ------- -------
1731 // t = 3000 t = 0xffffff00
1732
1733 seq_num_ = 2;
1734 timestamp_ = 3000;
1735 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001736 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001737 packet_->markerBit = true;
1738 packet_->seqNum = seq_num_;
1739 packet_->timestamp = timestamp_;
1740
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001741 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001742 EXPECT_EQ(kCompleteSession,
1743 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001744
1745 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1746 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1747
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001748 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001749
1750 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1751
1752 jitter_buffer_->ReleaseFrame(frame_out);
1753
1754 seq_num_--;
1755 timestamp_ = 0xffffff00;
1756 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001757 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001758 packet_->markerBit = true;
1759 packet_->seqNum = seq_num_;
1760 packet_->timestamp = timestamp_;
1761
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001762 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001763 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001764}
1765
philipel85130292016-07-06 16:10:31 +02001766TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001767 // --------------- ---------------
1768 // | 1 | 2 | | 3 | 4 |
1769 // --------------- ---------------
1770 // t = 0xffffff00 t = 33*90
1771
1772 timestamp_ = 0xffffff00;
1773 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001774 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001775 packet_->markerBit = false;
1776 packet_->seqNum = seq_num_;
1777 packet_->timestamp = timestamp_;
1778
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001779 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001780 EXPECT_EQ(kIncomplete,
1781 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001782
1783 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001784 EXPECT_TRUE(frame_out == NULL);
1785
1786 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001787 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001788 packet_->markerBit = true;
1789 packet_->seqNum = seq_num_;
1790
philipel9d3ab612015-12-21 04:12:39 -08001791 EXPECT_EQ(kCompleteSession,
1792 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001793
1794 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001795 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001796 jitter_buffer_->ReleaseFrame(frame_out);
1797
1798 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001799 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001800 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001801 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001802 packet_->markerBit = false;
1803 packet_->seqNum = seq_num_;
1804 packet_->timestamp = timestamp_;
1805
philipel9d3ab612015-12-21 04:12:39 -08001806 EXPECT_EQ(kIncomplete,
1807 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001808
1809 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001810 EXPECT_TRUE(frame_out == NULL);
1811
1812 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001813 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001814 packet_->markerBit = true;
1815 packet_->seqNum = seq_num_;
1816
philipel9d3ab612015-12-21 04:12:39 -08001817 EXPECT_EQ(kCompleteSession,
1818 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001819
1820 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001821 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001822 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001823 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001824}
1825
philipel85130292016-07-06 16:10:31 +02001826TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827 // ------- -------
1828 // | 1 | | 2 |
1829 // ------- -------
1830 // t = 0xffffff00 t = 2700
1831
1832 timestamp_ = 0xffffff00;
1833 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001834 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001835 packet_->markerBit = true;
1836 packet_->timestamp = timestamp_;
1837
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001838 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001839 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001840 EXPECT_EQ(kCompleteSession,
1841 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001842
1843 // Insert next frame.
1844 seq_num_++;
1845 timestamp_ = 2700;
1846 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001847 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001848 packet_->markerBit = true;
1849 packet_->seqNum = seq_num_;
1850 packet_->timestamp = timestamp_;
1851
philipel9d3ab612015-12-21 04:12:39 -08001852 EXPECT_EQ(kCompleteSession,
1853 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001854
1855 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1856 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001857 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001858 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001859 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001860
1861 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1862 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001863 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001864 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001865 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001866}
1867
philipel85130292016-07-06 16:10:31 +02001868TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869 // ------- -------
1870 // | 2 | | 1 |
1871 // ------- -------
1872 // t = 2700 t = 0xffffff00
1873
1874 seq_num_ = 2;
1875 timestamp_ = 2700;
1876 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08001877 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001878 packet_->markerBit = true;
1879 packet_->seqNum = seq_num_;
1880 packet_->timestamp = timestamp_;
1881
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001882 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001883 EXPECT_EQ(kCompleteSession,
1884 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001885
1886 // Insert second frame
1887 seq_num_--;
1888 timestamp_ = 0xffffff00;
1889 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08001890 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001891 packet_->markerBit = true;
1892 packet_->seqNum = seq_num_;
1893 packet_->timestamp = timestamp_;
1894
philipel9d3ab612015-12-21 04:12:39 -08001895 EXPECT_EQ(kCompleteSession,
1896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001897
1898 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1899 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001900 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001901 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001902 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001903
1904 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1905 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001906 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001907 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001908 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001909}
1910
philipel85130292016-07-06 16:10:31 +02001911TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001912 int loop = 0;
1913 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001914 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915 // Insert kMaxPacketsInJitterBuffer into frame.
1916 do {
1917 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001918 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001919 packet_->markerBit = false;
1920 packet_->seqNum = seq_num_;
1921
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001922 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001923 EXPECT_EQ(kIncomplete,
1924 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001925 firstPacket = false;
1926 } else {
philipel9d3ab612015-12-21 04:12:39 -08001927 EXPECT_EQ(kIncomplete,
1928 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001929 }
1930
1931 loop++;
1932 } while (loop < kMaxPacketsInSession);
1933
1934 // Max number of packets inserted.
1935 // Insert one more packet.
1936 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001937 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001938 packet_->markerBit = true;
1939 packet_->seqNum = seq_num_;
1940
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001941 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001942 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001943 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001944}
1945
philipel85130292016-07-06 16:10:31 +02001946TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001947 // TEST fill JB with more than max number of frame (50 delta frames +
1948 // 51 key frames) with wrap in seq_num_
1949 //
1950 // --------------------------------------------------------------
1951 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1952 // --------------------------------------------------------------
1953 // |<-----------delta frames------------->|<------key frames----->|
1954
jbauchdb81ffd2015-11-23 03:59:02 -08001955 // Make sure the jitter doesn't request a keyframe after too much non-
1956 // decodable frames.
1957 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001958 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001959
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001960 int loop = 0;
1961 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001962 uint32_t first_key_frame_timestamp = 0;
1963 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001964 // Insert MAX_NUMBER_OF_FRAMES frames.
1965 do {
philipel9d3ab612015-12-21 04:12:39 -08001966 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001967 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001968 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001969 packet_->markerBit = true;
1970 packet_->seqNum = seq_num_;
1971 packet_->timestamp = timestamp_;
1972
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001973 if (loop == 50) {
1974 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001975 packet_->frameType = kVideoFrameKey;
1976 }
1977
1978 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001979 EXPECT_EQ(kCompleteSession,
1980 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001981
1982 loop++;
1983 } while (loop < kMaxNumberOfFrames);
1984
1985 // Max number of frames inserted.
1986
1987 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001988 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001989 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08001990 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001991 packet_->markerBit = true;
1992 packet_->seqNum = seq_num_;
1993 packet_->timestamp = timestamp_;
1994
1995 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001996 EXPECT_EQ(kFlushIndicator,
1997 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001998
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001999 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2000 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002001 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002002 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002003 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002004}
2005
philipel85130292016-07-06 16:10:31 +02002006TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002007 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002008 seq_num_ = 3;
2009 // Insert one empty packet per frame, should never return the last timestamp
2010 // inserted. Only return empty frames in the presence of subsequent frames.
2011 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002012 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002013 for (int i = 0; i < maxSize + 10; i++) {
2014 timestamp_ += 33 * 90;
2015 seq_num_++;
johan0d1b2b62017-01-10 04:21:35 -08002016 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002017 packet_->markerBit = false;
2018 packet_->seqNum = seq_num_;
2019 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07002020 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002021
philipel9d3ab612015-12-21 04:12:39 -08002022 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002023 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
2024 // Timestamp should never be the last TS inserted.
2025 if (testFrame != NULL) {
2026 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002027 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002028 }
2029 }
2030}
2031
philipel85130292016-07-06 16:10:31 +02002032TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002033 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002034 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002035 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002036 timestamp_ += 33 * 90;
2037 int insertedLength = 0;
2038 packet_->seqNum = seq_num_;
2039 packet_->timestamp = timestamp_;
2040 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002041 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002042 packet_->completeNALU = kNaluStart;
2043 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002044 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002045
philipel9d3ab612015-12-21 04:12:39 -08002046 EXPECT_EQ(kDecodableSession,
2047 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002048
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002049 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002050 packet_->seqNum = seq_num_;
2051 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002052 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002053 packet_->completeNALU = kNaluIncomplete;
2054 packet_->markerBit = false;
2055
philipel9d3ab612015-12-21 04:12:39 -08002056 EXPECT_EQ(kDecodableSession,
2057 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002058
2059 seq_num_++;
2060 packet_->seqNum = seq_num_;
2061 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002062 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002063 packet_->completeNALU = kNaluEnd;
2064 packet_->markerBit = false;
2065
philipel9d3ab612015-12-21 04:12:39 -08002066 EXPECT_EQ(kDecodableSession,
2067 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002068
2069 seq_num_++;
2070 packet_->seqNum = seq_num_;
2071 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002072 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08002073 EXPECT_EQ(kDecodableSession,
2074 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002075 // The JB will only output (incomplete) frames if a packet belonging to a
2076 // subsequent frame was already inserted. Insert one packet of a subsequent
2077 // frame. place high timestamp so the JB would always have a next frame
2078 // (otherwise, for every inserted frame we need to take care of the next
2079 // frame as well).
2080 packet_->seqNum = 1;
2081 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2082 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002083 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002084 packet_->completeNALU = kNaluStart;
2085 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002086
philipel9d3ab612015-12-21 04:12:39 -08002087 EXPECT_EQ(kDecodableSession,
2088 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002089
2090 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2091
2092 // We can decode everything from a NALU until a packet has been lost.
2093 // Thus we can decode the first packet of the first NALU and the second NALU
2094 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002095 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002096 jitter_buffer_->ReleaseFrame(frame_out);
2097
2098 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002099 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002100 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002101 insertedLength = 0;
2102
2103 packet_->seqNum = seq_num_;
2104 packet_->timestamp = timestamp_;
2105 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002106 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002107 packet_->completeNALU = kNaluEnd;
2108 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002109 EXPECT_EQ(kDecodableSession,
2110 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2111 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002112 seq_num_--;
2113 packet_->seqNum = seq_num_;
2114 packet_->timestamp = timestamp_;
2115 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002116 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002117 packet_->completeNALU = kNaluStart;
2118 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002119
philipel9d3ab612015-12-21 04:12:39 -08002120 EXPECT_EQ(kDecodableSession,
2121 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002122 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2123
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002124 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002125 packet_->seqNum = seq_num_;
2126 packet_->timestamp = timestamp_;
2127 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002128 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002129 packet_->completeNALU = kNaluComplete;
2130 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002131 EXPECT_EQ(kDecodableSession,
2132 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002133 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002134 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002135 packet_->seqNum = seq_num_;
2136 packet_->timestamp = timestamp_;
2137 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002138 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002139 packet_->completeNALU = kNaluStart;
2140 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002141 EXPECT_EQ(kDecodableSession,
2142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002143 // This packet should be decoded since it's the beginning of a NAL.
2144 insertedLength += packet_->sizeBytes;
2145
2146 seq_num_ += 2;
2147 packet_->seqNum = seq_num_;
2148 packet_->timestamp = timestamp_;
2149 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002150 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002151 packet_->completeNALU = kNaluEnd;
2152 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002153 EXPECT_EQ(kDecodableSession,
2154 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155 // This packet should not be decoded because it is an incomplete NAL if it
2156 // is the last.
2157 frame_out = DecodeIncompleteFrame();
2158 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002159 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002160 jitter_buffer_->ReleaseFrame(frame_out);
2161
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002162 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002163 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002164 timestamp_ += 33 * 90;
Johan Ahlers37f93af2016-06-29 18:02:54 +02002165 WebRtcRTPHeader rtpHeader;
2166 memset(&rtpHeader, 0, sizeof(rtpHeader));
2167 VCMPacket emptypacket(data_, 0, rtpHeader);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002168 emptypacket.seqNum = seq_num_;
2169 emptypacket.timestamp = timestamp_;
2170 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002171 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002172 emptypacket.completeNALU = kNaluComplete;
2173 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002174 EXPECT_EQ(kCompleteSession,
2175 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002176 // This packet should not be decoded because it is an incomplete NAL if it
2177 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002178
2179 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2180 // has arrived.
2181 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002182 EXPECT_TRUE(frame_out != NULL);
2183 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002184
2185 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002186 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002187 timestamp_ += 33 * 90;
2188
2189 packet_->seqNum = seq_num_;
2190 packet_->timestamp = timestamp_;
2191 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002192 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002193 packet_->completeNALU = kNaluComplete;
2194 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002195
philipel9d3ab612015-12-21 04:12:39 -08002196 EXPECT_EQ(kDecodableSession,
2197 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002198
agalusza@google.comd177c102013-08-08 01:12:33 +00002199 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002200 emptypacket.seqNum = seq_num_;
2201 emptypacket.timestamp = timestamp_;
2202 emptypacket.frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002203 emptypacket.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002204 emptypacket.completeNALU = kNaluComplete;
2205 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002206 EXPECT_EQ(kCompleteSession,
2207 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002208
2209 frame_out = DecodeCompleteFrame();
2210 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002211 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002212 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002213}
2214
philipel85130292016-07-06 16:10:31 +02002215TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002216 // Test that a we cannot get incomplete frames from the JB if we haven't
2217 // received the marker bit, unless we have received a packet from a later
2218 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002219 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002220 // Start with a complete key frame - insert and decode.
2221 packet_->frameType = kVideoFrameKey;
johan0d1b2b62017-01-10 04:21:35 -08002222 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002223 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002224 bool retransmitted = false;
2225
philipel9d3ab612015-12-21 04:12:39 -08002226 EXPECT_EQ(kCompleteSession,
2227 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002228 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2229 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002230 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002231
2232 packet_->seqNum += 2;
2233 packet_->timestamp += 33 * 90;
2234 packet_->frameType = kVideoFrameDelta;
johan0d1b2b62017-01-10 04:21:35 -08002235 packet_->is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002236 packet_->markerBit = false;
2237
philipel9d3ab612015-12-21 04:12:39 -08002238 EXPECT_EQ(kDecodableSession,
2239 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002240
2241 frame_out = DecodeIncompleteFrame();
2242 EXPECT_TRUE(frame_out == NULL);
2243
2244 packet_->seqNum += 2;
2245 packet_->timestamp += 33 * 90;
johan0d1b2b62017-01-10 04:21:35 -08002246 packet_->is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002247
philipel9d3ab612015-12-21 04:12:39 -08002248 EXPECT_EQ(kDecodableSession,
2249 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002250
2251 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002252 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002253 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002254}
2255
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002256TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002257 // Make sure the jitter doesn't request a keyframe after too much non-
2258 // decodable frames.
2259 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002260 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002261 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002262 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002263 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002264 DropFrame(1);
2265 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002266 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002267 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002268 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002269 // This frame will make the jitter buffer recycle frames until a key frame.
2270 // Since none is found it will have to wait until the next key frame before
2271 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002272 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002273 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002274}
2275
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002276TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002277 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002278 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002279 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002280 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002281 // Insert empty packet.
2282 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002283 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002284 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002285 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002286 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002287 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002288 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002289 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002290 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002291 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002292 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002293 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002294}
2295
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002296TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002297 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2298 EXPECT_EQ(0, frame_stats.delta_frames);
2299 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002300
2301 uint32_t framerate = 0;
2302 uint32_t bitrate = 0;
2303 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2304 EXPECT_EQ(0u, framerate);
2305 EXPECT_EQ(0u, bitrate);
2306
2307 // Insert a couple of key and delta frames.
2308 InsertFrame(kVideoFrameKey);
2309 InsertFrame(kVideoFrameDelta);
2310 InsertFrame(kVideoFrameDelta);
2311 InsertFrame(kVideoFrameKey);
2312 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002313 // Decode some of them to make sure the statistics doesn't depend on frames
2314 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002315 EXPECT_TRUE(DecodeCompleteFrame());
2316 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002317 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002318 EXPECT_EQ(3, frame_stats.delta_frames);
2319 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002320
2321 // Insert 20 more frames to get estimates of bitrate and framerate over
2322 // 1 second.
2323 for (int i = 0; i < 20; ++i) {
2324 InsertFrame(kVideoFrameDelta);
2325 }
2326 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2327 // TODO(holmer): The current implementation returns the average of the last
2328 // two framerate calculations, which is why it takes two calls to reach the
2329 // actual framerate. This should be fixed.
2330 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2331 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2332 // Insert 25 more frames to get estimates of bitrate and framerate over
2333 // 2 seconds.
2334 for (int i = 0; i < 25; ++i) {
2335 InsertFrame(kVideoFrameDelta);
2336 }
2337 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2338 EXPECT_EQ(kDefaultFrameRate, framerate);
2339 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2340}
2341
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002342TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2343 // Insert delta frames.
2344 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2345 // Can't decode without a key frame.
2346 EXPECT_FALSE(DecodeCompleteFrame());
2347 InsertFrame(kVideoFrameKey);
2348 // Skip to the next key frame.
2349 EXPECT_TRUE(DecodeCompleteFrame());
2350}
2351
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002352TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2353 InsertFrame(kVideoFrameKey);
2354 EXPECT_TRUE(DecodeCompleteFrame());
2355 const int kNumDeltaFrames = 5;
2356 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2357 InsertFrame(kVideoFrameKey);
2358 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2359 EXPECT_TRUE(DecodeCompleteFrame());
2360 }
2361}
2362
2363TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2364 InsertFrame(kVideoFrameKey);
2365 EXPECT_TRUE(DecodeCompleteFrame());
2366 const int kNumDeltaFrames = 5;
2367 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2368 InsertFrame(kVideoFrameKey);
2369 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2370 InsertFrame(kVideoFrameKey);
2371 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2372 EXPECT_TRUE(DecodeCompleteFrame());
2373 }
2374}
2375
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002376TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2377 InsertFrame(kVideoFrameKey);
2378 EXPECT_TRUE(DecodeCompleteFrame());
2379 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2380 clock_->TimeInMilliseconds());
2381 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2382 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2383 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002384 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002385 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2386 EXPECT_FALSE(DecodeCompleteFrame());
2387 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2388 EXPECT_TRUE(DecodeCompleteFrame());
2389 EXPECT_TRUE(DecodeCompleteFrame());
2390}
2391
philipel85130292016-07-06 16:10:31 +02002392TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002393 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002394 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002395 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002396 InsertFrame(kVideoFrameKey);
2397 EXPECT_TRUE(DecodeCompleteFrame());
2398}
2399
philipel85130292016-07-06 16:10:31 +02002400TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002401 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002402 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002403 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002404
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002405 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2406 // old packet.
2407 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002408 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002409 EXPECT_EQ(kFlushIndicator,
2410 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002411 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002412
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002413 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002414 std::vector<uint16_t> nack_list =
2415 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002416 // No key frame will be requested since the jitter buffer is empty.
2417 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002418 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002419
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002420 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002421 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002422 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002423 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002424
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002425 // The next complete continuous frame isn't a key frame, but we're waiting
2426 // for one.
2427 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002428 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002429 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002430 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002431}
2432
philipel85130292016-07-06 16:10:31 +02002433TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002434 // Insert a key frame and decode it.
2435 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2436 EXPECT_TRUE(DecodeCompleteFrame());
2437
2438 // Insert a frame which should trigger a recycle until the next key frame.
2439 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2440
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002441 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002442 std::vector<uint16_t> nack_list =
2443 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002444 // Verify that the jitter buffer does not request a key frame.
2445 EXPECT_FALSE(request_key_frame);
2446 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002447 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002448 // Verify that we can decode the next frame.
2449 EXPECT_TRUE(DecodeCompleteFrame());
2450}
2451
philipel85130292016-07-06 16:10:31 +02002452TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002453 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002454 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002455 EXPECT_TRUE(DecodeCompleteFrame());
2456
2457 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002458 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002459 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002460 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002461 EXPECT_FALSE(DecodeCompleteFrame());
2462
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002463 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002464 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002465 // The jitter buffer is empty, so we won't request key frames until we get a
2466 // packet.
2467 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002468
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002469 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002470 // Now we have a packet in the jitter buffer, a key frame will be requested
2471 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002472 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002473 // The jitter buffer is empty, so we won't request key frames until we get a
2474 // packet.
2475 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002476 // The next complete continuous frame isn't a key frame, but we're waiting
2477 // for one.
2478 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002479 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002480 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002481 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002482 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002483}
2484
philipel85130292016-07-06 16:10:31 +02002485TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002486 DropFrame(10);
2487 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002488 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002489 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002490 std::vector<uint16_t> nack_list =
2491 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002492 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002493 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002494 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002495}
2496
philipel85130292016-07-06 16:10:31 +02002497TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002498 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002499 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002500 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002501 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002502 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002503 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002504 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002505 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002506 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02002507 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002508}
2509
philipel85130292016-07-06 16:10:31 +02002510TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002511 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002512 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2513 clock_->TimeInMilliseconds());
2514 VCMPacket packet;
2515 stream_generator_->PopPacket(&packet, 0);
2516 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002517 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002518 EXPECT_FALSE(retransmitted);
2519 // Drop second packet.
2520 stream_generator_->PopPacket(&packet, 1);
2521 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2522 EXPECT_FALSE(retransmitted);
2523 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002524 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002525 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002526 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002527 EXPECT_EQ(1u, nack_list.size());
2528 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002529 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002530 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002531 EXPECT_EQ(kCompleteSession,
2532 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002533 EXPECT_TRUE(retransmitted);
2534 EXPECT_TRUE(DecodeCompleteFrame());
2535}
2536
philipel85130292016-07-06 16:10:31 +02002537TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002538 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002539 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002540 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002541 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002542 // Drop second packet.
2543 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2544 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002545 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002546 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002547 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002548 ASSERT_EQ(1u, nack_list.size());
2549 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002550 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002551 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002552 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002553}
2554
philipel85130292016-07-06 16:10:31 +02002555TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002556 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002557 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002558 // First frame is delta.
2559 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2560 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002561 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002562 // Drop second packet in frame.
2563 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2564 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2565 // Second frame is key.
2566 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2567 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002568 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002569 // Drop second packet in frame.
2570 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2571 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002572 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002573 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002574 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02002575 ASSERT_EQ(1u, nack_list.size());
2576 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002577 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002578 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002579}
2580
philipel85130292016-07-06 16:10:31 +02002581TEST_F(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002582 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002583 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002584
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002585 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002586 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002587
2588 // ----------------------------------------------------------------
2589 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2590 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002591 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002592 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002593 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002594 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002595 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002596 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002597 while (stream_generator_->PacketsRemaining() > 1) {
2598 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002599 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002600 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002601 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002602 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002603 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002604 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002605 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002606 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002607 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002608 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002609
2610 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002611 std::vector<uint16_t> nack_list =
2612 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002613 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02002614 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002615 for (size_t i = 0; i < nack_list.size(); ++i)
2616 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002617}
2618
philipel85130292016-07-06 16:10:31 +02002619TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002620 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002621 // ------- ------------------------------------------------------------
2622 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2623 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002624 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002625 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002626 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002627 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002628 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002629 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002630 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002631 while (stream_generator_->PacketsRemaining() > 1) {
2632 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002633 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002634 EXPECT_FALSE(request_key_frame);
2635 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002636 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002637 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002638 }
2639 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002640 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002641 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002642 EXPECT_FALSE(DecodeCompleteFrame());
2643 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002644 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002645 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002646 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002647 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02002648 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2649 for (size_t i = 0; i < nack_list.size(); ++i)
2650 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002651}
2652
philipel85130292016-07-06 16:10:31 +02002653TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002654 bool request_key_frame = false;
2655 // -----------------------------------
2656 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2657 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002658 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002659 InsertFrame(kVideoFrameKey);
2660 EXPECT_FALSE(request_key_frame);
2661 EXPECT_TRUE(DecodeCompleteFrame());
2662 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2663 clock_->TimeInMilliseconds());
2664 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2665 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002666 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002667 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002668 EXPECT_FALSE(request_key_frame);
2669 } else {
2670 stream_generator_->NextPacket(NULL); // Drop packet
2671 }
2672 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2673 clock_->TimeInMilliseconds());
2674 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2675 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002676 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002677 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002678 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002679 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002680 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02002681 ASSERT_EQ(1u, nack_list.size());
2682 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002683}
2684
philipel85130292016-07-06 16:10:31 +02002685TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002686 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002687 InsertFrame(kVideoFrameKey);
2688 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002689 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002690 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2691 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002692
2693 // Far-into-the-future video frame, could be caused by resetting the encoder
2694 // or otherwise restarting. This should not fail when error when the packet is
2695 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002696 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002697 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2698 InsertFrame(kVideoFrameKey);
2699 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002700 nack_list = jitter_buffer_->GetNackList(&extended);
2701 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002702
2703 // Stream should be decodable from this point.
2704 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2705 InsertFrame(kVideoFrameDelta);
2706 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002707 nack_list = jitter_buffer_->GetNackList(&extended);
2708 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002709}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002710} // namespace webrtc