blob: 2846653b3fc689f5e759a900032de0dbd7893b17 [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
11#include <string.h>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/include/module_common_types.h"
14#include "modules/video_coding/packet.h"
15#include "modules/video_coding/session_info.h"
16#include "test/gtest.h"
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000017
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000018namespace webrtc {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000019
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000020class TestSessionInfo : public ::testing::Test {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000021 protected:
22 virtual void SetUp() {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000023 memset(packet_buffer_, 0, sizeof(packet_buffer_));
24 memset(frame_buffer_, 0, sizeof(frame_buffer_));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000025 session_.Reset();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000026 packet_.frameType = kVideoFrameDelta;
pbos@webrtc.org3004c792013-05-07 12:36:21 +000027 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000028 packet_.dataPtr = packet_buffer_;
29 packet_.seqNum = 0;
30 packet_.timestamp = 0;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000031 frame_data.rtt_ms = 0;
32 frame_data.rolling_average_packets_per_frame = -1;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000033 }
34
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000035 void FillPacket(uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000036 for (size_t i = 0; i < packet_buffer_size(); ++i)
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000037 packet_buffer_[i] = start_value + i;
38 }
39
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000040 void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000041 for (size_t j = 0; j < packet_buffer_size(); ++j) {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000042 ASSERT_EQ(start_value + j, start_ptr[j]);
43 }
44 }
45
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000046 size_t packet_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000047 return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
48 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000049 size_t frame_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000050 return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
51 }
52
53 enum { kPacketBufferSize = 10 };
54
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000055 uint8_t packet_buffer_[kPacketBufferSize];
pbos@webrtc.org3004c792013-05-07 12:36:21 +000056 uint8_t frame_buffer_[10 * kPacketBufferSize];
57
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000058 VCMSessionInfo session_;
59 VCMPacket packet_;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000060 FrameData frame_data;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000061};
62
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000063class TestNalUnits : public TestSessionInfo {
64 protected:
65 virtual void SetUp() {
66 TestSessionInfo::SetUp();
pwestin@webrtc.org56210572012-01-17 12:45:47 +000067 packet_.codec = kVideoCodecVP8;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000068 }
69
70 bool VerifyNalu(int offset, int packets_expected, int start_value) {
71 EXPECT_GE(session_.SessionLength(),
pbos@webrtc.org3004c792013-05-07 12:36:21 +000072 packets_expected * packet_buffer_size());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000073 for (int i = 0; i < packets_expected; ++i) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000074 int packet_index = (offset + i) * packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000075 VerifyPacket(frame_buffer_ + packet_index, start_value + i);
76 }
77 return true;
78 }
79};
80
mikhal@webrtc.orgcd648862012-01-03 23:59:42 +000081class TestNackList : public TestSessionInfo {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000082 protected:
pbos@webrtc.org3004c792013-05-07 12:36:21 +000083 static const size_t kMaxSeqNumListLength = 30;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000084
85 virtual void SetUp() {
86 TestSessionInfo::SetUp();
87 seq_num_list_length_ = 0;
88 memset(seq_num_list_, 0, sizeof(seq_num_list_));
89 }
90
philipel9d3ab612015-12-21 04:12:39 -080091 void BuildSeqNumList(uint16_t low, uint16_t high) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000092 size_t i = 0;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000093 while (low != high + 1) {
94 EXPECT_LT(i, kMaxSeqNumListLength);
95 if (i >= kMaxSeqNumListLength) {
96 seq_num_list_length_ = kMaxSeqNumListLength;
97 return;
98 }
99 seq_num_list_[i] = low;
100 low++;
101 i++;
102 }
103 seq_num_list_length_ = i;
104 }
105
106 void VerifyAll(int value) {
107 for (int i = 0; i < seq_num_list_length_; ++i)
108 EXPECT_EQ(seq_num_list_[i], value);
109 }
110
111 int seq_num_list_[kMaxSeqNumListLength];
112 int seq_num_list_length_;
113};
114
115TEST_F(TestSessionInfo, TestSimpleAPIs) {
johan0d1b2b62017-01-10 04:21:35 -0800116 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000117 packet_.seqNum = 0xFFFE;
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000118 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000119 packet_.frameType = kVideoFrameKey;
120 FillPacket(0);
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000121 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000122 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
123 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000124 EXPECT_FALSE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000125 EXPECT_EQ(kVideoFrameKey, session_.FrameType());
126
johan0d1b2b62017-01-10 04:21:35 -0800127 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000128 packet_.markerBit = true;
129 packet_.seqNum += 1;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000130 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000131 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
132 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000133 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000134 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
135 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
136
137 // Insert empty packet which will be the new high sequence number.
138 // To make things more difficult we will make sure to have a wrap here.
johan0d1b2b62017-01-10 04:21:35 -0800139 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000140 packet_.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -0800141 packet_.seqNum = 2;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000142 packet_.sizeBytes = 0;
pbos22993e12015-10-19 02:39:06 -0700143 packet_.frameType = kEmptyFrame;
philipel9d3ab612015-12-21 04:12:39 -0800144 EXPECT_EQ(
145 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000146 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
147}
148
149TEST_F(TestSessionInfo, NormalOperation) {
150 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800151 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000152 packet_.markerBit = false;
153 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000154 EXPECT_EQ(packet_buffer_size(),
155 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
156 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000157
johan0d1b2b62017-01-10 04:21:35 -0800158 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000159 for (int i = 1; i < 9; ++i) {
160 packet_.seqNum += 1;
161 FillPacket(i);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000162 ASSERT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800163 static_cast<size_t>(session_.InsertPacket(
164 packet_, frame_buffer_, kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000165 }
166
167 packet_.seqNum += 1;
168 packet_.markerBit = true;
169 FillPacket(9);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000170 EXPECT_EQ(packet_buffer_size(),
171 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
172 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000173
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000174 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000175 for (int i = 0; i < 10; ++i) {
176 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000177 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000178 }
179}
180
agalusza@google.comd177c102013-08-08 01:12:33 +0000181TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
182 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800183 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000184 packet_.markerBit = false;
185 FillPacket(3);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000186 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800187 static_cast<size_t>(session_.InsertPacket(
188 packet_, frame_buffer_, kWithErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000189 EXPECT_TRUE(session_.decodable());
190}
191
192TEST_F(TestSessionInfo, SelectiveDecodableState) {
193 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800194 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000195 packet_.markerBit = false;
196 FillPacket(1);
197 frame_data.rolling_average_packets_per_frame = 11;
198 frame_data.rtt_ms = 150;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000199 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800200 static_cast<size_t>(session_.InsertPacket(
201 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000202 EXPECT_FALSE(session_.decodable());
203
204 packet_.seqNum -= 1;
205 FillPacket(0);
johan0d1b2b62017-01-10 04:21:35 -0800206 packet_.is_first_packet_in_frame = true;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000207 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800208 static_cast<size_t>(session_.InsertPacket(
209 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000210 EXPECT_TRUE(session_.decodable());
211
johan0d1b2b62017-01-10 04:21:35 -0800212 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000213 packet_.seqNum += 1;
214 for (int i = 2; i < 8; ++i) {
215 packet_.seqNum += 1;
216 FillPacket(i);
philipel9d3ab612015-12-21 04:12:39 -0800217 EXPECT_EQ(packet_buffer_size(),
218 static_cast<size_t>(session_.InsertPacket(
219 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000220 EXPECT_TRUE(session_.decodable());
221 }
222
223 packet_.seqNum += 1;
224 FillPacket(8);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000225 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800226 static_cast<size_t>(session_.InsertPacket(
227 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000228 EXPECT_TRUE(session_.decodable());
229}
230
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000231TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
232 packet_.seqNum = 0x0001;
johan0d1b2b62017-01-10 04:21:35 -0800233 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000234 packet_.markerBit = true;
235 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000236 EXPECT_EQ(packet_buffer_size(),
237 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
238 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000239
240 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800241 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000242 packet_.markerBit = true;
243 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800244 EXPECT_EQ(
245 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000246 packet_.seqNum = 0x0000;
johan0d1b2b62017-01-10 04:21:35 -0800247 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000248 packet_.markerBit = false;
249 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800250 EXPECT_EQ(
251 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000252}
253
254TEST_F(TestSessionInfo, SetMarkerBitOnce) {
255 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800256 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000257 packet_.markerBit = true;
258 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000259 EXPECT_EQ(packet_buffer_size(),
260 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
261 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000262 ++packet_.seqNum;
johan0d1b2b62017-01-10 04:21:35 -0800263 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000264 packet_.markerBit = true;
265 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800266 EXPECT_EQ(
267 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000268}
269
270TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
271 // Allow packets in the range 5-6.
272 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800273 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000274 packet_.markerBit = false;
275 FillPacket(1);
276 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000277 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
278 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000279 // Insert an older packet with a first packet set.
280 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800281 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000282 packet_.markerBit = true;
283 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800284 EXPECT_EQ(
285 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000286 packet_.seqNum = 0x0006;
johan0d1b2b62017-01-10 04:21:35 -0800287 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000288 packet_.markerBit = true;
289 FillPacket(1);
290 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000291 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
292 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000293 packet_.seqNum = 0x0008;
johan0d1b2b62017-01-10 04:21:35 -0800294 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000295 packet_.markerBit = true;
296 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800297 EXPECT_EQ(
298 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000299}
300
301TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
302 packet_.seqNum = 0xFFFE;
johan0d1b2b62017-01-10 04:21:35 -0800303 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000304 packet_.markerBit = false;
305 FillPacket(1);
306 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000307 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
308 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000309
310 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800311 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000312 packet_.markerBit = true;
313 FillPacket(1);
314 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000315 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
316 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000317 packet_.seqNum = 0x0002;
johan0d1b2b62017-01-10 04:21:35 -0800318 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000319 packet_.markerBit = false;
320 FillPacket(1);
321 ASSERT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000322 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
323 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000324 packet_.seqNum = 0xFFF0;
johan0d1b2b62017-01-10 04:21:35 -0800325 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000326 packet_.markerBit = false;
327 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800328 EXPECT_EQ(
329 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000330 packet_.seqNum = 0x0006;
johan0d1b2b62017-01-10 04:21:35 -0800331 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000332 packet_.markerBit = false;
333 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800334 EXPECT_EQ(
335 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000336}
337
338TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
339 // Insert out of bound regular packets, and then the first and last packet.
340 // Verify that correct bounds are maintained.
341 packet_.seqNum = 0x0003;
johan0d1b2b62017-01-10 04:21:35 -0800342 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000343 packet_.markerBit = false;
344 FillPacket(1);
345 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000346 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
347 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000348 // Insert an older packet with a first packet set.
349 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800350 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000351 packet_.markerBit = false;
352 FillPacket(1);
353 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000354 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
355 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000356 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800357 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000358 packet_.markerBit = false;
359 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800360 EXPECT_EQ(
361 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000362 packet_.seqNum = 0x0010;
johan0d1b2b62017-01-10 04:21:35 -0800363 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000364 packet_.markerBit = false;
365 FillPacket(1);
366 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000367 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
368 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000369 packet_.seqNum = 0x0008;
johan0d1b2b62017-01-10 04:21:35 -0800370 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000371 packet_.markerBit = true;
372 FillPacket(1);
373 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000374 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
375 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000376
377 packet_.seqNum = 0x0009;
johan0d1b2b62017-01-10 04:21:35 -0800378 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000379 packet_.markerBit = false;
380 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800381 EXPECT_EQ(
382 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000383}
384
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000385TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
johan0d1b2b62017-01-10 04:21:35 -0800386 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000387 packet_.completeNALU = kNaluComplete;
pbos22993e12015-10-19 02:39:06 -0700388 packet_.frameType = kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000389 packet_.sizeBytes = 0;
390 packet_.seqNum = 0;
391 packet_.markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -0800392 EXPECT_EQ(
393 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000394
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000395 EXPECT_EQ(0U, session_.MakeDecodable());
396 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000397}
398
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000399TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
johan0d1b2b62017-01-10 04:21:35 -0800400 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000401 packet_.completeNALU = kNaluComplete;
402 packet_.seqNum = 0;
403 packet_.markerBit = false;
404 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000405 EXPECT_EQ(packet_buffer_size(),
406 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
407 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000408
johan0d1b2b62017-01-10 04:21:35 -0800409 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000410 packet_.completeNALU = kNaluComplete;
411 packet_.seqNum += 2;
412 packet_.markerBit = true;
413 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000414 EXPECT_EQ(packet_buffer_size(),
415 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
416 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000417
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000418 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000419 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000420 SCOPED_TRACE("Calling VerifyNalu");
421 EXPECT_TRUE(VerifyNalu(0, 1, 0));
422 SCOPED_TRACE("Calling VerifyNalu");
423 EXPECT_TRUE(VerifyNalu(1, 1, 2));
424}
425
426TEST_F(TestNalUnits, LossInMiddleOfNalu) {
johan0d1b2b62017-01-10 04:21:35 -0800427 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000428 packet_.completeNALU = kNaluComplete;
429 packet_.seqNum = 0;
430 packet_.markerBit = false;
431 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000432 EXPECT_EQ(packet_buffer_size(),
433 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
434 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000435
johan0d1b2b62017-01-10 04:21:35 -0800436 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000437 packet_.completeNALU = kNaluEnd;
438 packet_.seqNum += 2;
439 packet_.markerBit = true;
440 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000441 EXPECT_EQ(packet_buffer_size(),
442 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
443 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000444
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000445 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
446 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000447 SCOPED_TRACE("Calling VerifyNalu");
448 EXPECT_TRUE(VerifyNalu(0, 1, 0));
449}
450
451TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
johan0d1b2b62017-01-10 04:21:35 -0800452 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000453 packet_.completeNALU = kNaluComplete;
454 packet_.seqNum = 0;
455 packet_.markerBit = false;
456 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000457 EXPECT_EQ(packet_buffer_size(),
458 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
459 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000460
johan0d1b2b62017-01-10 04:21:35 -0800461 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000462 packet_.completeNALU = kNaluIncomplete;
463 packet_.seqNum += 2;
464 packet_.markerBit = false;
465 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000466 EXPECT_EQ(packet_buffer_size(),
467 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
468 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000469
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000470 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
471 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000472 SCOPED_TRACE("Calling VerifyNalu");
473 EXPECT_TRUE(VerifyNalu(0, 1, 0));
474}
475
476TEST_F(TestNalUnits, ReorderWrapNoLoss) {
477 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800478 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000479 packet_.completeNALU = kNaluIncomplete;
480 packet_.seqNum += 1;
481 packet_.markerBit = false;
482 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000483 EXPECT_EQ(packet_buffer_size(),
484 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
485 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000486
johan0d1b2b62017-01-10 04:21:35 -0800487 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000488 packet_.completeNALU = kNaluComplete;
489 packet_.seqNum -= 1;
490 packet_.markerBit = false;
491 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000492 EXPECT_EQ(packet_buffer_size(),
493 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
494 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000495
johan0d1b2b62017-01-10 04:21:35 -0800496 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000497 packet_.completeNALU = kNaluEnd;
498 packet_.seqNum += 2;
499 packet_.markerBit = true;
500 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000501 EXPECT_EQ(packet_buffer_size(),
502 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
503 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000504
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000505 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000506 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000507 SCOPED_TRACE("Calling VerifyNalu");
508 EXPECT_TRUE(VerifyNalu(0, 1, 0));
509}
510
511TEST_F(TestNalUnits, WrapLosses) {
512 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800513 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000514 packet_.completeNALU = kNaluIncomplete;
515 packet_.markerBit = false;
516 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000517 EXPECT_EQ(packet_buffer_size(),
518 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
519 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000520
johan0d1b2b62017-01-10 04:21:35 -0800521 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000522 packet_.completeNALU = kNaluEnd;
523 packet_.seqNum += 2;
524 packet_.markerBit = true;
525 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000526 EXPECT_EQ(packet_buffer_size(),
527 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
528 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000529
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000530 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000531 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000532}
533
534TEST_F(TestNalUnits, ReorderWrapLosses) {
535 packet_.seqNum = 0xFFFF;
536
johan0d1b2b62017-01-10 04:21:35 -0800537 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000538 packet_.completeNALU = kNaluEnd;
539 packet_.seqNum += 2;
540 packet_.markerBit = true;
541 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000542 EXPECT_EQ(packet_buffer_size(),
543 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
544 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000545
546 packet_.seqNum -= 2;
johan0d1b2b62017-01-10 04:21:35 -0800547 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000548 packet_.completeNALU = kNaluIncomplete;
549 packet_.markerBit = false;
550 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000551 EXPECT_EQ(packet_buffer_size(),
552 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
553 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000554
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000555 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000556 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000557}
agalusza@google.comd177c102013-08-08 01:12:33 +0000558
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000559} // namespace webrtc