blob: acfee8c6f7bf5584413f3968ce201d210baac9c8 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/video_coding/jitter_buffer.h"
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>
Jonas Olssona4d87372019-07-05 19:08:33 +020015#include <string>
stefana669a3a2016-10-06 05:04:52 -070016#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000017
Niels Möllerdb64d992019-03-29 14:30:53 +010018#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "common_video/h264/h264_common.h"
20#include "modules/video_coding/frame_buffer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/video_coding/media_opt_util.h"
22#include "modules/video_coding/packet.h"
23#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/field_trial.h"
29#include "test/gmock.h"
30#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000031
32namespace webrtc {
33
Niels Möllerdb64d992019-03-29 14:30:53 +010034class TestBasicJitterBuffer : public ::testing::Test {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000035 protected:
philipel85130292016-07-06 16:10:31 +020036 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -070037 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000038 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -070039 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +010040 clock_.get(), absl::WrapUnique(EventWrapper::Create())));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000041 jitter_buffer_->Start();
42 seq_num_ = 1234;
43 timestamp_ = 0;
44 size_ = 1400;
45 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
46 data_[0] = 0;
47 data_[1] = 0;
48 data_[2] = 0x80;
49 int count = 3;
50 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
51 data_[i] = count;
52 count++;
53 if (count == 10) {
54 data_[i + 1] = 0;
55 data_[i + 2] = 0;
56 data_[i + 3] = 0x80;
57 count = 3;
58 i += 3;
59 }
60 }
Niels Möller075e7fd2019-03-12 12:29:22 +010061 RTPHeader rtp_header;
62 RTPVideoHeader video_header;
63 rtp_header.sequenceNumber = seq_num_;
64 rtp_header.timestamp = timestamp_;
65 rtp_header.markerBit = true;
66 video_header.codec = kVideoCodecGeneric;
67 video_header.is_first_packet_in_frame = true;
Niels Möllerabbc50e2019-04-24 09:41:16 +020068 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möller075e7fd2019-03-12 12:29:22 +010069 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
Chen Xingf00bf422019-06-20 10:05:55 +020070 /*ntp_time_ms=*/0,
71 clock_->TimeInMilliseconds()));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000072 }
73
74 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -070075 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000076 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -070077 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +020078 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000079 }
80
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000081 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -080082 unsigned int size,
83 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000084 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000085
Niels Möller9c843902019-01-11 10:21:35 +010086 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000087 unsigned int i = 0;
88
89 if (startCode) {
90 EXPECT_EQ(0, outData[0]);
91 EXPECT_EQ(0, outData[1]);
92 EXPECT_EQ(0, outData[2]);
93 EXPECT_EQ(1, outData[3]);
94 i += 4;
95 }
96
Niels Möllerf0eee002018-11-28 16:31:29 +010097 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000098 int count = 3;
99 for (; i < size; i++) {
100 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
101 i += 2;
102 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
103 EXPECT_EQ(0, outData[0]);
104 EXPECT_EQ(0, outData[1]);
105 EXPECT_EQ(0, outData[2]);
106 EXPECT_EQ(1, outData[3]);
107 i += 3;
108 } else {
109 EXPECT_EQ(count, outData[i]);
110 count++;
111 if (count == 10) {
112 count = 3;
113 }
114 }
115 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000116 }
117
118 uint16_t seq_num_;
119 uint32_t timestamp_;
120 int size_;
121 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800122 std::unique_ptr<VCMPacket> packet_;
123 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800124 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000125};
126
Niels Möllerdb64d992019-03-29 14:30:53 +0100127class TestRunningJitterBuffer : public ::testing::Test {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000128 protected:
129 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000130
131 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000132 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000133 max_nack_list_size_ = 150;
134 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700135 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +0100136 clock_.get(), absl::WrapUnique(EventWrapper::Create()));
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700137 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000138 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800139 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
140 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000141 memset(data_buffer_, 0, kDataBufferSize);
142 }
143
144 virtual void TearDown() {
145 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000146 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000147 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000148 }
149
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000150 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000151 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000152 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000153 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000154 EXPECT_TRUE(packet_available);
155 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000156 return kGeneralError; // Return here to avoid crashes below.
157 bool retransmitted = false;
158 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000159 }
160
161 VCMFrameBufferEnum InsertPacket(int index) {
162 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000163 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000164 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000165 EXPECT_TRUE(packet_available);
166 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000167 return kGeneralError; // Return here to avoid crashes below.
168 bool retransmitted = false;
169 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000170 }
171
Niels Möller87e2d782019-03-07 10:18:23 +0100172 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700173 stream_generator_->GenerateFrame(
Niels Möller8f7ce222019-03-21 15:43:58 +0100174 frame_type, (frame_type != VideoFrameType::kEmptyFrame) ? 1 : 0,
175 (frame_type == VideoFrameType::kEmptyFrame) ? 1 : 0,
176 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000177 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000178 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000179 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000180 }
181
Niels Möller87e2d782019-03-07 10:18:23 +0100182 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000183 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000184 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000185 VCMFrameBufferEnum ret = InsertFrame(frame_type);
186 if (ret < kNoError) {
187 ret_for_all = ret;
188 } else if (ret_for_all >= kNoError) {
189 ret_for_all = ret;
190 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000191 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000192 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000193 }
194
195 void DropFrame(int num_packets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100196 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta,
197 num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000198 clock_->TimeInMilliseconds());
199 for (int i = 0; i < num_packets; ++i)
200 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000201 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000202 }
203
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000204 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700205 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000206 if (!found_frame)
207 return false;
208
isheriff6b4b5f32016-06-08 00:24:21 -0700209 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200210 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000211 bool ret = (frame != NULL);
212 jitter_buffer_->ReleaseFrame(frame);
213 return ret;
214 }
215
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000216 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000217 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800218 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000219 size_t max_nack_list_size_;
220 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000221 uint8_t data_buffer_[kDataBufferSize];
222};
223
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000224class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000225 protected:
philipel85130292016-07-06 16:10:31 +0200226 TestJitterBufferNack() {}
Jonas Olssona4d87372019-07-05 19:08:33 +0200227 virtual void SetUp() { TestRunningJitterBuffer::SetUp(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000228
philipel9d3ab612015-12-21 04:12:39 -0800229 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000230};
231
philipel85130292016-07-06 16:10:31 +0200232TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000233 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000234 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000235 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000236
237 // No packets inserted.
238 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000239}
240
philipel85130292016-07-06 16:10:31 +0200241TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000242 // Always start with a complete key frame when not allowing errors.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200243 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100244 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000245 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000246 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000247
248 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000249 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800250 EXPECT_EQ(kCompleteSession,
251 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000252 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000253 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100254 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000255 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000256}
257
philipel85130292016-07-06 16:10:31 +0200258TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200259 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100260 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000261 packet_->markerBit = false;
262
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000263 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800264 EXPECT_EQ(kIncomplete,
265 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000266 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
267 // Should not be complete.
268 EXPECT_TRUE(frame_out == NULL);
269
270 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100271 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000272 packet_->markerBit = true;
273 packet_->seqNum = seq_num_;
274
philipel9d3ab612015-12-21 04:12:39 -0800275 EXPECT_EQ(kCompleteSession,
276 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000277
278 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000279 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000280
Niels Möller8f7ce222019-03-21 15:43:58 +0100281 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000282 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000283}
284
philipel85130292016-07-06 16:10:31 +0200285TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200286 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100287 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000288 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000289
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000290 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800291 EXPECT_EQ(kIncomplete,
292 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000293
294 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
295
296 // Frame should not be complete.
297 EXPECT_TRUE(frame_out == NULL);
298
299 // Insert 98 frames.
300 int loop = 0;
301 do {
302 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100303 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000304 packet_->markerBit = false;
305 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000306
philipel9d3ab612015-12-21 04:12:39 -0800307 EXPECT_EQ(kIncomplete,
308 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000309 loop++;
310 } while (loop < 98);
311
312 // Insert last packet.
313 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100314 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000315 packet_->markerBit = true;
316 packet_->seqNum = seq_num_;
317
philipel9d3ab612015-12-21 04:12:39 -0800318 EXPECT_EQ(kCompleteSession,
319 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000320
321 frame_out = DecodeCompleteFrame();
322
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000323 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100324 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000325 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000326}
327
philipel85130292016-07-06 16:10:31 +0200328TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000329 // Always start with a complete key frame.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200330 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100331 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000332 packet_->markerBit = true;
333
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000334 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800335 EXPECT_EQ(kCompleteSession,
336 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000337 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
338 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000339 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000340
341 ++seq_num_;
342 packet_->seqNum = seq_num_;
343 packet_->markerBit = false;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200344 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000345 packet_->timestamp += 33 * 90;
346
philipel9d3ab612015-12-21 04:12:39 -0800347 EXPECT_EQ(kIncomplete,
348 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000349
350 frame_out = DecodeCompleteFrame();
351
352 // Frame should not be complete.
353 EXPECT_TRUE(frame_out == NULL);
354
Niels Möllerd5e02f02019-02-20 13:12:21 +0100355 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000356 // Insert 98 frames.
357 int loop = 0;
358 do {
359 ++seq_num_;
360 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000361
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000362 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800363 EXPECT_EQ(kIncomplete,
364 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000365 loop++;
366 } while (loop < 98);
367
368 // Insert the last packet.
369 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100370 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000371 packet_->markerBit = true;
372 packet_->seqNum = seq_num_;
373
philipel9d3ab612015-12-21 04:12:39 -0800374 EXPECT_EQ(kCompleteSession,
375 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000376
377 frame_out = DecodeCompleteFrame();
378
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000379 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100380 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000381 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000382}
383
philipel85130292016-07-06 16:10:31 +0200384TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000385 // Insert the "first" packet last.
386 seq_num_ += 100;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200387 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100388 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000389 packet_->markerBit = true;
390 packet_->seqNum = seq_num_;
391 packet_->timestamp = timestamp_;
392
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000393 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800394 EXPECT_EQ(kIncomplete,
395 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000396
397 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
398
399 EXPECT_TRUE(frame_out == NULL);
400
401 // Insert 98 packets.
402 int loop = 0;
403 do {
404 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100405 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000406 packet_->markerBit = false;
407 packet_->seqNum = seq_num_;
408
philipel9d3ab612015-12-21 04:12:39 -0800409 EXPECT_EQ(kIncomplete,
410 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000411 loop++;
412 } while (loop < 98);
413
414 // Insert the last packet.
415 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100416 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000417 packet_->markerBit = false;
418 packet_->seqNum = seq_num_;
419
philipel9d3ab612015-12-21 04:12:39 -0800420 EXPECT_EQ(kCompleteSession,
421 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000422
philipel9d3ab612015-12-21 04:12:39 -0800423 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000424
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000425 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000426
Niels Möller8f7ce222019-03-21 15:43:58 +0100427 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000428 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000429}
430
philipel85130292016-07-06 16:10:31 +0200431TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200432 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100433 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000434 packet_->markerBit = false;
435
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000436 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800437 EXPECT_EQ(kIncomplete,
438 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000439
440 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
441
442 EXPECT_TRUE(frame_out == NULL);
443
444 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100445 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000446 packet_->markerBit = true;
447 packet_->seqNum = seq_num_;
448
philipel9d3ab612015-12-21 04:12:39 -0800449 EXPECT_EQ(kCompleteSession,
450 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000451
452 // check that we fail to get frame since seqnum is not continuous
453 frame_out = DecodeCompleteFrame();
454 EXPECT_TRUE(frame_out == NULL);
455
456 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800457 timestamp_ -= 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200458 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100459 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000460 packet_->markerBit = false;
461 packet_->seqNum = seq_num_;
462 packet_->timestamp = timestamp_;
463
philipel9d3ab612015-12-21 04:12:39 -0800464 EXPECT_EQ(kIncomplete,
465 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000466
467 frame_out = DecodeCompleteFrame();
468
469 // It should not be complete.
470 EXPECT_TRUE(frame_out == NULL);
471
472 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100473 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000474 packet_->markerBit = true;
475 packet_->seqNum = seq_num_;
476
philipel9d3ab612015-12-21 04:12:39 -0800477 EXPECT_EQ(kCompleteSession,
478 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000479
480 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000481 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100482 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000483 jitter_buffer_->ReleaseFrame(frame_out);
484
485 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000486 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100487 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000488 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000489}
490
philipel85130292016-07-06 16:10:31 +0200491TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller691f62c2019-04-11 15:27:17 +0200492 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +0200493 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100494 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700495 packet_->markerBit = true;
496
497 // Send in an initial good packet/frame (Frame A) to start things off.
498 bool retransmitted = false;
499 EXPECT_EQ(kCompleteSession,
500 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
501 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
502 EXPECT_TRUE(frame_out != NULL);
503 jitter_buffer_->ReleaseFrame(frame_out);
504
505 // Now send in a complete delta frame (Frame C), but with a sequence number
506 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möllerabbc50e2019-04-24 09:41:16 +0200507 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700508 // Leave a gap of 2 sequence numbers and two frames.
509 packet_->seqNum = seq_num_ + 3;
510 packet_->timestamp = timestamp_ + (66 * 90);
511 // Still isFirst = marker = true.
512 // Session should be complete (frame is complete), but there's nothing to
513 // decode yet.
514 EXPECT_EQ(kCompleteSession,
515 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
516 frame_out = DecodeCompleteFrame();
517 EXPECT_TRUE(frame_out == NULL);
518
519 // Now send in a complete delta frame (Frame B) that is continuous from A, but
520 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
521 packet_->seqNum = seq_num_ + 1;
522 packet_->timestamp = timestamp_ + (33 * 90);
523 // Still isFirst = marker = true.
524 EXPECT_EQ(kCompleteSession,
525 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
526 frame_out = DecodeCompleteFrame();
527 EXPECT_TRUE(frame_out != NULL);
528 jitter_buffer_->ReleaseFrame(frame_out);
529
530 // But Frame C isn't continuous yet.
531 frame_out = DecodeCompleteFrame();
532 EXPECT_TRUE(frame_out == NULL);
533
534 // Add in the padding. These are empty packets (data length is 0) with no
535 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100536 RTPHeader rtp_header;
537 RTPVideoHeader video_header;
538 rtp_header.sequenceNumber = seq_num_ + 2;
539 rtp_header.timestamp = timestamp_ + (33 * 90);
540 rtp_header.markerBit = false;
541 video_header.codec = kVideoCodecGeneric;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200542 video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller075e7fd2019-03-12 12:29:22 +0100543 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
Chen Xingf00bf422019-06-20 10:05:55 +0200544 /*ntp_time_ms=*/0, clock_->TimeInMilliseconds());
Noah Richardse4cb4e92015-05-22 14:03:00 -0700545 EXPECT_EQ(kOldPacket,
546 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
547 empty_packet.seqNum += 1;
548 EXPECT_EQ(kOldPacket,
549 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
550
551 // But now Frame C should be ready!
552 frame_out = DecodeCompleteFrame();
553 EXPECT_TRUE(frame_out != NULL);
554 jitter_buffer_->ReleaseFrame(frame_out);
555}
556
philipel85130292016-07-06 16:10:31 +0200557TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200558 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100559 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000560 packet_->markerBit = false;
561 packet_->seqNum = seq_num_;
562 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000563 EXPECT_EQ(0, jitter_buffer_->num_packets());
564 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000565
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000566 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800567 EXPECT_EQ(kIncomplete,
568 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000569
570 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
571
572 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000573 EXPECT_EQ(1, jitter_buffer_->num_packets());
574 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000575
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000576 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800577 EXPECT_EQ(kDuplicatePacket,
578 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000579 EXPECT_EQ(2, jitter_buffer_->num_packets());
580 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000581
582 seq_num_++;
583 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000584 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100585 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000586
philipel9d3ab612015-12-21 04:12:39 -0800587 EXPECT_EQ(kCompleteSession,
588 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000589
590 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000591 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000592 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000593
Niels Möller8f7ce222019-03-21 15:43:58 +0100594 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000595 EXPECT_EQ(3, jitter_buffer_->num_packets());
596 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000597 jitter_buffer_->ReleaseFrame(frame_out);
598}
599
philipel85130292016-07-06 16:10:31 +0200600TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200601 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100602 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000603 packet_->markerBit = true;
604 packet_->seqNum = seq_num_;
605 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000606 EXPECT_EQ(0, jitter_buffer_->num_packets());
607 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
608
609 bool retransmitted = false;
610 // Insert first complete frame.
611 EXPECT_EQ(kCompleteSession,
612 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
613
614 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
615 ASSERT_TRUE(frame_out != NULL);
616 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100617 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000618 jitter_buffer_->ReleaseFrame(frame_out);
619
620 // Insert 3 delta frames.
621 for (uint16_t i = 1; i <= 3; ++i) {
622 packet_->seqNum = seq_num_ + i;
623 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200624 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000625 EXPECT_EQ(kCompleteSession,
626 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
627 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
628 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
629 }
630
631 // Retransmit second delta frame.
632 packet_->seqNum = seq_num_ + 2;
633 packet_->timestamp = timestamp_ + 66 * 90;
634
635 EXPECT_EQ(kDuplicatePacket,
636 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
637
638 EXPECT_EQ(5, jitter_buffer_->num_packets());
639 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
640
641 // Should be able to decode 3 delta frames, key frame already decoded.
642 for (size_t i = 0; i < 3; ++i) {
643 frame_out = DecodeCompleteFrame();
644 ASSERT_TRUE(frame_out != NULL);
645 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100646 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000647 jitter_buffer_->ReleaseFrame(frame_out);
648 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000649}
650
philipel85130292016-07-06 16:10:31 +0200651TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700652 // Verify that JB skips forward to next base layer frame.
653 // -------------------------------------------------
654 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
655 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
656 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
657 // | ss | x | x | x | |
658 // -------------------------------------------------
659 // |<----------tl0idx:200--------->|<---tl0idx:201---
660
Niels Möller691f62c2019-04-11 15:27:17 +0200661 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
philipel29d88462018-08-08 14:26:00 +0200662 auto& vp9_header =
663 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
664
asapersson9a4cd872015-10-23 00:27:14 -0700665 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200666 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100667 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700668 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200669 vp9_header.flexible_mode = false;
670 vp9_header.spatial_idx = 0;
671 vp9_header.beginning_of_frame = true;
672 vp9_header.end_of_frame = true;
673 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700674
675 packet_->seqNum = 65485;
676 packet_->timestamp = 1000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200677 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200678 vp9_header.picture_id = 5;
679 vp9_header.tl0_pic_idx = 200;
680 vp9_header.temporal_idx = 0;
681 vp9_header.ss_data_available = true;
682 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700683 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
684 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
685
686 // Insert next temporal layer 0.
687 packet_->seqNum = 65489;
688 packet_->timestamp = 13000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200689 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200690 vp9_header.picture_id = 9;
691 vp9_header.tl0_pic_idx = 201;
692 vp9_header.temporal_idx = 0;
693 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700694 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
695
696 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200697 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100698 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700699 jitter_buffer_->ReleaseFrame(frame_out);
700
701 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200702 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100703 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700704 jitter_buffer_->ReleaseFrame(frame_out);
705}
706
philipel85130292016-07-06 16:10:31 +0200707TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700708 // Verify that frames are updated with SS data when SS packet is reordered.
709 // --------------------------------
710 // | 65486 | 65487 | 65485 |...
711 // | pid:6 | pid:7 | pid:5 |...
712 // | tid:2 | tid:1 | tid:0 |...
713 // | | | ss |
714 // --------------------------------
715 // |<--------tl0idx:200--------->|
716
philipel29d88462018-08-08 14:26:00 +0200717 auto& vp9_header =
718 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
719
asapersson9a4cd872015-10-23 00:27:14 -0700720 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200721 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100722 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700723 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200724 vp9_header.flexible_mode = false;
725 vp9_header.spatial_idx = 0;
726 vp9_header.beginning_of_frame = true;
727 vp9_header.end_of_frame = true;
728 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700729
730 packet_->seqNum = 65486;
731 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200732 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200733 vp9_header.picture_id = 6;
734 vp9_header.temporal_idx = 2;
735 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700736 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
737
738 packet_->seqNum = 65487;
739 packet_->timestamp = 9000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200740 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200741 vp9_header.picture_id = 7;
742 vp9_header.temporal_idx = 1;
743 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700744 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
745
746 // Insert first frame with SS data.
747 packet_->seqNum = 65485;
748 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200749 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100750 packet_->video_header.width = 352;
751 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200752 vp9_header.picture_id = 5;
753 vp9_header.temporal_idx = 0;
754 vp9_header.temporal_up_switch = false;
755 vp9_header.ss_data_available = true;
756 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700757 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
758 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
759
760 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200761 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100762 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700763 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
764 EXPECT_FALSE(
765 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
766 jitter_buffer_->ReleaseFrame(frame_out);
767
768 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200769 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100770 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700771 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
772 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
773 jitter_buffer_->ReleaseFrame(frame_out);
774
775 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200776 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100777 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700778 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
779 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
780 jitter_buffer_->ReleaseFrame(frame_out);
781}
782
philipel85130292016-07-06 16:10:31 +0200783TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700784 // Verify that frames are updated with SS data when SS packet is reordered.
785 // -----------------------------------------
786 // | 65486 | 65487 | 65485 | 65484 |...
787 // | pid:6 | pid:6 | pid:5 | pid:5 |...
788 // | tid:1 | tid:1 | tid:0 | tid:0 |...
789 // | sid:0 | sid:1 | sid:1 | sid:0 |...
790 // | t:6000 | t:6000 | t:3000 | t:3000 |
791 // | | | | ss |
792 // -----------------------------------------
793 // |<-----------tl0idx:200------------>|
794
philipel29d88462018-08-08 14:26:00 +0200795 auto& vp9_header =
796 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
797
asapersson9a4cd872015-10-23 00:27:14 -0700798 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200799 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200800 vp9_header.flexible_mode = false;
801 vp9_header.beginning_of_frame = true;
802 vp9_header.end_of_frame = true;
803 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700804
Niels Möllerd5e02f02019-02-20 13:12:21 +0100805 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700806 packet_->markerBit = false;
807 packet_->seqNum = 65486;
808 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200809 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200810 vp9_header.spatial_idx = 0;
811 vp9_header.picture_id = 6;
812 vp9_header.temporal_idx = 1;
813 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700814 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
815
Niels Möllerd5e02f02019-02-20 13:12:21 +0100816 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700817 packet_->markerBit = true;
818 packet_->seqNum = 65487;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200819 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200820 vp9_header.spatial_idx = 1;
821 vp9_header.picture_id = 6;
822 vp9_header.temporal_idx = 1;
823 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700824 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
825
Niels Möllerd5e02f02019-02-20 13:12:21 +0100826 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700827 packet_->markerBit = true;
828 packet_->seqNum = 65485;
829 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200830 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200831 vp9_header.spatial_idx = 1;
832 vp9_header.picture_id = 5;
833 vp9_header.temporal_idx = 0;
834 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700835 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
836
837 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100838 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700839 packet_->markerBit = false;
840 packet_->seqNum = 65484;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200841 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100842 packet_->video_header.width = 352;
843 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200844 vp9_header.spatial_idx = 0;
845 vp9_header.picture_id = 5;
846 vp9_header.temporal_idx = 0;
847 vp9_header.temporal_up_switch = false;
848 vp9_header.ss_data_available = true;
849 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700850 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
851 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
852
853 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200854 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100855 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700856 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
857 EXPECT_FALSE(
858 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
859 jitter_buffer_->ReleaseFrame(frame_out);
860
861 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200862 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100863 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700864 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
865 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
866 jitter_buffer_->ReleaseFrame(frame_out);
867}
868
philipel85130292016-07-06 16:10:31 +0200869TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200870 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100871 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000872 packet_->markerBit = false;
873 packet_->seqNum = seq_num_;
874 packet_->timestamp = timestamp_;
875 packet_->insertStartCode = true;
876
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000877 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800878 EXPECT_EQ(kIncomplete,
879 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000880
881 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
882
883 // Frame should not be complete.
884 EXPECT_TRUE(frame_out == NULL);
885
886 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100887 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000888 packet_->markerBit = true;
889 packet_->seqNum = seq_num_;
890
philipel9d3ab612015-12-21 04:12:39 -0800891 EXPECT_EQ(kCompleteSession,
892 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000893
894 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000895 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +0100896 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000897 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000898}
899
stefana669a3a2016-10-06 05:04:52 -0700900TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +0200901 auto& h264_header =
902 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -0700903 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200904 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100905 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700906 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200907 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200908 h264_header.nalu_type = H264::NaluType::kIdr;
909 h264_header.nalus[0].type = H264::NaluType::kIdr;
910 h264_header.nalus[0].sps_id = -1;
911 h264_header.nalus[0].pps_id = 0;
912 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700913 bool retransmitted = false;
914 EXPECT_EQ(kCompleteSession,
915 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
916 // Not decodable since sps and pps are missing.
917 EXPECT_EQ(nullptr, DecodeCompleteFrame());
918
919 timestamp_ += 3000;
920 packet_->timestamp = timestamp_;
921 ++seq_num_;
922 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200923 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100924 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700925 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200926 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200927 h264_header.nalu_type = H264::NaluType::kStapA;
928 h264_header.nalus[0].type = H264::NaluType::kSps;
929 h264_header.nalus[0].sps_id = 0;
930 h264_header.nalus[0].pps_id = -1;
931 h264_header.nalus[1].type = H264::NaluType::kPps;
932 h264_header.nalus[1].sps_id = 0;
933 h264_header.nalus[1].pps_id = 0;
934 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -0700935 // Not complete since the marker bit hasn't been received.
936 EXPECT_EQ(kIncomplete,
937 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
938
939 ++seq_num_;
940 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200941 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100942 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -0700943 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200944 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200945 h264_header.nalu_type = H264::NaluType::kIdr;
946 h264_header.nalus[0].type = H264::NaluType::kIdr;
947 h264_header.nalus[0].sps_id = -1;
948 h264_header.nalus[0].pps_id = 0;
949 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700950 // Complete and decodable since the pps and sps are received in the first
951 // packet of this frame.
952 EXPECT_EQ(kCompleteSession,
953 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
954 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
955 ASSERT_NE(nullptr, frame_out);
956 jitter_buffer_->ReleaseFrame(frame_out);
957
958 timestamp_ += 3000;
959 packet_->timestamp = timestamp_;
960 ++seq_num_;
961 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200962 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100963 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700964 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200965 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200966 h264_header.nalu_type = H264::NaluType::kSlice;
967 h264_header.nalus[0].type = H264::NaluType::kSlice;
968 h264_header.nalus[0].sps_id = -1;
969 h264_header.nalus[0].pps_id = 0;
970 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700971 // Complete and decodable since sps, pps and key frame has been received.
972 EXPECT_EQ(kCompleteSession,
973 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
974 frame_out = DecodeCompleteFrame();
975 ASSERT_NE(nullptr, frame_out);
976 jitter_buffer_->ReleaseFrame(frame_out);
977}
978
philipel85130292016-07-06 16:10:31 +0200979TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000980 seq_num_ = 0xfff0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200981 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100982 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000983 packet_->markerBit = false;
984 packet_->seqNum = seq_num_;
985 packet_->timestamp = timestamp_;
986
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000987 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800988 EXPECT_EQ(kIncomplete,
989 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000990
991 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
992
993 EXPECT_TRUE(frame_out == NULL);
994
995 int loop = 0;
996 do {
997 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100998 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000999 packet_->markerBit = false;
1000 packet_->seqNum = seq_num_;
1001
philipel9d3ab612015-12-21 04:12:39 -08001002 EXPECT_EQ(kIncomplete,
1003 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001004
1005 frame_out = DecodeCompleteFrame();
1006
1007 EXPECT_TRUE(frame_out == NULL);
1008
1009 loop++;
1010 } while (loop < 98);
1011
1012 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001013 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001014 packet_->markerBit = true;
1015 packet_->seqNum = seq_num_;
1016
philipel9d3ab612015-12-21 04:12:39 -08001017 EXPECT_EQ(kCompleteSession,
1018 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001019
1020 frame_out = DecodeCompleteFrame();
1021
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001022 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001023
Niels Möller8f7ce222019-03-21 15:43:58 +01001024 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001025 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001026}
1027
philipel85130292016-07-06 16:10:31 +02001028TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001029 // Insert "first" packet last seqnum.
1030 seq_num_ = 10;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001031 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001032 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001033 packet_->markerBit = true;
1034 packet_->seqNum = seq_num_;
1035
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001036 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001037 EXPECT_EQ(kIncomplete,
1038 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001039 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1040
1041 // Should not be complete.
1042 EXPECT_TRUE(frame_out == NULL);
1043
1044 // Insert 98 frames.
1045 int loop = 0;
1046 do {
1047 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001048 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001049 packet_->markerBit = false;
1050 packet_->seqNum = seq_num_;
1051
philipel9d3ab612015-12-21 04:12:39 -08001052 EXPECT_EQ(kIncomplete,
1053 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001054
1055 frame_out = DecodeCompleteFrame();
1056
1057 EXPECT_TRUE(frame_out == NULL);
1058
1059 loop++;
1060 } while (loop < 98);
1061
1062 // Insert last packet.
1063 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001064 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001065 packet_->markerBit = false;
1066 packet_->seqNum = seq_num_;
1067
philipel9d3ab612015-12-21 04:12:39 -08001068 EXPECT_EQ(kCompleteSession,
1069 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001070
1071 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001072 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001073 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001074 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001075}
1076
philipel85130292016-07-06 16:10:31 +02001077TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001078 // ------- -------
1079 // | 2 | | 1 |
1080 // ------- -------
1081 // t = 3000 t = 2000
1082 seq_num_ = 2;
1083 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001084 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001085 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001086 packet_->markerBit = true;
1087 packet_->timestamp = timestamp_;
1088 packet_->seqNum = seq_num_;
1089
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001090 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001091 EXPECT_EQ(kCompleteSession,
1092 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001093
1094 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001095 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001096 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001097 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001098 jitter_buffer_->ReleaseFrame(frame_out);
1099
1100 seq_num_--;
1101 timestamp_ = 2000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001102 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001103 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001104 packet_->markerBit = true;
1105 packet_->seqNum = seq_num_;
1106 packet_->timestamp = timestamp_;
1107
philipel9d3ab612015-12-21 04:12:39 -08001108 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001109}
1110
philipel85130292016-07-06 16:10:31 +02001111TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001112 // ------- -------
1113 // | 2 | | 1 |
1114 // ------- -------
1115 // t = 3000 t = 0xffffff00
1116
1117 seq_num_ = 2;
1118 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001119 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001120 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001121 packet_->markerBit = true;
1122 packet_->seqNum = seq_num_;
1123 packet_->timestamp = timestamp_;
1124
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001125 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001126 EXPECT_EQ(kCompleteSession,
1127 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001128
1129 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001130 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001131
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001132 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001133
Niels Möller8f7ce222019-03-21 15:43:58 +01001134 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001135
1136 jitter_buffer_->ReleaseFrame(frame_out);
1137
1138 seq_num_--;
1139 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001140 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001141 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001142 packet_->markerBit = true;
1143 packet_->seqNum = seq_num_;
1144 packet_->timestamp = timestamp_;
1145
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001146 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001147 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001148}
1149
philipel85130292016-07-06 16:10:31 +02001150TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001151 // --------------- ---------------
1152 // | 1 | 2 | | 3 | 4 |
1153 // --------------- ---------------
1154 // t = 0xffffff00 t = 33*90
1155
1156 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001157 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001158 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001159 packet_->markerBit = false;
1160 packet_->seqNum = seq_num_;
1161 packet_->timestamp = timestamp_;
1162
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001163 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001164 EXPECT_EQ(kIncomplete,
1165 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001166
1167 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001168 EXPECT_TRUE(frame_out == NULL);
1169
1170 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001171 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001172 packet_->markerBit = true;
1173 packet_->seqNum = seq_num_;
1174
philipel9d3ab612015-12-21 04:12:39 -08001175 EXPECT_EQ(kCompleteSession,
1176 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001177
1178 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001179 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001180 jitter_buffer_->ReleaseFrame(frame_out);
1181
1182 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001183 timestamp_ += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001184 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001185 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001186 packet_->markerBit = false;
1187 packet_->seqNum = seq_num_;
1188 packet_->timestamp = timestamp_;
1189
philipel9d3ab612015-12-21 04:12:39 -08001190 EXPECT_EQ(kIncomplete,
1191 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001192
1193 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001194 EXPECT_TRUE(frame_out == NULL);
1195
1196 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001197 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001198 packet_->markerBit = true;
1199 packet_->seqNum = seq_num_;
1200
philipel9d3ab612015-12-21 04:12:39 -08001201 EXPECT_EQ(kCompleteSession,
1202 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001203
1204 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001205 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001206 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001207 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001208}
1209
philipel85130292016-07-06 16:10:31 +02001210TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001211 // ------- -------
1212 // | 1 | | 2 |
1213 // ------- -------
1214 // t = 0xffffff00 t = 2700
1215
1216 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001217 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001218 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001219 packet_->markerBit = true;
1220 packet_->timestamp = timestamp_;
1221
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001222 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001223 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001224 EXPECT_EQ(kCompleteSession,
1225 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001226
1227 // Insert next frame.
1228 seq_num_++;
1229 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001230 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001231 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001232 packet_->markerBit = true;
1233 packet_->seqNum = seq_num_;
1234 packet_->timestamp = timestamp_;
1235
philipel9d3ab612015-12-21 04:12:39 -08001236 EXPECT_EQ(kCompleteSession,
1237 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001238
1239 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001240 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001241 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001242 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001243 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001244
1245 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001246 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001247 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001248 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001249 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001250}
1251
philipel85130292016-07-06 16:10:31 +02001252TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001253 // ------- -------
1254 // | 2 | | 1 |
1255 // ------- -------
1256 // t = 2700 t = 0xffffff00
1257
1258 seq_num_ = 2;
1259 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001260 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001261 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001262 packet_->markerBit = true;
1263 packet_->seqNum = seq_num_;
1264 packet_->timestamp = timestamp_;
1265
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001266 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001267 EXPECT_EQ(kCompleteSession,
1268 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001269
1270 // Insert second frame
1271 seq_num_--;
1272 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001273 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001274 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001275 packet_->markerBit = true;
1276 packet_->seqNum = seq_num_;
1277 packet_->timestamp = timestamp_;
1278
philipel9d3ab612015-12-21 04:12:39 -08001279 EXPECT_EQ(kCompleteSession,
1280 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001281
1282 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001283 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001284 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001285 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001286 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001287
1288 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001289 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001290 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001291 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001292 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001293}
1294
philipel85130292016-07-06 16:10:31 +02001295TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001296 int loop = 0;
1297 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001298 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001299 // Insert kMaxPacketsInJitterBuffer into frame.
1300 do {
1301 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001302 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001303 packet_->markerBit = false;
1304 packet_->seqNum = seq_num_;
1305
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001306 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001307 EXPECT_EQ(kIncomplete,
1308 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001309 firstPacket = false;
1310 } else {
philipel9d3ab612015-12-21 04:12:39 -08001311 EXPECT_EQ(kIncomplete,
1312 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001313 }
1314
1315 loop++;
1316 } while (loop < kMaxPacketsInSession);
1317
1318 // Max number of packets inserted.
1319 // Insert one more packet.
1320 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001321 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001322 packet_->markerBit = true;
1323 packet_->seqNum = seq_num_;
1324
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001325 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001326 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001327 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001328}
1329
philipel85130292016-07-06 16:10:31 +02001330TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001331 // TEST fill JB with more than max number of frame (50 delta frames +
1332 // 51 key frames) with wrap in seq_num_
1333 //
1334 // --------------------------------------------------------------
1335 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1336 // --------------------------------------------------------------
1337 // |<-----------delta frames------------->|<------key frames----->|
1338
jbauchdb81ffd2015-11-23 03:59:02 -08001339 // Make sure the jitter doesn't request a keyframe after too much non-
1340 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001341 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001342
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001343 int loop = 0;
1344 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001345 uint32_t first_key_frame_timestamp = 0;
1346 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001347 // Insert MAX_NUMBER_OF_FRAMES frames.
1348 do {
philipel9d3ab612015-12-21 04:12:39 -08001349 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001350 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001351 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001352 packet_->markerBit = true;
1353 packet_->seqNum = seq_num_;
1354 packet_->timestamp = timestamp_;
1355
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001356 if (loop == 50) {
1357 first_key_frame_timestamp = packet_->timestamp;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001358 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001359 }
1360
1361 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001362 EXPECT_EQ(kCompleteSession,
1363 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001364
1365 loop++;
1366 } while (loop < kMaxNumberOfFrames);
1367
1368 // Max number of frames inserted.
1369
1370 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001371 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001372 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001373 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001374 packet_->markerBit = true;
1375 packet_->seqNum = seq_num_;
1376 packet_->timestamp = timestamp_;
1377
1378 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001379 EXPECT_EQ(kFlushIndicator,
1380 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001381
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001382 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001383 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001384 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001385 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001386 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001387}
1388
philipel85130292016-07-06 16:10:31 +02001389TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001390 seq_num_ = 3;
1391 // Insert one empty packet per frame, should never return the last timestamp
1392 // inserted. Only return empty frames in the presence of subsequent frames.
1393 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001394 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001395 for (int i = 0; i < maxSize + 10; i++) {
1396 timestamp_ += 33 * 90;
1397 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001398 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001399 packet_->markerBit = false;
1400 packet_->seqNum = seq_num_;
1401 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001402 packet_->video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001403
philipel9d3ab612015-12-21 04:12:39 -08001404 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001405 }
1406}
1407
philipel85130292016-07-06 16:10:31 +02001408TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001409 // Test that a we cannot get incomplete frames from the JB if we haven't
1410 // received the marker bit, unless we have received a packet from a later
1411 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001412 // Start with a complete key frame - insert and decode.
Niels Möller691f62c2019-04-11 15:27:17 +02001413 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +02001414 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001415 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001416 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001417 bool retransmitted = false;
1418
philipel9d3ab612015-12-21 04:12:39 -08001419 EXPECT_EQ(kCompleteSession,
1420 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001421 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1422 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001423 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001424
1425 packet_->seqNum += 2;
1426 packet_->timestamp += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001427 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001428 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001429 packet_->markerBit = false;
1430
Niels Möller375b3462019-01-10 15:35:56 +01001431 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001432 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001433
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001434 packet_->seqNum += 2;
1435 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001436 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001437
Niels Möller375b3462019-01-10 15:35:56 +01001438 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001439 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001440}
1441
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001442TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001443 // Make sure the jitter doesn't request a keyframe after too much non-
1444 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001445 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001446 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001447 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001448 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001449 DropFrame(1);
1450 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001451 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1452 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001453 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001454 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001455 // This frame will make the jitter buffer recycle frames until a key frame.
1456 // Since none is found it will have to wait until the next key frame before
1457 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001458 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001459 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001460}
1461
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001462TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001463 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001464 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001465 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001466 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001467 // Insert empty packet.
1468 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001469 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001470 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001471 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001472 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001473 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001474 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001475 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001476 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001477 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001478 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001479 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001480}
1481
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001482TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1483 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001484 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001485 // Can't decode without a key frame.
1486 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001487 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001488 // Skip to the next key frame.
1489 EXPECT_TRUE(DecodeCompleteFrame());
1490}
1491
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001492TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001493 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001494 EXPECT_TRUE(DecodeCompleteFrame());
1495 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001496 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1497 kNoError);
1498 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001499 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1500 EXPECT_TRUE(DecodeCompleteFrame());
1501 }
1502}
1503
1504TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001505 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001506 EXPECT_TRUE(DecodeCompleteFrame());
1507 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001508 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1509 kNoError);
1510 InsertFrame(VideoFrameType::kVideoFrameKey);
1511 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1512 kNoError);
1513 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001514 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1515 EXPECT_TRUE(DecodeCompleteFrame());
1516 }
1517}
1518
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001519TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001520 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001521 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001522 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001523 clock_->TimeInMilliseconds());
1524 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001525 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001526 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001527 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001528 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1529 EXPECT_FALSE(DecodeCompleteFrame());
1530 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1531 EXPECT_TRUE(DecodeCompleteFrame());
1532 EXPECT_TRUE(DecodeCompleteFrame());
1533}
1534
philipel85130292016-07-06 16:10:31 +02001535TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001536 // Make sure empty packets doesn't clog the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001537 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1538 kNoError);
1539 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001540 EXPECT_TRUE(DecodeCompleteFrame());
1541}
1542
philipel85130292016-07-06 16:10:31 +02001543TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001544 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001545 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001546 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001547
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001548 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1549 // old packet.
1550 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001551 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001552 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1553 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001554 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001555
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001556 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001557 std::vector<uint16_t> nack_list =
1558 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001559 // No key frame will be requested since the jitter buffer is empty.
1560 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001561 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001562
Niels Möller8f7ce222019-03-21 15:43:58 +01001563 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001564 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001565 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001566
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001567 // The next complete continuous frame isn't a key frame, but we're waiting
1568 // for one.
1569 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001570 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001571 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001572 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001573}
1574
philipel85130292016-07-06 16:10:31 +02001575TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001576 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001577 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001578 EXPECT_TRUE(DecodeCompleteFrame());
1579
1580 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001581 EXPECT_GE(
1582 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1583 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001584
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001585 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001586 std::vector<uint16_t> nack_list =
1587 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001588 // Verify that the jitter buffer does not request a key frame.
1589 EXPECT_FALSE(request_key_frame);
1590 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001591 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001592 // Verify that we can decode the next frame.
1593 EXPECT_TRUE(DecodeCompleteFrame());
1594}
1595
philipel85130292016-07-06 16:10:31 +02001596TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001597 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001598 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001599 EXPECT_TRUE(DecodeCompleteFrame());
1600
1601 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001602 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001603 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001604 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001605 EXPECT_FALSE(DecodeCompleteFrame());
1606
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001607 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001608 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001609 // The jitter buffer is empty, so we won't request key frames until we get a
1610 // packet.
1611 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001612
Niels Möller8f7ce222019-03-21 15:43:58 +01001613 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001614 // Now we have a packet in the jitter buffer, a key frame will be requested
1615 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001616 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001617 // The jitter buffer is empty, so we won't request key frames until we get a
1618 // packet.
1619 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001620 // The next complete continuous frame isn't a key frame, but we're waiting
1621 // for one.
1622 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001623 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001624 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001625 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001626}
1627
philipel85130292016-07-06 16:10:31 +02001628TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001629 DropFrame(10);
1630 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001631 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001632 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001633 std::vector<uint16_t> nack_list =
1634 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001635 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001636 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001637 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001638}
1639
philipel85130292016-07-06 16:10:31 +02001640TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001641 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001642 InsertFrame(VideoFrameType::kVideoFrameKey);
1643 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001644 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001645 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001646 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001647 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001648 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001649 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001650 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001651}
1652
philipel85130292016-07-06 16:10:31 +02001653TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001654 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001655 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001656 clock_->TimeInMilliseconds());
1657 VCMPacket packet;
1658 stream_generator_->PopPacket(&packet, 0);
1659 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001660 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001661 EXPECT_FALSE(retransmitted);
1662 // Drop second packet.
1663 stream_generator_->PopPacket(&packet, 1);
1664 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1665 EXPECT_FALSE(retransmitted);
1666 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001667 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001668 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001669 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001670 EXPECT_EQ(1u, nack_list.size());
1671 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001672 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001673 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001674 EXPECT_EQ(kCompleteSession,
1675 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001676 EXPECT_TRUE(retransmitted);
1677 EXPECT_TRUE(DecodeCompleteFrame());
1678}
1679
philipel85130292016-07-06 16:10:31 +02001680TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001681 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001682 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001683 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001684 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001685 // Drop second packet.
1686 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1687 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001688 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001689 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001690 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001691 ASSERT_EQ(1u, nack_list.size());
1692 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001693 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001694 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001695 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001696}
1697
philipel85130292016-07-06 16:10:31 +02001698TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001699 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001700 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001701 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001702 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001703 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001704 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001705 // Drop second packet in frame.
1706 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1707 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1708 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001709 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001710 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001711 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001712 // Drop second packet in frame.
1713 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1714 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001715 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001716 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001717 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001718 ASSERT_EQ(1u, nack_list.size());
1719 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001720 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001721 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001722}
1723
philipel85130292016-07-06 16:10:31 +02001724TEST_F(TestJitterBufferNack, NormalOperation) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001725 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001726 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001727
1728 // ----------------------------------------------------------------
1729 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1730 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001731 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001732 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001733 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001734 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001735 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001736 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001737 while (stream_generator_->PacketsRemaining() > 1) {
1738 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001739 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001740 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001741 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001742 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001743 }
Niels Möller375b3462019-01-10 15:35:56 +01001744 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001745 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001746 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001747 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001748
1749 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001750 std::vector<uint16_t> nack_list =
1751 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001752 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001753 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001754 for (size_t i = 0; i < nack_list.size(); ++i)
1755 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001756}
1757
philipel85130292016-07-06 16:10:31 +02001758TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001759 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001760 // ------- ------------------------------------------------------------
1761 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1762 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001763 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001764 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001765 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001766 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001767 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001768 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001769 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001770 while (stream_generator_->PacketsRemaining() > 1) {
1771 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001772 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001773 EXPECT_FALSE(request_key_frame);
1774 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001775 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001776 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001777 }
1778 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001779 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001780 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001781 EXPECT_FALSE(DecodeCompleteFrame());
1782 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001783 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001784 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001785 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001786 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001787 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1788 for (size_t i = 0; i < nack_list.size(); ++i)
1789 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001790}
1791
philipel85130292016-07-06 16:10:31 +02001792TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001793 bool request_key_frame = false;
1794 // -----------------------------------
1795 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1796 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001797 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001798 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001799 EXPECT_FALSE(request_key_frame);
1800 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001801 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001802 clock_->TimeInMilliseconds());
1803 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1804 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001805 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001806 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001807 EXPECT_FALSE(request_key_frame);
1808 } else {
1809 stream_generator_->NextPacket(NULL); // Drop packet
1810 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001811 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001812 clock_->TimeInMilliseconds());
1813 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1814 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001815 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001816 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001817 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001818 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001819 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001820 ASSERT_EQ(1u, nack_list.size());
1821 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001822}
1823
philipel85130292016-07-06 16:10:31 +02001824TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001825 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001826 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001827 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001828 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001829 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1830 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001831
1832 // Far-into-the-future video frame, could be caused by resetting the encoder
1833 // or otherwise restarting. This should not fail when error when the packet is
1834 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001835 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001836 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001837 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001838 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001839 nack_list = jitter_buffer_->GetNackList(&extended);
1840 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001841
1842 // Stream should be decodable from this point.
1843 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001844 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001845 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001846 nack_list = jitter_buffer_->GetNackList(&extended);
1847 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001848}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001849} // namespace webrtc