1 /*
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
11 #include "modules/video_coding/jitter_buffer.h"
12
13 #include <list>
14 #include <memory>
15 #include <string>
16 #include <vector>
17
18 #include "absl/memory/memory.h"
19 #include "common_video/h264/h264_common.h"
20 #include "modules/video_coding/frame_buffer.h"
21 #include "modules/video_coding/media_opt_util.h"
22 #include "modules/video_coding/packet.h"
23 #include "modules/video_coding/test/stream_generator.h"
24 #include "system_wrappers/include/clock.h"
25 #include "system_wrappers/include/metrics.h"
26 #include "test/gmock.h"
27 #include "test/gtest.h"
28 #include "test/scoped_key_value_config.h"
29
30 namespace webrtc {
31
32 class TestBasicJitterBuffer : public ::testing::Test {
33 protected:
TestBasicJitterBuffer()34 TestBasicJitterBuffer() {}
SetUp()35 void SetUp() override {
36 clock_.reset(new SimulatedClock(0));
37 jitter_buffer_.reset(new VCMJitterBuffer(
38 clock_.get(), absl::WrapUnique(EventWrapper::Create()), field_trials_));
39 jitter_buffer_->Start();
40 seq_num_ = 1234;
41 timestamp_ = 0;
42 size_ = 1400;
43 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
44 data_[0] = 0;
45 data_[1] = 0;
46 data_[2] = 0x80;
47 int count = 3;
48 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
49 data_[i] = count;
50 count++;
51 if (count == 10) {
52 data_[i + 1] = 0;
53 data_[i + 2] = 0;
54 data_[i + 3] = 0x80;
55 count = 3;
56 i += 3;
57 }
58 }
59 RTPHeader rtp_header;
60 RTPVideoHeader video_header;
61 rtp_header.sequenceNumber = seq_num_;
62 rtp_header.timestamp = timestamp_;
63 rtp_header.markerBit = true;
64 video_header.codec = kVideoCodecGeneric;
65 video_header.is_first_packet_in_frame = true;
66 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
67 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
68 /*ntp_time_ms=*/0, clock_->CurrentTime()));
69 }
70
DecodeCompleteFrame()71 VCMEncodedFrame* DecodeCompleteFrame() {
72 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
73 if (!found_frame)
74 return nullptr;
75 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
76 }
77
CheckOutFrame(VCMEncodedFrame * frame_out,unsigned int size,bool startCode)78 void CheckOutFrame(VCMEncodedFrame* frame_out,
79 unsigned int size,
80 bool startCode) {
81 ASSERT_TRUE(frame_out);
82
83 const uint8_t* outData = frame_out->data();
84 unsigned int i = 0;
85
86 if (startCode) {
87 EXPECT_EQ(0, outData[0]);
88 EXPECT_EQ(0, outData[1]);
89 EXPECT_EQ(0, outData[2]);
90 EXPECT_EQ(1, outData[3]);
91 i += 4;
92 }
93
94 EXPECT_EQ(size, frame_out->size());
95 int count = 3;
96 for (; i < size; i++) {
97 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
98 i += 2;
99 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
100 EXPECT_EQ(0, outData[0]);
101 EXPECT_EQ(0, outData[1]);
102 EXPECT_EQ(0, outData[2]);
103 EXPECT_EQ(1, outData[3]);
104 i += 3;
105 } else {
106 EXPECT_EQ(count, outData[i]);
107 count++;
108 if (count == 10) {
109 count = 3;
110 }
111 }
112 }
113 }
114
115 uint16_t seq_num_;
116 uint32_t timestamp_;
117 int size_;
118 uint8_t data_[1500];
119 test::ScopedKeyValueConfig field_trials_;
120 std::unique_ptr<VCMPacket> packet_;
121 std::unique_ptr<SimulatedClock> clock_;
122 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
123 };
124
125 class TestRunningJitterBuffer : public ::testing::Test {
126 protected:
127 enum { kDataBufferSize = 10 };
128
SetUp()129 virtual void SetUp() {
130 clock_.reset(new SimulatedClock(0));
131 max_nack_list_size_ = 150;
132 oldest_packet_to_nack_ = 250;
133 jitter_buffer_ = new VCMJitterBuffer(
134 clock_.get(), absl::WrapUnique(EventWrapper::Create()), field_trials_);
135 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
136 jitter_buffer_->Start();
137 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
138 0);
139 memset(data_buffer_, 0, kDataBufferSize);
140 }
141
TearDown()142 virtual void TearDown() {
143 jitter_buffer_->Stop();
144 delete stream_generator_;
145 delete jitter_buffer_;
146 }
147
InsertPacketAndPop(int index)148 VCMFrameBufferEnum InsertPacketAndPop(int index) {
149 VCMPacket packet;
150 packet.dataPtr = data_buffer_;
151 bool packet_available = stream_generator_->PopPacket(&packet, index);
152 EXPECT_TRUE(packet_available);
153 if (!packet_available)
154 return kGeneralError; // Return here to avoid crashes below.
155 bool retransmitted = false;
156 return jitter_buffer_->InsertPacket(packet, &retransmitted);
157 }
158
InsertPacket(int index)159 VCMFrameBufferEnum InsertPacket(int index) {
160 VCMPacket packet;
161 packet.dataPtr = data_buffer_;
162 bool packet_available = stream_generator_->GetPacket(&packet, index);
163 EXPECT_TRUE(packet_available);
164 if (!packet_available)
165 return kGeneralError; // Return here to avoid crashes below.
166 bool retransmitted = false;
167 return jitter_buffer_->InsertPacket(packet, &retransmitted);
168 }
169
InsertFrame(VideoFrameType frame_type)170 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
171 stream_generator_->GenerateFrame(
172 frame_type, (frame_type != VideoFrameType::kEmptyFrame) ? 1 : 0,
173 (frame_type == VideoFrameType::kEmptyFrame) ? 1 : 0,
174 clock_->TimeInMilliseconds());
175 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
176 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
177 return ret;
178 }
179
InsertFrames(int num_frames,VideoFrameType frame_type)180 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
181 VCMFrameBufferEnum ret_for_all = kNoError;
182 for (int i = 0; i < num_frames; ++i) {
183 VCMFrameBufferEnum ret = InsertFrame(frame_type);
184 if (ret < kNoError) {
185 ret_for_all = ret;
186 } else if (ret_for_all >= kNoError) {
187 ret_for_all = ret;
188 }
189 }
190 return ret_for_all;
191 }
192
DropFrame(int num_packets)193 void DropFrame(int num_packets) {
194 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta,
195 num_packets, 0,
196 clock_->TimeInMilliseconds());
197 for (int i = 0; i < num_packets; ++i)
198 stream_generator_->DropLastPacket();
199 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
200 }
201
DecodeCompleteFrame()202 bool DecodeCompleteFrame() {
203 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
204 if (!found_frame)
205 return false;
206
207 VCMEncodedFrame* frame =
208 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
209 bool ret = (frame != NULL);
210 jitter_buffer_->ReleaseFrame(frame);
211 return ret;
212 }
213
214 test::ScopedKeyValueConfig field_trials_;
215 VCMJitterBuffer* jitter_buffer_;
216 StreamGenerator* stream_generator_;
217 std::unique_ptr<SimulatedClock> clock_;
218 size_t max_nack_list_size_;
219 int oldest_packet_to_nack_;
220 uint8_t data_buffer_[kDataBufferSize];
221 };
222
223 class TestJitterBufferNack : public TestRunningJitterBuffer {
224 protected:
TestJitterBufferNack()225 TestJitterBufferNack() {}
SetUp()226 virtual void SetUp() { TestRunningJitterBuffer::SetUp(); }
227
TearDown()228 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
229 };
230
TEST_F(TestBasicJitterBuffer,StopRunning)231 TEST_F(TestBasicJitterBuffer, StopRunning) {
232 jitter_buffer_->Stop();
233 EXPECT_TRUE(NULL == DecodeCompleteFrame());
234 jitter_buffer_->Start();
235
236 // No packets inserted.
237 EXPECT_TRUE(NULL == DecodeCompleteFrame());
238 }
239
TEST_F(TestBasicJitterBuffer,SinglePacketFrame)240 TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
241 // Always start with a complete key frame when not allowing errors.
242 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
243 packet_->video_header.is_first_packet_in_frame = true;
244 packet_->markerBit = true;
245 packet_->timestamp += 123 * 90;
246
247 // Insert the packet to the jitter buffer and get a frame.
248 bool retransmitted = false;
249 EXPECT_EQ(kCompleteSession,
250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
251 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
252 CheckOutFrame(frame_out, size_, false);
253 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
254 jitter_buffer_->ReleaseFrame(frame_out);
255 }
256
TEST_F(TestBasicJitterBuffer,DualPacketFrame)257 TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
258 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
259 packet_->video_header.is_first_packet_in_frame = true;
260 packet_->markerBit = false;
261
262 bool retransmitted = false;
263 EXPECT_EQ(kIncomplete,
264 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
265 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
266 // Should not be complete.
267 EXPECT_TRUE(frame_out == NULL);
268
269 ++seq_num_;
270 packet_->video_header.is_first_packet_in_frame = false;
271 packet_->markerBit = true;
272 packet_->seqNum = seq_num_;
273
274 EXPECT_EQ(kCompleteSession,
275 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
276
277 frame_out = DecodeCompleteFrame();
278 CheckOutFrame(frame_out, 2 * size_, false);
279
280 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
281 jitter_buffer_->ReleaseFrame(frame_out);
282 }
283
284 TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
285 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
286 packet_->video_header.is_first_packet_in_frame = true;
287 packet_->markerBit = false;
288
289 bool retransmitted = false;
290 EXPECT_EQ(kIncomplete,
291 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
292
293 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
294
295 // Frame should not be complete.
296 EXPECT_TRUE(frame_out == NULL);
297
298 // Insert 98 frames.
299 int loop = 0;
300 do {
301 seq_num_++;
302 packet_->video_header.is_first_packet_in_frame = false;
303 packet_->markerBit = false;
304 packet_->seqNum = seq_num_;
305
306 EXPECT_EQ(kIncomplete,
307 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
308 loop++;
309 } while (loop < 98);
310
311 // Insert last packet.
312 ++seq_num_;
313 packet_->video_header.is_first_packet_in_frame = false;
314 packet_->markerBit = true;
315 packet_->seqNum = seq_num_;
316
317 EXPECT_EQ(kCompleteSession,
318 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
319
320 frame_out = DecodeCompleteFrame();
321
322 CheckOutFrame(frame_out, 100 * size_, false);
323 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
324 jitter_buffer_->ReleaseFrame(frame_out);
325 }
326
327 TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
328 // Always start with a complete key frame.
329 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
330 packet_->video_header.is_first_packet_in_frame = true;
331 packet_->markerBit = true;
332
333 bool retransmitted = false;
334 EXPECT_EQ(kCompleteSession,
335 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
336 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
337 EXPECT_FALSE(frame_out == NULL);
338 jitter_buffer_->ReleaseFrame(frame_out);
339
340 ++seq_num_;
341 packet_->seqNum = seq_num_;
342 packet_->markerBit = false;
343 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
344 packet_->timestamp += 33 * 90;
345
346 EXPECT_EQ(kIncomplete,
347 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
348
349 frame_out = DecodeCompleteFrame();
350
351 // Frame should not be complete.
352 EXPECT_TRUE(frame_out == NULL);
353
354 packet_->video_header.is_first_packet_in_frame = false;
355 // Insert 98 frames.
356 int loop = 0;
357 do {
358 ++seq_num_;
359 packet_->seqNum = seq_num_;
360
361 // Insert a packet into a frame.
362 EXPECT_EQ(kIncomplete,
363 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
364 loop++;
365 } while (loop < 98);
366
367 // Insert the last packet.
368 ++seq_num_;
369 packet_->video_header.is_first_packet_in_frame = false;
370 packet_->markerBit = true;
371 packet_->seqNum = seq_num_;
372
373 EXPECT_EQ(kCompleteSession,
374 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
375
376 frame_out = DecodeCompleteFrame();
377
378 CheckOutFrame(frame_out, 100 * size_, false);
379 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
380 jitter_buffer_->ReleaseFrame(frame_out);
381 }
382
TEST_F(TestBasicJitterBuffer,PacketReorderingReverseOrder)383 TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
384 // Insert the "first" packet last.
385 seq_num_ += 100;
386 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
387 packet_->video_header.is_first_packet_in_frame = false;
388 packet_->markerBit = true;
389 packet_->seqNum = seq_num_;
390 packet_->timestamp = timestamp_;
391
392 bool retransmitted = false;
393 EXPECT_EQ(kIncomplete,
394 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
395
396 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
397
398 EXPECT_TRUE(frame_out == NULL);
399
400 // Insert 98 packets.
401 int loop = 0;
402 do {
403 seq_num_--;
404 packet_->video_header.is_first_packet_in_frame = false;
405 packet_->markerBit = false;
406 packet_->seqNum = seq_num_;
407
408 EXPECT_EQ(kIncomplete,
409 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
410 loop++;
411 } while (loop < 98);
412
413 // Insert the last packet.
414 seq_num_--;
415 packet_->video_header.is_first_packet_in_frame = true;
416 packet_->markerBit = false;
417 packet_->seqNum = seq_num_;
418
419 EXPECT_EQ(kCompleteSession,
420 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
421
422 frame_out = DecodeCompleteFrame();
423
424 CheckOutFrame(frame_out, 100 * size_, false);
425
426 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
427 jitter_buffer_->ReleaseFrame(frame_out);
428 }
429
TEST_F(TestBasicJitterBuffer,FrameReordering2Frames2PacketsEach)430 TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
431 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
432 packet_->video_header.is_first_packet_in_frame = true;
433 packet_->markerBit = false;
434
435 bool retransmitted = false;
436 EXPECT_EQ(kIncomplete,
437 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
438
439 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
440
441 EXPECT_TRUE(frame_out == NULL);
442
443 seq_num_++;
444 packet_->video_header.is_first_packet_in_frame = false;
445 packet_->markerBit = true;
446 packet_->seqNum = seq_num_;
447
448 EXPECT_EQ(kCompleteSession,
449 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
450
451 // check that we fail to get frame since seqnum is not continuous
452 frame_out = DecodeCompleteFrame();
453 EXPECT_TRUE(frame_out == NULL);
454
455 seq_num_ -= 3;
456 timestamp_ -= 33 * 90;
457 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
458 packet_->video_header.is_first_packet_in_frame = true;
459 packet_->markerBit = false;
460 packet_->seqNum = seq_num_;
461 packet_->timestamp = timestamp_;
462
463 EXPECT_EQ(kIncomplete,
464 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
465
466 frame_out = DecodeCompleteFrame();
467
468 // It should not be complete.
469 EXPECT_TRUE(frame_out == NULL);
470
471 seq_num_++;
472 packet_->video_header.is_first_packet_in_frame = false;
473 packet_->markerBit = true;
474 packet_->seqNum = seq_num_;
475
476 EXPECT_EQ(kCompleteSession,
477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
478
479 frame_out = DecodeCompleteFrame();
480 CheckOutFrame(frame_out, 2 * size_, false);
481 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
482 jitter_buffer_->ReleaseFrame(frame_out);
483
484 frame_out = DecodeCompleteFrame();
485 CheckOutFrame(frame_out, 2 * size_, false);
486 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
487 jitter_buffer_->ReleaseFrame(frame_out);
488 }
489
TEST_F(TestBasicJitterBuffer,TestReorderingWithPadding)490 TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
491 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
492 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
493 packet_->video_header.is_first_packet_in_frame = true;
494 packet_->markerBit = true;
495
496 // Send in an initial good packet/frame (Frame A) to start things off.
497 bool retransmitted = false;
498 EXPECT_EQ(kCompleteSession,
499 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
500 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
501 EXPECT_TRUE(frame_out != NULL);
502 jitter_buffer_->ReleaseFrame(frame_out);
503
504 // Now send in a complete delta frame (Frame C), but with a sequence number
505 // gap. No pic index either, so no temporal scalability cheating :)
506 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
507 // Leave a gap of 2 sequence numbers and two frames.
508 packet_->seqNum = seq_num_ + 3;
509 packet_->timestamp = timestamp_ + (66 * 90);
510 // Still isFirst = marker = true.
511 // Session should be complete (frame is complete), but there's nothing to
512 // decode yet.
513 EXPECT_EQ(kCompleteSession,
514 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
515 frame_out = DecodeCompleteFrame();
516 EXPECT_TRUE(frame_out == NULL);
517
518 // Now send in a complete delta frame (Frame B) that is continuous from A, but
519 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
520 packet_->seqNum = seq_num_ + 1;
521 packet_->timestamp = timestamp_ + (33 * 90);
522 // Still isFirst = marker = true.
523 EXPECT_EQ(kCompleteSession,
524 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
525 frame_out = DecodeCompleteFrame();
526 EXPECT_TRUE(frame_out != NULL);
527 jitter_buffer_->ReleaseFrame(frame_out);
528
529 // But Frame C isn't continuous yet.
530 frame_out = DecodeCompleteFrame();
531 EXPECT_TRUE(frame_out == NULL);
532
533 // Add in the padding. These are empty packets (data length is 0) with no
534 // marker bit and matching the timestamp of Frame B.
535 RTPHeader rtp_header;
536 RTPVideoHeader video_header;
537 rtp_header.sequenceNumber = seq_num_ + 2;
538 rtp_header.timestamp = timestamp_ + (33 * 90);
539 rtp_header.markerBit = false;
540 video_header.codec = kVideoCodecGeneric;
541 video_header.frame_type = VideoFrameType::kEmptyFrame;
542 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
543 /*ntp_time_ms=*/0, clock_->CurrentTime());
544 EXPECT_EQ(kOldPacket,
545 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
546 empty_packet.seqNum += 1;
547 EXPECT_EQ(kOldPacket,
548 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
549
550 // But now Frame C should be ready!
551 frame_out = DecodeCompleteFrame();
552 EXPECT_TRUE(frame_out != NULL);
553 jitter_buffer_->ReleaseFrame(frame_out);
554 }
555
TEST_F(TestBasicJitterBuffer,DuplicatePackets)556 TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
557 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
558 packet_->video_header.is_first_packet_in_frame = true;
559 packet_->markerBit = false;
560 packet_->seqNum = seq_num_;
561 packet_->timestamp = timestamp_;
562 EXPECT_EQ(0, jitter_buffer_->num_packets());
563 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
564
565 bool retransmitted = false;
566 EXPECT_EQ(kIncomplete,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
568
569 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
570
571 EXPECT_TRUE(frame_out == NULL);
572 EXPECT_EQ(1, jitter_buffer_->num_packets());
573 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
574
575 // Insert a packet into a frame.
576 EXPECT_EQ(kDuplicatePacket,
577 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
578 EXPECT_EQ(2, jitter_buffer_->num_packets());
579 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
580
581 seq_num_++;
582 packet_->seqNum = seq_num_;
583 packet_->markerBit = true;
584 packet_->video_header.is_first_packet_in_frame = false;
585
586 EXPECT_EQ(kCompleteSession,
587 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
588
589 frame_out = DecodeCompleteFrame();
590 ASSERT_TRUE(frame_out != NULL);
591 CheckOutFrame(frame_out, 2 * size_, false);
592
593 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
594 EXPECT_EQ(3, jitter_buffer_->num_packets());
595 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
596 jitter_buffer_->ReleaseFrame(frame_out);
597 }
598
TEST_F(TestBasicJitterBuffer,DuplicatePreviousDeltaFramePacket)599 TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
600 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
601 packet_->video_header.is_first_packet_in_frame = true;
602 packet_->markerBit = true;
603 packet_->seqNum = seq_num_;
604 packet_->timestamp = timestamp_;
605 EXPECT_EQ(0, jitter_buffer_->num_packets());
606 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
607
608 bool retransmitted = false;
609 // Insert first complete frame.
610 EXPECT_EQ(kCompleteSession,
611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
612
613 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
614 ASSERT_TRUE(frame_out != NULL);
615 CheckOutFrame(frame_out, size_, false);
616 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
617 jitter_buffer_->ReleaseFrame(frame_out);
618
619 // Insert 3 delta frames.
620 for (uint16_t i = 1; i <= 3; ++i) {
621 packet_->seqNum = seq_num_ + i;
622 packet_->timestamp = timestamp_ + (i * 33) * 90;
623 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
624 EXPECT_EQ(kCompleteSession,
625 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
626 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
627 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
628 }
629
630 // Retransmit second delta frame.
631 packet_->seqNum = seq_num_ + 2;
632 packet_->timestamp = timestamp_ + 66 * 90;
633
634 EXPECT_EQ(kDuplicatePacket,
635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
636
637 EXPECT_EQ(5, jitter_buffer_->num_packets());
638 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
639
640 // Should be able to decode 3 delta frames, key frame already decoded.
641 for (size_t i = 0; i < 3; ++i) {
642 frame_out = DecodeCompleteFrame();
643 ASSERT_TRUE(frame_out != NULL);
644 CheckOutFrame(frame_out, size_, false);
645 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
646 jitter_buffer_->ReleaseFrame(frame_out);
647 }
648 }
649
TEST_F(TestBasicJitterBuffer,TestSkipForwardVp9)650 TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
651 // Verify that JB skips forward to next base layer frame.
652 // -------------------------------------------------
653 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
654 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
655 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
656 // | ss | x | x | x | |
657 // -------------------------------------------------
658 // |<----------tl0idx:200--------->|<---tl0idx:201---
659
660 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
661 auto& vp9_header =
662 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
663
664 bool re = false;
665 packet_->video_header.codec = kVideoCodecVP9;
666 packet_->video_header.is_first_packet_in_frame = true;
667 packet_->markerBit = true;
668 vp9_header.flexible_mode = false;
669 vp9_header.spatial_idx = 0;
670 vp9_header.beginning_of_frame = true;
671 vp9_header.end_of_frame = true;
672 vp9_header.temporal_up_switch = false;
673
674 packet_->seqNum = 65485;
675 packet_->timestamp = 1000;
676 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
677 vp9_header.picture_id = 5;
678 vp9_header.tl0_pic_idx = 200;
679 vp9_header.temporal_idx = 0;
680 vp9_header.ss_data_available = true;
681 vp9_header.gof.SetGofInfoVP9(
682 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
683 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
684
685 // Insert next temporal layer 0.
686 packet_->seqNum = 65489;
687 packet_->timestamp = 13000;
688 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
689 vp9_header.picture_id = 9;
690 vp9_header.tl0_pic_idx = 201;
691 vp9_header.temporal_idx = 0;
692 vp9_header.ss_data_available = false;
693 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
694
695 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
696 EXPECT_EQ(1000U, frame_out->Timestamp());
697 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
698 jitter_buffer_->ReleaseFrame(frame_out);
699
700 frame_out = DecodeCompleteFrame();
701 EXPECT_EQ(13000U, frame_out->Timestamp());
702 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
703 jitter_buffer_->ReleaseFrame(frame_out);
704 }
705
TEST_F(TestBasicJitterBuffer,ReorderedVp9SsData_3TlLayers)706 TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
707 // Verify that frames are updated with SS data when SS packet is reordered.
708 // --------------------------------
709 // | 65486 | 65487 | 65485 |...
710 // | pid:6 | pid:7 | pid:5 |...
711 // | tid:2 | tid:1 | tid:0 |...
712 // | | | ss |
713 // --------------------------------
714 // |<--------tl0idx:200--------->|
715
716 auto& vp9_header =
717 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
718
719 bool re = false;
720 packet_->video_header.codec = kVideoCodecVP9;
721 packet_->video_header.is_first_packet_in_frame = true;
722 packet_->markerBit = true;
723 vp9_header.flexible_mode = false;
724 vp9_header.spatial_idx = 0;
725 vp9_header.beginning_of_frame = true;
726 vp9_header.end_of_frame = true;
727 vp9_header.tl0_pic_idx = 200;
728
729 packet_->seqNum = 65486;
730 packet_->timestamp = 6000;
731 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
732 vp9_header.picture_id = 6;
733 vp9_header.temporal_idx = 2;
734 vp9_header.temporal_up_switch = true;
735 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
736
737 packet_->seqNum = 65487;
738 packet_->timestamp = 9000;
739 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
740 vp9_header.picture_id = 7;
741 vp9_header.temporal_idx = 1;
742 vp9_header.temporal_up_switch = true;
743 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
744
745 // Insert first frame with SS data.
746 packet_->seqNum = 65485;
747 packet_->timestamp = 3000;
748 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
749 packet_->video_header.width = 352;
750 packet_->video_header.height = 288;
751 vp9_header.picture_id = 5;
752 vp9_header.temporal_idx = 0;
753 vp9_header.temporal_up_switch = false;
754 vp9_header.ss_data_available = true;
755 vp9_header.gof.SetGofInfoVP9(
756 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
757 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
758
759 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
760 EXPECT_EQ(3000U, frame_out->Timestamp());
761 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
762 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
763 EXPECT_FALSE(
764 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
765 jitter_buffer_->ReleaseFrame(frame_out);
766
767 frame_out = DecodeCompleteFrame();
768 EXPECT_EQ(6000U, frame_out->Timestamp());
769 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
770 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
771 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
772 jitter_buffer_->ReleaseFrame(frame_out);
773
774 frame_out = DecodeCompleteFrame();
775 EXPECT_EQ(9000U, frame_out->Timestamp());
776 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
777 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
778 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
779 jitter_buffer_->ReleaseFrame(frame_out);
780 }
781
TEST_F(TestBasicJitterBuffer,ReorderedVp9SsData_2Tl2SLayers)782 TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
783 // Verify that frames are updated with SS data when SS packet is reordered.
784 // -----------------------------------------
785 // | 65486 | 65487 | 65485 | 65484 |...
786 // | pid:6 | pid:6 | pid:5 | pid:5 |...
787 // | tid:1 | tid:1 | tid:0 | tid:0 |...
788 // | sid:0 | sid:1 | sid:1 | sid:0 |...
789 // | t:6000 | t:6000 | t:3000 | t:3000 |
790 // | | | | ss |
791 // -----------------------------------------
792 // |<-----------tl0idx:200------------>|
793
794 auto& vp9_header =
795 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
796
797 bool re = false;
798 packet_->video_header.codec = kVideoCodecVP9;
799 vp9_header.flexible_mode = false;
800 vp9_header.beginning_of_frame = true;
801 vp9_header.end_of_frame = true;
802 vp9_header.tl0_pic_idx = 200;
803
804 packet_->video_header.is_first_packet_in_frame = true;
805 packet_->markerBit = false;
806 packet_->seqNum = 65486;
807 packet_->timestamp = 6000;
808 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
809 vp9_header.spatial_idx = 0;
810 vp9_header.picture_id = 6;
811 vp9_header.temporal_idx = 1;
812 vp9_header.temporal_up_switch = true;
813 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
814
815 packet_->video_header.is_first_packet_in_frame = false;
816 packet_->markerBit = true;
817 packet_->seqNum = 65487;
818 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
819 vp9_header.spatial_idx = 1;
820 vp9_header.picture_id = 6;
821 vp9_header.temporal_idx = 1;
822 vp9_header.temporal_up_switch = true;
823 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
824
825 packet_->video_header.is_first_packet_in_frame = false;
826 packet_->markerBit = true;
827 packet_->seqNum = 65485;
828 packet_->timestamp = 3000;
829 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
830 vp9_header.spatial_idx = 1;
831 vp9_header.picture_id = 5;
832 vp9_header.temporal_idx = 0;
833 vp9_header.temporal_up_switch = false;
834 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
835
836 // Insert first frame with SS data.
837 packet_->video_header.is_first_packet_in_frame = true;
838 packet_->markerBit = false;
839 packet_->seqNum = 65484;
840 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
841 packet_->video_header.width = 352;
842 packet_->video_header.height = 288;
843 vp9_header.spatial_idx = 0;
844 vp9_header.picture_id = 5;
845 vp9_header.temporal_idx = 0;
846 vp9_header.temporal_up_switch = false;
847 vp9_header.ss_data_available = true;
848 vp9_header.gof.SetGofInfoVP9(
849 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
850 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
851
852 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
853 EXPECT_EQ(3000U, frame_out->Timestamp());
854 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
855 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
856 EXPECT_FALSE(
857 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
858 jitter_buffer_->ReleaseFrame(frame_out);
859
860 frame_out = DecodeCompleteFrame();
861 EXPECT_EQ(6000U, frame_out->Timestamp());
862 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
863 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
864 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
865 jitter_buffer_->ReleaseFrame(frame_out);
866 }
867
TEST_F(TestBasicJitterBuffer,H264InsertStartCode)868 TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
869 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
870 packet_->video_header.is_first_packet_in_frame = true;
871 packet_->markerBit = false;
872 packet_->seqNum = seq_num_;
873 packet_->timestamp = timestamp_;
874 packet_->insertStartCode = true;
875
876 bool retransmitted = false;
877 EXPECT_EQ(kIncomplete,
878 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
879
880 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
881
882 // Frame should not be complete.
883 EXPECT_TRUE(frame_out == NULL);
884
885 seq_num_++;
886 packet_->video_header.is_first_packet_in_frame = false;
887 packet_->markerBit = true;
888 packet_->seqNum = seq_num_;
889
890 EXPECT_EQ(kCompleteSession,
891 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
892
893 frame_out = DecodeCompleteFrame();
894 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
895 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
896 jitter_buffer_->ReleaseFrame(frame_out);
897 }
898
TEST_F(TestBasicJitterBuffer,SpsAndPpsHandling)899 TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
900 auto& h264_header =
901 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
902 packet_->timestamp = timestamp_;
903 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
904 packet_->video_header.is_first_packet_in_frame = true;
905 packet_->markerBit = true;
906 packet_->video_header.codec = kVideoCodecH264;
907 h264_header.nalu_type = H264::NaluType::kIdr;
908 h264_header.nalus[0].type = H264::NaluType::kIdr;
909 h264_header.nalus[0].sps_id = -1;
910 h264_header.nalus[0].pps_id = 0;
911 h264_header.nalus_length = 1;
912 bool retransmitted = false;
913 EXPECT_EQ(kCompleteSession,
914 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
915 // Not decodable since sps and pps are missing.
916 EXPECT_EQ(nullptr, DecodeCompleteFrame());
917
918 timestamp_ += 3000;
919 packet_->timestamp = timestamp_;
920 ++seq_num_;
921 packet_->seqNum = seq_num_;
922 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
923 packet_->video_header.is_first_packet_in_frame = true;
924 packet_->markerBit = false;
925 packet_->video_header.codec = kVideoCodecH264;
926 h264_header.nalu_type = H264::NaluType::kStapA;
927 h264_header.nalus[0].type = H264::NaluType::kSps;
928 h264_header.nalus[0].sps_id = 0;
929 h264_header.nalus[0].pps_id = -1;
930 h264_header.nalus[1].type = H264::NaluType::kPps;
931 h264_header.nalus[1].sps_id = 0;
932 h264_header.nalus[1].pps_id = 0;
933 h264_header.nalus_length = 2;
934 // Not complete since the marker bit hasn't been received.
935 EXPECT_EQ(kIncomplete,
936 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
937
938 ++seq_num_;
939 packet_->seqNum = seq_num_;
940 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
941 packet_->video_header.is_first_packet_in_frame = false;
942 packet_->markerBit = true;
943 packet_->video_header.codec = kVideoCodecH264;
944 h264_header.nalu_type = H264::NaluType::kIdr;
945 h264_header.nalus[0].type = H264::NaluType::kIdr;
946 h264_header.nalus[0].sps_id = -1;
947 h264_header.nalus[0].pps_id = 0;
948 h264_header.nalus_length = 1;
949 // Complete and decodable since the pps and sps are received in the first
950 // packet of this frame.
951 EXPECT_EQ(kCompleteSession,
952 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
953 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
954 ASSERT_NE(nullptr, frame_out);
955 jitter_buffer_->ReleaseFrame(frame_out);
956
957 timestamp_ += 3000;
958 packet_->timestamp = timestamp_;
959 ++seq_num_;
960 packet_->seqNum = seq_num_;
961 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
962 packet_->video_header.is_first_packet_in_frame = true;
963 packet_->markerBit = true;
964 packet_->video_header.codec = kVideoCodecH264;
965 h264_header.nalu_type = H264::NaluType::kSlice;
966 h264_header.nalus[0].type = H264::NaluType::kSlice;
967 h264_header.nalus[0].sps_id = -1;
968 h264_header.nalus[0].pps_id = 0;
969 h264_header.nalus_length = 1;
970 // Complete and decodable since sps, pps and key frame has been received.
971 EXPECT_EQ(kCompleteSession,
972 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
973 frame_out = DecodeCompleteFrame();
974 ASSERT_NE(nullptr, frame_out);
975 jitter_buffer_->ReleaseFrame(frame_out);
976 }
977
TEST_F(TestBasicJitterBuffer,DeltaFrame100PacketsWithSeqNumWrap)978 TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
979 seq_num_ = 0xfff0;
980 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
981 packet_->video_header.is_first_packet_in_frame = true;
982 packet_->markerBit = false;
983 packet_->seqNum = seq_num_;
984 packet_->timestamp = timestamp_;
985
986 bool retransmitted = false;
987 EXPECT_EQ(kIncomplete,
988 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
989
990 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
991
992 EXPECT_TRUE(frame_out == NULL);
993
994 int loop = 0;
995 do {
996 seq_num_++;
997 packet_->video_header.is_first_packet_in_frame = false;
998 packet_->markerBit = false;
999 packet_->seqNum = seq_num_;
1000
1001 EXPECT_EQ(kIncomplete,
1002 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1003
1004 frame_out = DecodeCompleteFrame();
1005
1006 EXPECT_TRUE(frame_out == NULL);
1007
1008 loop++;
1009 } while (loop < 98);
1010
1011 seq_num_++;
1012 packet_->video_header.is_first_packet_in_frame = false;
1013 packet_->markerBit = true;
1014 packet_->seqNum = seq_num_;
1015
1016 EXPECT_EQ(kCompleteSession,
1017 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1018
1019 frame_out = DecodeCompleteFrame();
1020
1021 CheckOutFrame(frame_out, 100 * size_, false);
1022
1023 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1024 jitter_buffer_->ReleaseFrame(frame_out);
1025 }
1026
TEST_F(TestBasicJitterBuffer,PacketReorderingReverseWithNegSeqNumWrap)1027 TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
1028 // Insert "first" packet last seqnum.
1029 seq_num_ = 10;
1030 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1031 packet_->video_header.is_first_packet_in_frame = false;
1032 packet_->markerBit = true;
1033 packet_->seqNum = seq_num_;
1034
1035 bool retransmitted = false;
1036 EXPECT_EQ(kIncomplete,
1037 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1038 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1039
1040 // Should not be complete.
1041 EXPECT_TRUE(frame_out == NULL);
1042
1043 // Insert 98 frames.
1044 int loop = 0;
1045 do {
1046 seq_num_--;
1047 packet_->video_header.is_first_packet_in_frame = false;
1048 packet_->markerBit = false;
1049 packet_->seqNum = seq_num_;
1050
1051 EXPECT_EQ(kIncomplete,
1052 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1053
1054 frame_out = DecodeCompleteFrame();
1055
1056 EXPECT_TRUE(frame_out == NULL);
1057
1058 loop++;
1059 } while (loop < 98);
1060
1061 // Insert last packet.
1062 seq_num_--;
1063 packet_->video_header.is_first_packet_in_frame = true;
1064 packet_->markerBit = false;
1065 packet_->seqNum = seq_num_;
1066
1067 EXPECT_EQ(kCompleteSession,
1068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1069
1070 frame_out = DecodeCompleteFrame();
1071 CheckOutFrame(frame_out, 100 * size_, false);
1072 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1073 jitter_buffer_->ReleaseFrame(frame_out);
1074 }
1075
TEST_F(TestBasicJitterBuffer,TestInsertOldFrame)1076 TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
1077 // ------- -------
1078 // | 2 | | 1 |
1079 // ------- -------
1080 // t = 3000 t = 2000
1081 seq_num_ = 2;
1082 timestamp_ = 3000;
1083 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1084 packet_->video_header.is_first_packet_in_frame = true;
1085 packet_->markerBit = true;
1086 packet_->timestamp = timestamp_;
1087 packet_->seqNum = seq_num_;
1088
1089 bool retransmitted = false;
1090 EXPECT_EQ(kCompleteSession,
1091 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1092
1093 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1094 EXPECT_EQ(3000u, frame_out->Timestamp());
1095 CheckOutFrame(frame_out, size_, false);
1096 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1097 jitter_buffer_->ReleaseFrame(frame_out);
1098
1099 seq_num_--;
1100 timestamp_ = 2000;
1101 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1102 packet_->video_header.is_first_packet_in_frame = true;
1103 packet_->markerBit = true;
1104 packet_->seqNum = seq_num_;
1105 packet_->timestamp = timestamp_;
1106
1107 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1108 }
1109
TEST_F(TestBasicJitterBuffer,TestInsertOldFrameWithSeqNumWrap)1110 TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
1111 // ------- -------
1112 // | 2 | | 1 |
1113 // ------- -------
1114 // t = 3000 t = 0xffffff00
1115
1116 seq_num_ = 2;
1117 timestamp_ = 3000;
1118 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1119 packet_->video_header.is_first_packet_in_frame = true;
1120 packet_->markerBit = true;
1121 packet_->seqNum = seq_num_;
1122 packet_->timestamp = timestamp_;
1123
1124 bool retransmitted = false;
1125 EXPECT_EQ(kCompleteSession,
1126 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1127
1128 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1129 EXPECT_EQ(timestamp_, frame_out->Timestamp());
1130
1131 CheckOutFrame(frame_out, size_, false);
1132
1133 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1134
1135 jitter_buffer_->ReleaseFrame(frame_out);
1136
1137 seq_num_--;
1138 timestamp_ = 0xffffff00;
1139 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1140 packet_->video_header.is_first_packet_in_frame = true;
1141 packet_->markerBit = true;
1142 packet_->seqNum = seq_num_;
1143 packet_->timestamp = timestamp_;
1144
1145 // This timestamp is old.
1146 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1147 }
1148
TEST_F(TestBasicJitterBuffer,TimestampWrap)1149 TEST_F(TestBasicJitterBuffer, TimestampWrap) {
1150 // --------------- ---------------
1151 // | 1 | 2 | | 3 | 4 |
1152 // --------------- ---------------
1153 // t = 0xffffff00 t = 33*90
1154
1155 timestamp_ = 0xffffff00;
1156 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1157 packet_->video_header.is_first_packet_in_frame = true;
1158 packet_->markerBit = false;
1159 packet_->seqNum = seq_num_;
1160 packet_->timestamp = timestamp_;
1161
1162 bool retransmitted = false;
1163 EXPECT_EQ(kIncomplete,
1164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1165
1166 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1167 EXPECT_TRUE(frame_out == NULL);
1168
1169 seq_num_++;
1170 packet_->video_header.is_first_packet_in_frame = false;
1171 packet_->markerBit = true;
1172 packet_->seqNum = seq_num_;
1173
1174 EXPECT_EQ(kCompleteSession,
1175 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1176
1177 frame_out = DecodeCompleteFrame();
1178 CheckOutFrame(frame_out, 2 * size_, false);
1179 jitter_buffer_->ReleaseFrame(frame_out);
1180
1181 seq_num_++;
1182 timestamp_ += 33 * 90;
1183 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1184 packet_->video_header.is_first_packet_in_frame = true;
1185 packet_->markerBit = false;
1186 packet_->seqNum = seq_num_;
1187 packet_->timestamp = timestamp_;
1188
1189 EXPECT_EQ(kIncomplete,
1190 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1191
1192 frame_out = DecodeCompleteFrame();
1193 EXPECT_TRUE(frame_out == NULL);
1194
1195 seq_num_++;
1196 packet_->video_header.is_first_packet_in_frame = false;
1197 packet_->markerBit = true;
1198 packet_->seqNum = seq_num_;
1199
1200 EXPECT_EQ(kCompleteSession,
1201 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1202
1203 frame_out = DecodeCompleteFrame();
1204 CheckOutFrame(frame_out, 2 * size_, false);
1205 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
1206 jitter_buffer_->ReleaseFrame(frame_out);
1207 }
1208
1209 TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
1210 // ------- -------
1211 // | 1 | | 2 |
1212 // ------- -------
1213 // t = 0xffffff00 t = 2700
1214
1215 timestamp_ = 0xffffff00;
1216 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1217 packet_->video_header.is_first_packet_in_frame = true;
1218 packet_->markerBit = true;
1219 packet_->timestamp = timestamp_;
1220
1221 bool retransmitted = false;
1222 // Insert first frame (session will be complete).
1223 EXPECT_EQ(kCompleteSession,
1224 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1225
1226 // Insert next frame.
1227 seq_num_++;
1228 timestamp_ = 2700;
1229 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1230 packet_->video_header.is_first_packet_in_frame = true;
1231 packet_->markerBit = true;
1232 packet_->seqNum = seq_num_;
1233 packet_->timestamp = timestamp_;
1234
1235 EXPECT_EQ(kCompleteSession,
1236 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1237
1238 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1239 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
1240 CheckOutFrame(frame_out, size_, false);
1241 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1242 jitter_buffer_->ReleaseFrame(frame_out);
1243
1244 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1245 EXPECT_EQ(2700u, frame_out2->Timestamp());
1246 CheckOutFrame(frame_out2, size_, false);
1247 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
1248 jitter_buffer_->ReleaseFrame(frame_out2);
1249 }
1250
TEST_F(TestBasicJitterBuffer,Insert2FramesReOrderedWithTimestampWrap)1251 TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
1252 // ------- -------
1253 // | 2 | | 1 |
1254 // ------- -------
1255 // t = 2700 t = 0xffffff00
1256
1257 seq_num_ = 2;
1258 timestamp_ = 2700;
1259 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1260 packet_->video_header.is_first_packet_in_frame = true;
1261 packet_->markerBit = true;
1262 packet_->seqNum = seq_num_;
1263 packet_->timestamp = timestamp_;
1264
1265 bool retransmitted = false;
1266 EXPECT_EQ(kCompleteSession,
1267 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1268
1269 // Insert second frame
1270 seq_num_--;
1271 timestamp_ = 0xffffff00;
1272 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1273 packet_->video_header.is_first_packet_in_frame = true;
1274 packet_->markerBit = true;
1275 packet_->seqNum = seq_num_;
1276 packet_->timestamp = timestamp_;
1277
1278 EXPECT_EQ(kCompleteSession,
1279 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1280
1281 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1282 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
1283 CheckOutFrame(frame_out, size_, false);
1284 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1285 jitter_buffer_->ReleaseFrame(frame_out);
1286
1287 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
1288 EXPECT_EQ(2700u, frame_out2->Timestamp());
1289 CheckOutFrame(frame_out2, size_, false);
1290 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
1291 jitter_buffer_->ReleaseFrame(frame_out2);
1292 }
1293
TEST_F(TestBasicJitterBuffer,DeltaFrameWithMoreThanMaxNumberOfPackets)1294 TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
1295 int loop = 0;
1296 bool firstPacket = true;
1297 bool retransmitted = false;
1298 // Insert kMaxPacketsInJitterBuffer into frame.
1299 do {
1300 seq_num_++;
1301 packet_->video_header.is_first_packet_in_frame = false;
1302 packet_->markerBit = false;
1303 packet_->seqNum = seq_num_;
1304
1305 if (firstPacket) {
1306 EXPECT_EQ(kIncomplete,
1307 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1308 firstPacket = false;
1309 } else {
1310 EXPECT_EQ(kIncomplete,
1311 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1312 }
1313
1314 loop++;
1315 } while (loop < kMaxPacketsInSession);
1316
1317 // Max number of packets inserted.
1318 // Insert one more packet.
1319 seq_num_++;
1320 packet_->video_header.is_first_packet_in_frame = false;
1321 packet_->markerBit = true;
1322 packet_->seqNum = seq_num_;
1323
1324 // Insert the packet -> frame recycled.
1325 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1326 EXPECT_TRUE(NULL == DecodeCompleteFrame());
1327 }
1328
TEST_F(TestBasicJitterBuffer,ExceedNumOfFrameWithSeqNumWrap)1329 TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
1330 // TEST fill JB with more than max number of frame (50 delta frames +
1331 // 51 key frames) with wrap in seq_num_
1332 //
1333 // --------------------------------------------------------------
1334 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1335 // --------------------------------------------------------------
1336 // |<-----------delta frames------------->|<------key frames----->|
1337
1338 // Make sure the jitter doesn't request a keyframe after too much non-
1339 // decodable frames.
1340 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
1341
1342 int loop = 0;
1343 seq_num_ = 65485;
1344 uint32_t first_key_frame_timestamp = 0;
1345 bool retransmitted = false;
1346 // Insert MAX_NUMBER_OF_FRAMES frames.
1347 do {
1348 timestamp_ += 33 * 90;
1349 seq_num_++;
1350 packet_->video_header.is_first_packet_in_frame = true;
1351 packet_->markerBit = true;
1352 packet_->seqNum = seq_num_;
1353 packet_->timestamp = timestamp_;
1354
1355 if (loop == 50) {
1356 first_key_frame_timestamp = packet_->timestamp;
1357 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1358 }
1359
1360 // Insert frame.
1361 EXPECT_EQ(kCompleteSession,
1362 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1363
1364 loop++;
1365 } while (loop < kMaxNumberOfFrames);
1366
1367 // Max number of frames inserted.
1368
1369 // Insert one more frame.
1370 timestamp_ += 33 * 90;
1371 seq_num_++;
1372 packet_->video_header.is_first_packet_in_frame = true;
1373 packet_->markerBit = true;
1374 packet_->seqNum = seq_num_;
1375 packet_->timestamp = timestamp_;
1376
1377 // Now, no free frame - frames will be recycled until first key frame.
1378 EXPECT_EQ(kFlushIndicator,
1379 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1380
1381 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1382 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
1383 CheckOutFrame(frame_out, size_, false);
1384 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
1385 jitter_buffer_->ReleaseFrame(frame_out);
1386 }
1387
TEST_F(TestBasicJitterBuffer,EmptyLastFrame)1388 TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
1389 seq_num_ = 3;
1390 // Insert one empty packet per frame, should never return the last timestamp
1391 // inserted. Only return empty frames in the presence of subsequent frames.
1392 int maxSize = 1000;
1393 bool retransmitted = false;
1394 for (int i = 0; i < maxSize + 10; i++) {
1395 timestamp_ += 33 * 90;
1396 seq_num_++;
1397 packet_->video_header.is_first_packet_in_frame = false;
1398 packet_->markerBit = false;
1399 packet_->seqNum = seq_num_;
1400 packet_->timestamp = timestamp_;
1401 packet_->video_header.frame_type = VideoFrameType::kEmptyFrame;
1402
1403 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1404 }
1405 }
1406
TEST_F(TestBasicJitterBuffer,NextFrameWhenIncomplete)1407 TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
1408 // Test that a we cannot get incomplete frames from the JB if we haven't
1409 // received the marker bit, unless we have received a packet from a later
1410 // timestamp.
1411 // Start with a complete key frame - insert and decode.
1412 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
1413 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
1414 packet_->video_header.is_first_packet_in_frame = true;
1415 packet_->markerBit = true;
1416 bool retransmitted = false;
1417
1418 EXPECT_EQ(kCompleteSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1420 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1421 EXPECT_TRUE(frame_out != NULL);
1422 jitter_buffer_->ReleaseFrame(frame_out);
1423
1424 packet_->seqNum += 2;
1425 packet_->timestamp += 33 * 90;
1426 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1427 packet_->video_header.is_first_packet_in_frame = false;
1428 packet_->markerBit = false;
1429
1430 EXPECT_EQ(kIncomplete,
1431 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1432
1433 packet_->seqNum += 2;
1434 packet_->timestamp += 33 * 90;
1435 packet_->video_header.is_first_packet_in_frame = true;
1436
1437 EXPECT_EQ(kIncomplete,
1438 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
1439 }
1440
TEST_F(TestRunningJitterBuffer,Full)1441 TEST_F(TestRunningJitterBuffer, Full) {
1442 // Make sure the jitter doesn't request a keyframe after too much non-
1443 // decodable frames.
1444 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
1445 // Insert a key frame and decode it.
1446 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1447 EXPECT_TRUE(DecodeCompleteFrame());
1448 DropFrame(1);
1449 // Fill the jitter buffer.
1450 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1451 kNoError);
1452 // Make sure we can't decode these frames.
1453 EXPECT_FALSE(DecodeCompleteFrame());
1454 // This frame will make the jitter buffer recycle frames until a key frame.
1455 // Since none is found it will have to wait until the next key frame before
1456 // decoding.
1457 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
1458 EXPECT_FALSE(DecodeCompleteFrame());
1459 }
1460
TEST_F(TestRunningJitterBuffer,EmptyPackets)1461 TEST_F(TestRunningJitterBuffer, EmptyPackets) {
1462 // Make sure a frame can get complete even though empty packets are missing.
1463 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
1464 clock_->TimeInMilliseconds());
1465 bool request_key_frame = false;
1466 // Insert empty packet.
1467 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
1468 EXPECT_FALSE(request_key_frame);
1469 // Insert 3 media packets.
1470 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1471 EXPECT_FALSE(request_key_frame);
1472 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1473 EXPECT_FALSE(request_key_frame);
1474 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1475 EXPECT_FALSE(request_key_frame);
1476 // Insert empty packet.
1477 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1478 EXPECT_FALSE(request_key_frame);
1479 }
1480
TEST_F(TestRunningJitterBuffer,SkipToKeyFrame)1481 TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1482 // Insert delta frames.
1483 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
1484 // Can't decode without a key frame.
1485 EXPECT_FALSE(DecodeCompleteFrame());
1486 InsertFrame(VideoFrameType::kVideoFrameKey);
1487 // Skip to the next key frame.
1488 EXPECT_TRUE(DecodeCompleteFrame());
1489 }
1490
TEST_F(TestRunningJitterBuffer,DontSkipToKeyFrameIfDecodable)1491 TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
1492 InsertFrame(VideoFrameType::kVideoFrameKey);
1493 EXPECT_TRUE(DecodeCompleteFrame());
1494 const int kNumDeltaFrames = 5;
1495 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1496 kNoError);
1497 InsertFrame(VideoFrameType::kVideoFrameKey);
1498 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1499 EXPECT_TRUE(DecodeCompleteFrame());
1500 }
1501 }
1502
TEST_F(TestRunningJitterBuffer,KeyDeltaKeyDelta)1503 TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
1504 InsertFrame(VideoFrameType::kVideoFrameKey);
1505 EXPECT_TRUE(DecodeCompleteFrame());
1506 const int kNumDeltaFrames = 5;
1507 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1508 kNoError);
1509 InsertFrame(VideoFrameType::kVideoFrameKey);
1510 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1511 kNoError);
1512 InsertFrame(VideoFrameType::kVideoFrameKey);
1513 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1514 EXPECT_TRUE(DecodeCompleteFrame());
1515 }
1516 }
1517
TEST_F(TestRunningJitterBuffer,TwoPacketsNonContinuous)1518 TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
1519 InsertFrame(VideoFrameType::kVideoFrameKey);
1520 EXPECT_TRUE(DecodeCompleteFrame());
1521 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
1522 clock_->TimeInMilliseconds());
1523 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1524 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
1525 clock_->TimeInMilliseconds());
1526 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1527 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1528 EXPECT_FALSE(DecodeCompleteFrame());
1529 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1530 EXPECT_TRUE(DecodeCompleteFrame());
1531 EXPECT_TRUE(DecodeCompleteFrame());
1532 }
1533
TEST_F(TestJitterBufferNack,EmptyPackets)1534 TEST_F(TestJitterBufferNack, EmptyPackets) {
1535 // Make sure empty packets doesn't clog the jitter buffer.
1536 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1537 kNoError);
1538 InsertFrame(VideoFrameType::kVideoFrameKey);
1539 EXPECT_TRUE(DecodeCompleteFrame());
1540 }
1541
TEST_F(TestJitterBufferNack,NackTooOldPackets)1542 TEST_F(TestJitterBufferNack, NackTooOldPackets) {
1543 // Insert a key frame and decode it.
1544 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1545 EXPECT_TRUE(DecodeCompleteFrame());
1546
1547 // Drop one frame and insert `kNackHistoryLength` to trigger NACKing a too
1548 // old packet.
1549 DropFrame(1);
1550 // Insert a frame which should trigger a recycle until the next key frame.
1551 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1552 VideoFrameType::kVideoFrameDelta));
1553 EXPECT_FALSE(DecodeCompleteFrame());
1554
1555 bool request_key_frame = false;
1556 std::vector<uint16_t> nack_list =
1557 jitter_buffer_->GetNackList(&request_key_frame);
1558 // No key frame will be requested since the jitter buffer is empty.
1559 EXPECT_FALSE(request_key_frame);
1560 EXPECT_EQ(0u, nack_list.size());
1561
1562 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
1563 // Waiting for a key frame.
1564 EXPECT_FALSE(DecodeCompleteFrame());
1565
1566 // The next complete continuous frame isn't a key frame, but we're waiting
1567 // for one.
1568 EXPECT_FALSE(DecodeCompleteFrame());
1569 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1570 // Skipping ahead to the key frame.
1571 EXPECT_TRUE(DecodeCompleteFrame());
1572 }
1573
TEST_F(TestJitterBufferNack,NackLargeJitterBuffer)1574 TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
1575 // Insert a key frame and decode it.
1576 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1577 EXPECT_TRUE(DecodeCompleteFrame());
1578
1579 // Insert a frame which should trigger a recycle until the next key frame.
1580 EXPECT_GE(
1581 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1582 kNoError);
1583
1584 bool request_key_frame = false;
1585 std::vector<uint16_t> nack_list =
1586 jitter_buffer_->GetNackList(&request_key_frame);
1587 // Verify that the jitter buffer does not request a key frame.
1588 EXPECT_FALSE(request_key_frame);
1589 // Verify that no packets are NACKed.
1590 EXPECT_EQ(0u, nack_list.size());
1591 // Verify that we can decode the next frame.
1592 EXPECT_TRUE(DecodeCompleteFrame());
1593 }
1594
TEST_F(TestJitterBufferNack,NackListFull)1595 TEST_F(TestJitterBufferNack, NackListFull) {
1596 // Insert a key frame and decode it.
1597 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1598 EXPECT_TRUE(DecodeCompleteFrame());
1599
1600 // Generate and drop `kNackHistoryLength` packets to fill the NACK list.
1601 DropFrame(max_nack_list_size_ + 1);
1602 // Insert a frame which should trigger a recycle until the next key frame.
1603 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
1604 EXPECT_FALSE(DecodeCompleteFrame());
1605
1606 bool request_key_frame = false;
1607 jitter_buffer_->GetNackList(&request_key_frame);
1608 // The jitter buffer is empty, so we won't request key frames until we get a
1609 // packet.
1610 EXPECT_FALSE(request_key_frame);
1611
1612 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
1613 // Now we have a packet in the jitter buffer, a key frame will be requested
1614 // since it's not a key frame.
1615 jitter_buffer_->GetNackList(&request_key_frame);
1616 // The jitter buffer is empty, so we won't request key frames until we get a
1617 // packet.
1618 EXPECT_TRUE(request_key_frame);
1619 // The next complete continuous frame isn't a key frame, but we're waiting
1620 // for one.
1621 EXPECT_FALSE(DecodeCompleteFrame());
1622 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1623 // Skipping ahead to the key frame.
1624 EXPECT_TRUE(DecodeCompleteFrame());
1625 }
1626
TEST_F(TestJitterBufferNack,NoNackListReturnedBeforeFirstDecode)1627 TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
1628 DropFrame(10);
1629 // Insert a frame and try to generate a NACK list. Shouldn't get one.
1630 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
1631 bool request_key_frame = false;
1632 std::vector<uint16_t> nack_list =
1633 jitter_buffer_->GetNackList(&request_key_frame);
1634 // No list generated, and a key frame request is signaled.
1635 EXPECT_EQ(0u, nack_list.size());
1636 EXPECT_TRUE(request_key_frame);
1637 }
1638
TEST_F(TestJitterBufferNack,NackListBuiltBeforeFirstDecode)1639 TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
1640 stream_generator_->Init(0, clock_->TimeInMilliseconds());
1641 InsertFrame(VideoFrameType::kVideoFrameKey);
1642 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
1643 clock_->TimeInMilliseconds());
1644 stream_generator_->NextPacket(NULL); // Drop packet.
1645 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1646 EXPECT_TRUE(DecodeCompleteFrame());
1647 bool extended = false;
1648 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1649 EXPECT_EQ(1u, nack_list.size());
1650 }
1651
TEST_F(TestJitterBufferNack,VerifyRetransmittedFlag)1652 TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
1653 stream_generator_->Init(0, clock_->TimeInMilliseconds());
1654 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
1655 clock_->TimeInMilliseconds());
1656 VCMPacket packet;
1657 stream_generator_->PopPacket(&packet, 0);
1658 bool retransmitted = false;
1659 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1660 EXPECT_FALSE(retransmitted);
1661 // Drop second packet.
1662 stream_generator_->PopPacket(&packet, 1);
1663 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1664 EXPECT_FALSE(retransmitted);
1665 EXPECT_FALSE(DecodeCompleteFrame());
1666 bool extended = false;
1667 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1668 uint16_t seq_num;
1669 EXPECT_EQ(1u, nack_list.size());
1670 seq_num = nack_list[0];
1671 stream_generator_->PopPacket(&packet, 0);
1672 EXPECT_EQ(packet.seqNum, seq_num);
1673 EXPECT_EQ(kCompleteSession,
1674 jitter_buffer_->InsertPacket(packet, &retransmitted));
1675 EXPECT_TRUE(retransmitted);
1676 EXPECT_TRUE(DecodeCompleteFrame());
1677 }
1678
TEST_F(TestJitterBufferNack,UseNackToRecoverFirstKeyFrame)1679 TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
1680 stream_generator_->Init(0, clock_->TimeInMilliseconds());
1681 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
1682 clock_->TimeInMilliseconds());
1683 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1684 // Drop second packet.
1685 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1686 EXPECT_FALSE(DecodeCompleteFrame());
1687 bool extended = false;
1688 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1689 uint16_t seq_num;
1690 ASSERT_EQ(1u, nack_list.size());
1691 seq_num = nack_list[0];
1692 VCMPacket packet;
1693 stream_generator_->GetPacket(&packet, 0);
1694 EXPECT_EQ(packet.seqNum, seq_num);
1695 }
1696
TEST_F(TestJitterBufferNack,UseNackToRecoverFirstKeyFrameSecondInQueue)1697 TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
1698 VCMPacket packet;
1699 stream_generator_->Init(0, clock_->TimeInMilliseconds());
1700 // First frame is delta.
1701 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
1702 clock_->TimeInMilliseconds());
1703 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1704 // Drop second packet in frame.
1705 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1706 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1707 // Second frame is key.
1708 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
1709 clock_->TimeInMilliseconds() + 10);
1710 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1711 // Drop second packet in frame.
1712 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1713 EXPECT_FALSE(DecodeCompleteFrame());
1714 bool extended = false;
1715 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1716 uint16_t seq_num;
1717 ASSERT_EQ(1u, nack_list.size());
1718 seq_num = nack_list[0];
1719 stream_generator_->GetPacket(&packet, 0);
1720 EXPECT_EQ(packet.seqNum, seq_num);
1721 }
1722
TEST_F(TestJitterBufferNack,NormalOperation)1723 TEST_F(TestJitterBufferNack, NormalOperation) {
1724 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
1725 EXPECT_TRUE(DecodeCompleteFrame());
1726
1727 // ----------------------------------------------------------------
1728 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1729 // ----------------------------------------------------------------
1730 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
1731 clock_->TimeInMilliseconds());
1732 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1733 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1734 // Verify that the frame is incomplete.
1735 EXPECT_FALSE(DecodeCompleteFrame());
1736 while (stream_generator_->PacketsRemaining() > 1) {
1737 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
1738 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1739 } else {
1740 stream_generator_->NextPacket(NULL); // Drop packet
1741 }
1742 }
1743 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1744 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
1745 EXPECT_FALSE(DecodeCompleteFrame());
1746 bool request_key_frame = false;
1747
1748 // Verify the NACK list.
1749 std::vector<uint16_t> nack_list =
1750 jitter_buffer_->GetNackList(&request_key_frame);
1751 const size_t kExpectedNackSize = 9;
1752 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1753 for (size_t i = 0; i < nack_list.size(); ++i)
1754 EXPECT_EQ((1 + i) * 10, nack_list[i]);
1755 }
1756
TEST_F(TestJitterBufferNack,NormalOperationWrap)1757 TEST_F(TestJitterBufferNack, NormalOperationWrap) {
1758 bool request_key_frame = false;
1759 // ------- ------------------------------------------------------------
1760 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1761 // ------- ------------------------------------------------------------
1762 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
1763 InsertFrame(VideoFrameType::kVideoFrameKey);
1764 EXPECT_FALSE(request_key_frame);
1765 EXPECT_TRUE(DecodeCompleteFrame());
1766 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
1767 clock_->TimeInMilliseconds());
1768 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1769 while (stream_generator_->PacketsRemaining() > 1) {
1770 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
1771 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1772 EXPECT_FALSE(request_key_frame);
1773 } else {
1774 stream_generator_->NextPacket(NULL); // Drop packet
1775 }
1776 }
1777 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1778 EXPECT_FALSE(request_key_frame);
1779 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
1780 EXPECT_FALSE(DecodeCompleteFrame());
1781 EXPECT_FALSE(DecodeCompleteFrame());
1782 bool extended = false;
1783 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1784 // Verify the NACK list.
1785 const size_t kExpectedNackSize = 10;
1786 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1787 for (size_t i = 0; i < nack_list.size(); ++i)
1788 EXPECT_EQ(i * 10, nack_list[i]);
1789 }
1790
TEST_F(TestJitterBufferNack,NormalOperationWrap2)1791 TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
1792 bool request_key_frame = false;
1793 // -----------------------------------
1794 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1795 // -----------------------------------
1796 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
1797 InsertFrame(VideoFrameType::kVideoFrameKey);
1798 EXPECT_FALSE(request_key_frame);
1799 EXPECT_TRUE(DecodeCompleteFrame());
1800 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
1801 clock_->TimeInMilliseconds());
1802 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1803 for (int i = 0; i < 5; ++i) {
1804 if (stream_generator_->NextSequenceNumber() != 65535) {
1805 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1806 EXPECT_FALSE(request_key_frame);
1807 } else {
1808 stream_generator_->NextPacket(NULL); // Drop packet
1809 }
1810 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
1811 clock_->TimeInMilliseconds());
1812 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1813 }
1814 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1815 EXPECT_FALSE(request_key_frame);
1816 bool extended = false;
1817 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1818 // Verify the NACK list.
1819 ASSERT_EQ(1u, nack_list.size());
1820 EXPECT_EQ(65535, nack_list[0]);
1821 }
1822
TEST_F(TestJitterBufferNack,ResetByFutureKeyFrameDoesntError)1823 TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
1824 stream_generator_->Init(0, clock_->TimeInMilliseconds());
1825 InsertFrame(VideoFrameType::kVideoFrameKey);
1826 EXPECT_TRUE(DecodeCompleteFrame());
1827 bool extended = false;
1828 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1829 EXPECT_EQ(0u, nack_list.size());
1830
1831 // Far-into-the-future video frame, could be caused by resetting the encoder
1832 // or otherwise restarting. This should not fail when error when the packet is
1833 // a keyframe, even if all of the nack list needs to be flushed.
1834 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
1835 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1836 InsertFrame(VideoFrameType::kVideoFrameKey);
1837 EXPECT_TRUE(DecodeCompleteFrame());
1838 nack_list = jitter_buffer_->GetNackList(&extended);
1839 EXPECT_EQ(0u, nack_list.size());
1840
1841 // Stream should be decodable from this point.
1842 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1843 InsertFrame(VideoFrameType::kVideoFrameDelta);
1844 EXPECT_TRUE(DecodeCompleteFrame());
1845 nack_list = jitter_buffer_->GetNackList(&extended);
1846 EXPECT_EQ(0u, nack_list.size());
1847 }
1848 } // namespace webrtc
1849