blob: 53eba633c7887ec2c160c37f488e62c159dc43d6 [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,
Niels Möller8f7ce222019-03-21 15:43:58 +010070 /*ntp_time_ms=*/0));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000071 }
72
73 VCMEncodedFrame* DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -070074 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000075 if (!found_frame)
isheriff6b4b5f32016-06-08 00:24:21 -070076 return nullptr;
Niels Möller23775882018-08-16 10:24:12 +020077 return jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000078 }
79
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000080 void CheckOutFrame(VCMEncodedFrame* frame_out,
philipel9d3ab612015-12-21 04:12:39 -080081 unsigned int size,
82 bool startCode) {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000083 ASSERT_TRUE(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000084
Niels Möller9c843902019-01-11 10:21:35 +010085 const uint8_t* outData = frame_out->data();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000086 unsigned int i = 0;
87
88 if (startCode) {
89 EXPECT_EQ(0, outData[0]);
90 EXPECT_EQ(0, outData[1]);
91 EXPECT_EQ(0, outData[2]);
92 EXPECT_EQ(1, outData[3]);
93 i += 4;
94 }
95
Niels Möllerf0eee002018-11-28 16:31:29 +010096 EXPECT_EQ(size, frame_out->size());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000097 int count = 3;
98 for (; i < size; i++) {
99 if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
100 i += 2;
101 } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
102 EXPECT_EQ(0, outData[0]);
103 EXPECT_EQ(0, outData[1]);
104 EXPECT_EQ(0, outData[2]);
105 EXPECT_EQ(1, outData[3]);
106 i += 3;
107 } else {
108 EXPECT_EQ(count, outData[i]);
109 count++;
110 if (count == 10) {
111 count = 3;
112 }
113 }
114 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000115 }
116
117 uint16_t seq_num_;
118 uint32_t timestamp_;
119 int size_;
120 uint8_t data_[1500];
kwiberg3f55dea2016-02-29 05:51:59 -0800121 std::unique_ptr<VCMPacket> packet_;
122 std::unique_ptr<SimulatedClock> clock_;
kwiberg3f55dea2016-02-29 05:51:59 -0800123 std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000124};
125
Niels Möllerdb64d992019-03-29 14:30:53 +0100126class TestRunningJitterBuffer : public ::testing::Test {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000127 protected:
128 enum { kDataBufferSize = 10 };
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000129
130 virtual void SetUp() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000131 clock_.reset(new SimulatedClock(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000132 max_nack_list_size_ = 150;
133 oldest_packet_to_nack_ = 250;
Qiang Chend4cec152015-06-19 09:17:00 -0700134 jitter_buffer_ = new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +0100135 clock_.get(), absl::WrapUnique(EventWrapper::Create()));
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -0700136 stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000137 jitter_buffer_->Start();
philipel9d3ab612015-12-21 04:12:39 -0800138 jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
139 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000140 memset(data_buffer_, 0, kDataBufferSize);
141 }
142
143 virtual void TearDown() {
144 jitter_buffer_->Stop();
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000145 delete stream_generator_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000146 delete jitter_buffer_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000147 }
148
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000149 VCMFrameBufferEnum InsertPacketAndPop(int index) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000150 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000151 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000152 bool packet_available = stream_generator_->PopPacket(&packet, index);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000153 EXPECT_TRUE(packet_available);
154 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000155 return kGeneralError; // Return here to avoid crashes below.
156 bool retransmitted = false;
157 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000158 }
159
160 VCMFrameBufferEnum InsertPacket(int index) {
161 VCMPacket packet;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000162 packet.dataPtr = data_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000163 bool packet_available = stream_generator_->GetPacket(&packet, index);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000164 EXPECT_TRUE(packet_available);
165 if (!packet_available)
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000166 return kGeneralError; // Return here to avoid crashes below.
167 bool retransmitted = false;
168 return jitter_buffer_->InsertPacket(packet, &retransmitted);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000169 }
170
Niels Möller87e2d782019-03-07 10:18:23 +0100171 VCMFrameBufferEnum InsertFrame(VideoFrameType frame_type) {
pbos22993e12015-10-19 02:39:06 -0700172 stream_generator_->GenerateFrame(
Niels Möller8f7ce222019-03-21 15:43:58 +0100173 frame_type, (frame_type != VideoFrameType::kEmptyFrame) ? 1 : 0,
174 (frame_type == VideoFrameType::kEmptyFrame) ? 1 : 0,
175 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000176 VCMFrameBufferEnum ret = InsertPacketAndPop(0);
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000177 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000178 return ret;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000179 }
180
Niels Möller87e2d782019-03-07 10:18:23 +0100181 VCMFrameBufferEnum InsertFrames(int num_frames, VideoFrameType frame_type) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000182 VCMFrameBufferEnum ret_for_all = kNoError;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000183 for (int i = 0; i < num_frames; ++i) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000184 VCMFrameBufferEnum ret = InsertFrame(frame_type);
185 if (ret < kNoError) {
186 ret_for_all = ret;
187 } else if (ret_for_all >= kNoError) {
188 ret_for_all = ret;
189 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000190 }
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000191 return ret_for_all;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000192 }
193
194 void DropFrame(int num_packets) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100195 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta,
196 num_packets, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000197 clock_->TimeInMilliseconds());
198 for (int i = 0; i < num_packets; ++i)
199 stream_generator_->DropLastPacket();
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000200 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000201 }
202
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000203 bool DecodeCompleteFrame() {
isheriff6b4b5f32016-06-08 00:24:21 -0700204 VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000205 if (!found_frame)
206 return false;
207
isheriff6b4b5f32016-06-08 00:24:21 -0700208 VCMEncodedFrame* frame =
Niels Möller23775882018-08-16 10:24:12 +0200209 jitter_buffer_->ExtractAndSetDecode(found_frame->Timestamp());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000210 bool ret = (frame != NULL);
211 jitter_buffer_->ReleaseFrame(frame);
212 return ret;
213 }
214
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000215 VCMJitterBuffer* jitter_buffer_;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000216 StreamGenerator* stream_generator_;
kwiberg3f55dea2016-02-29 05:51:59 -0800217 std::unique_ptr<SimulatedClock> clock_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000218 size_t max_nack_list_size_;
219 int oldest_packet_to_nack_;
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000220 uint8_t data_buffer_[kDataBufferSize];
221};
222
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +0000223class TestJitterBufferNack : public TestRunningJitterBuffer {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000224 protected:
philipel85130292016-07-06 16:10:31 +0200225 TestJitterBufferNack() {}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000226 virtual void SetUp() {
227 TestRunningJitterBuffer::SetUp();
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000228 }
229
philipel9d3ab612015-12-21 04:12:39 -0800230 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000231};
232
philipel85130292016-07-06 16:10:31 +0200233TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000234 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000235 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000236 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000237
238 // No packets inserted.
239 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000240}
241
philipel85130292016-07-06 16:10:31 +0200242TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000243 // Always start with a complete key frame when not allowing errors.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200244 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100245 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000246 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000247 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000248
249 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000250 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800251 EXPECT_EQ(kCompleteSession,
252 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000253 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000254 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100255 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000256 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000257}
258
philipel85130292016-07-06 16:10:31 +0200259TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200260 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100261 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000262 packet_->markerBit = false;
263
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000264 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800265 EXPECT_EQ(kIncomplete,
266 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000267 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
268 // Should not be complete.
269 EXPECT_TRUE(frame_out == NULL);
270
271 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100272 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000273 packet_->markerBit = true;
274 packet_->seqNum = seq_num_;
275
philipel9d3ab612015-12-21 04:12:39 -0800276 EXPECT_EQ(kCompleteSession,
277 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000278
279 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000280 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000281
Niels Möller8f7ce222019-03-21 15:43:58 +0100282 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000283 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000284}
285
philipel85130292016-07-06 16:10:31 +0200286TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200287 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100288 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000289 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000290
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000291 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800292 EXPECT_EQ(kIncomplete,
293 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000294
295 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
296
297 // Frame should not be complete.
298 EXPECT_TRUE(frame_out == NULL);
299
300 // Insert 98 frames.
301 int loop = 0;
302 do {
303 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100304 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000305 packet_->markerBit = false;
306 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000307
philipel9d3ab612015-12-21 04:12:39 -0800308 EXPECT_EQ(kIncomplete,
309 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000310 loop++;
311 } while (loop < 98);
312
313 // Insert last packet.
314 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100315 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000316 packet_->markerBit = true;
317 packet_->seqNum = seq_num_;
318
philipel9d3ab612015-12-21 04:12:39 -0800319 EXPECT_EQ(kCompleteSession,
320 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000321
322 frame_out = DecodeCompleteFrame();
323
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000324 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100325 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000326 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000327}
328
philipel85130292016-07-06 16:10:31 +0200329TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000330 // Always start with a complete key frame.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200331 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100332 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000333 packet_->markerBit = true;
334
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000335 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800336 EXPECT_EQ(kCompleteSession,
337 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000338 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
339 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000340 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000341
342 ++seq_num_;
343 packet_->seqNum = seq_num_;
344 packet_->markerBit = false;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200345 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000346 packet_->timestamp += 33 * 90;
347
philipel9d3ab612015-12-21 04:12:39 -0800348 EXPECT_EQ(kIncomplete,
349 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000350
351 frame_out = DecodeCompleteFrame();
352
353 // Frame should not be complete.
354 EXPECT_TRUE(frame_out == NULL);
355
Niels Möllerd5e02f02019-02-20 13:12:21 +0100356 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000357 // Insert 98 frames.
358 int loop = 0;
359 do {
360 ++seq_num_;
361 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000362
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000363 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800364 EXPECT_EQ(kIncomplete,
365 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000366 loop++;
367 } while (loop < 98);
368
369 // Insert the last packet.
370 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100371 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000372 packet_->markerBit = true;
373 packet_->seqNum = seq_num_;
374
philipel9d3ab612015-12-21 04:12:39 -0800375 EXPECT_EQ(kCompleteSession,
376 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000377
378 frame_out = DecodeCompleteFrame();
379
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000380 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100381 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000382 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000383}
384
philipel85130292016-07-06 16:10:31 +0200385TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000386 // Insert the "first" packet last.
387 seq_num_ += 100;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200388 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100389 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000390 packet_->markerBit = true;
391 packet_->seqNum = seq_num_;
392 packet_->timestamp = timestamp_;
393
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000394 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800395 EXPECT_EQ(kIncomplete,
396 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000397
398 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
399
400 EXPECT_TRUE(frame_out == NULL);
401
402 // Insert 98 packets.
403 int loop = 0;
404 do {
405 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100406 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000407 packet_->markerBit = false;
408 packet_->seqNum = seq_num_;
409
philipel9d3ab612015-12-21 04:12:39 -0800410 EXPECT_EQ(kIncomplete,
411 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000412 loop++;
413 } while (loop < 98);
414
415 // Insert the last packet.
416 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100417 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000418 packet_->markerBit = false;
419 packet_->seqNum = seq_num_;
420
philipel9d3ab612015-12-21 04:12:39 -0800421 EXPECT_EQ(kCompleteSession,
422 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000423
philipel9d3ab612015-12-21 04:12:39 -0800424 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000425
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000426 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000427
Niels Möller8f7ce222019-03-21 15:43:58 +0100428 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000429 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000430}
431
philipel85130292016-07-06 16:10:31 +0200432TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200433 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100434 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000435 packet_->markerBit = false;
436
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000437 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800438 EXPECT_EQ(kIncomplete,
439 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000440
441 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
442
443 EXPECT_TRUE(frame_out == NULL);
444
445 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100446 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000447 packet_->markerBit = true;
448 packet_->seqNum = seq_num_;
449
philipel9d3ab612015-12-21 04:12:39 -0800450 EXPECT_EQ(kCompleteSession,
451 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000452
453 // check that we fail to get frame since seqnum is not continuous
454 frame_out = DecodeCompleteFrame();
455 EXPECT_TRUE(frame_out == NULL);
456
457 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800458 timestamp_ -= 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200459 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100460 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000461 packet_->markerBit = false;
462 packet_->seqNum = seq_num_;
463 packet_->timestamp = timestamp_;
464
philipel9d3ab612015-12-21 04:12:39 -0800465 EXPECT_EQ(kIncomplete,
466 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000467
468 frame_out = DecodeCompleteFrame();
469
470 // It should not be complete.
471 EXPECT_TRUE(frame_out == NULL);
472
473 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100474 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000475 packet_->markerBit = true;
476 packet_->seqNum = seq_num_;
477
philipel9d3ab612015-12-21 04:12:39 -0800478 EXPECT_EQ(kCompleteSession,
479 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000480
481 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000482 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100483 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000484 jitter_buffer_->ReleaseFrame(frame_out);
485
486 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000487 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100488 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000489 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000490}
491
philipel85130292016-07-06 16:10:31 +0200492TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller691f62c2019-04-11 15:27:17 +0200493 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +0200494 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100495 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700496 packet_->markerBit = true;
497
498 // Send in an initial good packet/frame (Frame A) to start things off.
499 bool retransmitted = false;
500 EXPECT_EQ(kCompleteSession,
501 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
502 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
503 EXPECT_TRUE(frame_out != NULL);
504 jitter_buffer_->ReleaseFrame(frame_out);
505
506 // Now send in a complete delta frame (Frame C), but with a sequence number
507 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möllerabbc50e2019-04-24 09:41:16 +0200508 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700509 // Leave a gap of 2 sequence numbers and two frames.
510 packet_->seqNum = seq_num_ + 3;
511 packet_->timestamp = timestamp_ + (66 * 90);
512 // Still isFirst = marker = true.
513 // Session should be complete (frame is complete), but there's nothing to
514 // decode yet.
515 EXPECT_EQ(kCompleteSession,
516 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
517 frame_out = DecodeCompleteFrame();
518 EXPECT_TRUE(frame_out == NULL);
519
520 // Now send in a complete delta frame (Frame B) that is continuous from A, but
521 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
522 packet_->seqNum = seq_num_ + 1;
523 packet_->timestamp = timestamp_ + (33 * 90);
524 // Still isFirst = marker = true.
525 EXPECT_EQ(kCompleteSession,
526 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
527 frame_out = DecodeCompleteFrame();
528 EXPECT_TRUE(frame_out != NULL);
529 jitter_buffer_->ReleaseFrame(frame_out);
530
531 // But Frame C isn't continuous yet.
532 frame_out = DecodeCompleteFrame();
533 EXPECT_TRUE(frame_out == NULL);
534
535 // Add in the padding. These are empty packets (data length is 0) with no
536 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100537 RTPHeader rtp_header;
538 RTPVideoHeader video_header;
539 rtp_header.sequenceNumber = seq_num_ + 2;
540 rtp_header.timestamp = timestamp_ + (33 * 90);
541 rtp_header.markerBit = false;
542 video_header.codec = kVideoCodecGeneric;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200543 video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller075e7fd2019-03-12 12:29:22 +0100544 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
Niels Möllerabbc50e2019-04-24 09:41:16 +0200545 /*ntp_time_ms=*/0);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700546 EXPECT_EQ(kOldPacket,
547 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
548 empty_packet.seqNum += 1;
549 EXPECT_EQ(kOldPacket,
550 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
551
552 // But now Frame C should be ready!
553 frame_out = DecodeCompleteFrame();
554 EXPECT_TRUE(frame_out != NULL);
555 jitter_buffer_->ReleaseFrame(frame_out);
556}
557
philipel85130292016-07-06 16:10:31 +0200558TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200559 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100560 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000561 packet_->markerBit = false;
562 packet_->seqNum = seq_num_;
563 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000564 EXPECT_EQ(0, jitter_buffer_->num_packets());
565 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000566
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000567 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800568 EXPECT_EQ(kIncomplete,
569 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000570
571 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
572
573 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000574 EXPECT_EQ(1, jitter_buffer_->num_packets());
575 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000576
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000577 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800578 EXPECT_EQ(kDuplicatePacket,
579 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000580 EXPECT_EQ(2, jitter_buffer_->num_packets());
581 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000582
583 seq_num_++;
584 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000585 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100586 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000587
philipel9d3ab612015-12-21 04:12:39 -0800588 EXPECT_EQ(kCompleteSession,
589 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000590
591 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000592 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000593 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000594
Niels Möller8f7ce222019-03-21 15:43:58 +0100595 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000596 EXPECT_EQ(3, jitter_buffer_->num_packets());
597 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000598 jitter_buffer_->ReleaseFrame(frame_out);
599}
600
philipel85130292016-07-06 16:10:31 +0200601TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200602 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100603 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000604 packet_->markerBit = true;
605 packet_->seqNum = seq_num_;
606 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000607 EXPECT_EQ(0, jitter_buffer_->num_packets());
608 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
609
610 bool retransmitted = false;
611 // Insert first complete frame.
612 EXPECT_EQ(kCompleteSession,
613 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
614
615 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
616 ASSERT_TRUE(frame_out != NULL);
617 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100618 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000619 jitter_buffer_->ReleaseFrame(frame_out);
620
621 // Insert 3 delta frames.
622 for (uint16_t i = 1; i <= 3; ++i) {
623 packet_->seqNum = seq_num_ + i;
624 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200625 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000626 EXPECT_EQ(kCompleteSession,
627 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
628 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
629 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
630 }
631
632 // Retransmit second delta frame.
633 packet_->seqNum = seq_num_ + 2;
634 packet_->timestamp = timestamp_ + 66 * 90;
635
636 EXPECT_EQ(kDuplicatePacket,
637 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
638
639 EXPECT_EQ(5, jitter_buffer_->num_packets());
640 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
641
642 // Should be able to decode 3 delta frames, key frame already decoded.
643 for (size_t i = 0; i < 3; ++i) {
644 frame_out = DecodeCompleteFrame();
645 ASSERT_TRUE(frame_out != NULL);
646 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100647 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000648 jitter_buffer_->ReleaseFrame(frame_out);
649 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000650}
651
philipel85130292016-07-06 16:10:31 +0200652TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700653 // Verify that JB skips forward to next base layer frame.
654 // -------------------------------------------------
655 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
656 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
657 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
658 // | ss | x | x | x | |
659 // -------------------------------------------------
660 // |<----------tl0idx:200--------->|<---tl0idx:201---
661
Niels Möller691f62c2019-04-11 15:27:17 +0200662 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
philipel29d88462018-08-08 14:26:00 +0200663 auto& vp9_header =
664 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
665
asapersson9a4cd872015-10-23 00:27:14 -0700666 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200667 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100668 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700669 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200670 vp9_header.flexible_mode = false;
671 vp9_header.spatial_idx = 0;
672 vp9_header.beginning_of_frame = true;
673 vp9_header.end_of_frame = true;
674 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700675
676 packet_->seqNum = 65485;
677 packet_->timestamp = 1000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200678 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200679 vp9_header.picture_id = 5;
680 vp9_header.tl0_pic_idx = 200;
681 vp9_header.temporal_idx = 0;
682 vp9_header.ss_data_available = true;
683 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700684 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
685 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
686
687 // Insert next temporal layer 0.
688 packet_->seqNum = 65489;
689 packet_->timestamp = 13000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200690 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200691 vp9_header.picture_id = 9;
692 vp9_header.tl0_pic_idx = 201;
693 vp9_header.temporal_idx = 0;
694 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700695 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
696
697 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200698 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100699 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700700 jitter_buffer_->ReleaseFrame(frame_out);
701
702 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200703 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100704 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700705 jitter_buffer_->ReleaseFrame(frame_out);
706}
707
philipel85130292016-07-06 16:10:31 +0200708TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700709 // Verify that frames are updated with SS data when SS packet is reordered.
710 // --------------------------------
711 // | 65486 | 65487 | 65485 |...
712 // | pid:6 | pid:7 | pid:5 |...
713 // | tid:2 | tid:1 | tid:0 |...
714 // | | | ss |
715 // --------------------------------
716 // |<--------tl0idx:200--------->|
717
philipel29d88462018-08-08 14:26:00 +0200718 auto& vp9_header =
719 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
720
asapersson9a4cd872015-10-23 00:27:14 -0700721 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200722 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100723 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700724 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200725 vp9_header.flexible_mode = false;
726 vp9_header.spatial_idx = 0;
727 vp9_header.beginning_of_frame = true;
728 vp9_header.end_of_frame = true;
729 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700730
731 packet_->seqNum = 65486;
732 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200733 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200734 vp9_header.picture_id = 6;
735 vp9_header.temporal_idx = 2;
736 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700737 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
738
739 packet_->seqNum = 65487;
740 packet_->timestamp = 9000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200741 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200742 vp9_header.picture_id = 7;
743 vp9_header.temporal_idx = 1;
744 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700745 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
746
747 // Insert first frame with SS data.
748 packet_->seqNum = 65485;
749 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200750 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100751 packet_->video_header.width = 352;
752 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200753 vp9_header.picture_id = 5;
754 vp9_header.temporal_idx = 0;
755 vp9_header.temporal_up_switch = false;
756 vp9_header.ss_data_available = true;
757 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700758 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
759 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
760
761 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200762 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100763 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700764 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
765 EXPECT_FALSE(
766 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
767 jitter_buffer_->ReleaseFrame(frame_out);
768
769 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200770 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100771 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700772 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
773 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
774 jitter_buffer_->ReleaseFrame(frame_out);
775
776 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200777 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100778 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700779 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
780 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
781 jitter_buffer_->ReleaseFrame(frame_out);
782}
783
philipel85130292016-07-06 16:10:31 +0200784TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700785 // Verify that frames are updated with SS data when SS packet is reordered.
786 // -----------------------------------------
787 // | 65486 | 65487 | 65485 | 65484 |...
788 // | pid:6 | pid:6 | pid:5 | pid:5 |...
789 // | tid:1 | tid:1 | tid:0 | tid:0 |...
790 // | sid:0 | sid:1 | sid:1 | sid:0 |...
791 // | t:6000 | t:6000 | t:3000 | t:3000 |
792 // | | | | ss |
793 // -----------------------------------------
794 // |<-----------tl0idx:200------------>|
795
philipel29d88462018-08-08 14:26:00 +0200796 auto& vp9_header =
797 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
798
asapersson9a4cd872015-10-23 00:27:14 -0700799 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200800 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200801 vp9_header.flexible_mode = false;
802 vp9_header.beginning_of_frame = true;
803 vp9_header.end_of_frame = true;
804 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700805
Niels Möllerd5e02f02019-02-20 13:12:21 +0100806 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700807 packet_->markerBit = false;
808 packet_->seqNum = 65486;
809 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200810 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200811 vp9_header.spatial_idx = 0;
812 vp9_header.picture_id = 6;
813 vp9_header.temporal_idx = 1;
814 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700815 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
816
Niels Möllerd5e02f02019-02-20 13:12:21 +0100817 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700818 packet_->markerBit = true;
819 packet_->seqNum = 65487;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200820 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200821 vp9_header.spatial_idx = 1;
822 vp9_header.picture_id = 6;
823 vp9_header.temporal_idx = 1;
824 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700825 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
826
Niels Möllerd5e02f02019-02-20 13:12:21 +0100827 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700828 packet_->markerBit = true;
829 packet_->seqNum = 65485;
830 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200831 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200832 vp9_header.spatial_idx = 1;
833 vp9_header.picture_id = 5;
834 vp9_header.temporal_idx = 0;
835 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700836 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
837
838 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100839 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700840 packet_->markerBit = false;
841 packet_->seqNum = 65484;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200842 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100843 packet_->video_header.width = 352;
844 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200845 vp9_header.spatial_idx = 0;
846 vp9_header.picture_id = 5;
847 vp9_header.temporal_idx = 0;
848 vp9_header.temporal_up_switch = false;
849 vp9_header.ss_data_available = true;
850 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700851 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
852 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
853
854 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200855 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100856 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700857 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
858 EXPECT_FALSE(
859 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
860 jitter_buffer_->ReleaseFrame(frame_out);
861
862 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200863 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100864 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700865 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
866 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
867 jitter_buffer_->ReleaseFrame(frame_out);
868}
869
philipel85130292016-07-06 16:10:31 +0200870TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200871 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100872 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000873 packet_->markerBit = false;
874 packet_->seqNum = seq_num_;
875 packet_->timestamp = timestamp_;
876 packet_->insertStartCode = true;
877
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000878 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800879 EXPECT_EQ(kIncomplete,
880 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000881
882 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
883
884 // Frame should not be complete.
885 EXPECT_TRUE(frame_out == NULL);
886
887 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100888 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000889 packet_->markerBit = true;
890 packet_->seqNum = seq_num_;
891
philipel9d3ab612015-12-21 04:12:39 -0800892 EXPECT_EQ(kCompleteSession,
893 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000894
895 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000896 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +0100897 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000898 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000899}
900
stefana669a3a2016-10-06 05:04:52 -0700901TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +0200902 auto& h264_header =
903 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -0700904 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200905 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100906 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700907 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200908 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200909 h264_header.nalu_type = H264::NaluType::kIdr;
910 h264_header.nalus[0].type = H264::NaluType::kIdr;
911 h264_header.nalus[0].sps_id = -1;
912 h264_header.nalus[0].pps_id = 0;
913 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700914 bool retransmitted = false;
915 EXPECT_EQ(kCompleteSession,
916 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
917 // Not decodable since sps and pps are missing.
918 EXPECT_EQ(nullptr, DecodeCompleteFrame());
919
920 timestamp_ += 3000;
921 packet_->timestamp = timestamp_;
922 ++seq_num_;
923 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200924 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100925 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700926 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200927 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200928 h264_header.nalu_type = H264::NaluType::kStapA;
929 h264_header.nalus[0].type = H264::NaluType::kSps;
930 h264_header.nalus[0].sps_id = 0;
931 h264_header.nalus[0].pps_id = -1;
932 h264_header.nalus[1].type = H264::NaluType::kPps;
933 h264_header.nalus[1].sps_id = 0;
934 h264_header.nalus[1].pps_id = 0;
935 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -0700936 // Not complete since the marker bit hasn't been received.
937 EXPECT_EQ(kIncomplete,
938 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
939
940 ++seq_num_;
941 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200942 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100943 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -0700944 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200945 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200946 h264_header.nalu_type = H264::NaluType::kIdr;
947 h264_header.nalus[0].type = H264::NaluType::kIdr;
948 h264_header.nalus[0].sps_id = -1;
949 h264_header.nalus[0].pps_id = 0;
950 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700951 // Complete and decodable since the pps and sps are received in the first
952 // packet of this frame.
953 EXPECT_EQ(kCompleteSession,
954 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
955 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
956 ASSERT_NE(nullptr, frame_out);
957 jitter_buffer_->ReleaseFrame(frame_out);
958
959 timestamp_ += 3000;
960 packet_->timestamp = timestamp_;
961 ++seq_num_;
962 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200963 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100964 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700965 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200966 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200967 h264_header.nalu_type = H264::NaluType::kSlice;
968 h264_header.nalus[0].type = H264::NaluType::kSlice;
969 h264_header.nalus[0].sps_id = -1;
970 h264_header.nalus[0].pps_id = 0;
971 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700972 // Complete and decodable since sps, pps and key frame has been received.
973 EXPECT_EQ(kCompleteSession,
974 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
975 frame_out = DecodeCompleteFrame();
976 ASSERT_NE(nullptr, frame_out);
977 jitter_buffer_->ReleaseFrame(frame_out);
978}
979
philipel85130292016-07-06 16:10:31 +0200980TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000981 seq_num_ = 0xfff0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200982 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100983 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000984 packet_->markerBit = false;
985 packet_->seqNum = seq_num_;
986 packet_->timestamp = timestamp_;
987
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000988 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800989 EXPECT_EQ(kIncomplete,
990 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000991
992 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
993
994 EXPECT_TRUE(frame_out == NULL);
995
996 int loop = 0;
997 do {
998 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100999 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001000 packet_->markerBit = false;
1001 packet_->seqNum = seq_num_;
1002
philipel9d3ab612015-12-21 04:12:39 -08001003 EXPECT_EQ(kIncomplete,
1004 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001005
1006 frame_out = DecodeCompleteFrame();
1007
1008 EXPECT_TRUE(frame_out == NULL);
1009
1010 loop++;
1011 } while (loop < 98);
1012
1013 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001014 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001015 packet_->markerBit = true;
1016 packet_->seqNum = seq_num_;
1017
philipel9d3ab612015-12-21 04:12:39 -08001018 EXPECT_EQ(kCompleteSession,
1019 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001020
1021 frame_out = DecodeCompleteFrame();
1022
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001023 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001024
Niels Möller8f7ce222019-03-21 15:43:58 +01001025 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001026 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001027}
1028
philipel85130292016-07-06 16:10:31 +02001029TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001030 // Insert "first" packet last seqnum.
1031 seq_num_ = 10;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001032 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001033 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001034 packet_->markerBit = true;
1035 packet_->seqNum = seq_num_;
1036
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001037 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001038 EXPECT_EQ(kIncomplete,
1039 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001040 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1041
1042 // Should not be complete.
1043 EXPECT_TRUE(frame_out == NULL);
1044
1045 // Insert 98 frames.
1046 int loop = 0;
1047 do {
1048 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001049 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001050 packet_->markerBit = false;
1051 packet_->seqNum = seq_num_;
1052
philipel9d3ab612015-12-21 04:12:39 -08001053 EXPECT_EQ(kIncomplete,
1054 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001055
1056 frame_out = DecodeCompleteFrame();
1057
1058 EXPECT_TRUE(frame_out == NULL);
1059
1060 loop++;
1061 } while (loop < 98);
1062
1063 // Insert last packet.
1064 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001065 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001066 packet_->markerBit = false;
1067 packet_->seqNum = seq_num_;
1068
philipel9d3ab612015-12-21 04:12:39 -08001069 EXPECT_EQ(kCompleteSession,
1070 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001071
1072 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001073 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001074 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001075 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001076}
1077
philipel85130292016-07-06 16:10:31 +02001078TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001079 // ------- -------
1080 // | 2 | | 1 |
1081 // ------- -------
1082 // t = 3000 t = 2000
1083 seq_num_ = 2;
1084 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001085 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001086 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001087 packet_->markerBit = true;
1088 packet_->timestamp = timestamp_;
1089 packet_->seqNum = seq_num_;
1090
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001091 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001092 EXPECT_EQ(kCompleteSession,
1093 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001094
1095 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001096 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001097 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001098 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001099 jitter_buffer_->ReleaseFrame(frame_out);
1100
1101 seq_num_--;
1102 timestamp_ = 2000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001103 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001104 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001105 packet_->markerBit = true;
1106 packet_->seqNum = seq_num_;
1107 packet_->timestamp = timestamp_;
1108
philipel9d3ab612015-12-21 04:12:39 -08001109 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001110}
1111
philipel85130292016-07-06 16:10:31 +02001112TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001113 // ------- -------
1114 // | 2 | | 1 |
1115 // ------- -------
1116 // t = 3000 t = 0xffffff00
1117
1118 seq_num_ = 2;
1119 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001120 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001121 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001122 packet_->markerBit = true;
1123 packet_->seqNum = seq_num_;
1124 packet_->timestamp = timestamp_;
1125
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001126 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001127 EXPECT_EQ(kCompleteSession,
1128 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001129
1130 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001131 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001132
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001133 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001134
Niels Möller8f7ce222019-03-21 15:43:58 +01001135 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001136
1137 jitter_buffer_->ReleaseFrame(frame_out);
1138
1139 seq_num_--;
1140 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001141 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001142 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001143 packet_->markerBit = true;
1144 packet_->seqNum = seq_num_;
1145 packet_->timestamp = timestamp_;
1146
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001147 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001148 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001149}
1150
philipel85130292016-07-06 16:10:31 +02001151TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001152 // --------------- ---------------
1153 // | 1 | 2 | | 3 | 4 |
1154 // --------------- ---------------
1155 // t = 0xffffff00 t = 33*90
1156
1157 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001158 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001159 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001160 packet_->markerBit = false;
1161 packet_->seqNum = seq_num_;
1162 packet_->timestamp = timestamp_;
1163
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001164 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001165 EXPECT_EQ(kIncomplete,
1166 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001167
1168 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001169 EXPECT_TRUE(frame_out == NULL);
1170
1171 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001172 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001173 packet_->markerBit = true;
1174 packet_->seqNum = seq_num_;
1175
philipel9d3ab612015-12-21 04:12:39 -08001176 EXPECT_EQ(kCompleteSession,
1177 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001178
1179 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001180 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001181 jitter_buffer_->ReleaseFrame(frame_out);
1182
1183 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001184 timestamp_ += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001185 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001186 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001187 packet_->markerBit = false;
1188 packet_->seqNum = seq_num_;
1189 packet_->timestamp = timestamp_;
1190
philipel9d3ab612015-12-21 04:12:39 -08001191 EXPECT_EQ(kIncomplete,
1192 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001193
1194 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001195 EXPECT_TRUE(frame_out == NULL);
1196
1197 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001198 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001199 packet_->markerBit = true;
1200 packet_->seqNum = seq_num_;
1201
philipel9d3ab612015-12-21 04:12:39 -08001202 EXPECT_EQ(kCompleteSession,
1203 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001204
1205 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001206 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001207 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001208 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001209}
1210
philipel85130292016-07-06 16:10:31 +02001211TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001212 // ------- -------
1213 // | 1 | | 2 |
1214 // ------- -------
1215 // t = 0xffffff00 t = 2700
1216
1217 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001218 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001219 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001220 packet_->markerBit = true;
1221 packet_->timestamp = timestamp_;
1222
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001223 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001224 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001225 EXPECT_EQ(kCompleteSession,
1226 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001227
1228 // Insert next frame.
1229 seq_num_++;
1230 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001231 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001232 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001233 packet_->markerBit = true;
1234 packet_->seqNum = seq_num_;
1235 packet_->timestamp = timestamp_;
1236
philipel9d3ab612015-12-21 04:12:39 -08001237 EXPECT_EQ(kCompleteSession,
1238 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001239
1240 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001241 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001242 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001243 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001244 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001245
1246 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001247 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001248 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001249 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001250 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001251}
1252
philipel85130292016-07-06 16:10:31 +02001253TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001254 // ------- -------
1255 // | 2 | | 1 |
1256 // ------- -------
1257 // t = 2700 t = 0xffffff00
1258
1259 seq_num_ = 2;
1260 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001261 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001262 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001263 packet_->markerBit = true;
1264 packet_->seqNum = seq_num_;
1265 packet_->timestamp = timestamp_;
1266
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001267 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001268 EXPECT_EQ(kCompleteSession,
1269 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001270
1271 // Insert second frame
1272 seq_num_--;
1273 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001274 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001275 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001276 packet_->markerBit = true;
1277 packet_->seqNum = seq_num_;
1278 packet_->timestamp = timestamp_;
1279
philipel9d3ab612015-12-21 04:12:39 -08001280 EXPECT_EQ(kCompleteSession,
1281 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001282
1283 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001284 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001285 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001286 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001287 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001288
1289 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001290 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001291 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001292 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001293 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001294}
1295
philipel85130292016-07-06 16:10:31 +02001296TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001297 int loop = 0;
1298 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001299 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001300 // Insert kMaxPacketsInJitterBuffer into frame.
1301 do {
1302 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001303 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001304 packet_->markerBit = false;
1305 packet_->seqNum = seq_num_;
1306
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001307 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001308 EXPECT_EQ(kIncomplete,
1309 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001310 firstPacket = false;
1311 } else {
philipel9d3ab612015-12-21 04:12:39 -08001312 EXPECT_EQ(kIncomplete,
1313 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001314 }
1315
1316 loop++;
1317 } while (loop < kMaxPacketsInSession);
1318
1319 // Max number of packets inserted.
1320 // Insert one more packet.
1321 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001322 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001323 packet_->markerBit = true;
1324 packet_->seqNum = seq_num_;
1325
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001326 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001327 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001328 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001329}
1330
philipel85130292016-07-06 16:10:31 +02001331TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001332 // TEST fill JB with more than max number of frame (50 delta frames +
1333 // 51 key frames) with wrap in seq_num_
1334 //
1335 // --------------------------------------------------------------
1336 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1337 // --------------------------------------------------------------
1338 // |<-----------delta frames------------->|<------key frames----->|
1339
jbauchdb81ffd2015-11-23 03:59:02 -08001340 // Make sure the jitter doesn't request a keyframe after too much non-
1341 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001342 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001343
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001344 int loop = 0;
1345 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001346 uint32_t first_key_frame_timestamp = 0;
1347 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001348 // Insert MAX_NUMBER_OF_FRAMES frames.
1349 do {
philipel9d3ab612015-12-21 04:12:39 -08001350 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001351 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001352 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001353 packet_->markerBit = true;
1354 packet_->seqNum = seq_num_;
1355 packet_->timestamp = timestamp_;
1356
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001357 if (loop == 50) {
1358 first_key_frame_timestamp = packet_->timestamp;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001359 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001360 }
1361
1362 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001363 EXPECT_EQ(kCompleteSession,
1364 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001365
1366 loop++;
1367 } while (loop < kMaxNumberOfFrames);
1368
1369 // Max number of frames inserted.
1370
1371 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001372 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001373 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001374 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001375 packet_->markerBit = true;
1376 packet_->seqNum = seq_num_;
1377 packet_->timestamp = timestamp_;
1378
1379 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001380 EXPECT_EQ(kFlushIndicator,
1381 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001382
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001383 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001384 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001385 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001386 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001387 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001388}
1389
philipel85130292016-07-06 16:10:31 +02001390TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001391 seq_num_ = 3;
1392 // Insert one empty packet per frame, should never return the last timestamp
1393 // inserted. Only return empty frames in the presence of subsequent frames.
1394 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001395 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001396 for (int i = 0; i < maxSize + 10; i++) {
1397 timestamp_ += 33 * 90;
1398 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001399 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001400 packet_->markerBit = false;
1401 packet_->seqNum = seq_num_;
1402 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001403 packet_->video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001404
philipel9d3ab612015-12-21 04:12:39 -08001405 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001406 }
1407}
1408
philipel85130292016-07-06 16:10:31 +02001409TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001410 // Test that a we cannot get incomplete frames from the JB if we haven't
1411 // received the marker bit, unless we have received a packet from a later
1412 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001413 // Start with a complete key frame - insert and decode.
Niels Möller691f62c2019-04-11 15:27:17 +02001414 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +02001415 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001416 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001417 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001418 bool retransmitted = false;
1419
philipel9d3ab612015-12-21 04:12:39 -08001420 EXPECT_EQ(kCompleteSession,
1421 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001422 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1423 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001424 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001425
1426 packet_->seqNum += 2;
1427 packet_->timestamp += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001428 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001429 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001430 packet_->markerBit = false;
1431
Niels Möller375b3462019-01-10 15:35:56 +01001432 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001433 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001434
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001435 packet_->seqNum += 2;
1436 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001437 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001438
Niels Möller375b3462019-01-10 15:35:56 +01001439 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001440 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001441}
1442
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001443TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001444 // Make sure the jitter doesn't request a keyframe after too much non-
1445 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001446 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001447 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001448 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001449 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001450 DropFrame(1);
1451 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001452 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1453 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001454 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001455 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001456 // This frame will make the jitter buffer recycle frames until a key frame.
1457 // Since none is found it will have to wait until the next key frame before
1458 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001459 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001460 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001461}
1462
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001463TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001464 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001465 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001466 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001467 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001468 // Insert empty packet.
1469 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001470 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001471 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001472 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001473 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001474 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001475 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001476 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001477 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001478 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001479 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001480 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001481}
1482
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001483TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1484 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001485 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001486 // Can't decode without a key frame.
1487 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001488 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001489 // Skip to the next key frame.
1490 EXPECT_TRUE(DecodeCompleteFrame());
1491}
1492
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001493TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001494 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001495 EXPECT_TRUE(DecodeCompleteFrame());
1496 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001497 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1498 kNoError);
1499 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001500 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1501 EXPECT_TRUE(DecodeCompleteFrame());
1502 }
1503}
1504
1505TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001506 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001507 EXPECT_TRUE(DecodeCompleteFrame());
1508 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001509 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1510 kNoError);
1511 InsertFrame(VideoFrameType::kVideoFrameKey);
1512 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1513 kNoError);
1514 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001515 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1516 EXPECT_TRUE(DecodeCompleteFrame());
1517 }
1518}
1519
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001520TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001521 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001522 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001523 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001524 clock_->TimeInMilliseconds());
1525 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001526 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001527 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001528 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001529 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1530 EXPECT_FALSE(DecodeCompleteFrame());
1531 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1532 EXPECT_TRUE(DecodeCompleteFrame());
1533 EXPECT_TRUE(DecodeCompleteFrame());
1534}
1535
philipel85130292016-07-06 16:10:31 +02001536TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001537 // Make sure empty packets doesn't clog the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001538 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1539 kNoError);
1540 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001541 EXPECT_TRUE(DecodeCompleteFrame());
1542}
1543
philipel85130292016-07-06 16:10:31 +02001544TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001545 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001546 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001547 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001548
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001549 // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
1550 // old packet.
1551 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001552 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001553 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1554 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001555 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001556
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001557 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001558 std::vector<uint16_t> nack_list =
1559 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001560 // No key frame will be requested since the jitter buffer is empty.
1561 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001562 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001563
Niels Möller8f7ce222019-03-21 15:43:58 +01001564 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001565 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001566 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001567
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001568 // The next complete continuous frame isn't a key frame, but we're waiting
1569 // for one.
1570 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001571 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001572 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001573 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001574}
1575
philipel85130292016-07-06 16:10:31 +02001576TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001577 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001578 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001579 EXPECT_TRUE(DecodeCompleteFrame());
1580
1581 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001582 EXPECT_GE(
1583 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1584 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001585
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001586 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001587 std::vector<uint16_t> nack_list =
1588 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001589 // Verify that the jitter buffer does not request a key frame.
1590 EXPECT_FALSE(request_key_frame);
1591 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001592 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001593 // Verify that we can decode the next frame.
1594 EXPECT_TRUE(DecodeCompleteFrame());
1595}
1596
philipel85130292016-07-06 16:10:31 +02001597TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001598 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001599 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001600 EXPECT_TRUE(DecodeCompleteFrame());
1601
1602 // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001603 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001604 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001605 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001606 EXPECT_FALSE(DecodeCompleteFrame());
1607
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001608 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001609 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001610 // The jitter buffer is empty, so we won't request key frames until we get a
1611 // packet.
1612 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001613
Niels Möller8f7ce222019-03-21 15:43:58 +01001614 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001615 // Now we have a packet in the jitter buffer, a key frame will be requested
1616 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001617 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001618 // The jitter buffer is empty, so we won't request key frames until we get a
1619 // packet.
1620 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001621 // The next complete continuous frame isn't a key frame, but we're waiting
1622 // for one.
1623 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001624 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001625 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001626 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001627}
1628
philipel85130292016-07-06 16:10:31 +02001629TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001630 DropFrame(10);
1631 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001632 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001633 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001634 std::vector<uint16_t> nack_list =
1635 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001636 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001637 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001638 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001639}
1640
philipel85130292016-07-06 16:10:31 +02001641TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001642 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001643 InsertFrame(VideoFrameType::kVideoFrameKey);
1644 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001645 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001646 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001647 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001648 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001649 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001650 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001651 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001652}
1653
philipel85130292016-07-06 16:10:31 +02001654TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001655 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001656 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001657 clock_->TimeInMilliseconds());
1658 VCMPacket packet;
1659 stream_generator_->PopPacket(&packet, 0);
1660 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001661 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001662 EXPECT_FALSE(retransmitted);
1663 // Drop second packet.
1664 stream_generator_->PopPacket(&packet, 1);
1665 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1666 EXPECT_FALSE(retransmitted);
1667 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001668 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001669 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001670 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001671 EXPECT_EQ(1u, nack_list.size());
1672 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001673 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001674 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001675 EXPECT_EQ(kCompleteSession,
1676 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001677 EXPECT_TRUE(retransmitted);
1678 EXPECT_TRUE(DecodeCompleteFrame());
1679}
1680
philipel85130292016-07-06 16:10:31 +02001681TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001682 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001683 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001684 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001685 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001686 // Drop second packet.
1687 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1688 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001689 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001690 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001691 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001692 ASSERT_EQ(1u, nack_list.size());
1693 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001694 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001695 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001696 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001697}
1698
philipel85130292016-07-06 16:10:31 +02001699TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001700 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001701 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001702 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001703 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001704 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001705 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001706 // Drop second packet in frame.
1707 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1708 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1709 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001710 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001711 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001712 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001713 // Drop second packet in frame.
1714 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1715 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001716 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001717 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001718 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001719 ASSERT_EQ(1u, nack_list.size());
1720 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001721 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001722 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001723}
1724
philipel85130292016-07-06 16:10:31 +02001725TEST_F(TestJitterBufferNack, NormalOperation) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001726 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001727 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001728
1729 // ----------------------------------------------------------------
1730 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1731 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001732 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001733 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001734 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001735 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001736 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001737 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001738 while (stream_generator_->PacketsRemaining() > 1) {
1739 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001740 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001741 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001742 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001743 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001744 }
Niels Möller375b3462019-01-10 15:35:56 +01001745 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001746 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001747 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001748 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001749
1750 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001751 std::vector<uint16_t> nack_list =
1752 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001753 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001754 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001755 for (size_t i = 0; i < nack_list.size(); ++i)
1756 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001757}
1758
philipel85130292016-07-06 16:10:31 +02001759TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001760 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001761 // ------- ------------------------------------------------------------
1762 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1763 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001764 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001765 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001766 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001767 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001768 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001769 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001770 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001771 while (stream_generator_->PacketsRemaining() > 1) {
1772 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001773 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001774 EXPECT_FALSE(request_key_frame);
1775 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001776 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001777 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001778 }
1779 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001780 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001781 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001782 EXPECT_FALSE(DecodeCompleteFrame());
1783 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001784 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001785 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001786 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001787 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001788 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1789 for (size_t i = 0; i < nack_list.size(); ++i)
1790 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001791}
1792
philipel85130292016-07-06 16:10:31 +02001793TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001794 bool request_key_frame = false;
1795 // -----------------------------------
1796 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1797 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001798 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001799 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001800 EXPECT_FALSE(request_key_frame);
1801 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001802 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001803 clock_->TimeInMilliseconds());
1804 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1805 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001806 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001807 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001808 EXPECT_FALSE(request_key_frame);
1809 } else {
1810 stream_generator_->NextPacket(NULL); // Drop packet
1811 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001812 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001813 clock_->TimeInMilliseconds());
1814 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1815 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001816 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001817 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001818 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001819 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001820 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001821 ASSERT_EQ(1u, nack_list.size());
1822 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001823}
1824
philipel85130292016-07-06 16:10:31 +02001825TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001826 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001827 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001828 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001829 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001830 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1831 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001832
1833 // Far-into-the-future video frame, could be caused by resetting the encoder
1834 // or otherwise restarting. This should not fail when error when the packet is
1835 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001836 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001837 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001838 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001839 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001840 nack_list = jitter_buffer_->GetNackList(&extended);
1841 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001842
1843 // Stream should be decodable from this point.
1844 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001845 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001846 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001847 nack_list = jitter_buffer_->GetNackList(&extended);
1848 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001849}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001850} // namespace webrtc