blob: 801eeb6754b44c6d5d7294c5157f45726077d4f3 [file] [log] [blame]
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/video_coding/jitter_buffer.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000012
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000013#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
Jonas Olssona4d87372019-07-05 19:08:33 +020015#include <string>
stefana669a3a2016-10-06 05:04:52 -070016#include <vector>
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +000017
Niels Möllerdb64d992019-03-29 14:30:53 +010018#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "common_video/h264/h264_common.h"
20#include "modules/video_coding/frame_buffer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/video_coding/media_opt_util.h"
22#include "modules/video_coding/packet.h"
23#include "modules/video_coding/test/stream_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/location.h"
25#include "system_wrappers/include/clock.h"
26#include "system_wrappers/include/field_trial.h"
27#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/field_trial.h"
29#include "test/gmock.h"
30#include "test/gtest.h"
stefan@webrtc.orgad4af572012-01-12 15:16:49 +000031
32namespace webrtc {
33
Niels Möllerdb64d992019-03-29 14:30:53 +010034class TestBasicJitterBuffer : public ::testing::Test {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000035 protected:
philipel85130292016-07-06 16:10:31 +020036 TestBasicJitterBuffer() {}
nisseef8b61e2016-04-29 06:09:15 -070037 void SetUp() override {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000038 clock_.reset(new SimulatedClock(0));
Qiang Chend4cec152015-06-19 09:17:00 -070039 jitter_buffer_.reset(new VCMJitterBuffer(
Niels Möllerdb64d992019-03-29 14:30:53 +010040 clock_.get(), absl::WrapUnique(EventWrapper::Create())));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +000041 jitter_buffer_->Start();
42 seq_num_ = 1234;
43 timestamp_ = 0;
44 size_ = 1400;
45 // Data vector - 0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
46 data_[0] = 0;
47 data_[1] = 0;
48 data_[2] = 0x80;
49 int count = 3;
50 for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
51 data_[i] = count;
52 count++;
53 if (count == 10) {
54 data_[i + 1] = 0;
55 data_[i + 2] = 0;
56 data_[i + 3] = 0x80;
57 count = 3;
58 i += 3;
59 }
60 }
Niels Möller075e7fd2019-03-12 12:29:22 +010061 RTPHeader rtp_header;
62 RTPVideoHeader video_header;
63 rtp_header.sequenceNumber = seq_num_;
64 rtp_header.timestamp = timestamp_;
65 rtp_header.markerBit = true;
66 video_header.codec = kVideoCodecGeneric;
67 video_header.is_first_packet_in_frame = true;
Niels Möllerabbc50e2019-04-24 09:41:16 +020068 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möller075e7fd2019-03-12 12:29:22 +010069 packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header,
Johannes Kronf7de74c2021-04-30 13:10:56 +020070 /*ntp_time_ms=*/0, clock_->CurrentTime()));
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() {}
Jonas Olssona4d87372019-07-05 19:08:33 +0200226 virtual void SetUp() { TestRunningJitterBuffer::SetUp(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000227
philipel9d3ab612015-12-21 04:12:39 -0800228 virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +0000229};
230
philipel85130292016-07-06 16:10:31 +0200231TEST_F(TestBasicJitterBuffer, StopRunning) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000232 jitter_buffer_->Stop();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000233 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000234 jitter_buffer_->Start();
agalusza@google.comd177c102013-08-08 01:12:33 +0000235
236 // No packets inserted.
237 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000238}
239
philipel85130292016-07-06 16:10:31 +0200240TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000241 // Always start with a complete key frame when not allowing errors.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200242 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100243 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000244 packet_->markerBit = true;
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000245 packet_->timestamp += 123 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000246
247 // Insert the packet to the jitter buffer and get a frame.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000248 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800249 EXPECT_EQ(kCompleteSession,
250 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000251 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000252 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100253 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000254 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000255}
256
philipel85130292016-07-06 16:10:31 +0200257TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200258 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100259 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000260 packet_->markerBit = false;
261
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000262 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800263 EXPECT_EQ(kIncomplete,
264 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000265 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
266 // Should not be complete.
267 EXPECT_TRUE(frame_out == NULL);
268
269 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100270 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000271 packet_->markerBit = true;
272 packet_->seqNum = seq_num_;
273
philipel9d3ab612015-12-21 04:12:39 -0800274 EXPECT_EQ(kCompleteSession,
275 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000276
277 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000278 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000279
Niels Möller8f7ce222019-03-21 15:43:58 +0100280 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000281 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000282}
283
philipel85130292016-07-06 16:10:31 +0200284TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200285 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100286 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000287 packet_->markerBit = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000288
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000289 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800290 EXPECT_EQ(kIncomplete,
291 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000292
293 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
294
295 // Frame should not be complete.
296 EXPECT_TRUE(frame_out == NULL);
297
298 // Insert 98 frames.
299 int loop = 0;
300 do {
301 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100302 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000303 packet_->markerBit = false;
304 packet_->seqNum = seq_num_;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000305
philipel9d3ab612015-12-21 04:12:39 -0800306 EXPECT_EQ(kIncomplete,
307 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000308 loop++;
309 } while (loop < 98);
310
311 // Insert last packet.
312 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100313 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000314 packet_->markerBit = true;
315 packet_->seqNum = seq_num_;
316
philipel9d3ab612015-12-21 04:12:39 -0800317 EXPECT_EQ(kCompleteSession,
318 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000319
320 frame_out = DecodeCompleteFrame();
321
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000322 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100323 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000324 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000325}
326
philipel85130292016-07-06 16:10:31 +0200327TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000328 // Always start with a complete key frame.
Niels Möllerabbc50e2019-04-24 09:41:16 +0200329 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100330 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000331 packet_->markerBit = true;
332
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000333 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800334 EXPECT_EQ(kCompleteSession,
335 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000336 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
337 EXPECT_FALSE(frame_out == NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000338 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000339
340 ++seq_num_;
341 packet_->seqNum = seq_num_;
342 packet_->markerBit = false;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200343 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000344 packet_->timestamp += 33 * 90;
345
philipel9d3ab612015-12-21 04:12:39 -0800346 EXPECT_EQ(kIncomplete,
347 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000348
349 frame_out = DecodeCompleteFrame();
350
351 // Frame should not be complete.
352 EXPECT_TRUE(frame_out == NULL);
353
Niels Möllerd5e02f02019-02-20 13:12:21 +0100354 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000355 // Insert 98 frames.
356 int loop = 0;
357 do {
358 ++seq_num_;
359 packet_->seqNum = seq_num_;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000360
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000361 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800362 EXPECT_EQ(kIncomplete,
363 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000364 loop++;
365 } while (loop < 98);
366
367 // Insert the last packet.
368 ++seq_num_;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100369 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000370 packet_->markerBit = true;
371 packet_->seqNum = seq_num_;
372
philipel9d3ab612015-12-21 04:12:39 -0800373 EXPECT_EQ(kCompleteSession,
374 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000375
376 frame_out = DecodeCompleteFrame();
377
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000378 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100379 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000380 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000381}
382
philipel85130292016-07-06 16:10:31 +0200383TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000384 // Insert the "first" packet last.
385 seq_num_ += 100;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200386 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100387 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000388 packet_->markerBit = true;
389 packet_->seqNum = seq_num_;
390 packet_->timestamp = timestamp_;
391
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000392 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800393 EXPECT_EQ(kIncomplete,
394 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000395
396 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
397
398 EXPECT_TRUE(frame_out == NULL);
399
400 // Insert 98 packets.
401 int loop = 0;
402 do {
403 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100404 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000405 packet_->markerBit = false;
406 packet_->seqNum = seq_num_;
407
philipel9d3ab612015-12-21 04:12:39 -0800408 EXPECT_EQ(kIncomplete,
409 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000410 loop++;
411 } while (loop < 98);
412
413 // Insert the last packet.
414 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100415 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000416 packet_->markerBit = false;
417 packet_->seqNum = seq_num_;
418
philipel9d3ab612015-12-21 04:12:39 -0800419 EXPECT_EQ(kCompleteSession,
420 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000421
philipel9d3ab612015-12-21 04:12:39 -0800422 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000423
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000424 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000425
Niels Möller8f7ce222019-03-21 15:43:58 +0100426 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000427 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000428}
429
philipel85130292016-07-06 16:10:31 +0200430TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200431 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100432 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000433 packet_->markerBit = false;
434
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000435 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800436 EXPECT_EQ(kIncomplete,
437 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000438
439 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
440
441 EXPECT_TRUE(frame_out == NULL);
442
443 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100444 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000445 packet_->markerBit = true;
446 packet_->seqNum = seq_num_;
447
philipel9d3ab612015-12-21 04:12:39 -0800448 EXPECT_EQ(kCompleteSession,
449 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000450
451 // check that we fail to get frame since seqnum is not continuous
452 frame_out = DecodeCompleteFrame();
453 EXPECT_TRUE(frame_out == NULL);
454
455 seq_num_ -= 3;
philipel9d3ab612015-12-21 04:12:39 -0800456 timestamp_ -= 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200457 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100458 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000459 packet_->markerBit = false;
460 packet_->seqNum = seq_num_;
461 packet_->timestamp = timestamp_;
462
philipel9d3ab612015-12-21 04:12:39 -0800463 EXPECT_EQ(kIncomplete,
464 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000465
466 frame_out = DecodeCompleteFrame();
467
468 // It should not be complete.
469 EXPECT_TRUE(frame_out == NULL);
470
471 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100472 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000473 packet_->markerBit = true;
474 packet_->seqNum = seq_num_;
475
philipel9d3ab612015-12-21 04:12:39 -0800476 EXPECT_EQ(kCompleteSession,
477 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000478
479 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000480 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100481 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000482 jitter_buffer_->ReleaseFrame(frame_out);
483
484 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000485 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100486 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000487 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000488}
489
philipel85130292016-07-06 16:10:31 +0200490TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
Niels Möller691f62c2019-04-11 15:27:17 +0200491 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +0200492 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100493 packet_->video_header.is_first_packet_in_frame = true;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700494 packet_->markerBit = true;
495
496 // Send in an initial good packet/frame (Frame A) to start things off.
497 bool retransmitted = false;
498 EXPECT_EQ(kCompleteSession,
499 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
500 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
501 EXPECT_TRUE(frame_out != NULL);
502 jitter_buffer_->ReleaseFrame(frame_out);
503
504 // Now send in a complete delta frame (Frame C), but with a sequence number
505 // gap. No pic index either, so no temporal scalability cheating :)
Niels Möllerabbc50e2019-04-24 09:41:16 +0200506 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Noah Richardse4cb4e92015-05-22 14:03:00 -0700507 // Leave a gap of 2 sequence numbers and two frames.
508 packet_->seqNum = seq_num_ + 3;
509 packet_->timestamp = timestamp_ + (66 * 90);
510 // Still isFirst = marker = true.
511 // Session should be complete (frame is complete), but there's nothing to
512 // decode yet.
513 EXPECT_EQ(kCompleteSession,
514 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
515 frame_out = DecodeCompleteFrame();
516 EXPECT_TRUE(frame_out == NULL);
517
518 // Now send in a complete delta frame (Frame B) that is continuous from A, but
519 // doesn't fill the full gap to C. The rest of the gap is going to be padding.
520 packet_->seqNum = seq_num_ + 1;
521 packet_->timestamp = timestamp_ + (33 * 90);
522 // Still isFirst = marker = true.
523 EXPECT_EQ(kCompleteSession,
524 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
525 frame_out = DecodeCompleteFrame();
526 EXPECT_TRUE(frame_out != NULL);
527 jitter_buffer_->ReleaseFrame(frame_out);
528
529 // But Frame C isn't continuous yet.
530 frame_out = DecodeCompleteFrame();
531 EXPECT_TRUE(frame_out == NULL);
532
533 // Add in the padding. These are empty packets (data length is 0) with no
534 // marker bit and matching the timestamp of Frame B.
Niels Möller075e7fd2019-03-12 12:29:22 +0100535 RTPHeader rtp_header;
536 RTPVideoHeader video_header;
537 rtp_header.sequenceNumber = seq_num_ + 2;
538 rtp_header.timestamp = timestamp_ + (33 * 90);
539 rtp_header.markerBit = false;
540 video_header.codec = kVideoCodecGeneric;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200541 video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller075e7fd2019-03-12 12:29:22 +0100542 VCMPacket empty_packet(data_, 0, rtp_header, video_header,
Johannes Kronf7de74c2021-04-30 13:10:56 +0200543 /*ntp_time_ms=*/0, clock_->CurrentTime());
Noah Richardse4cb4e92015-05-22 14:03:00 -0700544 EXPECT_EQ(kOldPacket,
545 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
546 empty_packet.seqNum += 1;
547 EXPECT_EQ(kOldPacket,
548 jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
549
550 // But now Frame C should be ready!
551 frame_out = DecodeCompleteFrame();
552 EXPECT_TRUE(frame_out != NULL);
553 jitter_buffer_->ReleaseFrame(frame_out);
554}
555
philipel85130292016-07-06 16:10:31 +0200556TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200557 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100558 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000559 packet_->markerBit = false;
560 packet_->seqNum = seq_num_;
561 packet_->timestamp = timestamp_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000562 EXPECT_EQ(0, jitter_buffer_->num_packets());
563 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000564
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000565 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800566 EXPECT_EQ(kIncomplete,
567 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000568
569 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
570
571 EXPECT_TRUE(frame_out == NULL);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000572 EXPECT_EQ(1, jitter_buffer_->num_packets());
573 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000574
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000575 // Insert a packet into a frame.
philipel9d3ab612015-12-21 04:12:39 -0800576 EXPECT_EQ(kDuplicatePacket,
577 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000578 EXPECT_EQ(2, jitter_buffer_->num_packets());
579 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000580
581 seq_num_++;
582 packet_->seqNum = seq_num_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000583 packet_->markerBit = true;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100584 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000585
philipel9d3ab612015-12-21 04:12:39 -0800586 EXPECT_EQ(kCompleteSession,
587 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000588
589 frame_out = DecodeCompleteFrame();
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000590 ASSERT_TRUE(frame_out != NULL);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000591 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000592
Niels Möller8f7ce222019-03-21 15:43:58 +0100593 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000594 EXPECT_EQ(3, jitter_buffer_->num_packets());
595 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000596 jitter_buffer_->ReleaseFrame(frame_out);
597}
598
philipel85130292016-07-06 16:10:31 +0200599TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200600 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100601 packet_->video_header.is_first_packet_in_frame = true;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000602 packet_->markerBit = true;
603 packet_->seqNum = seq_num_;
604 packet_->timestamp = timestamp_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000605 EXPECT_EQ(0, jitter_buffer_->num_packets());
606 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
607
608 bool retransmitted = false;
609 // Insert first complete frame.
610 EXPECT_EQ(kCompleteSession,
611 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
612
613 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
614 ASSERT_TRUE(frame_out != NULL);
615 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100616 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000617 jitter_buffer_->ReleaseFrame(frame_out);
618
619 // Insert 3 delta frames.
620 for (uint16_t i = 1; i <= 3; ++i) {
621 packet_->seqNum = seq_num_ + i;
622 packet_->timestamp = timestamp_ + (i * 33) * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200623 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000624 EXPECT_EQ(kCompleteSession,
625 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
626 EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
627 EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
628 }
629
630 // Retransmit second delta frame.
631 packet_->seqNum = seq_num_ + 2;
632 packet_->timestamp = timestamp_ + 66 * 90;
633
634 EXPECT_EQ(kDuplicatePacket,
635 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
636
637 EXPECT_EQ(5, jitter_buffer_->num_packets());
638 EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
639
640 // Should be able to decode 3 delta frames, key frame already decoded.
641 for (size_t i = 0; i < 3; ++i) {
642 frame_out = DecodeCompleteFrame();
643 ASSERT_TRUE(frame_out != NULL);
644 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +0100645 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000646 jitter_buffer_->ReleaseFrame(frame_out);
647 }
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000648}
649
philipel85130292016-07-06 16:10:31 +0200650TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
asapersson9a4cd872015-10-23 00:27:14 -0700651 // Verify that JB skips forward to next base layer frame.
652 // -------------------------------------------------
653 // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
654 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
655 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
656 // | ss | x | x | x | |
657 // -------------------------------------------------
658 // |<----------tl0idx:200--------->|<---tl0idx:201---
659
Niels Möller691f62c2019-04-11 15:27:17 +0200660 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
philipel29d88462018-08-08 14:26:00 +0200661 auto& vp9_header =
662 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
663
asapersson9a4cd872015-10-23 00:27:14 -0700664 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200665 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100666 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700667 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200668 vp9_header.flexible_mode = false;
669 vp9_header.spatial_idx = 0;
670 vp9_header.beginning_of_frame = true;
671 vp9_header.end_of_frame = true;
672 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700673
674 packet_->seqNum = 65485;
675 packet_->timestamp = 1000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200676 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200677 vp9_header.picture_id = 5;
678 vp9_header.tl0_pic_idx = 200;
679 vp9_header.temporal_idx = 0;
680 vp9_header.ss_data_available = true;
681 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700682 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
683 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
684
685 // Insert next temporal layer 0.
686 packet_->seqNum = 65489;
687 packet_->timestamp = 13000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200688 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200689 vp9_header.picture_id = 9;
690 vp9_header.tl0_pic_idx = 201;
691 vp9_header.temporal_idx = 0;
692 vp9_header.ss_data_available = false;
asapersson9a4cd872015-10-23 00:27:14 -0700693 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
694
695 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200696 EXPECT_EQ(1000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100697 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700698 jitter_buffer_->ReleaseFrame(frame_out);
699
700 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200701 EXPECT_EQ(13000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100702 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700703 jitter_buffer_->ReleaseFrame(frame_out);
704}
705
philipel85130292016-07-06 16:10:31 +0200706TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700707 // Verify that frames are updated with SS data when SS packet is reordered.
708 // --------------------------------
709 // | 65486 | 65487 | 65485 |...
710 // | pid:6 | pid:7 | pid:5 |...
711 // | tid:2 | tid:1 | tid:0 |...
712 // | | | ss |
713 // --------------------------------
714 // |<--------tl0idx:200--------->|
715
philipel29d88462018-08-08 14:26:00 +0200716 auto& vp9_header =
717 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
718
asapersson9a4cd872015-10-23 00:27:14 -0700719 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200720 packet_->video_header.codec = kVideoCodecVP9;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100721 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700722 packet_->markerBit = true;
philipel29d88462018-08-08 14:26:00 +0200723 vp9_header.flexible_mode = false;
724 vp9_header.spatial_idx = 0;
725 vp9_header.beginning_of_frame = true;
726 vp9_header.end_of_frame = true;
727 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700728
729 packet_->seqNum = 65486;
730 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200731 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200732 vp9_header.picture_id = 6;
733 vp9_header.temporal_idx = 2;
734 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700735 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
736
737 packet_->seqNum = 65487;
738 packet_->timestamp = 9000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200739 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200740 vp9_header.picture_id = 7;
741 vp9_header.temporal_idx = 1;
742 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700743 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
744
745 // Insert first frame with SS data.
746 packet_->seqNum = 65485;
747 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200748 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100749 packet_->video_header.width = 352;
750 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200751 vp9_header.picture_id = 5;
752 vp9_header.temporal_idx = 0;
753 vp9_header.temporal_up_switch = false;
754 vp9_header.ss_data_available = true;
755 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700756 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2..
757 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
758
759 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200760 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100761 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700762 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
763 EXPECT_FALSE(
764 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
765 jitter_buffer_->ReleaseFrame(frame_out);
766
767 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200768 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100769 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700770 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
771 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
772 jitter_buffer_->ReleaseFrame(frame_out);
773
774 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200775 EXPECT_EQ(9000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100776 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700777 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
778 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
779 jitter_buffer_->ReleaseFrame(frame_out);
780}
781
philipel85130292016-07-06 16:10:31 +0200782TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
asapersson9a4cd872015-10-23 00:27:14 -0700783 // Verify that frames are updated with SS data when SS packet is reordered.
784 // -----------------------------------------
785 // | 65486 | 65487 | 65485 | 65484 |...
786 // | pid:6 | pid:6 | pid:5 | pid:5 |...
787 // | tid:1 | tid:1 | tid:0 | tid:0 |...
788 // | sid:0 | sid:1 | sid:1 | sid:0 |...
789 // | t:6000 | t:6000 | t:3000 | t:3000 |
790 // | | | | ss |
791 // -----------------------------------------
792 // |<-----------tl0idx:200------------>|
793
philipel29d88462018-08-08 14:26:00 +0200794 auto& vp9_header =
795 packet_->video_header.video_type_header.emplace<RTPVideoHeaderVP9>();
796
asapersson9a4cd872015-10-23 00:27:14 -0700797 bool re = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200798 packet_->video_header.codec = kVideoCodecVP9;
philipel29d88462018-08-08 14:26:00 +0200799 vp9_header.flexible_mode = false;
800 vp9_header.beginning_of_frame = true;
801 vp9_header.end_of_frame = true;
802 vp9_header.tl0_pic_idx = 200;
asapersson9a4cd872015-10-23 00:27:14 -0700803
Niels Möllerd5e02f02019-02-20 13:12:21 +0100804 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700805 packet_->markerBit = false;
806 packet_->seqNum = 65486;
807 packet_->timestamp = 6000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200808 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200809 vp9_header.spatial_idx = 0;
810 vp9_header.picture_id = 6;
811 vp9_header.temporal_idx = 1;
812 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700813 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
814
Niels Möllerd5e02f02019-02-20 13:12:21 +0100815 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700816 packet_->markerBit = true;
817 packet_->seqNum = 65487;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200818 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
philipel29d88462018-08-08 14:26:00 +0200819 vp9_header.spatial_idx = 1;
820 vp9_header.picture_id = 6;
821 vp9_header.temporal_idx = 1;
822 vp9_header.temporal_up_switch = true;
asapersson9a4cd872015-10-23 00:27:14 -0700823 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
824
Niels Möllerd5e02f02019-02-20 13:12:21 +0100825 packet_->video_header.is_first_packet_in_frame = false;
asapersson9a4cd872015-10-23 00:27:14 -0700826 packet_->markerBit = true;
827 packet_->seqNum = 65485;
828 packet_->timestamp = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200829 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
philipel29d88462018-08-08 14:26:00 +0200830 vp9_header.spatial_idx = 1;
831 vp9_header.picture_id = 5;
832 vp9_header.temporal_idx = 0;
833 vp9_header.temporal_up_switch = false;
asapersson9a4cd872015-10-23 00:27:14 -0700834 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
835
836 // Insert first frame with SS data.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100837 packet_->video_header.is_first_packet_in_frame = true;
asapersson9a4cd872015-10-23 00:27:14 -0700838 packet_->markerBit = false;
839 packet_->seqNum = 65484;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200840 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100841 packet_->video_header.width = 352;
842 packet_->video_header.height = 288;
philipel29d88462018-08-08 14:26:00 +0200843 vp9_header.spatial_idx = 0;
844 vp9_header.picture_id = 5;
845 vp9_header.temporal_idx = 0;
846 vp9_header.temporal_up_switch = false;
847 vp9_header.ss_data_available = true;
848 vp9_header.gof.SetGofInfoVP9(
asapersson9a4cd872015-10-23 00:27:14 -0700849 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1..
850 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
851
852 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200853 EXPECT_EQ(3000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100854 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700855 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
856 EXPECT_FALSE(
857 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
858 jitter_buffer_->ReleaseFrame(frame_out);
859
860 frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +0200861 EXPECT_EQ(6000U, frame_out->Timestamp());
Niels Möller8f7ce222019-03-21 15:43:58 +0100862 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
asapersson9a4cd872015-10-23 00:27:14 -0700863 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
864 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
865 jitter_buffer_->ReleaseFrame(frame_out);
866}
867
philipel85130292016-07-06 16:10:31 +0200868TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
Niels Möllerabbc50e2019-04-24 09:41:16 +0200869 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100870 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000871 packet_->markerBit = false;
872 packet_->seqNum = seq_num_;
873 packet_->timestamp = timestamp_;
874 packet_->insertStartCode = true;
875
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000876 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800877 EXPECT_EQ(kIncomplete,
878 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000879
880 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
881
882 // Frame should not be complete.
883 EXPECT_TRUE(frame_out == NULL);
884
885 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100886 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000887 packet_->markerBit = true;
888 packet_->seqNum = seq_num_;
889
philipel9d3ab612015-12-21 04:12:39 -0800890 EXPECT_EQ(kCompleteSession,
891 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000892
893 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000894 CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
Niels Möller8f7ce222019-03-21 15:43:58 +0100895 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000896 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000897}
898
stefana669a3a2016-10-06 05:04:52 -0700899TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
philipel7d745e52018-08-02 14:03:53 +0200900 auto& h264_header =
901 packet_->video_header.video_type_header.emplace<RTPVideoHeaderH264>();
stefana669a3a2016-10-06 05:04:52 -0700902 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200903 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100904 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700905 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200906 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200907 h264_header.nalu_type = H264::NaluType::kIdr;
908 h264_header.nalus[0].type = H264::NaluType::kIdr;
909 h264_header.nalus[0].sps_id = -1;
910 h264_header.nalus[0].pps_id = 0;
911 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700912 bool retransmitted = false;
913 EXPECT_EQ(kCompleteSession,
914 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
915 // Not decodable since sps and pps are missing.
916 EXPECT_EQ(nullptr, DecodeCompleteFrame());
917
918 timestamp_ += 3000;
919 packet_->timestamp = timestamp_;
920 ++seq_num_;
921 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200922 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100923 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700924 packet_->markerBit = false;
Niels Möller520ca4e2018-06-04 11:14:38 +0200925 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200926 h264_header.nalu_type = H264::NaluType::kStapA;
927 h264_header.nalus[0].type = H264::NaluType::kSps;
928 h264_header.nalus[0].sps_id = 0;
929 h264_header.nalus[0].pps_id = -1;
930 h264_header.nalus[1].type = H264::NaluType::kPps;
931 h264_header.nalus[1].sps_id = 0;
932 h264_header.nalus[1].pps_id = 0;
933 h264_header.nalus_length = 2;
stefana669a3a2016-10-06 05:04:52 -0700934 // Not complete since the marker bit hasn't been received.
935 EXPECT_EQ(kIncomplete,
936 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
937
938 ++seq_num_;
939 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200940 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100941 packet_->video_header.is_first_packet_in_frame = false;
stefana669a3a2016-10-06 05:04:52 -0700942 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200943 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200944 h264_header.nalu_type = H264::NaluType::kIdr;
945 h264_header.nalus[0].type = H264::NaluType::kIdr;
946 h264_header.nalus[0].sps_id = -1;
947 h264_header.nalus[0].pps_id = 0;
948 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700949 // Complete and decodable since the pps and sps are received in the first
950 // packet of this frame.
951 EXPECT_EQ(kCompleteSession,
952 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
953 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
954 ASSERT_NE(nullptr, frame_out);
955 jitter_buffer_->ReleaseFrame(frame_out);
956
957 timestamp_ += 3000;
958 packet_->timestamp = timestamp_;
959 ++seq_num_;
960 packet_->seqNum = seq_num_;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200961 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100962 packet_->video_header.is_first_packet_in_frame = true;
stefana669a3a2016-10-06 05:04:52 -0700963 packet_->markerBit = true;
Niels Möller520ca4e2018-06-04 11:14:38 +0200964 packet_->video_header.codec = kVideoCodecH264;
philipel7d745e52018-08-02 14:03:53 +0200965 h264_header.nalu_type = H264::NaluType::kSlice;
966 h264_header.nalus[0].type = H264::NaluType::kSlice;
967 h264_header.nalus[0].sps_id = -1;
968 h264_header.nalus[0].pps_id = 0;
969 h264_header.nalus_length = 1;
stefana669a3a2016-10-06 05:04:52 -0700970 // Complete and decodable since sps, pps and key frame has been received.
971 EXPECT_EQ(kCompleteSession,
972 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
973 frame_out = DecodeCompleteFrame();
974 ASSERT_NE(nullptr, frame_out);
975 jitter_buffer_->ReleaseFrame(frame_out);
976}
977
philipel85130292016-07-06 16:10:31 +0200978TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000979 seq_num_ = 0xfff0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200980 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100981 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000982 packet_->markerBit = false;
983 packet_->seqNum = seq_num_;
984 packet_->timestamp = timestamp_;
985
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000986 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -0800987 EXPECT_EQ(kIncomplete,
988 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000989
990 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
991
992 EXPECT_TRUE(frame_out == NULL);
993
994 int loop = 0;
995 do {
996 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100997 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +0000998 packet_->markerBit = false;
999 packet_->seqNum = seq_num_;
1000
philipel9d3ab612015-12-21 04:12:39 -08001001 EXPECT_EQ(kIncomplete,
1002 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001003
1004 frame_out = DecodeCompleteFrame();
1005
1006 EXPECT_TRUE(frame_out == NULL);
1007
1008 loop++;
1009 } while (loop < 98);
1010
1011 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001012 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001013 packet_->markerBit = true;
1014 packet_->seqNum = seq_num_;
1015
philipel9d3ab612015-12-21 04:12:39 -08001016 EXPECT_EQ(kCompleteSession,
1017 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001018
1019 frame_out = DecodeCompleteFrame();
1020
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001021 CheckOutFrame(frame_out, 100 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001022
Niels Möller8f7ce222019-03-21 15:43:58 +01001023 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001024 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001025}
1026
philipel85130292016-07-06 16:10:31 +02001027TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001028 // Insert "first" packet last seqnum.
1029 seq_num_ = 10;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001030 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001031 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001032 packet_->markerBit = true;
1033 packet_->seqNum = seq_num_;
1034
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001035 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001036 EXPECT_EQ(kIncomplete,
1037 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001038 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1039
1040 // Should not be complete.
1041 EXPECT_TRUE(frame_out == NULL);
1042
1043 // Insert 98 frames.
1044 int loop = 0;
1045 do {
1046 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001047 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001048 packet_->markerBit = false;
1049 packet_->seqNum = seq_num_;
1050
philipel9d3ab612015-12-21 04:12:39 -08001051 EXPECT_EQ(kIncomplete,
1052 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001053
1054 frame_out = DecodeCompleteFrame();
1055
1056 EXPECT_TRUE(frame_out == NULL);
1057
1058 loop++;
1059 } while (loop < 98);
1060
1061 // Insert last packet.
1062 seq_num_--;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001063 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001064 packet_->markerBit = false;
1065 packet_->seqNum = seq_num_;
1066
philipel9d3ab612015-12-21 04:12:39 -08001067 EXPECT_EQ(kCompleteSession,
1068 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001069
1070 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001071 CheckOutFrame(frame_out, 100 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001072 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001073 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001074}
1075
philipel85130292016-07-06 16:10:31 +02001076TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001077 // ------- -------
1078 // | 2 | | 1 |
1079 // ------- -------
1080 // t = 3000 t = 2000
1081 seq_num_ = 2;
1082 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001083 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001084 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001085 packet_->markerBit = true;
1086 packet_->timestamp = timestamp_;
1087 packet_->seqNum = seq_num_;
1088
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001089 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001090 EXPECT_EQ(kCompleteSession,
1091 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001092
1093 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001094 EXPECT_EQ(3000u, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001095 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001096 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001097 jitter_buffer_->ReleaseFrame(frame_out);
1098
1099 seq_num_--;
1100 timestamp_ = 2000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001101 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001102 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001103 packet_->markerBit = true;
1104 packet_->seqNum = seq_num_;
1105 packet_->timestamp = timestamp_;
1106
philipel9d3ab612015-12-21 04:12:39 -08001107 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001108}
1109
philipel85130292016-07-06 16:10:31 +02001110TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001111 // ------- -------
1112 // | 2 | | 1 |
1113 // ------- -------
1114 // t = 3000 t = 0xffffff00
1115
1116 seq_num_ = 2;
1117 timestamp_ = 3000;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001118 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001119 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001120 packet_->markerBit = true;
1121 packet_->seqNum = seq_num_;
1122 packet_->timestamp = timestamp_;
1123
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001124 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001125 EXPECT_EQ(kCompleteSession,
1126 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001127
1128 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001129 EXPECT_EQ(timestamp_, frame_out->Timestamp());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001130
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001131 CheckOutFrame(frame_out, size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001132
Niels Möller8f7ce222019-03-21 15:43:58 +01001133 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001134
1135 jitter_buffer_->ReleaseFrame(frame_out);
1136
1137 seq_num_--;
1138 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001139 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001140 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001141 packet_->markerBit = true;
1142 packet_->seqNum = seq_num_;
1143 packet_->timestamp = timestamp_;
1144
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001145 // This timestamp is old.
philipel9d3ab612015-12-21 04:12:39 -08001146 EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001147}
1148
philipel85130292016-07-06 16:10:31 +02001149TEST_F(TestBasicJitterBuffer, TimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001150 // --------------- ---------------
1151 // | 1 | 2 | | 3 | 4 |
1152 // --------------- ---------------
1153 // t = 0xffffff00 t = 33*90
1154
1155 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001156 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001157 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001158 packet_->markerBit = false;
1159 packet_->seqNum = seq_num_;
1160 packet_->timestamp = timestamp_;
1161
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001162 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001163 EXPECT_EQ(kIncomplete,
1164 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001165
1166 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001167 EXPECT_TRUE(frame_out == NULL);
1168
1169 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001170 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001171 packet_->markerBit = true;
1172 packet_->seqNum = seq_num_;
1173
philipel9d3ab612015-12-21 04:12:39 -08001174 EXPECT_EQ(kCompleteSession,
1175 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001176
1177 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001178 CheckOutFrame(frame_out, 2 * size_, false);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001179 jitter_buffer_->ReleaseFrame(frame_out);
1180
1181 seq_num_++;
philipel9d3ab612015-12-21 04:12:39 -08001182 timestamp_ += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001183 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001184 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001185 packet_->markerBit = false;
1186 packet_->seqNum = seq_num_;
1187 packet_->timestamp = timestamp_;
1188
philipel9d3ab612015-12-21 04:12:39 -08001189 EXPECT_EQ(kIncomplete,
1190 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001191
1192 frame_out = DecodeCompleteFrame();
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001193 EXPECT_TRUE(frame_out == NULL);
1194
1195 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001196 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001197 packet_->markerBit = true;
1198 packet_->seqNum = seq_num_;
1199
philipel9d3ab612015-12-21 04:12:39 -08001200 EXPECT_EQ(kCompleteSession,
1201 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001202
1203 frame_out = DecodeCompleteFrame();
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001204 CheckOutFrame(frame_out, 2 * size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001205 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001206 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001207}
1208
philipel85130292016-07-06 16:10:31 +02001209TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001210 // ------- -------
1211 // | 1 | | 2 |
1212 // ------- -------
1213 // t = 0xffffff00 t = 2700
1214
1215 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001216 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001217 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001218 packet_->markerBit = true;
1219 packet_->timestamp = timestamp_;
1220
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001221 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001222 // Insert first frame (session will be complete).
philipel9d3ab612015-12-21 04:12:39 -08001223 EXPECT_EQ(kCompleteSession,
1224 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001225
1226 // Insert next frame.
1227 seq_num_++;
1228 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001229 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001230 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001231 packet_->markerBit = true;
1232 packet_->seqNum = seq_num_;
1233 packet_->timestamp = timestamp_;
1234
philipel9d3ab612015-12-21 04:12:39 -08001235 EXPECT_EQ(kCompleteSession,
1236 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001237
1238 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001239 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001240 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001241 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001242 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001243
1244 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001245 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001246 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001247 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001248 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001249}
1250
philipel85130292016-07-06 16:10:31 +02001251TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001252 // ------- -------
1253 // | 2 | | 1 |
1254 // ------- -------
1255 // t = 2700 t = 0xffffff00
1256
1257 seq_num_ = 2;
1258 timestamp_ = 2700;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001259 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001260 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001261 packet_->markerBit = true;
1262 packet_->seqNum = seq_num_;
1263 packet_->timestamp = timestamp_;
1264
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001265 bool retransmitted = false;
philipel9d3ab612015-12-21 04:12:39 -08001266 EXPECT_EQ(kCompleteSession,
1267 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001268
1269 // Insert second frame
1270 seq_num_--;
1271 timestamp_ = 0xffffff00;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001272 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001273 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001274 packet_->markerBit = true;
1275 packet_->seqNum = seq_num_;
1276 packet_->timestamp = timestamp_;
1277
philipel9d3ab612015-12-21 04:12:39 -08001278 EXPECT_EQ(kCompleteSession,
1279 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001280
1281 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001282 EXPECT_EQ(0xffffff00, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001283 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001284 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001285 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001286
1287 VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001288 EXPECT_EQ(2700u, frame_out2->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001289 CheckOutFrame(frame_out2, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001290 EXPECT_EQ(VideoFrameType::kVideoFrameDelta, frame_out2->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001291 jitter_buffer_->ReleaseFrame(frame_out2);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001292}
1293
philipel85130292016-07-06 16:10:31 +02001294TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001295 int loop = 0;
1296 bool firstPacket = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001297 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001298 // Insert kMaxPacketsInJitterBuffer into frame.
1299 do {
1300 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001301 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001302 packet_->markerBit = false;
1303 packet_->seqNum = seq_num_;
1304
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001305 if (firstPacket) {
philipel9d3ab612015-12-21 04:12:39 -08001306 EXPECT_EQ(kIncomplete,
1307 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001308 firstPacket = false;
1309 } else {
philipel9d3ab612015-12-21 04:12:39 -08001310 EXPECT_EQ(kIncomplete,
1311 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001312 }
1313
1314 loop++;
1315 } while (loop < kMaxPacketsInSession);
1316
1317 // Max number of packets inserted.
1318 // Insert one more packet.
1319 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001320 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001321 packet_->markerBit = true;
1322 packet_->seqNum = seq_num_;
1323
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001324 // Insert the packet -> frame recycled.
philipel9d3ab612015-12-21 04:12:39 -08001325 EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001326 EXPECT_TRUE(NULL == DecodeCompleteFrame());
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001327}
1328
philipel85130292016-07-06 16:10:31 +02001329TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001330 // TEST fill JB with more than max number of frame (50 delta frames +
1331 // 51 key frames) with wrap in seq_num_
1332 //
1333 // --------------------------------------------------------------
1334 // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
1335 // --------------------------------------------------------------
1336 // |<-----------delta frames------------->|<------key frames----->|
1337
jbauchdb81ffd2015-11-23 03:59:02 -08001338 // Make sure the jitter doesn't request a keyframe after too much non-
1339 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001340 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
jbauchdb81ffd2015-11-23 03:59:02 -08001341
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001342 int loop = 0;
1343 seq_num_ = 65485;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001344 uint32_t first_key_frame_timestamp = 0;
1345 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001346 // Insert MAX_NUMBER_OF_FRAMES frames.
1347 do {
philipel9d3ab612015-12-21 04:12:39 -08001348 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001349 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001350 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001351 packet_->markerBit = true;
1352 packet_->seqNum = seq_num_;
1353 packet_->timestamp = timestamp_;
1354
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001355 if (loop == 50) {
1356 first_key_frame_timestamp = packet_->timestamp;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001357 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001358 }
1359
1360 // Insert frame.
philipel9d3ab612015-12-21 04:12:39 -08001361 EXPECT_EQ(kCompleteSession,
1362 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001363
1364 loop++;
1365 } while (loop < kMaxNumberOfFrames);
1366
1367 // Max number of frames inserted.
1368
1369 // Insert one more frame.
philipel9d3ab612015-12-21 04:12:39 -08001370 timestamp_ += 33 * 90;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001371 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001372 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001373 packet_->markerBit = true;
1374 packet_->seqNum = seq_num_;
1375 packet_->timestamp = timestamp_;
1376
1377 // Now, no free frame - frames will be recycled until first key frame.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001378 EXPECT_EQ(kFlushIndicator,
1379 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001380
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001381 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
Niels Möller23775882018-08-16 10:24:12 +02001382 EXPECT_EQ(first_key_frame_timestamp, frame_out->Timestamp());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001383 CheckOutFrame(frame_out, size_, false);
Niels Möller8f7ce222019-03-21 15:43:58 +01001384 EXPECT_EQ(VideoFrameType::kVideoFrameKey, frame_out->FrameType());
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001385 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001386}
1387
philipel85130292016-07-06 16:10:31 +02001388TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001389 seq_num_ = 3;
1390 // Insert one empty packet per frame, should never return the last timestamp
1391 // inserted. Only return empty frames in the presence of subsequent frames.
1392 int maxSize = 1000;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001393 bool retransmitted = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001394 for (int i = 0; i < maxSize + 10; i++) {
1395 timestamp_ += 33 * 90;
1396 seq_num_++;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001397 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001398 packet_->markerBit = false;
1399 packet_->seqNum = seq_num_;
1400 packet_->timestamp = timestamp_;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001401 packet_->video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001402
philipel9d3ab612015-12-21 04:12:39 -08001403 EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001404 }
1405}
1406
philipel85130292016-07-06 16:10:31 +02001407TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001408 // Test that a we cannot get incomplete frames from the JB if we haven't
1409 // received the marker bit, unless we have received a packet from a later
1410 // timestamp.
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001411 // Start with a complete key frame - insert and decode.
Niels Möller691f62c2019-04-11 15:27:17 +02001412 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
Niels Möllerabbc50e2019-04-24 09:41:16 +02001413 packet_->video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001414 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001415 packet_->markerBit = true;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001416 bool retransmitted = false;
1417
philipel9d3ab612015-12-21 04:12:39 -08001418 EXPECT_EQ(kCompleteSession,
1419 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001420 VCMEncodedFrame* frame_out = DecodeCompleteFrame();
1421 EXPECT_TRUE(frame_out != NULL);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +00001422 jitter_buffer_->ReleaseFrame(frame_out);
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001423
1424 packet_->seqNum += 2;
1425 packet_->timestamp += 33 * 90;
Niels Möllerabbc50e2019-04-24 09:41:16 +02001426 packet_->video_header.frame_type = VideoFrameType::kVideoFrameDelta;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001427 packet_->video_header.is_first_packet_in_frame = false;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001428 packet_->markerBit = false;
1429
Niels Möller375b3462019-01-10 15:35:56 +01001430 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001431 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001432
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001433 packet_->seqNum += 2;
1434 packet_->timestamp += 33 * 90;
Niels Möllerd5e02f02019-02-20 13:12:21 +01001435 packet_->video_header.is_first_packet_in_frame = true;
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001436
Niels Möller375b3462019-01-10 15:35:56 +01001437 EXPECT_EQ(kIncomplete,
philipel9d3ab612015-12-21 04:12:39 -08001438 jitter_buffer_->InsertPacket(*packet_, &retransmitted));
mikhal@webrtc.org474e9152013-05-07 16:55:03 +00001439}
1440
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001441TEST_F(TestRunningJitterBuffer, Full) {
jbauchdb81ffd2015-11-23 03:59:02 -08001442 // Make sure the jitter doesn't request a keyframe after too much non-
1443 // decodable frames.
philipel9d3ab612015-12-21 04:12:39 -08001444 jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001445 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001446 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001447 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001448 DropFrame(1);
1449 // Fill the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001450 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kVideoFrameDelta),
1451 kNoError);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001452 // Make sure we can't decode these frames.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001453 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001454 // This frame will make the jitter buffer recycle frames until a key frame.
1455 // Since none is found it will have to wait until the next key frame before
1456 // decoding.
Niels Möller8f7ce222019-03-21 15:43:58 +01001457 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001458 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001459}
1460
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001461TEST_F(TestRunningJitterBuffer, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001462 // Make sure a frame can get complete even though empty packets are missing.
Niels Möller8f7ce222019-03-21 15:43:58 +01001463 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 3,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001464 clock_->TimeInMilliseconds());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001465 bool request_key_frame = false;
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001466 // Insert empty packet.
1467 EXPECT_EQ(kNoError, InsertPacketAndPop(4));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001468 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001469 // Insert 3 media packets.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001470 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001471 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001472 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001473 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001474 EXPECT_EQ(kCompleteSession, 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 // Insert empty packet.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001477 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001478 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001479}
1480
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001481TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
1482 // Insert delta frames.
Niels Möller8f7ce222019-03-21 15:43:58 +01001483 EXPECT_GE(InsertFrames(5, VideoFrameType::kVideoFrameDelta), kNoError);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001484 // Can't decode without a key frame.
1485 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001486 InsertFrame(VideoFrameType::kVideoFrameKey);
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001487 // Skip to the next key frame.
1488 EXPECT_TRUE(DecodeCompleteFrame());
1489}
1490
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001491TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001492 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001493 EXPECT_TRUE(DecodeCompleteFrame());
1494 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001495 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1496 kNoError);
1497 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001498 for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
1499 EXPECT_TRUE(DecodeCompleteFrame());
1500 }
1501}
1502
1503TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001504 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001505 EXPECT_TRUE(DecodeCompleteFrame());
1506 const int kNumDeltaFrames = 5;
Niels Möller8f7ce222019-03-21 15:43:58 +01001507 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1508 kNoError);
1509 InsertFrame(VideoFrameType::kVideoFrameKey);
1510 EXPECT_GE(InsertFrames(kNumDeltaFrames, VideoFrameType::kVideoFrameDelta),
1511 kNoError);
1512 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgef144882013-05-07 19:16:33 +00001513 for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
1514 EXPECT_TRUE(DecodeCompleteFrame());
1515 }
1516}
1517
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001518TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001519 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001520 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001521 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001522 clock_->TimeInMilliseconds());
1523 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001524 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001525 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001526 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001527 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
1528 EXPECT_FALSE(DecodeCompleteFrame());
1529 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
1530 EXPECT_TRUE(DecodeCompleteFrame());
1531 EXPECT_TRUE(DecodeCompleteFrame());
1532}
1533
philipel85130292016-07-06 16:10:31 +02001534TEST_F(TestJitterBufferNack, EmptyPackets) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001535 // Make sure empty packets doesn't clog the jitter buffer.
Niels Möller8f7ce222019-03-21 15:43:58 +01001536 EXPECT_GE(InsertFrames(kMaxNumberOfFrames, VideoFrameType::kEmptyFrame),
1537 kNoError);
1538 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001539 EXPECT_TRUE(DecodeCompleteFrame());
1540}
1541
philipel85130292016-07-06 16:10:31 +02001542TEST_F(TestJitterBufferNack, NackTooOldPackets) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001543 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001544 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001545 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001546
Artem Titovdcd7fc72021-08-09 13:02:57 +02001547 // Drop one frame and insert `kNackHistoryLength` to trigger NACKing a too
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001548 // old packet.
1549 DropFrame(1);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001550 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001551 EXPECT_EQ(kFlushIndicator, InsertFrames(oldest_packet_to_nack_ + 1,
1552 VideoFrameType::kVideoFrameDelta));
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001553 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001554
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001555 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001556 std::vector<uint16_t> nack_list =
1557 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001558 // No key frame will be requested since the jitter buffer is empty.
1559 EXPECT_FALSE(request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001560 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001561
Niels Möller8f7ce222019-03-21 15:43:58 +01001562 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001563 // Waiting for a key frame.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001564 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001565
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001566 // The next complete continuous frame isn't a key frame, but we're waiting
1567 // for one.
1568 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001569 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001570 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001571 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001572}
1573
philipel85130292016-07-06 16:10:31 +02001574TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001575 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001576 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001577 EXPECT_TRUE(DecodeCompleteFrame());
1578
1579 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001580 EXPECT_GE(
1581 InsertFrames(oldest_packet_to_nack_, VideoFrameType::kVideoFrameDelta),
1582 kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001583
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001584 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001585 std::vector<uint16_t> nack_list =
1586 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001587 // Verify that the jitter buffer does not request a key frame.
1588 EXPECT_FALSE(request_key_frame);
1589 // Verify that no packets are NACKed.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001590 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001591 // Verify that we can decode the next frame.
1592 EXPECT_TRUE(DecodeCompleteFrame());
1593}
1594
philipel85130292016-07-06 16:10:31 +02001595TEST_F(TestJitterBufferNack, NackListFull) {
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001596 // Insert a key frame and decode it.
Niels Möller8f7ce222019-03-21 15:43:58 +01001597 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001598 EXPECT_TRUE(DecodeCompleteFrame());
1599
Artem Titovdcd7fc72021-08-09 13:02:57 +02001600 // Generate and drop `kNackHistoryLength` packets to fill the NACK list.
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001601 DropFrame(max_nack_list_size_ + 1);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001602 // Insert a frame which should trigger a recycle until the next key frame.
Niels Möller8f7ce222019-03-21 15:43:58 +01001603 EXPECT_EQ(kFlushIndicator, InsertFrame(VideoFrameType::kVideoFrameDelta));
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001604 EXPECT_FALSE(DecodeCompleteFrame());
1605
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001606 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001607 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001608 // The jitter buffer is empty, so we won't request key frames until we get a
1609 // packet.
1610 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001611
Niels Möller8f7ce222019-03-21 15:43:58 +01001612 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001613 // Now we have a packet in the jitter buffer, a key frame will be requested
1614 // since it's not a key frame.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001615 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +00001616 // The jitter buffer is empty, so we won't request key frames until we get a
1617 // packet.
1618 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001619 // The next complete continuous frame isn't a key frame, but we're waiting
1620 // for one.
1621 EXPECT_FALSE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001622 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +00001623 // Skipping ahead to the key frame.
mikhal@webrtc.orgc1f243f2013-04-22 22:24:38 +00001624 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001625}
1626
philipel85130292016-07-06 16:10:31 +02001627TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001628 DropFrame(10);
1629 // Insert a frame and try to generate a NACK list. Shouldn't get one.
Niels Möller8f7ce222019-03-21 15:43:58 +01001630 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameDelta), kNoError);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001631 bool request_key_frame = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001632 std::vector<uint16_t> nack_list =
1633 jitter_buffer_->GetNackList(&request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001634 // No list generated, and a key frame request is signaled.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001635 EXPECT_EQ(0u, nack_list.size());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001636 EXPECT_TRUE(request_key_frame);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001637}
1638
philipel85130292016-07-06 16:10:31 +02001639TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001640 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001641 InsertFrame(VideoFrameType::kVideoFrameKey);
1642 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 2, 0,
philipel9d3ab612015-12-21 04:12:39 -08001643 clock_->TimeInMilliseconds());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001644 stream_generator_->NextPacket(NULL); // Drop packet.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001645 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001646 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001647 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001648 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel85130292016-07-06 16:10:31 +02001649 EXPECT_EQ(1u, nack_list.size());
stefan@webrtc.org4d2f5de2013-04-09 18:24:41 +00001650}
1651
philipel85130292016-07-06 16:10:31 +02001652TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001653 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001654 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001655 clock_->TimeInMilliseconds());
1656 VCMPacket packet;
1657 stream_generator_->PopPacket(&packet, 0);
1658 bool retransmitted = false;
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001659 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001660 EXPECT_FALSE(retransmitted);
1661 // Drop second packet.
1662 stream_generator_->PopPacket(&packet, 1);
1663 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
1664 EXPECT_FALSE(retransmitted);
1665 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001666 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001667 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001668 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001669 EXPECT_EQ(1u, nack_list.size());
1670 seq_num = nack_list[0];
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001671 stream_generator_->PopPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001672 EXPECT_EQ(packet.seqNum, seq_num);
philipel9d3ab612015-12-21 04:12:39 -08001673 EXPECT_EQ(kCompleteSession,
1674 jitter_buffer_->InsertPacket(packet, &retransmitted));
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +00001675 EXPECT_TRUE(retransmitted);
1676 EXPECT_TRUE(DecodeCompleteFrame());
1677}
1678
philipel85130292016-07-06 16:10:31 +02001679TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001680 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001681 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
philipel9d3ab612015-12-21 04:12:39 -08001682 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001683 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001684 // Drop second packet.
1685 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1686 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001687 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001688 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001689 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001690 ASSERT_EQ(1u, nack_list.size());
1691 seq_num = nack_list[0];
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001692 VCMPacket packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001693 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001694 EXPECT_EQ(packet.seqNum, seq_num);
stefan@webrtc.org885cd132013-04-16 09:38:26 +00001695}
1696
philipel85130292016-07-06 16:10:31 +02001697TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001698 VCMPacket packet;
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001699 stream_generator_->Init(0, clock_->TimeInMilliseconds());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001700 // First frame is delta.
Niels Möller8f7ce222019-03-21 15:43:58 +01001701 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001702 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001703 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001704 // Drop second packet in frame.
1705 ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
1706 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
1707 // Second frame is key.
Niels Möller8f7ce222019-03-21 15:43:58 +01001708 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 3, 0,
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001709 clock_->TimeInMilliseconds() + 10);
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001710 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001711 // Drop second packet in frame.
1712 EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
1713 EXPECT_FALSE(DecodeCompleteFrame());
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001714 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001715 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
philipel83f831a2016-03-12 03:30:23 -08001716 uint16_t seq_num;
philipel85130292016-07-06 16:10:31 +02001717 ASSERT_EQ(1u, nack_list.size());
1718 seq_num = nack_list[0];
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001719 stream_generator_->GetPacket(&packet, 0);
philipel83f831a2016-03-12 03:30:23 -08001720 EXPECT_EQ(packet.seqNum, seq_num);
hclam@chromium.orgfe307e12013-05-16 21:19:59 +00001721}
1722
philipel85130292016-07-06 16:10:31 +02001723TEST_F(TestJitterBufferNack, NormalOperation) {
Niels Möller8f7ce222019-03-21 15:43:58 +01001724 EXPECT_GE(InsertFrame(VideoFrameType::kVideoFrameKey), kNoError);
Niels Möller375b3462019-01-10 15:35:56 +01001725 EXPECT_TRUE(DecodeCompleteFrame());
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001726
1727 // ----------------------------------------------------------------
1728 // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
1729 // ----------------------------------------------------------------
Niels Möller8f7ce222019-03-21 15:43:58 +01001730 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameKey, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001731 clock_->TimeInMilliseconds());
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +00001732 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller375b3462019-01-10 15:35:56 +01001733 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001734 // Verify that the frame is incomplete.
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001735 EXPECT_FALSE(DecodeCompleteFrame());
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001736 while (stream_generator_->PacketsRemaining() > 1) {
1737 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
Niels Möller375b3462019-01-10 15:35:56 +01001738 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001739 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001740 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001741 }
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001742 }
Niels Möller375b3462019-01-10 15:35:56 +01001743 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001744 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001745 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001746 bool request_key_frame = false;
philipel83f831a2016-03-12 03:30:23 -08001747
1748 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001749 std::vector<uint16_t> nack_list =
1750 jitter_buffer_->GetNackList(&request_key_frame);
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001751 const size_t kExpectedNackSize = 9;
philipel85130292016-07-06 16:10:31 +02001752 ASSERT_EQ(kExpectedNackSize, nack_list.size());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001753 for (size_t i = 0; i < nack_list.size(); ++i)
1754 EXPECT_EQ((1 + i) * 10, nack_list[i]);
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001755}
1756
philipel85130292016-07-06 16:10:31 +02001757TEST_F(TestJitterBufferNack, NormalOperationWrap) {
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001758 bool request_key_frame = false;
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001759 // ------- ------------------------------------------------------------
1760 // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
1761 // ------- ------------------------------------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001762 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001763 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001764 EXPECT_FALSE(request_key_frame);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001765 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001766 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 100, 0,
philipel9d3ab612015-12-21 04:12:39 -08001767 clock_->TimeInMilliseconds());
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +00001768 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001769 while (stream_generator_->PacketsRemaining() > 1) {
1770 if (stream_generator_->NextSequenceNumber() % 10 != 0) {
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001771 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001772 EXPECT_FALSE(request_key_frame);
1773 } else {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001774 stream_generator_->NextPacket(NULL); // Drop packet
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001775 }
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001776 }
1777 EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
stefan@webrtc.orga64300a2013-03-04 15:24:40 +00001778 EXPECT_FALSE(request_key_frame);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001779 EXPECT_EQ(0, stream_generator_->PacketsRemaining());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001780 EXPECT_FALSE(DecodeCompleteFrame());
1781 EXPECT_FALSE(DecodeCompleteFrame());
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001782 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001783 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001784 // Verify the NACK list.
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001785 const size_t kExpectedNackSize = 10;
philipel85130292016-07-06 16:10:31 +02001786 ASSERT_EQ(kExpectedNackSize, nack_list.size());
1787 for (size_t i = 0; i < nack_list.size(); ++i)
1788 EXPECT_EQ(i * 10, nack_list[i]);
stefan@webrtc.org8ddf9a42012-01-16 11:59:01 +00001789}
1790
philipel85130292016-07-06 16:10:31 +02001791TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001792 bool request_key_frame = false;
1793 // -----------------------------------
1794 // | 65532 | 65533 | 65534 | x | 0 | 1 |
1795 // -----------------------------------
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001796 stream_generator_->Init(65532, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001797 InsertFrame(VideoFrameType::kVideoFrameKey);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001798 EXPECT_FALSE(request_key_frame);
1799 EXPECT_TRUE(DecodeCompleteFrame());
Niels Möller8f7ce222019-03-21 15:43:58 +01001800 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001801 clock_->TimeInMilliseconds());
1802 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1803 for (int i = 0; i < 5; ++i) {
philipel9d3ab612015-12-21 04:12:39 -08001804 if (stream_generator_->NextSequenceNumber() != 65535) {
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001805 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001806 EXPECT_FALSE(request_key_frame);
1807 } else {
1808 stream_generator_->NextPacket(NULL); // Drop packet
1809 }
Niels Möller8f7ce222019-03-21 15:43:58 +01001810 stream_generator_->GenerateFrame(VideoFrameType::kVideoFrameDelta, 1, 0,
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001811 clock_->TimeInMilliseconds());
1812 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
1813 }
mikhal@webrtc.org759b0412013-05-07 16:36:00 +00001814 EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001815 EXPECT_FALSE(request_key_frame);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001816 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001817 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001818 // Verify the NACK list.
philipel85130292016-07-06 16:10:31 +02001819 ASSERT_EQ(1u, nack_list.size());
1820 EXPECT_EQ(65535, nack_list[0]);
stefan@webrtc.orga5dee332013-05-07 11:11:17 +00001821}
1822
philipel85130292016-07-06 16:10:31 +02001823TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001824 stream_generator_->Init(0, clock_->TimeInMilliseconds());
Niels Möller8f7ce222019-03-21 15:43:58 +01001825 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001826 EXPECT_TRUE(DecodeCompleteFrame());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001827 bool extended = false;
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001828 std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
1829 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001830
1831 // Far-into-the-future video frame, could be caused by resetting the encoder
1832 // or otherwise restarting. This should not fail when error when the packet is
1833 // a keyframe, even if all of the nack list needs to be flushed.
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -07001834 stream_generator_->Init(10000, clock_->TimeInMilliseconds());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001835 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001836 InsertFrame(VideoFrameType::kVideoFrameKey);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001837 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001838 nack_list = jitter_buffer_->GetNackList(&extended);
1839 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001840
1841 // Stream should be decodable from this point.
1842 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
Niels Möller8f7ce222019-03-21 15:43:58 +01001843 InsertFrame(VideoFrameType::kVideoFrameDelta);
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001844 EXPECT_TRUE(DecodeCompleteFrame());
Wan-Teh Changb1825a42015-06-03 15:03:35 -07001845 nack_list = jitter_buffer_->GetNackList(&extended);
1846 EXPECT_EQ(0u, nack_list.size());
pbos@webrtc.orgebb467f2014-05-19 15:28:02 +00001847}
stefan@webrtc.orgad4af572012-01-12 15:16:49 +00001848} // namespace webrtc