blob: 07b43dfec49ca02e636e6329e41297d8b906bc56 [file] [log] [blame]
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +00001/*
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +00003 *
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/session_info.h"
12
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000013#include <string.h>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/include/module_common_types.h"
16#include "modules/video_coding/packet.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "test/gtest.h"
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000018
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000019namespace webrtc {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000020
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000021class TestSessionInfo : public ::testing::Test {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000022 protected:
23 virtual void SetUp() {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000024 memset(packet_buffer_, 0, sizeof(packet_buffer_));
25 memset(frame_buffer_, 0, sizeof(frame_buffer_));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000026 session_.Reset();
Niels Möllerabbc50e2019-04-24 09:41:16 +020027 packet_.video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org3004c792013-05-07 12:36:21 +000028 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000029 packet_.dataPtr = packet_buffer_;
30 packet_.seqNum = 0;
31 packet_.timestamp = 0;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000032 frame_data.rtt_ms = 0;
33 frame_data.rolling_average_packets_per_frame = -1;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000034 }
35
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000036 void FillPacket(uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000037 for (size_t i = 0; i < packet_buffer_size(); ++i)
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000038 packet_buffer_[i] = start_value + i;
39 }
40
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000041 void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000042 for (size_t j = 0; j < packet_buffer_size(); ++j) {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000043 ASSERT_EQ(start_value + j, start_ptr[j]);
44 }
45 }
46
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000047 size_t packet_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000048 return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
49 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000050 size_t frame_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000051 return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
52 }
53
54 enum { kPacketBufferSize = 10 };
55
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000056 uint8_t packet_buffer_[kPacketBufferSize];
pbos@webrtc.org3004c792013-05-07 12:36:21 +000057 uint8_t frame_buffer_[10 * kPacketBufferSize];
58
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000059 VCMSessionInfo session_;
60 VCMPacket packet_;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000061 FrameData frame_data;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000062};
63
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000064class TestNalUnits : public TestSessionInfo {
65 protected:
66 virtual void SetUp() {
67 TestSessionInfo::SetUp();
Niels Möllerd5e02f02019-02-20 13:12:21 +010068 packet_.video_header.codec = kVideoCodecVP8;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000069 }
70
71 bool VerifyNalu(int offset, int packets_expected, int start_value) {
72 EXPECT_GE(session_.SessionLength(),
pbos@webrtc.org3004c792013-05-07 12:36:21 +000073 packets_expected * packet_buffer_size());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000074 for (int i = 0; i < packets_expected; ++i) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000075 int packet_index = (offset + i) * packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000076 VerifyPacket(frame_buffer_ + packet_index, start_value + i);
77 }
78 return true;
79 }
80};
81
mikhal@webrtc.orgcd648862012-01-03 23:59:42 +000082class TestNackList : public TestSessionInfo {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000083 protected:
pbos@webrtc.org3004c792013-05-07 12:36:21 +000084 static const size_t kMaxSeqNumListLength = 30;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000085
86 virtual void SetUp() {
87 TestSessionInfo::SetUp();
88 seq_num_list_length_ = 0;
89 memset(seq_num_list_, 0, sizeof(seq_num_list_));
90 }
91
philipel9d3ab612015-12-21 04:12:39 -080092 void BuildSeqNumList(uint16_t low, uint16_t high) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000093 size_t i = 0;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000094 while (low != high + 1) {
95 EXPECT_LT(i, kMaxSeqNumListLength);
96 if (i >= kMaxSeqNumListLength) {
97 seq_num_list_length_ = kMaxSeqNumListLength;
98 return;
99 }
100 seq_num_list_[i] = low;
101 low++;
102 i++;
103 }
104 seq_num_list_length_ = i;
105 }
106
107 void VerifyAll(int value) {
108 for (int i = 0; i < seq_num_list_length_; ++i)
109 EXPECT_EQ(seq_num_list_[i], value);
110 }
111
112 int seq_num_list_[kMaxSeqNumListLength];
113 int seq_num_list_length_;
114};
115
116TEST_F(TestSessionInfo, TestSimpleAPIs) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100117 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000118 packet_.seqNum = 0xFFFE;
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000119 packet_.sizeBytes = packet_buffer_size();
Niels Möllerabbc50e2019-04-24 09:41:16 +0200120 packet_.video_header.frame_type = VideoFrameType::kVideoFrameKey;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000121 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100122 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
123 packet_, frame_buffer_, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000124 EXPECT_FALSE(session_.HaveLastPacket());
Niels Möller8f7ce222019-03-21 15:43:58 +0100125 EXPECT_EQ(VideoFrameType::kVideoFrameKey, session_.FrameType());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000126
Niels Möllerd5e02f02019-02-20 13:12:21 +0100127 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000128 packet_.markerBit = true;
129 packet_.seqNum += 1;
Niels Möller375b3462019-01-10 15:35:56 +0100130 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
131 packet_, frame_buffer_, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000132 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000133 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
134 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
135
136 // Insert empty packet which will be the new high sequence number.
137 // To make things more difficult we will make sure to have a wrap here.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100138 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000139 packet_.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -0800140 packet_.seqNum = 2;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000141 packet_.sizeBytes = 0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200142 packet_.video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller375b3462019-01-10 15:35:56 +0100143 EXPECT_EQ(0, session_.InsertPacket(packet_, frame_buffer_, frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000144 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
145}
146
147TEST_F(TestSessionInfo, NormalOperation) {
148 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100149 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000150 packet_.markerBit = false;
151 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100152 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
153 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000154
Niels Möllerd5e02f02019-02-20 13:12:21 +0100155 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000156 for (int i = 1; i < 9; ++i) {
157 packet_.seqNum += 1;
158 FillPacket(i);
Niels Möller375b3462019-01-10 15:35:56 +0100159 ASSERT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
160 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000161 }
162
163 packet_.seqNum += 1;
164 packet_.markerBit = true;
165 FillPacket(9);
Niels Möller375b3462019-01-10 15:35:56 +0100166 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
167 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000168
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000169 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000170 for (int i = 0; i < 10; ++i) {
171 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000172 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000173 }
174}
175
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000176TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
177 packet_.seqNum = 0x0001;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100178 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000179 packet_.markerBit = true;
180 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100181 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
182 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000183
184 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100185 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000186 packet_.markerBit = true;
187 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100188 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000189 packet_.seqNum = 0x0000;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100190 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000191 packet_.markerBit = false;
192 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100193 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000194}
195
196TEST_F(TestSessionInfo, SetMarkerBitOnce) {
197 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100198 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000199 packet_.markerBit = true;
200 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100201 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
202 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000203 ++packet_.seqNum;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100204 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000205 packet_.markerBit = true;
206 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100207 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000208}
209
210TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
211 // Allow packets in the range 5-6.
212 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100213 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000214 packet_.markerBit = false;
215 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100216 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
217 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000218 // Insert an older packet with a first packet set.
219 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100220 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000221 packet_.markerBit = true;
222 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100223 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000224 packet_.seqNum = 0x0006;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100225 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000226 packet_.markerBit = true;
227 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100228 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
229 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000230 packet_.seqNum = 0x0008;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100231 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000232 packet_.markerBit = true;
233 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100234 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000235}
236
237TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
238 packet_.seqNum = 0xFFFE;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100239 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000240 packet_.markerBit = false;
241 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100242 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
243 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000244
245 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100246 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000247 packet_.markerBit = true;
248 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100249 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
250 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000251 packet_.seqNum = 0x0002;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100252 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000253 packet_.markerBit = false;
254 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100255 ASSERT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
256 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000257 packet_.seqNum = 0xFFF0;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100258 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000259 packet_.markerBit = false;
260 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100261 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000262 packet_.seqNum = 0x0006;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100263 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000264 packet_.markerBit = false;
265 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100266 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000267}
268
269TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
270 // Insert out of bound regular packets, and then the first and last packet.
271 // Verify that correct bounds are maintained.
272 packet_.seqNum = 0x0003;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100273 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000274 packet_.markerBit = false;
275 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100276 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
277 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000278 // Insert an older packet with a first packet set.
279 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100280 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000281 packet_.markerBit = false;
282 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100283 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
284 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000285 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100286 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000287 packet_.markerBit = false;
288 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100289 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000290 packet_.seqNum = 0x0010;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100291 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000292 packet_.markerBit = false;
293 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100294 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
295 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000296 packet_.seqNum = 0x0008;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100297 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000298 packet_.markerBit = true;
299 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100300 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
301 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000302
303 packet_.seqNum = 0x0009;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100304 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000305 packet_.markerBit = false;
306 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100307 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000308}
309
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000310TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100311 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000312 packet_.completeNALU = kNaluComplete;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200313 packet_.video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000314 packet_.sizeBytes = 0;
315 packet_.seqNum = 0;
316 packet_.markerBit = false;
Niels Möller375b3462019-01-10 15:35:56 +0100317 EXPECT_EQ(0, session_.InsertPacket(packet_, frame_buffer_, frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000318
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000319 EXPECT_EQ(0U, session_.MakeDecodable());
320 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000321}
322
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000323TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100324 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000325 packet_.completeNALU = kNaluComplete;
326 packet_.seqNum = 0;
327 packet_.markerBit = false;
328 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100329 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
330 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000331
Niels Möllerd5e02f02019-02-20 13:12:21 +0100332 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000333 packet_.completeNALU = kNaluComplete;
334 packet_.seqNum += 2;
335 packet_.markerBit = true;
336 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100337 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
338 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000339
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000340 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000341 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000342 SCOPED_TRACE("Calling VerifyNalu");
343 EXPECT_TRUE(VerifyNalu(0, 1, 0));
344 SCOPED_TRACE("Calling VerifyNalu");
345 EXPECT_TRUE(VerifyNalu(1, 1, 2));
346}
347
348TEST_F(TestNalUnits, LossInMiddleOfNalu) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100349 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000350 packet_.completeNALU = kNaluComplete;
351 packet_.seqNum = 0;
352 packet_.markerBit = false;
353 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100354 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
355 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000356
Niels Möllerd5e02f02019-02-20 13:12:21 +0100357 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000358 packet_.completeNALU = kNaluEnd;
359 packet_.seqNum += 2;
360 packet_.markerBit = true;
361 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100362 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
363 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000364
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000365 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
366 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000367 SCOPED_TRACE("Calling VerifyNalu");
368 EXPECT_TRUE(VerifyNalu(0, 1, 0));
369}
370
371TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100372 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000373 packet_.completeNALU = kNaluComplete;
374 packet_.seqNum = 0;
375 packet_.markerBit = false;
376 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100377 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
378 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000379
Niels Möllerd5e02f02019-02-20 13:12:21 +0100380 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000381 packet_.completeNALU = kNaluIncomplete;
382 packet_.seqNum += 2;
383 packet_.markerBit = false;
384 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100385 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
386 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000387
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000388 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
389 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000390 SCOPED_TRACE("Calling VerifyNalu");
391 EXPECT_TRUE(VerifyNalu(0, 1, 0));
392}
393
394TEST_F(TestNalUnits, ReorderWrapNoLoss) {
395 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100396 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000397 packet_.completeNALU = kNaluIncomplete;
398 packet_.seqNum += 1;
399 packet_.markerBit = false;
400 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100401 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
402 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000403
Niels Möllerd5e02f02019-02-20 13:12:21 +0100404 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000405 packet_.completeNALU = kNaluComplete;
406 packet_.seqNum -= 1;
407 packet_.markerBit = false;
408 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100409 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
410 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000411
Niels Möllerd5e02f02019-02-20 13:12:21 +0100412 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000413 packet_.completeNALU = kNaluEnd;
414 packet_.seqNum += 2;
415 packet_.markerBit = true;
416 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100417 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
418 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000419
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000420 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000421 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000422 SCOPED_TRACE("Calling VerifyNalu");
423 EXPECT_TRUE(VerifyNalu(0, 1, 0));
424}
425
426TEST_F(TestNalUnits, WrapLosses) {
427 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100428 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000429 packet_.completeNALU = kNaluIncomplete;
430 packet_.markerBit = false;
431 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100432 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
433 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000434
Niels Möllerd5e02f02019-02-20 13:12:21 +0100435 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000436 packet_.completeNALU = kNaluEnd;
437 packet_.seqNum += 2;
438 packet_.markerBit = true;
439 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100440 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
441 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000442
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000443 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000444 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000445}
446
447TEST_F(TestNalUnits, ReorderWrapLosses) {
448 packet_.seqNum = 0xFFFF;
449
Niels Möllerd5e02f02019-02-20 13:12:21 +0100450 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000451 packet_.completeNALU = kNaluEnd;
452 packet_.seqNum += 2;
453 packet_.markerBit = true;
454 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100455 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
456 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000457
458 packet_.seqNum -= 2;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100459 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000460 packet_.completeNALU = kNaluIncomplete;
461 packet_.markerBit = false;
462 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100463 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
464 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000465
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000466 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000467 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000468}
agalusza@google.comd177c102013-08-08 01:12:33 +0000469
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000470} // namespace webrtc