blob: 315e5f9dcd2521b3917523fbb66ade73fedaa8b0 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
philipel83f831a2016-03-12 03:30:23 -080011#include <string>
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
stefana669a3a2016-10-06 05:04:52 -070015#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000016
Niels Möllerdb64d992019-03-29 14:30:53 +010017#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "common_video/h264/h264_common.h"
19#include "modules/video_coding/frame_buffer.h"
20#include "modules/video_coding/jitter_buffer.h"
21#include "modules/video_coding/media_opt_util.h"
22#include "modules/video_coding/packet.h"
23#include "modules/video_coding/test/stream_generator.h"
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() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000227 virtual void SetUp() {
228 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000229 }
230
philipel9d3ab612015-12-21 04:12:39 -0800231 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000232};
233
philipel85130292016-07-06 16:10:31 +0200234TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000235 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000236 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000237 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000238
239 // No packets inserted.
240 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000241}
242
philipel85130292016-07-06 16:10:31 +0200243TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000244 // Always start with a complete key frame when not allowing errors.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200245 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100246 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000247 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000248 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000249
250 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000251 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800252 EXPECT_EQ(kCompleteSession,
253 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000254 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000255 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100256 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000257 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000258}
259
philipel85130292016-07-06 16:10:31 +0200260TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200261 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100262 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000263 packet_->markerBit = false;
264
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000265 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800266 EXPECT_EQ(kIncomplete,
267 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000268 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
269 // Should not be complete.
270 EXPECT_TRUE(frame_out == NULL);
271
272 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100273 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000274 packet_->markerBit = true;
275 packet_->seqNum = seq_num_;
276
philipel9d3ab612015-12-21 04:12:39 -0800277 EXPECT_EQ(kCompleteSession,
278 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000279
280 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000281 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000282
Niels Möller8f7ce222019-03-21 15:43:58 +0100283 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000284 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000285}
286
philipel85130292016-07-06 16:10:31 +0200287TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200288 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100289 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000290 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000291
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000292 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800293 EXPECT_EQ(kIncomplete,
294 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000295
296 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
297
298 // Frame should not be complete.
299 EXPECT_TRUE(frame_out == NULL);
300
301 // Insert 98 frames.
302 int loop = 0;
303 do {
304 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100305 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000306 packet_->markerBit = false;
307 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000308
philipel9d3ab612015-12-21 04:12:39 -0800309 EXPECT_EQ(kIncomplete,
310 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000311 loop++;
312 } while (loop < 98);
313
314 // Insert last packet.
315 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100316 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000317 packet_->markerBit = true;
318 packet_->seqNum = seq_num_;
319
philipel9d3ab612015-12-21 04:12:39 -0800320 EXPECT_EQ(kCompleteSession,
321 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000322
323 frame_out = DecodeCompleteFrame();
324
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000325 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100326 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000327 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000328}
329
philipel85130292016-07-06 16:10:31 +0200330TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000331 // Always start with a complete key frame.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200332 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100333 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000334 packet_->markerBit = true;
335
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000336 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800337 EXPECT_EQ(kCompleteSession,
338 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000339 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
340 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000341 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000342
343 ++seq_num_;
344 packet_->seqNum = seq_num_;
345 packet_->markerBit = false;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200346 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000347 packet_->timestamp += 33 * 90;
348
philipel9d3ab612015-12-21 04:12:39 -0800349 EXPECT_EQ(kIncomplete,
350 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000351
352 frame_out = DecodeCompleteFrame();
353
354 // Frame should not be complete.
355 EXPECT_TRUE(frame_out == NULL);
356
Niels Möllerd5e02f02019-02-20 13:12:21 +0100357 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000358 // Insert 98 frames.
359 int loop = 0;
360 do {
361 ++seq_num_;
362 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000363
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000364 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800365 EXPECT_EQ(kIncomplete,
366 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000367 loop++;
368 } while (loop < 98);
369
370 // Insert the last packet.
371 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100372 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000373 packet_->markerBit = true;
374 packet_->seqNum = seq_num_;
375
philipel9d3ab612015-12-21 04:12:39 -0800376 EXPECT_EQ(kCompleteSession,
377 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000378
379 frame_out = DecodeCompleteFrame();
380
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000381 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100382 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000383 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000384}
385
philipel85130292016-07-06 16:10:31 +0200386TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000387 // Insert the "first" packet last.
388 seq_num_ += 100;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200389 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100390 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000391 packet_->markerBit = true;
392 packet_->seqNum = seq_num_;
393 packet_->timestamp = timestamp_;
394
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000395 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800396 EXPECT_EQ(kIncomplete,
397 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000398
399 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
400
401 EXPECT_TRUE(frame_out == NULL);
402
403 // Insert 98 packets.
404 int loop = 0;
405 do {
406 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100407 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000408 packet_->markerBit = false;
409 packet_->seqNum = seq_num_;
410
philipel9d3ab612015-12-21 04:12:39 -0800411 EXPECT_EQ(kIncomplete,
412 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000413 loop++;
414 } while (loop < 98);
415
416 // Insert the last packet.
417 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100418 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000419 packet_->markerBit = false;
420 packet_->seqNum = seq_num_;
421
philipel9d3ab612015-12-21 04:12:39 -0800422 EXPECT_EQ(kCompleteSession,
423 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000424
philipel9d3ab612015-12-21 04:12:39 -0800425 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000426
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000427 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000428
Niels Möller8f7ce222019-03-21 15:43:58 +0100429 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000430 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000431}
432
philipel85130292016-07-06 16:10:31 +0200433TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200434 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100435 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000436 packet_->markerBit = false;
437
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000438 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800439 EXPECT_EQ(kIncomplete,
440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000441
442 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
443
444 EXPECT_TRUE(frame_out == NULL);
445
446 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100447 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000448 packet_->markerBit = true;
449 packet_->seqNum = seq_num_;
450
philipel9d3ab612015-12-21 04:12:39 -0800451 EXPECT_EQ(kCompleteSession,
452 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000453
454 // check that we fail to get frame since seqnum is not continuous
455 frame_out = DecodeCompleteFrame();
456 EXPECT_TRUE(frame_out == NULL);
457
458 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800459 timestamp_ -= 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200460 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100461 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000462 packet_->markerBit = false;
463 packet_->seqNum = seq_num_;
464 packet_->timestamp = timestamp_;
465
philipel9d3ab612015-12-21 04:12:39 -0800466 EXPECT_EQ(kIncomplete,
467 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000468
469 frame_out = DecodeCompleteFrame();
470
471 // It should not be complete.
472 EXPECT_TRUE(frame_out == NULL);
473
474 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100475 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000476 packet_->markerBit = true;
477 packet_->seqNum = seq_num_;
478
philipel9d3ab612015-12-21 04:12:39 -0800479 EXPECT_EQ(kCompleteSession,
480 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000481
482 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000483 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100484 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000485 jitter_buffer_->ReleaseFrame(frame_out);
486
487 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000488 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100489 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000490 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000491}
492
philipel85130292016-07-06 16:10:31 +0200493TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller691f62c2019-04-11 15:27:17 +0200494 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +0200495 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100496 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700497 packet_->markerBit = true;
498
499 // Send in an initial good packet/frame (Frame A) to start things off.
500 bool retransmitted = false;
501 EXPECT_EQ(kCompleteSession,
502 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
503 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
504 EXPECT_TRUE(frame_out != NULL);
505 jitter_buffer_->ReleaseFrame(frame_out);
506
507 // Now send in a complete delta frame (Frame C), but with a sequence number
508 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möllerabbc50e2019-04-24 09:41:16 +0200509 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700510 // Leave a gap of 2 sequence numbers and two frames.
511 packet_->seqNum = seq_num_ + 3;
512 packet_->timestamp = timestamp_ + (66 * 90);
513 // Still isFirst = marker = true.
514 // Session should be complete (frame is complete), but there's nothing to
515 // decode yet.
516 EXPECT_EQ(kCompleteSession,
517 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
518 frame_out = DecodeCompleteFrame();
519 EXPECT_TRUE(frame_out == NULL);
520
521 // Now send in a complete delta frame (Frame B) that is continuous from A, but
522 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
523 packet_->seqNum = seq_num_ + 1;
524 packet_->timestamp = timestamp_ + (33 * 90);
525 // Still isFirst = marker = true.
526 EXPECT_EQ(kCompleteSession,
527 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
528 frame_out = DecodeCompleteFrame();
529 EXPECT_TRUE(frame_out != NULL);
530 jitter_buffer_->ReleaseFrame(frame_out);
531
532 // But Frame C isn't continuous yet.
533 frame_out = DecodeCompleteFrame();
534 EXPECT_TRUE(frame_out == NULL);
535
536 // Add in the padding. These are empty packets (data length is 0) with no
537 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100538 RTPHeader rtp_header;
539 RTPVideoHeader video_header;
540 rtp_header.sequenceNumber = seq_num_ + 2;
541 rtp_header.timestamp = timestamp_ + (33 * 90);
542 rtp_header.markerBit = false;
543 video_header.codec = kVideoCodecGeneric;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200544 video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller075e7fd2019-03-12 12:29:22 +0100545 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
Chen Xingf00bf422019-06-20 10:05:55 +0200546 /*ntp_time_ms=*/0, clock_->TimeInMilliseconds());
Noah Richardse4cb4e92015-05-22 14:03:00 -0700547 EXPECT_EQ(kOldPacket,
548 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
549 empty_packet.seqNum += 1;
550 EXPECT_EQ(kOldPacket,
551 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
552
553 // But now Frame C should be ready!
554 frame_out = DecodeCompleteFrame();
555 EXPECT_TRUE(frame_out != NULL);
556 jitter_buffer_->ReleaseFrame(frame_out);
557}
558
philipel85130292016-07-06 16:10:31 +0200559TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200560 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100561 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000562 packet_->markerBit = false;
563 packet_->seqNum = seq_num_;
564 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000565 EXPECT_EQ(0, jitter_buffer_->num_packets());
566 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000567
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000568 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800569 EXPECT_EQ(kIncomplete,
570 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000571
572 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
573
574 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000575 EXPECT_EQ(1, jitter_buffer_->num_packets());
576 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000578 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800579 EXPECT_EQ(kDuplicatePacket,
580 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000581 EXPECT_EQ(2, jitter_buffer_->num_packets());
582 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000583
584 seq_num_++;
585 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000586 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100587 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588
philipel9d3ab612015-12-21 04:12:39 -0800589 EXPECT_EQ(kCompleteSession,
590 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000591
592 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000593 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000594 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000595
Niels Möller8f7ce222019-03-21 15:43:58 +0100596 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000597 EXPECT_EQ(3, jitter_buffer_->num_packets());
598 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000599 jitter_buffer_->ReleaseFrame(frame_out);
600}
601
philipel85130292016-07-06 16:10:31 +0200602TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200603 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100604 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000605 packet_->markerBit = true;
606 packet_->seqNum = seq_num_;
607 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000608 EXPECT_EQ(0, jitter_buffer_->num_packets());
609 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
610
611 bool retransmitted = false;
612 // Insert first complete frame.
613 EXPECT_EQ(kCompleteSession,
614 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
615
616 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
617 ASSERT_TRUE(frame_out != NULL);
618 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100619 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000620 jitter_buffer_->ReleaseFrame(frame_out);
621
622 // Insert 3 delta frames.
623 for (uint16_t i = 1; i <= 3; ++i) {
624 packet_->seqNum = seq_num_ + i;
625 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200626 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000627 EXPECT_EQ(kCompleteSession,
628 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
629 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
630 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
631 }
632
633 // Retransmit second delta frame.
634 packet_->seqNum = seq_num_ + 2;
635 packet_->timestamp = timestamp_ + 66 * 90;
636
637 EXPECT_EQ(kDuplicatePacket,
638 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
639
640 EXPECT_EQ(5, jitter_buffer_->num_packets());
641 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
642
643 // Should be able to decode 3 delta frames, key frame already decoded.
644 for (size_t i = 0; i < 3; ++i) {
645 frame_out = DecodeCompleteFrame();
646 ASSERT_TRUE(frame_out != NULL);
647 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100648 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000649 jitter_buffer_->ReleaseFrame(frame_out);
650 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000651}
652
philipel85130292016-07-06 16:10:31 +0200653TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700654 // Verify that JB skips forward to next base layer frame.
655 // -------------------------------------------------
656 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
657 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
658 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
659 // | ss | x | x | x | |
660 // -------------------------------------------------
661 // |<----------tl0idx:200--------->|<---tl0idx:201---
662
Niels Möller691f62c2019-04-11 15:27:17 +0200663 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
philipel29d88462018-08-08 14:26:00 +0200664 auto& vp9_header =
665 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
666
asapersson9a4cd872015-10-23 00:27:14 -0700667 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200668 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100669 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700670 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200671 vp9_header.flexible_mode = false;
672 vp9_header.spatial_idx = 0;
673 vp9_header.beginning_of_frame = true;
674 vp9_header.end_of_frame = true;
675 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700676
677 packet_->seqNum = 65485;
678 packet_->timestamp = 1000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200679 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200680 vp9_header.picture_id = 5;
681 vp9_header.tl0_pic_idx = 200;
682 vp9_header.temporal_idx = 0;
683 vp9_header.ss_data_available = true;
684 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700685 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
686 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
687
688 // Insert next temporal layer 0.
689 packet_->seqNum = 65489;
690 packet_->timestamp = 13000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200691 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200692 vp9_header.picture_id = 9;
693 vp9_header.tl0_pic_idx = 201;
694 vp9_header.temporal_idx = 0;
695 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700696 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
697
698 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200699 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100700 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700701 jitter_buffer_->ReleaseFrame(frame_out);
702
703 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200704 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100705 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700706 jitter_buffer_->ReleaseFrame(frame_out);
707}
708
philipel85130292016-07-06 16:10:31 +0200709TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700710 // Verify that frames are updated with SS data when SS packet is reordered.
711 // --------------------------------
712 // | 65486 | 65487 | 65485 |...
713 // | pid:6 | pid:7 | pid:5 |...
714 // | tid:2 | tid:1 | tid:0 |...
715 // | | | ss |
716 // --------------------------------
717 // |<--------tl0idx:200--------->|
718
philipel29d88462018-08-08 14:26:00 +0200719 auto& vp9_header =
720 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
721
asapersson9a4cd872015-10-23 00:27:14 -0700722 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200723 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100724 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700725 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200726 vp9_header.flexible_mode = false;
727 vp9_header.spatial_idx = 0;
728 vp9_header.beginning_of_frame = true;
729 vp9_header.end_of_frame = true;
730 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700731
732 packet_->seqNum = 65486;
733 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200734 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200735 vp9_header.picture_id = 6;
736 vp9_header.temporal_idx = 2;
737 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700738 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
739
740 packet_->seqNum = 65487;
741 packet_->timestamp = 9000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200742 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200743 vp9_header.picture_id = 7;
744 vp9_header.temporal_idx = 1;
745 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700746 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
747
748 // Insert first frame with SS data.
749 packet_->seqNum = 65485;
750 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200751 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100752 packet_->video_header.width = 352;
753 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200754 vp9_header.picture_id = 5;
755 vp9_header.temporal_idx = 0;
756 vp9_header.temporal_up_switch = false;
757 vp9_header.ss_data_available = true;
758 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700759 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
760 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
761
762 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200763 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100764 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700765 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
766 EXPECT_FALSE(
767 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
768 jitter_buffer_->ReleaseFrame(frame_out);
769
770 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200771 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100772 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700773 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
774 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
775 jitter_buffer_->ReleaseFrame(frame_out);
776
777 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200778 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100779 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700780 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
781 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
782 jitter_buffer_->ReleaseFrame(frame_out);
783}
784
philipel85130292016-07-06 16:10:31 +0200785TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700786 // Verify that frames are updated with SS data when SS packet is reordered.
787 // -----------------------------------------
788 // | 65486 | 65487 | 65485 | 65484 |...
789 // | pid:6 | pid:6 | pid:5 | pid:5 |...
790 // | tid:1 | tid:1 | tid:0 | tid:0 |...
791 // | sid:0 | sid:1 | sid:1 | sid:0 |...
792 // | t:6000 | t:6000 | t:3000 | t:3000 |
793 // | | | | ss |
794 // -----------------------------------------
795 // |<-----------tl0idx:200------------>|
796
philipel29d88462018-08-08 14:26:00 +0200797 auto& vp9_header =
798 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
799
asapersson9a4cd872015-10-23 00:27:14 -0700800 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200801 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200802 vp9_header.flexible_mode = false;
803 vp9_header.beginning_of_frame = true;
804 vp9_header.end_of_frame = true;
805 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700806
Niels Möllerd5e02f02019-02-20 13:12:21 +0100807 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700808 packet_->markerBit = false;
809 packet_->seqNum = 65486;
810 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200811 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200812 vp9_header.spatial_idx = 0;
813 vp9_header.picture_id = 6;
814 vp9_header.temporal_idx = 1;
815 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700816 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
817
Niels Möllerd5e02f02019-02-20 13:12:21 +0100818 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700819 packet_->markerBit = true;
820 packet_->seqNum = 65487;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200821 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200822 vp9_header.spatial_idx = 1;
823 vp9_header.picture_id = 6;
824 vp9_header.temporal_idx = 1;
825 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700826 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
827
Niels Möllerd5e02f02019-02-20 13:12:21 +0100828 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700829 packet_->markerBit = true;
830 packet_->seqNum = 65485;
831 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200832 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200833 vp9_header.spatial_idx = 1;
834 vp9_header.picture_id = 5;
835 vp9_header.temporal_idx = 0;
836 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700837 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
838
839 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100840 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700841 packet_->markerBit = false;
842 packet_->seqNum = 65484;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200843 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100844 packet_->video_header.width = 352;
845 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200846 vp9_header.spatial_idx = 0;
847 vp9_header.picture_id = 5;
848 vp9_header.temporal_idx = 0;
849 vp9_header.temporal_up_switch = false;
850 vp9_header.ss_data_available = true;
851 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700852 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
853 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
854
855 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200856 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100857 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700858 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
859 EXPECT_FALSE(
860 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
861 jitter_buffer_->ReleaseFrame(frame_out);
862
863 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200864 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100865 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700866 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
867 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
868 jitter_buffer_->ReleaseFrame(frame_out);
869}
870
philipel85130292016-07-06 16:10:31 +0200871TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200872 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100873 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000874 packet_->markerBit = false;
875 packet_->seqNum = seq_num_;
876 packet_->timestamp = timestamp_;
877 packet_->insertStartCode = true;
878
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000879 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800880 EXPECT_EQ(kIncomplete,
881 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000882
883 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
884
885 // Frame should not be complete.
886 EXPECT_TRUE(frame_out == NULL);
887
888 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100889 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000890 packet_->markerBit = true;
891 packet_->seqNum = seq_num_;
892
philipel9d3ab612015-12-21 04:12:39 -0800893 EXPECT_EQ(kCompleteSession,
894 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000895
896 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000897 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +0100898 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000899 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000900}
901
stefana669a3a2016-10-06 05:04:52 -0700902TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +0200903 auto& h264_header =
904 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -0700905 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200906 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100907 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700908 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200909 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200910 h264_header.nalu_type = H264::NaluType::kIdr;
911 h264_header.nalus[0].type = H264::NaluType::kIdr;
912 h264_header.nalus[0].sps_id = -1;
913 h264_header.nalus[0].pps_id = 0;
914 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700915 bool retransmitted = false;
916 EXPECT_EQ(kCompleteSession,
917 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
918 // Not decodable since sps and pps are missing.
919 EXPECT_EQ(nullptr, DecodeCompleteFrame());
920
921 timestamp_ += 3000;
922 packet_->timestamp = timestamp_;
923 ++seq_num_;
924 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200925 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100926 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700927 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200928 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200929 h264_header.nalu_type = H264::NaluType::kStapA;
930 h264_header.nalus[0].type = H264::NaluType::kSps;
931 h264_header.nalus[0].sps_id = 0;
932 h264_header.nalus[0].pps_id = -1;
933 h264_header.nalus[1].type = H264::NaluType::kPps;
934 h264_header.nalus[1].sps_id = 0;
935 h264_header.nalus[1].pps_id = 0;
936 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -0700937 // Not complete since the marker bit hasn't been received.
938 EXPECT_EQ(kIncomplete,
939 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
940
941 ++seq_num_;
942 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200943 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100944 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -0700945 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200946 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200947 h264_header.nalu_type = H264::NaluType::kIdr;
948 h264_header.nalus[0].type = H264::NaluType::kIdr;
949 h264_header.nalus[0].sps_id = -1;
950 h264_header.nalus[0].pps_id = 0;
951 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700952 // Complete and decodable since the pps and sps are received in the first
953 // packet of this frame.
954 EXPECT_EQ(kCompleteSession,
955 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
956 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
957 ASSERT_NE(nullptr, frame_out);
958 jitter_buffer_->ReleaseFrame(frame_out);
959
960 timestamp_ += 3000;
961 packet_->timestamp = timestamp_;
962 ++seq_num_;
963 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200964 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100965 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700966 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200967 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200968 h264_header.nalu_type = H264::NaluType::kSlice;
969 h264_header.nalus[0].type = H264::NaluType::kSlice;
970 h264_header.nalus[0].sps_id = -1;
971 h264_header.nalus[0].pps_id = 0;
972 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700973 // Complete and decodable since sps, pps and key frame has been received.
974 EXPECT_EQ(kCompleteSession,
975 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
976 frame_out = DecodeCompleteFrame();
977 ASSERT_NE(nullptr, frame_out);
978 jitter_buffer_->ReleaseFrame(frame_out);
979}
980
philipel85130292016-07-06 16:10:31 +0200981TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000982 seq_num_ = 0xfff0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200983 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100984 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000985 packet_->markerBit = false;
986 packet_->seqNum = seq_num_;
987 packet_->timestamp = timestamp_;
988
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000989 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800990 EXPECT_EQ(kIncomplete,
991 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000992
993 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
994
995 EXPECT_TRUE(frame_out == NULL);
996
997 int loop = 0;
998 do {
999 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001000 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001001 packet_->markerBit = false;
1002 packet_->seqNum = seq_num_;
1003
philipel9d3ab612015-12-21 04:12:39 -08001004 EXPECT_EQ(kIncomplete,
1005 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001006
1007 frame_out = DecodeCompleteFrame();
1008
1009 EXPECT_TRUE(frame_out == NULL);
1010
1011 loop++;
1012 } while (loop < 98);
1013
1014 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001015 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001016 packet_->markerBit = true;
1017 packet_->seqNum = seq_num_;
1018
philipel9d3ab612015-12-21 04:12:39 -08001019 EXPECT_EQ(kCompleteSession,
1020 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001021
1022 frame_out = DecodeCompleteFrame();
1023
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001024 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001025
Niels Möller8f7ce222019-03-21 15:43:58 +01001026 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001027 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001028}
1029
philipel85130292016-07-06 16:10:31 +02001030TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001031 // Insert "first" packet last seqnum.
1032 seq_num_ = 10;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001033 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001034 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001035 packet_->markerBit = true;
1036 packet_->seqNum = seq_num_;
1037
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001038 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001039 EXPECT_EQ(kIncomplete,
1040 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001041 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1042
1043 // Should not be complete.
1044 EXPECT_TRUE(frame_out == NULL);
1045
1046 // Insert 98 frames.
1047 int loop = 0;
1048 do {
1049 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001050 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001051 packet_->markerBit = false;
1052 packet_->seqNum = seq_num_;
1053
philipel9d3ab612015-12-21 04:12:39 -08001054 EXPECT_EQ(kIncomplete,
1055 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001056
1057 frame_out = DecodeCompleteFrame();
1058
1059 EXPECT_TRUE(frame_out == NULL);
1060
1061 loop++;
1062 } while (loop < 98);
1063
1064 // Insert last packet.
1065 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001066 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001067 packet_->markerBit = false;
1068 packet_->seqNum = seq_num_;
1069
philipel9d3ab612015-12-21 04:12:39 -08001070 EXPECT_EQ(kCompleteSession,
1071 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001072
1073 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001074 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001075 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001076 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001077}
1078
philipel85130292016-07-06 16:10:31 +02001079TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001080 // ------- -------
1081 // | 2 | | 1 |
1082 // ------- -------
1083 // t = 3000 t = 2000
1084 seq_num_ = 2;
1085 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001086 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001087 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001088 packet_->markerBit = true;
1089 packet_->timestamp = timestamp_;
1090 packet_->seqNum = seq_num_;
1091
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001092 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001093 EXPECT_EQ(kCompleteSession,
1094 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001095
1096 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001097 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001098 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001099 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001100 jitter_buffer_->ReleaseFrame(frame_out);
1101
1102 seq_num_--;
1103 timestamp_ = 2000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001104 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001105 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001106 packet_->markerBit = true;
1107 packet_->seqNum = seq_num_;
1108 packet_->timestamp = timestamp_;
1109
philipel9d3ab612015-12-21 04:12:39 -08001110 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001111}
1112
philipel85130292016-07-06 16:10:31 +02001113TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001114 // ------- -------
1115 // | 2 | | 1 |
1116 // ------- -------
1117 // t = 3000 t = 0xffffff00
1118
1119 seq_num_ = 2;
1120 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001121 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001122 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001123 packet_->markerBit = true;
1124 packet_->seqNum = seq_num_;
1125 packet_->timestamp = timestamp_;
1126
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001127 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001128 EXPECT_EQ(kCompleteSession,
1129 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001130
1131 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001132 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001133
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001134 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001135
Niels Möller8f7ce222019-03-21 15:43:58 +01001136 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001137
1138 jitter_buffer_->ReleaseFrame(frame_out);
1139
1140 seq_num_--;
1141 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001142 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001143 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001144 packet_->markerBit = true;
1145 packet_->seqNum = seq_num_;
1146 packet_->timestamp = timestamp_;
1147
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001148 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001149 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001150}
1151
philipel85130292016-07-06 16:10:31 +02001152TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001153 // --------------- ---------------
1154 // | 1 | 2 | | 3 | 4 |
1155 // --------------- ---------------
1156 // t = 0xffffff00 t = 33*90
1157
1158 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001159 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001160 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001161 packet_->markerBit = false;
1162 packet_->seqNum = seq_num_;
1163 packet_->timestamp = timestamp_;
1164
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001165 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001166 EXPECT_EQ(kIncomplete,
1167 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001168
1169 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001170 EXPECT_TRUE(frame_out == NULL);
1171
1172 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001173 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001174 packet_->markerBit = true;
1175 packet_->seqNum = seq_num_;
1176
philipel9d3ab612015-12-21 04:12:39 -08001177 EXPECT_EQ(kCompleteSession,
1178 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001179
1180 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001181 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001182 jitter_buffer_->ReleaseFrame(frame_out);
1183
1184 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001185 timestamp_ += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001186 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001187 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001188 packet_->markerBit = false;
1189 packet_->seqNum = seq_num_;
1190 packet_->timestamp = timestamp_;
1191
philipel9d3ab612015-12-21 04:12:39 -08001192 EXPECT_EQ(kIncomplete,
1193 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001194
1195 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001196 EXPECT_TRUE(frame_out == NULL);
1197
1198 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001199 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001200 packet_->markerBit = true;
1201 packet_->seqNum = seq_num_;
1202
philipel9d3ab612015-12-21 04:12:39 -08001203 EXPECT_EQ(kCompleteSession,
1204 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001205
1206 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001207 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001208 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001209 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001210}
1211
philipel85130292016-07-06 16:10:31 +02001212TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001213 // ------- -------
1214 // | 1 | | 2 |
1215 // ------- -------
1216 // t = 0xffffff00 t = 2700
1217
1218 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001219 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001220 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001221 packet_->markerBit = true;
1222 packet_->timestamp = timestamp_;
1223
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001224 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001225 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001226 EXPECT_EQ(kCompleteSession,
1227 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001228
1229 // Insert next frame.
1230 seq_num_++;
1231 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001232 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001233 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001234 packet_->markerBit = true;
1235 packet_->seqNum = seq_num_;
1236 packet_->timestamp = timestamp_;
1237
philipel9d3ab612015-12-21 04:12:39 -08001238 EXPECT_EQ(kCompleteSession,
1239 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001240
1241 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001242 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001243 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001244 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001245 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001246
1247 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001248 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001249 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001250 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001251 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001252}
1253
philipel85130292016-07-06 16:10:31 +02001254TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001255 // ------- -------
1256 // | 2 | | 1 |
1257 // ------- -------
1258 // t = 2700 t = 0xffffff00
1259
1260 seq_num_ = 2;
1261 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001262 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001263 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001264 packet_->markerBit = true;
1265 packet_->seqNum = seq_num_;
1266 packet_->timestamp = timestamp_;
1267
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001268 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001269 EXPECT_EQ(kCompleteSession,
1270 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001271
1272 // Insert second frame
1273 seq_num_--;
1274 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001275 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001276 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001277 packet_->markerBit = true;
1278 packet_->seqNum = seq_num_;
1279 packet_->timestamp = timestamp_;
1280
philipel9d3ab612015-12-21 04:12:39 -08001281 EXPECT_EQ(kCompleteSession,
1282 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001283
1284 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001285 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001286 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001287 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001288 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001289
1290 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001291 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001292 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001293 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001294 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001295}
1296
philipel85130292016-07-06 16:10:31 +02001297TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001298 int loop = 0;
1299 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001300 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001301 // Insert kMaxPacketsInJitterBuffer into frame.
1302 do {
1303 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001304 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001305 packet_->markerBit = false;
1306 packet_->seqNum = seq_num_;
1307
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001308 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001309 EXPECT_EQ(kIncomplete,
1310 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001311 firstPacket = false;
1312 } else {
philipel9d3ab612015-12-21 04:12:39 -08001313 EXPECT_EQ(kIncomplete,
1314 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001315 }
1316
1317 loop++;
1318 } while (loop < kMaxPacketsInSession);
1319
1320 // Max number of packets inserted.
1321 // Insert one more packet.
1322 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001323 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001324 packet_->markerBit = true;
1325 packet_->seqNum = seq_num_;
1326
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001327 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001328 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001329 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001330}
1331
philipel85130292016-07-06 16:10:31 +02001332TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001333 // TEST fill JB with more than max number of frame (50 delta frames +
1334 // 51 key frames) with wrap in seq_num_
1335 //
1336 // --------------------------------------------------------------
1337 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1338 // --------------------------------------------------------------
1339 // |<-----------delta frames------------->|<------key frames----->|
1340
jbauchdb81ffd2015-11-23 03:59:02 -08001341 // Make sure the jitter doesn't request a keyframe after too much non-
1342 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001343 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001344
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001345 int loop = 0;
1346 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001347 uint32_t first_key_frame_timestamp = 0;
1348 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001349 // Insert MAX_NUMBER_OF_FRAMES frames.
1350 do {
philipel9d3ab612015-12-21 04:12:39 -08001351 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001352 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001353 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001354 packet_->markerBit = true;
1355 packet_->seqNum = seq_num_;
1356 packet_->timestamp = timestamp_;
1357
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001358 if (loop == 50) {
1359 first_key_frame_timestamp = packet_->timestamp;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001360 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001361 }
1362
1363 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001364 EXPECT_EQ(kCompleteSession,
1365 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001366
1367 loop++;
1368 } while (loop < kMaxNumberOfFrames);
1369
1370 // Max number of frames inserted.
1371
1372 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001373 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001374 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001375 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001376 packet_->markerBit = true;
1377 packet_->seqNum = seq_num_;
1378 packet_->timestamp = timestamp_;
1379
1380 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001381 EXPECT_EQ(kFlushIndicator,
1382 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001383
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001384 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001385 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001386 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001387 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001388 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001389}
1390
philipel85130292016-07-06 16:10:31 +02001391TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001392 seq_num_ = 3;
1393 // Insert one empty packet per frame, should never return the last timestamp
1394 // inserted. Only return empty frames in the presence of subsequent frames.
1395 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001396 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001397 for (int i = 0; i < maxSize + 10; i++) {
1398 timestamp_ += 33 * 90;
1399 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001400 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001401 packet_->markerBit = false;
1402 packet_->seqNum = seq_num_;
1403 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001404 packet_->video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001405
philipel9d3ab612015-12-21 04:12:39 -08001406 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001407 }
1408}
1409
philipel85130292016-07-06 16:10:31 +02001410TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001411 // Test that a we cannot get incomplete frames from the JB if we haven't
1412 // received the marker bit, unless we have received a packet from a later
1413 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001414 // Start with a complete key frame - insert and decode.
Niels Möller691f62c2019-04-11 15:27:17 +02001415 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +02001416 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001417 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001418 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001419 bool retransmitted = false;
1420
philipel9d3ab612015-12-21 04:12:39 -08001421 EXPECT_EQ(kCompleteSession,
1422 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001423 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1424 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001425 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001426
1427 packet_->seqNum += 2;
1428 packet_->timestamp += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001429 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001430 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001431 packet_->markerBit = false;
1432
Niels Möller375b3462019-01-10 15:35:56 +01001433 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001434 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001435
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001436 packet_->seqNum += 2;
1437 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001438 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001439
Niels Möller375b3462019-01-10 15:35:56 +01001440 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001441 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001442}
1443
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001444TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001445 // Make sure the jitter doesn't request a keyframe after too much non-
1446 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001447 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001448 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001449 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001450 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001451 DropFrame(1);
1452 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001453 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1454 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001455 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001456 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001457 // This frame will make the jitter buffer recycle frames until a key frame.
1458 // Since none is found it will have to wait until the next key frame before
1459 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001460 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001461 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001462}
1463
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001464TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001465 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001466 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001467 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001468 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001469 // Insert empty packet.
1470 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001471 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001472 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001473 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001474 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001475 EXPECT_EQ(kIncomplete, 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 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001478 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001479 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001480 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001481 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001482}
1483
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001484TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1485 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001486 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001487 // Can't decode without a key frame.
1488 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001489 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001490 // Skip to the next key frame.
1491 EXPECT_TRUE(DecodeCompleteFrame());
1492}
1493
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001494TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001495 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001496 EXPECT_TRUE(DecodeCompleteFrame());
1497 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001498 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1499 kNoError);
1500 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001501 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1502 EXPECT_TRUE(DecodeCompleteFrame());
1503 }
1504}
1505
1506TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001507 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001508 EXPECT_TRUE(DecodeCompleteFrame());
1509 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001510 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1511 kNoError);
1512 InsertFrame(VideoFrameType::kVideoFrameKey);
1513 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1514 kNoError);
1515 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001516 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1517 EXPECT_TRUE(DecodeCompleteFrame());
1518 }
1519}
1520
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001521TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001522 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001523 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001524 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001525 clock_->TimeInMilliseconds());
1526 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001527 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001528 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001529 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001530 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1531 EXPECT_FALSE(DecodeCompleteFrame());
1532 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1533 EXPECT_TRUE(DecodeCompleteFrame());
1534 EXPECT_TRUE(DecodeCompleteFrame());
1535}
1536
philipel85130292016-07-06 16:10:31 +02001537TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001538 // Make sure empty packets doesn't clog the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001539 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1540 kNoError);
1541 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001542 EXPECT_TRUE(DecodeCompleteFrame());
1543}
1544
philipel85130292016-07-06 16:10:31 +02001545TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001546 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001547 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001548 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001549
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001550 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1551 // old packet.
1552 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001553 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001554 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1555 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001556 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001557
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001558 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001559 std::vector<uint16_t> nack_list =
1560 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001561 // No key frame will be requested since the jitter buffer is empty.
1562 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001563 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001564
Niels Möller8f7ce222019-03-21 15:43:58 +01001565 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001566 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001567 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001568
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001569 // The next complete continuous frame isn't a key frame, but we're waiting
1570 // for one.
1571 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001572 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001573 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001574 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001575}
1576
philipel85130292016-07-06 16:10:31 +02001577TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001578 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001579 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001580 EXPECT_TRUE(DecodeCompleteFrame());
1581
1582 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001583 EXPECT_GE(
1584 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1585 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001586
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001587 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001588 std::vector<uint16_t> nack_list =
1589 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001590 // Verify that the jitter buffer does not request a key frame.
1591 EXPECT_FALSE(request_key_frame);
1592 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001593 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001594 // Verify that we can decode the next frame.
1595 EXPECT_TRUE(DecodeCompleteFrame());
1596}
1597
philipel85130292016-07-06 16:10:31 +02001598TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001599 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001600 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001601 EXPECT_TRUE(DecodeCompleteFrame());
1602
1603 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001604 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001605 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001606 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001607 EXPECT_FALSE(DecodeCompleteFrame());
1608
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001609 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001610 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001611 // The jitter buffer is empty, so we won't request key frames until we get a
1612 // packet.
1613 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001614
Niels Möller8f7ce222019-03-21 15:43:58 +01001615 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001616 // Now we have a packet in the jitter buffer, a key frame will be requested
1617 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001618 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001619 // The jitter buffer is empty, so we won't request key frames until we get a
1620 // packet.
1621 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001622 // The next complete continuous frame isn't a key frame, but we're waiting
1623 // for one.
1624 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001625 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001626 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001627 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001628}
1629
philipel85130292016-07-06 16:10:31 +02001630TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001631 DropFrame(10);
1632 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001633 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001634 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001635 std::vector<uint16_t> nack_list =
1636 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001637 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001638 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001639 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001640}
1641
philipel85130292016-07-06 16:10:31 +02001642TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001643 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001644 InsertFrame(VideoFrameType::kVideoFrameKey);
1645 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001646 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001647 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001648 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001649 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001650 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001651 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001652 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001653}
1654
philipel85130292016-07-06 16:10:31 +02001655TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001656 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001657 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001658 clock_->TimeInMilliseconds());
1659 VCMPacket packet;
1660 stream_generator_->PopPacket(&packet, 0);
1661 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001662 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001663 EXPECT_FALSE(retransmitted);
1664 // Drop second packet.
1665 stream_generator_->PopPacket(&packet, 1);
1666 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1667 EXPECT_FALSE(retransmitted);
1668 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001669 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001670 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001671 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001672 EXPECT_EQ(1u, nack_list.size());
1673 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001674 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001675 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001676 EXPECT_EQ(kCompleteSession,
1677 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001678 EXPECT_TRUE(retransmitted);
1679 EXPECT_TRUE(DecodeCompleteFrame());
1680}
1681
philipel85130292016-07-06 16:10:31 +02001682TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001683 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001684 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001685 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001686 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001687 // Drop second packet.
1688 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1689 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001690 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001691 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001692 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001693 ASSERT_EQ(1u, nack_list.size());
1694 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001695 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001696 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001697 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001698}
1699
philipel85130292016-07-06 16:10:31 +02001700TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001701 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001702 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001703 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001704 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001705 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001706 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001707 // Drop second packet in frame.
1708 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1709 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1710 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001711 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001712 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001713 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001714 // Drop second packet in frame.
1715 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1716 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001717 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001718 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001719 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001720 ASSERT_EQ(1u, nack_list.size());
1721 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001722 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001723 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001724}
1725
philipel85130292016-07-06 16:10:31 +02001726TEST_F(TestJitterBufferNack, NormalOperation) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001727 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001728 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001729
1730 // ----------------------------------------------------------------
1731 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1732 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001733 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001734 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001735 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001736 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001737 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001738 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001739 while (stream_generator_->PacketsRemaining() > 1) {
1740 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001741 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001742 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001743 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001744 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001745 }
Niels Möller375b3462019-01-10 15:35:56 +01001746 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001747 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001748 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001749 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001750
1751 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001752 std::vector<uint16_t> nack_list =
1753 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001754 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001755 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001756 for (size_t i = 0; i < nack_list.size(); ++i)
1757 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001758}
1759
philipel85130292016-07-06 16:10:31 +02001760TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001761 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001762 // ------- ------------------------------------------------------------
1763 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1764 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001765 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001766 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001767 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001768 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001769 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001770 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001771 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001772 while (stream_generator_->PacketsRemaining() > 1) {
1773 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001774 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001775 EXPECT_FALSE(request_key_frame);
1776 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001777 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001778 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001779 }
1780 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001781 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001782 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001783 EXPECT_FALSE(DecodeCompleteFrame());
1784 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001785 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001786 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001787 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001788 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001789 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1790 for (size_t i = 0; i < nack_list.size(); ++i)
1791 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001792}
1793
philipel85130292016-07-06 16:10:31 +02001794TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001795 bool request_key_frame = false;
1796 // -----------------------------------
1797 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1798 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001799 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001800 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001801 EXPECT_FALSE(request_key_frame);
1802 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001803 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001804 clock_->TimeInMilliseconds());
1805 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1806 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001807 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001808 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001809 EXPECT_FALSE(request_key_frame);
1810 } else {
1811 stream_generator_->NextPacket(NULL); // Drop packet
1812 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001813 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001814 clock_->TimeInMilliseconds());
1815 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1816 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001817 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001818 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001819 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001820 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001821 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001822 ASSERT_EQ(1u, nack_list.size());
1823 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001824}
1825
philipel85130292016-07-06 16:10:31 +02001826TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001827 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001828 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001829 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001830 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001831 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1832 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001833
1834 // Far-into-the-future video frame, could be caused by resetting the encoder
1835 // or otherwise restarting. This should not fail when error when the packet is
1836 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001837 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001838 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001839 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001840 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001841 nack_list = jitter_buffer_->GetNackList(&extended);
1842 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001843
1844 // Stream should be decodable from this point.
1845 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001846 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001847 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001848 nack_list = jitter_buffer_->GetNackList(&extended);
1849 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001850}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001851} // namespace webrtc