blob: e75d1771b3634f8c69913d63cb97dcc924e84b47 [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>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000015
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000016#include "testing/gtest/include/gtest/gtest.h"
philipel83f831a2016-03-12 03:30:23 -080017#include "testing/gmock/include/gmock/gmock.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/frame_buffer.h"
19#include "webrtc/modules/video_coding/jitter_buffer.h"
20#include "webrtc/modules/video_coding/media_opt_util.h"
21#include "webrtc/modules/video_coding/packet.h"
22#include "webrtc/modules/video_coding/test/stream_generator.h"
23#include "webrtc/modules/video_coding/test/test_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010024#include "webrtc/system_wrappers/include/clock.h"
philipel83f831a2016-03-12 03:30:23 -080025#include "webrtc/system_wrappers/include/field_trial.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010026#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070027#include "webrtc/system_wrappers/include/metrics_default.h"
philipel83f831a2016-03-12 03:30:23 -080028#include "webrtc/test/field_trial.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000029
30namespace webrtc {
31
asapersson9a4cd872015-10-23 00:27:14 -070032namespace {
philipel9d3ab612015-12-21 04:12:39 -080033const uint32_t kProcessIntervalSec = 60;
asapersson9a4cd872015-10-23 00:27:14 -070034} // namespace
35
36class Vp9SsMapTest : public ::testing::Test {
37 protected:
philipel9d3ab612015-12-21 04:12:39 -080038 Vp9SsMapTest() : packet_(data_, 1400, 1234, 1, true) {}
asapersson9a4cd872015-10-23 00:27:14 -070039
40 virtual void SetUp() {
41 packet_.isFirstPacket = true;
42 packet_.markerBit = true;
43 packet_.frameType = kVideoFrameKey;
44 packet_.codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -070045 packet_.video_header.codec = kRtpVideoVp9;
46 packet_.video_header.codecHeader.VP9.flexible_mode = false;
47 packet_.video_header.codecHeader.VP9.gof_idx = 0;
48 packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
49 packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
50 packet_.video_header.codecHeader.VP9.ss_data_available = true;
51 packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -070052 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
53 }
54
55 Vp9SsMap map_;
56 uint8_t data_[1500];
57 VCMPacket packet_;
58};
59
60TEST_F(Vp9SsMapTest, Insert) {
61 EXPECT_TRUE(map_.Insert(packet_));
62}
63
64TEST_F(Vp9SsMapTest, Insert_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -070065 packet_.video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -070066 EXPECT_FALSE(map_.Insert(packet_));
67}
68
69TEST_F(Vp9SsMapTest, Find) {
70 EXPECT_TRUE(map_.Insert(packet_));
71 Vp9SsMap::SsMap::iterator it;
72 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
73 EXPECT_EQ(packet_.timestamp, it->first);
74}
75
76TEST_F(Vp9SsMapTest, Find_WithWrap) {
77 const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
78 const uint32_t kSsTimestamp2 = 100;
79 packet_.timestamp = kSsTimestamp1;
80 EXPECT_TRUE(map_.Insert(packet_));
81 packet_.timestamp = kSsTimestamp2;
82 EXPECT_TRUE(map_.Insert(packet_));
83 Vp9SsMap::SsMap::iterator it;
84 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
85 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
86 EXPECT_EQ(kSsTimestamp1, it->first);
87 EXPECT_TRUE(map_.Find(0, &it));
88 EXPECT_EQ(kSsTimestamp1, it->first);
89 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
90 EXPECT_EQ(kSsTimestamp1, it->first);
91 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
92 EXPECT_EQ(kSsTimestamp2, it->first);
93 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
94 EXPECT_EQ(kSsTimestamp2, it->first);
95}
96
97TEST_F(Vp9SsMapTest, Reset) {
98 EXPECT_TRUE(map_.Insert(packet_));
99 Vp9SsMap::SsMap::iterator it;
100 EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
101 EXPECT_EQ(packet_.timestamp, it->first);
102
103 map_.Reset();
104 EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
105}
106
107TEST_F(Vp9SsMapTest, RemoveOld) {
108 Vp9SsMap::SsMap::iterator it;
109 const uint32_t kSsTimestamp1 = 10000;
110 packet_.timestamp = kSsTimestamp1;
111 EXPECT_TRUE(map_.Insert(packet_));
112
113 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
114 map_.RemoveOld(kTimestamp - 1); // Interval not passed.
115 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed.
116
117 map_.RemoveOld(kTimestamp);
118 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
119 EXPECT_TRUE(map_.Find(kTimestamp, &it));
120 EXPECT_EQ(kTimestamp, it->first);
121}
122
123TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
124 Vp9SsMap::SsMap::iterator it;
125 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
126 const uint32_t kSsTimestamp2 = 10;
127 const uint32_t kSsTimestamp3 = 1000;
128 packet_.timestamp = kSsTimestamp1;
129 EXPECT_TRUE(map_.Insert(packet_));
130 packet_.timestamp = kSsTimestamp2;
131 EXPECT_TRUE(map_.Insert(packet_));
132 packet_.timestamp = kSsTimestamp3;
133 EXPECT_TRUE(map_.Insert(packet_));
134
135 map_.RemoveOld(kSsTimestamp3);
136 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
137 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
138 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
139}
140
141TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
isheriff6b4b5f32016-06-08 00:24:21 -0700142 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700143 EXPECT_FALSE(map_.UpdatePacket(&packet_));
144}
145
146TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
147 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700148 packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
asapersson9a4cd872015-10-23 00:27:14 -0700149 EXPECT_FALSE(map_.UpdatePacket(&packet_));
150}
151
152TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
153 EXPECT_TRUE(map_.Insert(packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700154 packet_.video_header.codecHeader.VP9.gof_idx = 4;
asapersson9a4cd872015-10-23 00:27:14 -0700155 EXPECT_FALSE(map_.UpdatePacket(&packet_));
156}
157
158TEST_F(Vp9SsMapTest, UpdatePacket) {
159 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2..
160
isheriff6b4b5f32016-06-08 00:24:21 -0700161 packet_.video_header.codecHeader.VP9.gof_idx = 0;
asapersson9a4cd872015-10-23 00:27:14 -0700162 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700163 EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
164 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
165 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
166 EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
asapersson9a4cd872015-10-23 00:27:14 -0700167
isheriff6b4b5f32016-06-08 00:24:21 -0700168 packet_.video_header.codecHeader.VP9.gof_idx = 1;
asapersson9a4cd872015-10-23 00:27:14 -0700169 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700170 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
171 EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
172 EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
173 EXPECT_EQ(1, 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 = 2;
asapersson9a4cd872015-10-23 00:27:14 -0700176 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700177 EXPECT_EQ(1, 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(2, 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 = 3;
asapersson9a4cd872015-10-23 00:27:14 -0700183 EXPECT_TRUE(map_.UpdatePacket(&packet_));
isheriff6b4b5f32016-06-08 00:24:21 -0700184 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
185 EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
186 EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
187 EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
188 EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
asapersson9a4cd872015-10-23 00:27:14 -0700189}
190
philipel83f831a2016-03-12 03:30:23 -0800191class ProcessThreadMock : public ProcessThread {
192 public:
193 MOCK_METHOD0(Start, void());
194 MOCK_METHOD0(Stop, void());
195 MOCK_METHOD1(WakeUp, void(Module* module));
196 MOCK_METHOD1(RegisterModule, void(Module* module));
197 MOCK_METHOD1(DeRegisterModule, void(Module* module));
tommi435f98b2016-05-28 14:57:15 -0700198 void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
philipel83f831a2016-03-12 03:30:23 -0800199};
200
201class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
202 public NackSender,
203 public KeyFrameRequestSender {
204 public:
205 void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
206 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
207 sequence_numbers.end());
208 }
209
210 void RequestKeyFrame() override { ++keyframe_requests_; }
211
212 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
213 std::vector<uint16_t> nack_sent_;
214 int keyframe_requests_;
215
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000216 protected:
philipel83f831a2016-03-12 03:30:23 -0800217 TestBasicJitterBuffer() : scoped_field_trial_(GetParam()) {}
nisseef8b61e2016-04-29 06:09:15 -0700218 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000219 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -0700220 jitter_buffer_.reset(new VCMJitterBuffer(
221 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800222 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
223 this,
224 this));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000225 jitter_buffer_->Start();
226 seq_num_ = 1234;
227 timestamp_ = 0;
228 size_ = 1400;
229 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
230 data_[0] = 0;
231 data_[1] = 0;
232 data_[2] = 0x80;
233 int count = 3;
234 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
235 data_[i] = count;
236 count++;
237 if (count == 10) {
238 data_[i + 1] = 0;
239 data_[i + 2] = 0;
240 data_[i + 3] = 0x80;
241 count = 3;
242 i += 3;
243 }
244 }
245 packet_.reset(new VCMPacket(data_, size_, seq_num_, timestamp_, true));
246 }
247
248 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700249 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000250 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -0700251 return nullptr;
252 return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000253 }
254
255 VCMEncodedFrame* DecodeIncompleteFrame() {
256 uint32_t timestamp = 0;
257 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
258 if (!found_frame)
259 return NULL;
260 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
261 return frame;
262 }
agalusza@google.comd177c102013-08-08 01:12:33 +0000263
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000264 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -0800265 unsigned int size,
266 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000267 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000268
269 const uint8_t* outData = frame_out->Buffer();
270 unsigned int i = 0;
271
272 if (startCode) {
273 EXPECT_EQ(0, outData[0]);
274 EXPECT_EQ(0, outData[1]);
275 EXPECT_EQ(0, outData[2]);
276 EXPECT_EQ(1, outData[3]);
277 i += 4;
278 }
279
280 EXPECT_EQ(size, frame_out->Length());
281 int count = 3;
282 for (; i < size; i++) {
283 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
284 i += 2;
285 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
286 EXPECT_EQ(0, outData[0]);
287 EXPECT_EQ(0, outData[1]);
288 EXPECT_EQ(0, outData[2]);
289 EXPECT_EQ(1, outData[3]);
290 i += 3;
291 } else {
292 EXPECT_EQ(count, outData[i]);
293 count++;
294 if (count == 10) {
295 count = 3;
296 }
297 }
298 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000299 }
300
301 uint16_t seq_num_;
302 uint32_t timestamp_;
303 int size_;
304 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800305 std::unique_ptr<VCMPacket> packet_;
306 std::unique_ptr<SimulatedClock> clock_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000307 NullEventFactory event_factory_;
kwiberg3f55dea2016-02-29 05:51:59 -0800308 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
philipel83f831a2016-03-12 03:30:23 -0800309 test::ScopedFieldTrials scoped_field_trial_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000310};
311
philipel83f831a2016-03-12 03:30:23 -0800312INSTANTIATE_TEST_CASE_P(
313 TestWithNackModule,
314 TestBasicJitterBuffer,
315 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
316 "WebRTC-NewVideoJitterBuffer/Disabled/"));
317
318class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
319 public NackSender,
320 public KeyFrameRequestSender {
321 public:
322 void SendNack(const std::vector<uint16_t>& sequence_numbers) {
323 nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
324 sequence_numbers.end());
325 }
326
327 void RequestKeyFrame() { ++keyframe_requests_; }
328
329 ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
330 std::vector<uint16_t> nack_sent_;
331 int keyframe_requests_;
332
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000333 protected:
334 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000335
336 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000337 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000338 max_nack_list_size_ = 150;
339 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700340 jitter_buffer_ = new VCMJitterBuffer(
341 clock_.get(),
philipel83f831a2016-03-12 03:30:23 -0800342 std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
343 this, this);
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700344 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000345 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800346 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
347 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000348 memset(data_buffer_, 0, kDataBufferSize);
349 }
350
351 virtual void TearDown() {
352 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000353 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000354 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000355 }
356
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000357 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000358 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000359 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000360 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000361 EXPECT_TRUE(packet_available);
362 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000363 return kGeneralError; // Return here to avoid crashes below.
364 bool retransmitted = false;
365 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000366 }
367
368 VCMFrameBufferEnum InsertPacket(int index) {
369 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000370 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000371 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000372 EXPECT_TRUE(packet_available);
373 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000374 return kGeneralError; // Return here to avoid crashes below.
375 bool retransmitted = false;
376 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000377 }
378
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000379 VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700380 stream_generator_->GenerateFrame(
381 frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
382 (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000383 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000384 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000385 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000386 }
387
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000388 VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
389 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000390 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000391 VCMFrameBufferEnum ret = InsertFrame(frame_type);
392 if (ret < kNoError) {
393 ret_for_all = ret;
394 } else if (ret_for_all >= kNoError) {
395 ret_for_all = ret;
396 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000397 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000398 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000399 }
400
401 void DropFrame(int num_packets) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000402 stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000403 clock_->TimeInMilliseconds());
404 for (int i = 0; i < num_packets; ++i)
405 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000406 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000407 }
408
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000409 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700410 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000411 if (!found_frame)
412 return false;
413
isheriff6b4b5f32016-06-08 00:24:21 -0700414 VCMEncodedFrame* frame =
415 jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000416 bool ret = (frame != NULL);
417 jitter_buffer_->ReleaseFrame(frame);
418 return ret;
419 }
420
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +0000421 bool DecodeIncompleteFrame() {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000422 uint32_t timestamp = 0;
423 bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
424 if (!found_frame)
425 return false;
426 VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000427 bool ret = (frame != NULL);
428 jitter_buffer_->ReleaseFrame(frame);
429 return ret;
430 }
431
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000432 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000433 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800434 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000435 NullEventFactory event_factory_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000436 size_t max_nack_list_size_;
437 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000438 uint8_t data_buffer_[kDataBufferSize];
439};
440
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000441class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000442 protected:
philipel83f831a2016-03-12 03:30:23 -0800443 TestJitterBufferNack() : scoped_field_trial_(GetParam()) {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000444 virtual void SetUp() {
445 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000446 jitter_buffer_->SetNackMode(kNack, -1, -1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000447 }
448
philipel9d3ab612015-12-21 04:12:39 -0800449 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
philipel83f831a2016-03-12 03:30:23 -0800450
451 test::ScopedFieldTrials scoped_field_trial_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000452};
453
philipel83f831a2016-03-12 03:30:23 -0800454INSTANTIATE_TEST_CASE_P(
455 TestWithNackModule,
456 TestJitterBufferNack,
457 ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
458 "WebRTC-NewVideoJitterBuffer/Disabled/"));
459
460TEST_P(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000461 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000462 EXPECT_TRUE(NULL == DecodeCompleteFrame());
463 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
464 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000465 // Allow selective errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000466 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +0000467
468 // No packets inserted.
469 EXPECT_TRUE(NULL == DecodeCompleteFrame());
470 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
471
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000472 // Allow decoding with errors.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000473 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000474
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000475 // No packets inserted.
476 EXPECT_TRUE(NULL == DecodeCompleteFrame());
477 EXPECT_TRUE(NULL == DecodeIncompleteFrame());
478}
479
philipel83f831a2016-03-12 03:30:23 -0800480TEST_P(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000481 // Always start with a complete key frame when not allowing errors.
482 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000483 packet_->frameType = kVideoFrameKey;
484 packet_->isFirstPacket = true;
485 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000486 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000487
488 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000489 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800490 EXPECT_EQ(kCompleteSession,
491 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000492 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000493 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000494 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000495 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000496}
497
philipel83f831a2016-03-12 03:30:23 -0800498TEST_P(TestBasicJitterBuffer, VerifyHistogramStats) {
asapersson01d70a32016-05-20 06:29:46 -0700499 metrics::Reset();
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200500 // Always start with a complete key frame when not allowing errors.
501 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
502 packet_->frameType = kVideoFrameKey;
503 packet_->isFirstPacket = true;
504 packet_->markerBit = true;
505 packet_->timestamp += 123 * 90;
506
507 // Insert single packet frame to the jitter buffer and get a frame.
508 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800509 EXPECT_EQ(kCompleteSession,
510 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200511 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
512 CheckOutFrame(frame_out, size_, false);
513 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
514 jitter_buffer_->ReleaseFrame(frame_out);
515
516 // Verify that histograms are updated when the jitter buffer is stopped.
517 clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
518 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700519 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
520 EXPECT_EQ(1,
521 metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
philipel9d3ab612015-12-21 04:12:39 -0800522 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700523 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
philipel9d3ab612015-12-21 04:12:39 -0800524 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700525 1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200526
527 // Verify that histograms are not updated if stop is called again.
528 jitter_buffer_->Stop();
asapersson01d70a32016-05-20 06:29:46 -0700529 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
530 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
philipel9d3ab612015-12-21 04:12:39 -0800531 EXPECT_EQ(
asapersson01d70a32016-05-20 06:29:46 -0700532 1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
533 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
Ã…sa Perssona96f02b2015-04-24 08:52:11 +0200534}
535
philipel83f831a2016-03-12 03:30:23 -0800536TEST_P(TestBasicJitterBuffer, DualPacketFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000537 packet_->frameType = kVideoFrameKey;
538 packet_->isFirstPacket = true;
539 packet_->markerBit = false;
540
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000541 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800542 EXPECT_EQ(kIncomplete,
543 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000544 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
545 // Should not be complete.
546 EXPECT_TRUE(frame_out == NULL);
547
548 ++seq_num_;
549 packet_->isFirstPacket = false;
550 packet_->markerBit = true;
551 packet_->seqNum = seq_num_;
552
philipel9d3ab612015-12-21 04:12:39 -0800553 EXPECT_EQ(kCompleteSession,
554 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000555
556 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000557 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000558
559 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000560 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561}
562
philipel83f831a2016-03-12 03:30:23 -0800563TEST_P(TestBasicJitterBuffer, 100PacketKeyFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564 packet_->frameType = kVideoFrameKey;
565 packet_->isFirstPacket = true;
566 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000567
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000568 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800569 EXPECT_EQ(kIncomplete,
570 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000571
572 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
573
574 // Frame should not be complete.
575 EXPECT_TRUE(frame_out == NULL);
576
577 // Insert 98 frames.
578 int loop = 0;
579 do {
580 seq_num_++;
581 packet_->isFirstPacket = false;
582 packet_->markerBit = false;
583 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000584
philipel9d3ab612015-12-21 04:12:39 -0800585 EXPECT_EQ(kIncomplete,
586 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587 loop++;
588 } while (loop < 98);
589
590 // Insert last packet.
591 ++seq_num_;
592 packet_->isFirstPacket = false;
593 packet_->markerBit = true;
594 packet_->seqNum = seq_num_;
595
philipel9d3ab612015-12-21 04:12:39 -0800596 EXPECT_EQ(kCompleteSession,
597 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000598
599 frame_out = DecodeCompleteFrame();
600
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000601 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000602 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000603 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000604}
605
philipel83f831a2016-03-12 03:30:23 -0800606TEST_P(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000607 // Always start with a complete key frame.
608 packet_->frameType = kVideoFrameKey;
609 packet_->isFirstPacket = true;
610 packet_->markerBit = true;
611
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000612 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800613 EXPECT_EQ(kCompleteSession,
614 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000615 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
616 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000617 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000618
619 ++seq_num_;
620 packet_->seqNum = seq_num_;
621 packet_->markerBit = false;
622 packet_->frameType = kVideoFrameDelta;
623 packet_->timestamp += 33 * 90;
624
philipel9d3ab612015-12-21 04:12:39 -0800625 EXPECT_EQ(kIncomplete,
626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000627
628 frame_out = DecodeCompleteFrame();
629
630 // Frame should not be complete.
631 EXPECT_TRUE(frame_out == NULL);
632
633 packet_->isFirstPacket = false;
634 // Insert 98 frames.
635 int loop = 0;
636 do {
637 ++seq_num_;
638 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000639
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000640 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800641 EXPECT_EQ(kIncomplete,
642 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000643 loop++;
644 } while (loop < 98);
645
646 // Insert the last packet.
647 ++seq_num_;
648 packet_->isFirstPacket = false;
649 packet_->markerBit = true;
650 packet_->seqNum = seq_num_;
651
philipel9d3ab612015-12-21 04:12:39 -0800652 EXPECT_EQ(kCompleteSession,
653 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000654
655 frame_out = DecodeCompleteFrame();
656
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000657 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000658 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000659 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000660}
661
philipel83f831a2016-03-12 03:30:23 -0800662TEST_P(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000663 // Insert the "first" packet last.
664 seq_num_ += 100;
665 packet_->frameType = kVideoFrameKey;
666 packet_->isFirstPacket = false;
667 packet_->markerBit = true;
668 packet_->seqNum = seq_num_;
669 packet_->timestamp = timestamp_;
670
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000671 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800672 EXPECT_EQ(kIncomplete,
673 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000674
675 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
676
677 EXPECT_TRUE(frame_out == NULL);
678
679 // Insert 98 packets.
680 int loop = 0;
681 do {
682 seq_num_--;
683 packet_->isFirstPacket = false;
684 packet_->markerBit = false;
685 packet_->seqNum = seq_num_;
686
philipel9d3ab612015-12-21 04:12:39 -0800687 EXPECT_EQ(kIncomplete,
688 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000689 loop++;
690 } while (loop < 98);
691
692 // Insert the last packet.
693 seq_num_--;
694 packet_->isFirstPacket = true;
695 packet_->markerBit = false;
696 packet_->seqNum = seq_num_;
697
philipel9d3ab612015-12-21 04:12:39 -0800698 EXPECT_EQ(kCompleteSession,
699 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000700
philipel9d3ab612015-12-21 04:12:39 -0800701 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000702
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000703 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000704
705 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000706 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000707}
708
philipel83f831a2016-03-12 03:30:23 -0800709TEST_P(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000710 packet_->frameType = kVideoFrameDelta;
711 packet_->isFirstPacket = true;
712 packet_->markerBit = false;
713
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000714 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800715 EXPECT_EQ(kIncomplete,
716 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000717
718 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
719
720 EXPECT_TRUE(frame_out == NULL);
721
722 seq_num_++;
723 packet_->isFirstPacket = false;
724 packet_->markerBit = true;
725 packet_->seqNum = seq_num_;
726
philipel9d3ab612015-12-21 04:12:39 -0800727 EXPECT_EQ(kCompleteSession,
728 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000729
730 // check that we fail to get frame since seqnum is not continuous
731 frame_out = DecodeCompleteFrame();
732 EXPECT_TRUE(frame_out == NULL);
733
734 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800735 timestamp_ -= 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000736 packet_->frameType = kVideoFrameKey;
737 packet_->isFirstPacket = true;
738 packet_->markerBit = false;
739 packet_->seqNum = seq_num_;
740 packet_->timestamp = timestamp_;
741
philipel9d3ab612015-12-21 04:12:39 -0800742 EXPECT_EQ(kIncomplete,
743 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000744
745 frame_out = DecodeCompleteFrame();
746
747 // It should not be complete.
748 EXPECT_TRUE(frame_out == NULL);
749
750 seq_num_++;
751 packet_->isFirstPacket = false;
752 packet_->markerBit = true;
753 packet_->seqNum = seq_num_;
754
philipel9d3ab612015-12-21 04:12:39 -0800755 EXPECT_EQ(kCompleteSession,
756 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000757
758 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000759 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000760 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000761 jitter_buffer_->ReleaseFrame(frame_out);
762
763 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000764 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000765 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000766 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000767}
768
philipel83f831a2016-03-12 03:30:23 -0800769TEST_P(TestBasicJitterBuffer, TestReorderingWithPadding) {
Noah Richardse4cb4e92015-05-22 14:03:00 -0700770 packet_->frameType = kVideoFrameKey;
771 packet_->isFirstPacket = true;
772 packet_->markerBit = true;
773
774 // Send in an initial good packet/frame (Frame A) to start things off.
775 bool retransmitted = false;
776 EXPECT_EQ(kCompleteSession,
777 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
778 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
779 EXPECT_TRUE(frame_out != NULL);
780 jitter_buffer_->ReleaseFrame(frame_out);
781
782 // Now send in a complete delta frame (Frame C), but with a sequence number
783 // gap. No pic index either, so no temporal scalability cheating :)
784 packet_->frameType = kVideoFrameDelta;
785 // Leave a gap of 2 sequence numbers and two frames.
786 packet_->seqNum = seq_num_ + 3;
787 packet_->timestamp = timestamp_ + (66 * 90);
788 // Still isFirst = marker = true.
789 // Session should be complete (frame is complete), but there's nothing to
790 // decode yet.
791 EXPECT_EQ(kCompleteSession,
792 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
793 frame_out = DecodeCompleteFrame();
794 EXPECT_TRUE(frame_out == NULL);
795
796 // Now send in a complete delta frame (Frame B) that is continuous from A, but
797 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
798 packet_->seqNum = seq_num_ + 1;
799 packet_->timestamp = timestamp_ + (33 * 90);
800 // Still isFirst = marker = true.
801 EXPECT_EQ(kCompleteSession,
802 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
803 frame_out = DecodeCompleteFrame();
804 EXPECT_TRUE(frame_out != NULL);
805 jitter_buffer_->ReleaseFrame(frame_out);
806
807 // But Frame C isn't continuous yet.
808 frame_out = DecodeCompleteFrame();
809 EXPECT_TRUE(frame_out == NULL);
810
811 // Add in the padding. These are empty packets (data length is 0) with no
812 // marker bit and matching the timestamp of Frame B.
813 VCMPacket empty_packet(data_, 0, seq_num_ + 2, timestamp_ + (33 * 90), false);
814 EXPECT_EQ(kOldPacket,
815 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
816 empty_packet.seqNum += 1;
817 EXPECT_EQ(kOldPacket,
818 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
819
820 // But now Frame C should be ready!
821 frame_out = DecodeCompleteFrame();
822 EXPECT_TRUE(frame_out != NULL);
823 jitter_buffer_->ReleaseFrame(frame_out);
824}
825
philipel83f831a2016-03-12 03:30:23 -0800826TEST_P(TestBasicJitterBuffer, DuplicatePackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000827 packet_->frameType = kVideoFrameKey;
828 packet_->isFirstPacket = true;
829 packet_->markerBit = false;
830 packet_->seqNum = seq_num_;
831 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000832 EXPECT_EQ(0, jitter_buffer_->num_packets());
833 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000834
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000835 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800836 EXPECT_EQ(kIncomplete,
837 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000838
839 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
840
841 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000842 EXPECT_EQ(1, jitter_buffer_->num_packets());
843 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000844
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000845 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800846 EXPECT_EQ(kDuplicatePacket,
847 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000848 EXPECT_EQ(2, jitter_buffer_->num_packets());
849 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000850
851 seq_num_++;
852 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000853 packet_->markerBit = true;
854 packet_->isFirstPacket = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000855
philipel9d3ab612015-12-21 04:12:39 -0800856 EXPECT_EQ(kCompleteSession,
857 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000858
859 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000860 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000861 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000862
863 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000864 EXPECT_EQ(3, jitter_buffer_->num_packets());
865 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000866 jitter_buffer_->ReleaseFrame(frame_out);
867}
868
philipel83f831a2016-03-12 03:30:23 -0800869TEST_P(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000870 packet_->frameType = kVideoFrameKey;
871 packet_->isFirstPacket = true;
872 packet_->markerBit = true;
873 packet_->seqNum = seq_num_;
874 packet_->timestamp = timestamp_;
875 jitter_buffer_->SetDecodeErrorMode(kNoErrors);
876 EXPECT_EQ(0, jitter_buffer_->num_packets());
877 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
878
879 bool retransmitted = false;
880 // Insert first complete frame.
881 EXPECT_EQ(kCompleteSession,
882 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
883
884 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
885 ASSERT_TRUE(frame_out != NULL);
886 CheckOutFrame(frame_out, size_, false);
887 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
888 jitter_buffer_->ReleaseFrame(frame_out);
889
890 // Insert 3 delta frames.
891 for (uint16_t i = 1; i <= 3; ++i) {
892 packet_->seqNum = seq_num_ + i;
893 packet_->timestamp = timestamp_ + (i * 33) * 90;
894 packet_->frameType = kVideoFrameDelta;
895 EXPECT_EQ(kCompleteSession,
896 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
897 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
898 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
899 }
900
901 // Retransmit second delta frame.
902 packet_->seqNum = seq_num_ + 2;
903 packet_->timestamp = timestamp_ + 66 * 90;
904
905 EXPECT_EQ(kDuplicatePacket,
906 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
907
908 EXPECT_EQ(5, jitter_buffer_->num_packets());
909 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
910
911 // Should be able to decode 3 delta frames, key frame already decoded.
912 for (size_t i = 0; i < 3; ++i) {
913 frame_out = DecodeCompleteFrame();
914 ASSERT_TRUE(frame_out != NULL);
915 CheckOutFrame(frame_out, size_, false);
916 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
917 jitter_buffer_->ReleaseFrame(frame_out);
918 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000919}
920
philipel83f831a2016-03-12 03:30:23 -0800921TEST_P(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700922 // Verify that JB skips forward to next base layer frame.
923 // -------------------------------------------------
924 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
925 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
926 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
927 // | ss | x | x | x | |
928 // -------------------------------------------------
929 // |<----------tl0idx:200--------->|<---tl0idx:201---
930
931 bool re = false;
932 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700933 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700934 packet_->isFirstPacket = true;
935 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700936 packet_->video_header.codecHeader.VP9.flexible_mode = false;
937 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
938 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
939 packet_->video_header.codecHeader.VP9.end_of_frame = true;
940 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700941
942 packet_->seqNum = 65485;
943 packet_->timestamp = 1000;
944 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -0700945 packet_->video_header.codecHeader.VP9.picture_id = 5;
946 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
947 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
948 packet_->video_header.codecHeader.VP9.ss_data_available = true;
949 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700950 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
951 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
952
953 // Insert next temporal layer 0.
954 packet_->seqNum = 65489;
955 packet_->timestamp = 13000;
956 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700957 packet_->video_header.codecHeader.VP9.picture_id = 9;
958 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
959 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
960 packet_->video_header.codecHeader.VP9.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700961 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
962
963 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
964 EXPECT_EQ(1000U, frame_out->TimeStamp());
965 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
966 jitter_buffer_->ReleaseFrame(frame_out);
967
968 frame_out = DecodeCompleteFrame();
969 EXPECT_EQ(13000U, frame_out->TimeStamp());
970 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
971 jitter_buffer_->ReleaseFrame(frame_out);
972}
973
philipel83f831a2016-03-12 03:30:23 -0800974TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700975 // Verify that frames are updated with SS data when SS packet is reordered.
976 // --------------------------------
977 // | 65486 | 65487 | 65485 |...
978 // | pid:6 | pid:7 | pid:5 |...
979 // | tid:2 | tid:1 | tid:0 |...
980 // | | | ss |
981 // --------------------------------
982 // |<--------tl0idx:200--------->|
983
984 bool re = false;
985 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -0700986 packet_->video_header.codec = kRtpVideoVp9;
asapersson9a4cd872015-10-23 00:27:14 -0700987 packet_->isFirstPacket = true;
988 packet_->markerBit = true;
isheriff6b4b5f32016-06-08 00:24:21 -0700989 packet_->video_header.codecHeader.VP9.flexible_mode = false;
990 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
991 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
992 packet_->video_header.codecHeader.VP9.end_of_frame = true;
993 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700994
995 packet_->seqNum = 65486;
996 packet_->timestamp = 6000;
997 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -0700998 packet_->video_header.codecHeader.VP9.picture_id = 6;
999 packet_->video_header.codecHeader.VP9.temporal_idx = 2;
1000 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001001 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1002
1003 packet_->seqNum = 65487;
1004 packet_->timestamp = 9000;
1005 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001006 packet_->video_header.codecHeader.VP9.picture_id = 7;
1007 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1008 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001009 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1010
1011 // Insert first frame with SS data.
1012 packet_->seqNum = 65485;
1013 packet_->timestamp = 3000;
1014 packet_->frameType = kVideoFrameKey;
1015 packet_->width = 352;
1016 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001017 packet_->video_header.codecHeader.VP9.picture_id = 5;
1018 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1019 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1020 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1021 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001022 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
1023 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1024
1025 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1026 EXPECT_EQ(3000U, frame_out->TimeStamp());
1027 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1028 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1029 EXPECT_FALSE(
1030 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1031 jitter_buffer_->ReleaseFrame(frame_out);
1032
1033 frame_out = DecodeCompleteFrame();
1034 EXPECT_EQ(6000U, frame_out->TimeStamp());
1035 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1036 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1037 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1038 jitter_buffer_->ReleaseFrame(frame_out);
1039
1040 frame_out = DecodeCompleteFrame();
1041 EXPECT_EQ(9000U, frame_out->TimeStamp());
1042 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1043 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1044 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1045 jitter_buffer_->ReleaseFrame(frame_out);
1046}
1047
philipel83f831a2016-03-12 03:30:23 -08001048TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -07001049 // Verify that frames are updated with SS data when SS packet is reordered.
1050 // -----------------------------------------
1051 // | 65486 | 65487 | 65485 | 65484 |...
1052 // | pid:6 | pid:6 | pid:5 | pid:5 |...
1053 // | tid:1 | tid:1 | tid:0 | tid:0 |...
1054 // | sid:0 | sid:1 | sid:1 | sid:0 |...
1055 // | t:6000 | t:6000 | t:3000 | t:3000 |
1056 // | | | | ss |
1057 // -----------------------------------------
1058 // |<-----------tl0idx:200------------>|
1059
1060 bool re = false;
1061 packet_->codec = kVideoCodecVP9;
isheriff6b4b5f32016-06-08 00:24:21 -07001062 packet_->video_header.codec = kRtpVideoVp9;
1063 packet_->video_header.codecHeader.VP9.flexible_mode = false;
1064 packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
1065 packet_->video_header.codecHeader.VP9.end_of_frame = true;
1066 packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -07001067
1068 packet_->isFirstPacket = true;
1069 packet_->markerBit = false;
1070 packet_->seqNum = 65486;
1071 packet_->timestamp = 6000;
1072 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001073 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1074 packet_->video_header.codecHeader.VP9.picture_id = 6;
1075 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1076 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001077 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1078
1079 packet_->isFirstPacket = false;
1080 packet_->markerBit = true;
1081 packet_->seqNum = 65487;
1082 packet_->frameType = kVideoFrameDelta;
isheriff6b4b5f32016-06-08 00:24:21 -07001083 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1084 packet_->video_header.codecHeader.VP9.picture_id = 6;
1085 packet_->video_header.codecHeader.VP9.temporal_idx = 1;
1086 packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -07001087 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1088
1089 packet_->isFirstPacket = false;
1090 packet_->markerBit = true;
1091 packet_->seqNum = 65485;
1092 packet_->timestamp = 3000;
1093 packet_->frameType = kVideoFrameKey;
isheriff6b4b5f32016-06-08 00:24:21 -07001094 packet_->video_header.codecHeader.VP9.spatial_idx = 1;
1095 packet_->video_header.codecHeader.VP9.picture_id = 5;
1096 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1097 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -07001098 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
1099
1100 // Insert first frame with SS data.
1101 packet_->isFirstPacket = true;
1102 packet_->markerBit = false;
1103 packet_->seqNum = 65484;
1104 packet_->frameType = kVideoFrameKey;
1105 packet_->width = 352;
1106 packet_->height = 288;
isheriff6b4b5f32016-06-08 00:24:21 -07001107 packet_->video_header.codecHeader.VP9.spatial_idx = 0;
1108 packet_->video_header.codecHeader.VP9.picture_id = 5;
1109 packet_->video_header.codecHeader.VP9.temporal_idx = 0;
1110 packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
1111 packet_->video_header.codecHeader.VP9.ss_data_available = true;
1112 packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -07001113 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
1114 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
1115
1116 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1117 EXPECT_EQ(3000U, frame_out->TimeStamp());
1118 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1119 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1120 EXPECT_FALSE(
1121 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1122 jitter_buffer_->ReleaseFrame(frame_out);
1123
1124 frame_out = DecodeCompleteFrame();
1125 EXPECT_EQ(6000U, frame_out->TimeStamp());
1126 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
1127 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
1128 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
1129 jitter_buffer_->ReleaseFrame(frame_out);
1130}
1131
philipel83f831a2016-03-12 03:30:23 -08001132TEST_P(TestBasicJitterBuffer, H264InsertStartCode) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001133 packet_->frameType = kVideoFrameKey;
1134 packet_->isFirstPacket = true;
1135 packet_->markerBit = false;
1136 packet_->seqNum = seq_num_;
1137 packet_->timestamp = timestamp_;
1138 packet_->insertStartCode = true;
1139
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001140 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001141 EXPECT_EQ(kIncomplete,
1142 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001143
1144 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1145
1146 // Frame should not be complete.
1147 EXPECT_TRUE(frame_out == NULL);
1148
1149 seq_num_++;
1150 packet_->isFirstPacket = false;
1151 packet_->markerBit = true;
1152 packet_->seqNum = seq_num_;
1153
philipel9d3ab612015-12-21 04:12:39 -08001154 EXPECT_EQ(kCompleteSession,
1155 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001156
1157 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001158 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001160 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001161}
1162
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001163// Test threshold conditions of decodable state.
philipel83f831a2016-03-12 03:30:23 -08001164TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001165 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001166 // Always start with a key frame. Use 10 packets to test Decodable State
1167 // boundaries.
1168 packet_->frameType = kVideoFrameKey;
1169 packet_->isFirstPacket = true;
1170 packet_->markerBit = false;
1171 packet_->seqNum = seq_num_;
1172 packet_->timestamp = timestamp_;
1173
1174 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001175 EXPECT_EQ(kIncomplete,
1176 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001177 uint32_t timestamp = 0;
isheriff6b4b5f32016-06-08 00:24:21 -07001178 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001179 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1180
1181 packet_->isFirstPacket = false;
1182 for (int i = 1; i < 9; ++i) {
1183 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001184 EXPECT_EQ(kIncomplete,
1185 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001186 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001187 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1188 }
1189
1190 // last packet
1191 packet_->markerBit = true;
1192 packet_->seqNum++;
1193
philipel9d3ab612015-12-21 04:12:39 -08001194 EXPECT_EQ(kCompleteSession,
1195 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001196 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1197 CheckOutFrame(frame_out, 10 * size_, false);
1198 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001199 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001200
1201 // An incomplete frame can only be decoded once a subsequent frame has begun
1202 // to arrive. Insert packet in distant frame for this purpose.
1203 packet_->frameType = kVideoFrameDelta;
1204 packet_->isFirstPacket = true;
1205 packet_->markerBit = false;
1206 packet_->seqNum += 100;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001207 packet_->timestamp += 33 * 90 * 8;
1208
philipel9d3ab612015-12-21 04:12:39 -08001209 EXPECT_EQ(kDecodableSession,
1210 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001211 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001212 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1213
1214 // Insert second frame
1215 packet_->seqNum -= 99;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001216 packet_->timestamp -= 33 * 90 * 7;
agalusza@google.comd177c102013-08-08 01:12:33 +00001217
philipel9d3ab612015-12-21 04:12:39 -08001218 EXPECT_EQ(kDecodableSession,
1219 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001220 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001221 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1222
1223 packet_->isFirstPacket = false;
1224 for (int i = 1; i < 8; ++i) {
1225 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001226 EXPECT_EQ(kDecodableSession,
1227 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001228 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001229 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1230 }
1231
1232 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001233 EXPECT_EQ(kDecodableSession,
1234 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001235 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
agalusza@google.comd177c102013-08-08 01:12:33 +00001236 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1237
1238 frame_out = DecodeIncompleteFrame();
1239 ASSERT_FALSE(NULL == frame_out);
1240 CheckOutFrame(frame_out, 9 * size_, false);
1241 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001242 jitter_buffer_->ReleaseFrame(frame_out);
agalusza@google.comd177c102013-08-08 01:12:33 +00001243
1244 packet_->markerBit = true;
1245 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001246 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
agalusza@google.comd177c102013-08-08 01:12:33 +00001247}
1248
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001249// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001250TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001251 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1252 // Always start with a key frame.
1253 packet_->frameType = kVideoFrameKey;
1254 packet_->isFirstPacket = true;
1255 packet_->markerBit = true;
1256 packet_->seqNum = seq_num_;
1257 packet_->timestamp = timestamp_;
1258
1259 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001260 EXPECT_EQ(kCompleteSession,
1261 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001262 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1263 CheckOutFrame(frame_out, size_, false);
1264 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001265 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001266
1267 // An incomplete frame can only be decoded once a subsequent frame has begun
1268 // to arrive. Insert packet in distant frame for this purpose.
1269 packet_->frameType = kVideoFrameDelta;
1270 packet_->isFirstPacket = false;
1271 packet_->markerBit = false;
1272 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001273 packet_->timestamp += 33 * 90 * 8;
1274 EXPECT_EQ(kIncomplete,
1275 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001276 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001277 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001278 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1279
1280 // Insert second frame - an incomplete key frame.
1281 packet_->frameType = kVideoFrameKey;
1282 packet_->isFirstPacket = true;
1283 packet_->seqNum -= 99;
philipel9d3ab612015-12-21 04:12:39 -08001284 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001285
philipel9d3ab612015-12-21 04:12:39 -08001286 EXPECT_EQ(kIncomplete,
1287 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001288 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001289 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1290
1291 // Insert a few more packets. Make sure we're waiting for the key frame to be
1292 // complete.
1293 packet_->isFirstPacket = false;
1294 for (int i = 1; i < 5; ++i) {
1295 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001296 EXPECT_EQ(kIncomplete,
1297 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001298 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001299 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1300 }
1301
1302 // Complete key frame.
1303 packet_->markerBit = true;
1304 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001305 EXPECT_EQ(kCompleteSession,
1306 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001307 frame_out = DecodeCompleteFrame();
1308 CheckOutFrame(frame_out, 6 * size_, false);
1309 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001310 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001311}
1312
1313// Make sure first packet is present before a frame can be decoded.
philipel83f831a2016-03-12 03:30:23 -08001314TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001315 jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
1316 // Always start with a key frame.
1317 packet_->frameType = kVideoFrameKey;
1318 packet_->isFirstPacket = true;
1319 packet_->markerBit = true;
1320 packet_->seqNum = seq_num_;
1321 packet_->timestamp = timestamp_;
1322
1323 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001324 EXPECT_EQ(kCompleteSession,
1325 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001326 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1327 CheckOutFrame(frame_out, size_, false);
1328 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001329 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001330
1331 // An incomplete frame can only be decoded once a subsequent frame has begun
1332 // to arrive. Insert packet in distant frame for this purpose.
1333 packet_->frameType = kVideoFrameDelta;
1334 packet_->isFirstPacket = false;
1335 packet_->markerBit = false;
1336 packet_->seqNum += 100;
philipel9d3ab612015-12-21 04:12:39 -08001337 packet_->timestamp += 33 * 90 * 8;
1338 EXPECT_EQ(kIncomplete,
1339 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001340 uint32_t timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001341 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001342 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1343
1344 // Insert second frame with the first packet missing. Make sure we're waiting
1345 // for the key frame to be complete.
1346 packet_->seqNum -= 98;
philipel9d3ab612015-12-21 04:12:39 -08001347 packet_->timestamp -= 33 * 90 * 7;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001348
philipel9d3ab612015-12-21 04:12:39 -08001349 EXPECT_EQ(kIncomplete,
1350 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
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 for (int i = 0; i < 5; ++i) {
1355 packet_->seqNum++;
philipel9d3ab612015-12-21 04:12:39 -08001356 EXPECT_EQ(kIncomplete,
1357 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001358 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001359 EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1360 }
1361
1362 // Add first packet. Frame should now be decodable, but incomplete.
1363 packet_->isFirstPacket = true;
1364 packet_->seqNum -= 6;
philipel9d3ab612015-12-21 04:12:39 -08001365 EXPECT_EQ(kDecodableSession,
1366 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001367 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001368 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
1369
1370 frame_out = DecodeIncompleteFrame();
1371 CheckOutFrame(frame_out, 7 * size_, false);
1372 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001373 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001374}
1375
philipel83f831a2016-03-12 03:30:23 -08001376TEST_P(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001377 // Will use one packet per frame.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001378 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
agalusza@google.comd177c102013-08-08 01:12:33 +00001379 packet_->frameType = kVideoFrameKey;
1380 packet_->isFirstPacket = true;
1381 packet_->markerBit = true;
1382 packet_->seqNum = seq_num_;
1383 packet_->timestamp = timestamp_;
agalusza@google.comd177c102013-08-08 01:12:33 +00001384 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001385 EXPECT_EQ(kCompleteSession,
1386 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001387 uint32_t next_timestamp;
isheriff6b4b5f32016-06-08 00:24:21 -07001388 VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
1389 EXPECT_NE(frame, nullptr);
1390 EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
1391 frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001392 EXPECT_TRUE(frame != NULL);
1393 jitter_buffer_->ReleaseFrame(frame);
agalusza@google.comd177c102013-08-08 01:12:33 +00001394
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001395 // Drop a complete frame.
1396 timestamp_ += 2 * 33 * 90;
1397 seq_num_ += 2;
agalusza@google.comd177c102013-08-08 01:12:33 +00001398 packet_->frameType = kVideoFrameDelta;
agalusza@google.comd177c102013-08-08 01:12:33 +00001399 packet_->isFirstPacket = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001400 packet_->markerBit = false;
1401 packet_->seqNum = seq_num_;
1402 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001403 EXPECT_EQ(kDecodableSession,
1404 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001405 // Insert a packet (so the previous one will be released).
1406 timestamp_ += 33 * 90;
1407 seq_num_ += 2;
1408 packet_->frameType = kVideoFrameDelta;
1409 packet_->isFirstPacket = true;
1410 packet_->markerBit = false;
1411 packet_->seqNum = seq_num_;
1412 packet_->timestamp = timestamp_;
philipel9d3ab612015-12-21 04:12:39 -08001413 EXPECT_EQ(kDecodableSession,
1414 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
isheriff6b4b5f32016-06-08 00:24:21 -07001415 EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001416 EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
1417 EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
agalusza@google.comd177c102013-08-08 01:12:33 +00001418}
1419
philipel83f831a2016-03-12 03:30:23 -08001420TEST_P(TestBasicJitterBuffer, PacketLoss) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001421 // Verify missing packets statistics and not decodable packets statistics.
1422 // Insert 10 frames consisting of 4 packets and remove one from all of them.
1423 // The last packet is an empty (non-media) packet.
1424
1425 // Select a start seqNum which triggers a difficult wrap situation
1426 // The JB will only output (incomplete)frames if the next one has started
1427 // to arrive. Start by inserting one frame (key).
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001428 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001429 seq_num_ = 0xffff - 4;
1430 seq_num_++;
1431 packet_->frameType = kVideoFrameKey;
1432 packet_->isFirstPacket = true;
1433 packet_->markerBit = false;
1434 packet_->seqNum = seq_num_;
1435 packet_->timestamp = timestamp_;
1436 packet_->completeNALU = kNaluStart;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001437
1438 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001439 EXPECT_EQ(kDecodableSession,
1440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001441 for (int i = 0; i < 11; ++i) {
1442 webrtc::FrameType frametype = kVideoFrameDelta;
1443 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001444 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001445 packet_->frameType = frametype;
1446 packet_->isFirstPacket = true;
1447 packet_->markerBit = false;
1448 packet_->seqNum = seq_num_;
1449 packet_->timestamp = timestamp_;
1450 packet_->completeNALU = kNaluStart;
1451
philipel9d3ab612015-12-21 04:12:39 -08001452 EXPECT_EQ(kDecodableSession,
1453 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001454
1455 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1456
1457 // Should not be complete.
1458 EXPECT_TRUE(frame_out == NULL);
1459
1460 seq_num_ += 2;
1461 packet_->isFirstPacket = false;
1462 packet_->markerBit = true;
1463 packet_->seqNum = seq_num_;
1464 packet_->completeNALU = kNaluEnd;
1465
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001466 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
1467 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001468
1469 // Insert an empty (non-media) packet.
1470 seq_num_++;
1471 packet_->isFirstPacket = false;
1472 packet_->markerBit = false;
1473 packet_->seqNum = seq_num_;
1474 packet_->completeNALU = kNaluEnd;
pbos22993e12015-10-19 02:39:06 -07001475 packet_->frameType = kEmptyFrame;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001476
agalusza@google.coma7e360e2013-08-01 03:15:08 +00001477 EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001478 kDecodableSession);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001479 frame_out = DecodeIncompleteFrame();
1480
1481 // One of the packets has been discarded by the jitter buffer.
1482 // Last frame can't be extracted yet.
1483 if (i < 10) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001484 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001485
1486 if (i == 0) {
philipel9d3ab612015-12-21 04:12:39 -08001487 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001488 } else {
philipel9d3ab612015-12-21 04:12:39 -08001489 EXPECT_EQ(frametype, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001490 }
1491 EXPECT_FALSE(frame_out->Complete());
1492 EXPECT_FALSE(frame_out->MissingFrame());
1493 }
1494
1495 jitter_buffer_->ReleaseFrame(frame_out);
1496 }
1497
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001498 // Insert 3 old packets and verify that we have 3 discarded packets
1499 // Match value to actual latest timestamp decoded.
1500 timestamp_ -= 33 * 90;
1501 packet_->timestamp = timestamp_ - 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001502
philipel9d3ab612015-12-21 04:12:39 -08001503 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001504
1505 packet_->timestamp = timestamp_ - 500;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001506
philipel9d3ab612015-12-21 04:12:39 -08001507 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001508
1509 packet_->timestamp = timestamp_ - 100;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001510
philipel9d3ab612015-12-21 04:12:39 -08001511 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001512
1513 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1514
1515 jitter_buffer_->Flush();
1516
1517 // This statistic shouldn't be reset by a flush.
1518 EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
1519}
1520
philipel83f831a2016-03-12 03:30:23 -08001521TEST_P(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001522 seq_num_ = 0xfff0;
1523 packet_->frameType = kVideoFrameKey;
1524 packet_->isFirstPacket = true;
1525 packet_->markerBit = false;
1526 packet_->seqNum = seq_num_;
1527 packet_->timestamp = timestamp_;
1528
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001529 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001530 EXPECT_EQ(kIncomplete,
1531 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001532
1533 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1534
1535 EXPECT_TRUE(frame_out == NULL);
1536
1537 int loop = 0;
1538 do {
1539 seq_num_++;
1540 packet_->isFirstPacket = false;
1541 packet_->markerBit = false;
1542 packet_->seqNum = seq_num_;
1543
philipel9d3ab612015-12-21 04:12:39 -08001544 EXPECT_EQ(kIncomplete,
1545 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001546
1547 frame_out = DecodeCompleteFrame();
1548
1549 EXPECT_TRUE(frame_out == NULL);
1550
1551 loop++;
1552 } while (loop < 98);
1553
1554 seq_num_++;
1555 packet_->isFirstPacket = false;
1556 packet_->markerBit = true;
1557 packet_->seqNum = seq_num_;
1558
philipel9d3ab612015-12-21 04:12:39 -08001559 EXPECT_EQ(kCompleteSession,
1560 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001561
1562 frame_out = DecodeCompleteFrame();
1563
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001564 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001565
1566 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001567 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001568}
1569
philipel83f831a2016-03-12 03:30:23 -08001570TEST_P(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001571 // Insert "first" packet last seqnum.
1572 seq_num_ = 10;
1573 packet_->frameType = kVideoFrameKey;
1574 packet_->isFirstPacket = false;
1575 packet_->markerBit = true;
1576 packet_->seqNum = seq_num_;
1577
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001578 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001579 EXPECT_EQ(kIncomplete,
1580 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001581 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1582
1583 // Should not be complete.
1584 EXPECT_TRUE(frame_out == NULL);
1585
1586 // Insert 98 frames.
1587 int loop = 0;
1588 do {
1589 seq_num_--;
1590 packet_->isFirstPacket = false;
1591 packet_->markerBit = false;
1592 packet_->seqNum = seq_num_;
1593
philipel9d3ab612015-12-21 04:12:39 -08001594 EXPECT_EQ(kIncomplete,
1595 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001596
1597 frame_out = DecodeCompleteFrame();
1598
1599 EXPECT_TRUE(frame_out == NULL);
1600
1601 loop++;
1602 } while (loop < 98);
1603
1604 // Insert last packet.
1605 seq_num_--;
1606 packet_->isFirstPacket = true;
1607 packet_->markerBit = false;
1608 packet_->seqNum = seq_num_;
1609
philipel9d3ab612015-12-21 04:12:39 -08001610 EXPECT_EQ(kCompleteSession,
1611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001612
1613 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001614 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001615 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001616 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001617}
1618
philipel83f831a2016-03-12 03:30:23 -08001619TEST_P(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001620 // ------- -------
1621 // | 2 | | 1 |
1622 // ------- -------
1623 // t = 3000 t = 2000
1624 seq_num_ = 2;
1625 timestamp_ = 3000;
1626 packet_->frameType = kVideoFrameKey;
1627 packet_->isFirstPacket = true;
1628 packet_->markerBit = true;
1629 packet_->timestamp = timestamp_;
1630 packet_->seqNum = seq_num_;
1631
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001632 bool retransmitted = false;
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 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1637 EXPECT_EQ(3000u, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001638 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001639 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001640 jitter_buffer_->ReleaseFrame(frame_out);
1641
1642 seq_num_--;
1643 timestamp_ = 2000;
1644 packet_->frameType = kVideoFrameDelta;
1645 packet_->isFirstPacket = true;
1646 packet_->markerBit = true;
1647 packet_->seqNum = seq_num_;
1648 packet_->timestamp = timestamp_;
1649
philipel9d3ab612015-12-21 04:12:39 -08001650 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001651}
1652
philipel83f831a2016-03-12 03:30:23 -08001653TEST_P(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001654 // ------- -------
1655 // | 2 | | 1 |
1656 // ------- -------
1657 // t = 3000 t = 0xffffff00
1658
1659 seq_num_ = 2;
1660 timestamp_ = 3000;
1661 packet_->frameType = kVideoFrameKey;
1662 packet_->isFirstPacket = true;
1663 packet_->markerBit = true;
1664 packet_->seqNum = seq_num_;
1665 packet_->timestamp = timestamp_;
1666
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001667 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001668 EXPECT_EQ(kCompleteSession,
1669 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001670
1671 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1672 EXPECT_EQ(timestamp_, frame_out->TimeStamp());
1673
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001674 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001675
1676 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
1677
1678 jitter_buffer_->ReleaseFrame(frame_out);
1679
1680 seq_num_--;
1681 timestamp_ = 0xffffff00;
1682 packet_->frameType = kVideoFrameDelta;
1683 packet_->isFirstPacket = true;
1684 packet_->markerBit = true;
1685 packet_->seqNum = seq_num_;
1686 packet_->timestamp = timestamp_;
1687
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001688 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001689 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001690}
1691
philipel83f831a2016-03-12 03:30:23 -08001692TEST_P(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001693 // --------------- ---------------
1694 // | 1 | 2 | | 3 | 4 |
1695 // --------------- ---------------
1696 // t = 0xffffff00 t = 33*90
1697
1698 timestamp_ = 0xffffff00;
1699 packet_->frameType = kVideoFrameKey;
1700 packet_->isFirstPacket = true;
1701 packet_->markerBit = false;
1702 packet_->seqNum = seq_num_;
1703 packet_->timestamp = timestamp_;
1704
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001705 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001706 EXPECT_EQ(kIncomplete,
1707 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001708
1709 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001710 EXPECT_TRUE(frame_out == NULL);
1711
1712 seq_num_++;
1713 packet_->isFirstPacket = false;
1714 packet_->markerBit = true;
1715 packet_->seqNum = seq_num_;
1716
philipel9d3ab612015-12-21 04:12:39 -08001717 EXPECT_EQ(kCompleteSession,
1718 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001719
1720 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001721 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001722 jitter_buffer_->ReleaseFrame(frame_out);
1723
1724 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001725 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001726 packet_->frameType = kVideoFrameDelta;
1727 packet_->isFirstPacket = true;
1728 packet_->markerBit = false;
1729 packet_->seqNum = seq_num_;
1730 packet_->timestamp = timestamp_;
1731
philipel9d3ab612015-12-21 04:12:39 -08001732 EXPECT_EQ(kIncomplete,
1733 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001734
1735 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001736 EXPECT_TRUE(frame_out == NULL);
1737
1738 seq_num_++;
1739 packet_->isFirstPacket = false;
1740 packet_->markerBit = true;
1741 packet_->seqNum = seq_num_;
1742
philipel9d3ab612015-12-21 04:12:39 -08001743 EXPECT_EQ(kCompleteSession,
1744 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001745
1746 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001747 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001748 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001749 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001750}
1751
philipel83f831a2016-03-12 03:30:23 -08001752TEST_P(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001753 // ------- -------
1754 // | 1 | | 2 |
1755 // ------- -------
1756 // t = 0xffffff00 t = 2700
1757
1758 timestamp_ = 0xffffff00;
1759 packet_->frameType = kVideoFrameKey;
1760 packet_->isFirstPacket = true;
1761 packet_->markerBit = true;
1762 packet_->timestamp = timestamp_;
1763
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001764 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001765 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001766 EXPECT_EQ(kCompleteSession,
1767 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001768
1769 // Insert next frame.
1770 seq_num_++;
1771 timestamp_ = 2700;
1772 packet_->frameType = kVideoFrameDelta;
1773 packet_->isFirstPacket = true;
1774 packet_->markerBit = true;
1775 packet_->seqNum = seq_num_;
1776 packet_->timestamp = timestamp_;
1777
philipel9d3ab612015-12-21 04:12:39 -08001778 EXPECT_EQ(kCompleteSession,
1779 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001780
1781 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1782 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001783 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001784 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001785 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001786
1787 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1788 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001789 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001790 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001791 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001792}
1793
philipel83f831a2016-03-12 03:30:23 -08001794TEST_P(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001795 // ------- -------
1796 // | 2 | | 1 |
1797 // ------- -------
1798 // t = 2700 t = 0xffffff00
1799
1800 seq_num_ = 2;
1801 timestamp_ = 2700;
1802 packet_->frameType = kVideoFrameDelta;
1803 packet_->isFirstPacket = true;
1804 packet_->markerBit = true;
1805 packet_->seqNum = seq_num_;
1806 packet_->timestamp = timestamp_;
1807
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001808 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001809 EXPECT_EQ(kCompleteSession,
1810 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001811
1812 // Insert second frame
1813 seq_num_--;
1814 timestamp_ = 0xffffff00;
1815 packet_->frameType = kVideoFrameKey;
1816 packet_->isFirstPacket = true;
1817 packet_->markerBit = true;
1818 packet_->seqNum = seq_num_;
1819 packet_->timestamp = timestamp_;
1820
philipel9d3ab612015-12-21 04:12:39 -08001821 EXPECT_EQ(kCompleteSession,
1822 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001823
1824 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1825 EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001826 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001827 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001828 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001829
1830 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1831 EXPECT_EQ(2700u, frame_out2->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001832 CheckOutFrame(frame_out2, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001833 EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001834 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001835}
1836
philipel83f831a2016-03-12 03:30:23 -08001837TEST_P(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001838 int loop = 0;
1839 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001840 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001841 // Insert kMaxPacketsInJitterBuffer into frame.
1842 do {
1843 seq_num_++;
1844 packet_->isFirstPacket = false;
1845 packet_->markerBit = false;
1846 packet_->seqNum = seq_num_;
1847
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001848 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001849 EXPECT_EQ(kIncomplete,
1850 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001851 firstPacket = false;
1852 } else {
philipel9d3ab612015-12-21 04:12:39 -08001853 EXPECT_EQ(kIncomplete,
1854 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001855 }
1856
1857 loop++;
1858 } while (loop < kMaxPacketsInSession);
1859
1860 // Max number of packets inserted.
1861 // Insert one more packet.
1862 seq_num_++;
1863 packet_->isFirstPacket = false;
1864 packet_->markerBit = true;
1865 packet_->seqNum = seq_num_;
1866
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001867 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001868 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001869 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001870}
1871
philipel83f831a2016-03-12 03:30:23 -08001872TEST_P(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001873 // TEST fill JB with more than max number of frame (50 delta frames +
1874 // 51 key frames) with wrap in seq_num_
1875 //
1876 // --------------------------------------------------------------
1877 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1878 // --------------------------------------------------------------
1879 // |<-----------delta frames------------->|<------key frames----->|
1880
jbauchdb81ffd2015-11-23 03:59:02 -08001881 // Make sure the jitter doesn't request a keyframe after too much non-
1882 // decodable frames.
1883 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08001884 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001885
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001886 int loop = 0;
1887 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001888 uint32_t first_key_frame_timestamp = 0;
1889 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001890 // Insert MAX_NUMBER_OF_FRAMES frames.
1891 do {
philipel9d3ab612015-12-21 04:12:39 -08001892 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001893 seq_num_++;
1894 packet_->isFirstPacket = true;
1895 packet_->markerBit = true;
1896 packet_->seqNum = seq_num_;
1897 packet_->timestamp = timestamp_;
1898
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001899 if (loop == 50) {
1900 first_key_frame_timestamp = packet_->timestamp;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001901 packet_->frameType = kVideoFrameKey;
1902 }
1903
1904 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001905 EXPECT_EQ(kCompleteSession,
1906 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001907
1908 loop++;
1909 } while (loop < kMaxNumberOfFrames);
1910
1911 // Max number of frames inserted.
1912
1913 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001914 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001915 seq_num_++;
1916 packet_->isFirstPacket = true;
1917 packet_->markerBit = true;
1918 packet_->seqNum = seq_num_;
1919 packet_->timestamp = timestamp_;
1920
1921 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001922 EXPECT_EQ(kFlushIndicator,
1923 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001924
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001925 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1926 EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001927 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001928 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001929 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001930}
1931
philipel83f831a2016-03-12 03:30:23 -08001932TEST_P(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001933 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001934 seq_num_ = 3;
1935 // Insert one empty packet per frame, should never return the last timestamp
1936 // inserted. Only return empty frames in the presence of subsequent frames.
1937 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001938 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001939 for (int i = 0; i < maxSize + 10; i++) {
1940 timestamp_ += 33 * 90;
1941 seq_num_++;
1942 packet_->isFirstPacket = false;
1943 packet_->markerBit = false;
1944 packet_->seqNum = seq_num_;
1945 packet_->timestamp = timestamp_;
pbos22993e12015-10-19 02:39:06 -07001946 packet_->frameType = kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001947
philipel9d3ab612015-12-21 04:12:39 -08001948 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001949 VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
1950 // Timestamp should never be the last TS inserted.
1951 if (testFrame != NULL) {
1952 EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001953 jitter_buffer_->ReleaseFrame(testFrame);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001954 }
1955 }
1956}
1957
philipel83f831a2016-03-12 03:30:23 -08001958TEST_P(TestBasicJitterBuffer, H264IncompleteNalu) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001959 jitter_buffer_->SetNackMode(kNoNack, -1, -1);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001960 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001961 ++seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001962 timestamp_ += 33 * 90;
1963 int insertedLength = 0;
1964 packet_->seqNum = seq_num_;
1965 packet_->timestamp = timestamp_;
1966 packet_->frameType = kVideoFrameKey;
1967 packet_->isFirstPacket = true;
1968 packet_->completeNALU = kNaluStart;
1969 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001970 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001971
philipel9d3ab612015-12-21 04:12:39 -08001972 EXPECT_EQ(kDecodableSession,
1973 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001974
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001975 seq_num_ += 2; // Skip one packet.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001976 packet_->seqNum = seq_num_;
1977 packet_->frameType = kVideoFrameKey;
1978 packet_->isFirstPacket = false;
1979 packet_->completeNALU = kNaluIncomplete;
1980 packet_->markerBit = false;
1981
philipel9d3ab612015-12-21 04:12:39 -08001982 EXPECT_EQ(kDecodableSession,
1983 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001984
1985 seq_num_++;
1986 packet_->seqNum = seq_num_;
1987 packet_->frameType = kVideoFrameKey;
1988 packet_->isFirstPacket = false;
1989 packet_->completeNALU = kNaluEnd;
1990 packet_->markerBit = false;
1991
philipel9d3ab612015-12-21 04:12:39 -08001992 EXPECT_EQ(kDecodableSession,
1993 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001994
1995 seq_num_++;
1996 packet_->seqNum = seq_num_;
1997 packet_->completeNALU = kNaluComplete;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00001998 packet_->markerBit = true; // Last packet.
philipel9d3ab612015-12-21 04:12:39 -08001999 EXPECT_EQ(kDecodableSession,
2000 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002001 // The JB will only output (incomplete) frames if a packet belonging to a
2002 // subsequent frame was already inserted. Insert one packet of a subsequent
2003 // frame. place high timestamp so the JB would always have a next frame
2004 // (otherwise, for every inserted frame we need to take care of the next
2005 // frame as well).
2006 packet_->seqNum = 1;
2007 packet_->timestamp = timestamp_ + 33 * 90 * 10;
2008 packet_->frameType = kVideoFrameDelta;
2009 packet_->isFirstPacket = false;
2010 packet_->completeNALU = kNaluStart;
2011 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002012
philipel9d3ab612015-12-21 04:12:39 -08002013 EXPECT_EQ(kDecodableSession,
2014 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002015
2016 VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
2017
2018 // We can decode everything from a NALU until a packet has been lost.
2019 // Thus we can decode the first packet of the first NALU and the second NALU
2020 // which consists of one packet.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002021 CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002022 jitter_buffer_->ReleaseFrame(frame_out);
2023
2024 // Test reordered start frame + 1 lost.
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002025 seq_num_ += 2; // Re-order 1 frame.
philipel9d3ab612015-12-21 04:12:39 -08002026 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002027 insertedLength = 0;
2028
2029 packet_->seqNum = seq_num_;
2030 packet_->timestamp = timestamp_;
2031 packet_->frameType = kVideoFrameKey;
2032 packet_->isFirstPacket = false;
2033 packet_->completeNALU = kNaluEnd;
2034 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002035 EXPECT_EQ(kDecodableSession,
2036 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
2037 insertedLength += packet_->sizeBytes; // This packet should be decoded.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002038 seq_num_--;
2039 packet_->seqNum = seq_num_;
2040 packet_->timestamp = timestamp_;
2041 packet_->frameType = kVideoFrameKey;
2042 packet_->isFirstPacket = true;
2043 packet_->completeNALU = kNaluStart;
2044 packet_->markerBit = false;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +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 insertedLength += packet_->sizeBytes; // This packet should be decoded.
2049
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +00002050 seq_num_ += 3; // One packet drop.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002051 packet_->seqNum = seq_num_;
2052 packet_->timestamp = timestamp_;
2053 packet_->frameType = kVideoFrameKey;
2054 packet_->isFirstPacket = false;
2055 packet_->completeNALU = kNaluComplete;
2056 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002057 EXPECT_EQ(kDecodableSession,
2058 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002059 insertedLength += packet_->sizeBytes; // This packet should be decoded.
agalusza@google.comd177c102013-08-08 01:12:33 +00002060 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002061 packet_->seqNum = seq_num_;
2062 packet_->timestamp = timestamp_;
2063 packet_->frameType = kVideoFrameKey;
2064 packet_->isFirstPacket = false;
2065 packet_->completeNALU = kNaluStart;
2066 packet_->markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -08002067 EXPECT_EQ(kDecodableSession,
2068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002069 // This packet should be decoded since it's the beginning of a NAL.
2070 insertedLength += packet_->sizeBytes;
2071
2072 seq_num_ += 2;
2073 packet_->seqNum = seq_num_;
2074 packet_->timestamp = timestamp_;
2075 packet_->frameType = kVideoFrameKey;
2076 packet_->isFirstPacket = false;
2077 packet_->completeNALU = kNaluEnd;
2078 packet_->markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002079 EXPECT_EQ(kDecodableSession,
2080 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002081 // This packet should not be decoded because it is an incomplete NAL if it
2082 // is the last.
2083 frame_out = DecodeIncompleteFrame();
2084 // Only last NALU is complete.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002085 CheckOutFrame(frame_out, insertedLength, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002086 jitter_buffer_->ReleaseFrame(frame_out);
2087
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002088 // Test to insert empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002089 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002090 timestamp_ += 33 * 90;
2091 VCMPacket emptypacket(data_, 0, seq_num_, timestamp_, true);
2092 emptypacket.seqNum = seq_num_;
2093 emptypacket.timestamp = timestamp_;
2094 emptypacket.frameType = kVideoFrameKey;
2095 emptypacket.isFirstPacket = true;
2096 emptypacket.completeNALU = kNaluComplete;
2097 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002098 EXPECT_EQ(kCompleteSession,
2099 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002100 // This packet should not be decoded because it is an incomplete NAL if it
2101 // is the last.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002102
2103 // Will be sent to the decoder, as a packet belonging to a subsequent frame
2104 // has arrived.
2105 frame_out = DecodeIncompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002106 EXPECT_TRUE(frame_out != NULL);
2107 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002108
2109 // Test that a frame can include an empty packet.
agalusza@google.comd177c102013-08-08 01:12:33 +00002110 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002111 timestamp_ += 33 * 90;
2112
2113 packet_->seqNum = seq_num_;
2114 packet_->timestamp = timestamp_;
2115 packet_->frameType = kVideoFrameKey;
2116 packet_->isFirstPacket = true;
2117 packet_->completeNALU = kNaluComplete;
2118 packet_->markerBit = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +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
agalusza@google.comd177c102013-08-08 01:12:33 +00002123 seq_num_++;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002124 emptypacket.seqNum = seq_num_;
2125 emptypacket.timestamp = timestamp_;
2126 emptypacket.frameType = kVideoFrameKey;
2127 emptypacket.isFirstPacket = true;
2128 emptypacket.completeNALU = kNaluComplete;
2129 emptypacket.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -08002130 EXPECT_EQ(kCompleteSession,
2131 jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002132
2133 frame_out = DecodeCompleteFrame();
2134 // Only last NALU is complete
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002135 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002136 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002137}
2138
philipel83f831a2016-03-12 03:30:23 -08002139TEST_P(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002140 // Test that a we cannot get incomplete frames from the JB if we haven't
2141 // received the marker bit, unless we have received a packet from a later
2142 // timestamp.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002143 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002144 // Start with a complete key frame - insert and decode.
2145 packet_->frameType = kVideoFrameKey;
2146 packet_->isFirstPacket = true;
2147 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002148 bool retransmitted = false;
2149
philipel9d3ab612015-12-21 04:12:39 -08002150 EXPECT_EQ(kCompleteSession,
2151 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002152 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
2153 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002154 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002155
2156 packet_->seqNum += 2;
2157 packet_->timestamp += 33 * 90;
2158 packet_->frameType = kVideoFrameDelta;
2159 packet_->isFirstPacket = false;
2160 packet_->markerBit = false;
2161
philipel9d3ab612015-12-21 04:12:39 -08002162 EXPECT_EQ(kDecodableSession,
2163 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002164
2165 frame_out = DecodeIncompleteFrame();
2166 EXPECT_TRUE(frame_out == NULL);
2167
2168 packet_->seqNum += 2;
2169 packet_->timestamp += 33 * 90;
2170 packet_->isFirstPacket = true;
2171
philipel9d3ab612015-12-21 04:12:39 -08002172 EXPECT_EQ(kDecodableSession,
2173 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002174
2175 frame_out = DecodeIncompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002176 CheckOutFrame(frame_out, packet_->sizeBytes, false);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002177 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00002178}
2179
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002180TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08002181 // Make sure the jitter doesn't request a keyframe after too much non-
2182 // decodable frames.
2183 jitter_buffer_->SetNackMode(kNack, -1, -1);
philipel9d3ab612015-12-21 04:12:39 -08002184 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002185 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002186 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002187 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002188 DropFrame(1);
2189 // Fill the jitter buffer.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002190 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002191 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002192 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002193 // This frame will make the jitter buffer recycle frames until a key frame.
2194 // Since none is found it will have to wait until the next key frame before
2195 // decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00002196 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002197 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002198}
2199
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002200TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002201 // Make sure a frame can get complete even though empty packets are missing.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002202 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002203 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002204 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002205 // Insert empty packet.
2206 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002207 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002208 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002209 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002210 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002211 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002212 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002213 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002214 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002215 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002216 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002217 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002218}
2219
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002220TEST_F(TestRunningJitterBuffer, StatisticsTest) {
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002221 FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
2222 EXPECT_EQ(0, frame_stats.delta_frames);
2223 EXPECT_EQ(0, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002224
2225 uint32_t framerate = 0;
2226 uint32_t bitrate = 0;
2227 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2228 EXPECT_EQ(0u, framerate);
2229 EXPECT_EQ(0u, bitrate);
2230
2231 // Insert a couple of key and delta frames.
2232 InsertFrame(kVideoFrameKey);
2233 InsertFrame(kVideoFrameDelta);
2234 InsertFrame(kVideoFrameDelta);
2235 InsertFrame(kVideoFrameKey);
2236 InsertFrame(kVideoFrameDelta);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002237 // Decode some of them to make sure the statistics doesn't depend on frames
2238 // being decoded.
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002239 EXPECT_TRUE(DecodeCompleteFrame());
2240 EXPECT_TRUE(DecodeCompleteFrame());
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00002241 frame_stats = jitter_buffer_->FrameStatistics();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +00002242 EXPECT_EQ(3, frame_stats.delta_frames);
2243 EXPECT_EQ(2, frame_stats.key_frames);
stefan@webrtc.org9e254132013-02-28 08:45:23 +00002244
2245 // Insert 20 more frames to get estimates of bitrate and framerate over
2246 // 1 second.
2247 for (int i = 0; i < 20; ++i) {
2248 InsertFrame(kVideoFrameDelta);
2249 }
2250 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2251 // TODO(holmer): The current implementation returns the average of the last
2252 // two framerate calculations, which is why it takes two calls to reach the
2253 // actual framerate. This should be fixed.
2254 EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
2255 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2256 // Insert 25 more frames to get estimates of bitrate and framerate over
2257 // 2 seconds.
2258 for (int i = 0; i < 25; ++i) {
2259 InsertFrame(kVideoFrameDelta);
2260 }
2261 jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
2262 EXPECT_EQ(kDefaultFrameRate, framerate);
2263 EXPECT_EQ(kDefaultBitrateKbps, bitrate);
2264}
2265
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002266TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
2267 // Insert delta frames.
2268 EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
2269 // Can't decode without a key frame.
2270 EXPECT_FALSE(DecodeCompleteFrame());
2271 InsertFrame(kVideoFrameKey);
2272 // Skip to the next key frame.
2273 EXPECT_TRUE(DecodeCompleteFrame());
2274}
2275
stefan@webrtc.orgef144882013-05-07 19:16:33 +00002276TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
2277 InsertFrame(kVideoFrameKey);
2278 EXPECT_TRUE(DecodeCompleteFrame());
2279 const int kNumDeltaFrames = 5;
2280 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2281 InsertFrame(kVideoFrameKey);
2282 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
2283 EXPECT_TRUE(DecodeCompleteFrame());
2284 }
2285}
2286
2287TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
2288 InsertFrame(kVideoFrameKey);
2289 EXPECT_TRUE(DecodeCompleteFrame());
2290 const int kNumDeltaFrames = 5;
2291 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2292 InsertFrame(kVideoFrameKey);
2293 EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
2294 InsertFrame(kVideoFrameKey);
2295 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
2296 EXPECT_TRUE(DecodeCompleteFrame());
2297 }
2298}
2299
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002300TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
2301 InsertFrame(kVideoFrameKey);
2302 EXPECT_TRUE(DecodeCompleteFrame());
2303 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2304 clock_->TimeInMilliseconds());
2305 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2306 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
2307 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002308 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002309 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
2310 EXPECT_FALSE(DecodeCompleteFrame());
2311 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
2312 EXPECT_TRUE(DecodeCompleteFrame());
2313 EXPECT_TRUE(DecodeCompleteFrame());
2314}
2315
philipel83f831a2016-03-12 03:30:23 -08002316TEST_P(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002317 // Make sure empty packets doesn't clog the jitter buffer.
mikhal@webrtc.org9da75172013-04-11 18:49:13 +00002318 jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
pbos22993e12015-10-19 02:39:06 -07002319 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002320 InsertFrame(kVideoFrameKey);
2321 EXPECT_TRUE(DecodeCompleteFrame());
2322}
2323
philipel83f831a2016-03-12 03:30:23 -08002324TEST_P(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002325 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002326 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002327 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002328
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002329 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
2330 // old packet.
2331 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002332 // Insert a frame which should trigger a recycle until the next key frame.
philipel9d3ab612015-12-21 04:12:39 -08002333 EXPECT_EQ(kFlushIndicator,
2334 InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002335 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002336
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002337 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002338 std::vector<uint16_t> nack_list =
2339 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002340 // No key frame will be requested since the jitter buffer is empty.
2341 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002342 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002343
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002344 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002345 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002346 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002347 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002348
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002349 // The next complete continuous frame isn't a key frame, but we're waiting
2350 // for one.
2351 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002352 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002353 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002354 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002355}
2356
philipel83f831a2016-03-12 03:30:23 -08002357TEST_P(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002358 // Insert a key frame and decode it.
2359 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
2360 EXPECT_TRUE(DecodeCompleteFrame());
2361
2362 // Insert a frame which should trigger a recycle until the next key frame.
2363 EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
2364
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002365 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002366 std::vector<uint16_t> nack_list =
2367 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002368 // Verify that the jitter buffer does not request a key frame.
2369 EXPECT_FALSE(request_key_frame);
2370 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002371 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002372 // Verify that we can decode the next frame.
2373 EXPECT_TRUE(DecodeCompleteFrame());
2374}
2375
philipel83f831a2016-03-12 03:30:23 -08002376TEST_P(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002377 // Insert a key frame and decode it.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002378 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002379 EXPECT_TRUE(DecodeCompleteFrame());
2380
2381 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002382 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002383 // Insert a frame which should trigger a recycle until the next key frame.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002384 EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002385 EXPECT_FALSE(DecodeCompleteFrame());
2386
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002387 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002388 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002389 // The jitter buffer is empty, so we won't request key frames until we get a
2390 // packet.
2391 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002392
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002393 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002394 // Now we have a packet in the jitter buffer, a key frame will be requested
2395 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002396 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00002397 // The jitter buffer is empty, so we won't request key frames until we get a
2398 // packet.
2399 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002400 // The next complete continuous frame isn't a key frame, but we're waiting
2401 // for one.
2402 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002403 EXPECT_FALSE(DecodeIncompleteFrame());
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002404 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00002405 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00002406 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002407}
2408
philipel83f831a2016-03-12 03:30:23 -08002409TEST_P(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002410 DropFrame(10);
2411 // Insert a frame and try to generate a NACK list. Shouldn't get one.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002412 EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
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.orgad4af572012-01-12 15:16:49 +00002416 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002417 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002418 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002419}
2420
philipel83f831a2016-03-12 03:30:23 -08002421TEST_P(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002422 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002423 InsertFrame(kVideoFrameKey);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002424 stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08002425 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002426 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002427 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002428 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002429 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002430 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002431 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2432 EXPECT_EQ(1u, nack_sent_.size());
2433 else
2434 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00002435}
2436
philipel83f831a2016-03-12 03:30:23 -08002437TEST_P(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002438 stream_generator_->Init(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002439 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2440 clock_->TimeInMilliseconds());
2441 VCMPacket packet;
2442 stream_generator_->PopPacket(&packet, 0);
2443 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002444 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002445 EXPECT_FALSE(retransmitted);
2446 // Drop second packet.
2447 stream_generator_->PopPacket(&packet, 1);
2448 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
2449 EXPECT_FALSE(retransmitted);
2450 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002451 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002452 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002453 uint16_t seq_num;
2454 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2455 EXPECT_EQ(1u, nack_sent_.size());
2456 seq_num = nack_sent_[0];
2457 } else {
2458 EXPECT_EQ(1u, nack_list.size());
2459 seq_num = nack_list[0];
2460 }
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002461 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002462 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08002463 EXPECT_EQ(kCompleteSession,
2464 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00002465 EXPECT_TRUE(retransmitted);
2466 EXPECT_TRUE(DecodeCompleteFrame());
2467}
2468
philipel83f831a2016-03-12 03:30:23 -08002469TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002470 stream_generator_->Init(0, clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002471 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08002472 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002473 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002474 // Drop second packet.
2475 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2476 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002477 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002478 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002479 uint16_t seq_num;
2480 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2481 ASSERT_EQ(1u, nack_sent_.size());
2482 seq_num = nack_sent_[0];
2483 } else {
2484 ASSERT_EQ(1u, nack_list.size());
2485 seq_num = nack_list[0];
2486 }
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002487 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002488 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002489 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00002490}
2491
philipel83f831a2016-03-12 03:30:23 -08002492TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002493 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002494 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002495 // First frame is delta.
2496 stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
2497 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002498 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002499 // Drop second packet in frame.
2500 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
2501 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
2502 // Second frame is key.
2503 stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
2504 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002505 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002506 // Drop second packet in frame.
2507 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
2508 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002509 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002510 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08002511 uint16_t seq_num;
2512 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2513 ASSERT_EQ(2u, nack_sent_.size());
2514 seq_num = nack_sent_[1];
2515 } else {
2516 ASSERT_EQ(1u, nack_list.size());
2517 seq_num = nack_list[0];
2518 }
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002519 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08002520 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00002521}
2522
philipel83f831a2016-03-12 03:30:23 -08002523TEST_P(TestJitterBufferNack, NormalOperation) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002524 EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002525 jitter_buffer_->SetDecodeErrorMode(kWithErrors);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002526
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002527 EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002528 EXPECT_TRUE(DecodeIncompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002529
2530 // ----------------------------------------------------------------
2531 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
2532 // ----------------------------------------------------------------
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002533 stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002534 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00002535 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
agalusza@google.comd177c102013-08-08 01:12:33 +00002536 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002537 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002538 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002539 while (stream_generator_->PacketsRemaining() > 1) {
2540 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002541 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002542 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002543 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002544 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002545 }
agalusza@google.coma7e360e2013-08-01 03:15:08 +00002546 EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002547 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002548 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +00002549 EXPECT_FALSE(DecodeIncompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002550 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08002551
2552 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002553 std::vector<uint16_t> nack_list =
2554 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002555 const size_t kExpectedNackSize = 9;
philipel83f831a2016-03-12 03:30:23 -08002556 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
2557 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2558 else
2559 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002560 for (size_t i = 0; i < nack_list.size(); ++i)
2561 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002562}
2563
philipel83f831a2016-03-12 03:30:23 -08002564TEST_P(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002565 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002566 // ------- ------------------------------------------------------------
2567 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
2568 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002569 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002570 InsertFrame(kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002571 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002572 EXPECT_TRUE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002573 stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08002574 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00002575 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002576 while (stream_generator_->PacketsRemaining() > 1) {
2577 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002578 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002579 EXPECT_FALSE(request_key_frame);
2580 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002581 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002582 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002583 }
2584 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00002585 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00002586 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002587 EXPECT_FALSE(DecodeCompleteFrame());
2588 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002589 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002590 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002591 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002592 const size_t kExpectedNackSize = 10;
philipel83f831a2016-03-12 03:30:23 -08002593 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2594 ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
2595 for (size_t i = 0; i < nack_sent_.size(); ++i)
2596 EXPECT_EQ(i * 10, nack_sent_[i]);
2597 } else {
2598 ASSERT_EQ(kExpectedNackSize, nack_list.size());
2599 for (size_t i = 0; i < nack_list.size(); ++i)
2600 EXPECT_EQ(i * 10, nack_list[i]);
2601 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00002602}
2603
philipel83f831a2016-03-12 03:30:23 -08002604TEST_P(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002605 bool request_key_frame = false;
2606 // -----------------------------------
2607 // | 65532 | 65533 | 65534 | x | 0 | 1 |
2608 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002609 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002610 InsertFrame(kVideoFrameKey);
2611 EXPECT_FALSE(request_key_frame);
2612 EXPECT_TRUE(DecodeCompleteFrame());
2613 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2614 clock_->TimeInMilliseconds());
2615 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2616 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08002617 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002618 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002619 EXPECT_FALSE(request_key_frame);
2620 } else {
2621 stream_generator_->NextPacket(NULL); // Drop packet
2622 }
2623 stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
2624 clock_->TimeInMilliseconds());
2625 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2626 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00002627 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002628 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002629 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002630 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002631 // Verify the NACK list.
philipel83f831a2016-03-12 03:30:23 -08002632 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
2633 ASSERT_EQ(1u, nack_sent_.size());
2634 EXPECT_EQ(65535, nack_sent_[0]);
2635 } else {
2636 ASSERT_EQ(1u, nack_list.size());
2637 EXPECT_EQ(65535, nack_list[0]);
2638 }
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00002639}
2640
philipel83f831a2016-03-12 03:30:23 -08002641TEST_P(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002642 stream_generator_->Init(0, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002643 InsertFrame(kVideoFrameKey);
2644 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002645 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002646 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
2647 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002648
2649 // Far-into-the-future video frame, could be caused by resetting the encoder
2650 // or otherwise restarting. This should not fail when error when the packet is
2651 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07002652 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002653 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2654 InsertFrame(kVideoFrameKey);
2655 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002656 nack_list = jitter_buffer_->GetNackList(&extended);
2657 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002658
2659 // Stream should be decodable from this point.
2660 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
2661 InsertFrame(kVideoFrameDelta);
2662 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07002663 nack_list = jitter_buffer_->GetNackList(&extended);
2664 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00002665}
2666
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00002667} // namespace webrtc