blob: 1863ad7eef68608df8fa45237caf9986a1ddd31d [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();
26 packet_.Reset();
27 packet_.frameType = 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();
pwestin@webrtc.org56210572012-01-17 12:45:47 +000068 packet_.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) {
johan0d1b2b62017-01-10 04:21:35 -0800117 packet_.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();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000120 packet_.frameType = kVideoFrameKey;
121 FillPacket(0);
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000122 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000123 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
124 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000125 EXPECT_FALSE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000126 EXPECT_EQ(kVideoFrameKey, session_.FrameType());
127
johan0d1b2b62017-01-10 04:21:35 -0800128 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000129 packet_.markerBit = true;
130 packet_.seqNum += 1;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000131 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000132 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
133 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000134 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000135 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
136 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
137
138 // Insert empty packet which will be the new high sequence number.
139 // To make things more difficult we will make sure to have a wrap here.
johan0d1b2b62017-01-10 04:21:35 -0800140 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000141 packet_.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -0800142 packet_.seqNum = 2;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000143 packet_.sizeBytes = 0;
pbos22993e12015-10-19 02:39:06 -0700144 packet_.frameType = kEmptyFrame;
philipel9d3ab612015-12-21 04:12:39 -0800145 EXPECT_EQ(
146 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000147 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
148}
149
150TEST_F(TestSessionInfo, NormalOperation) {
151 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800152 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000153 packet_.markerBit = false;
154 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000155 EXPECT_EQ(packet_buffer_size(),
156 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
157 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000158
johan0d1b2b62017-01-10 04:21:35 -0800159 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000160 for (int i = 1; i < 9; ++i) {
161 packet_.seqNum += 1;
162 FillPacket(i);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000163 ASSERT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800164 static_cast<size_t>(session_.InsertPacket(
165 packet_, frame_buffer_, kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000166 }
167
168 packet_.seqNum += 1;
169 packet_.markerBit = true;
170 FillPacket(9);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000171 EXPECT_EQ(packet_buffer_size(),
172 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
173 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000174
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000175 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000176 for (int i = 0; i < 10; ++i) {
177 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000178 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000179 }
180}
181
agalusza@google.comd177c102013-08-08 01:12:33 +0000182TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
183 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800184 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000185 packet_.markerBit = false;
186 FillPacket(3);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000187 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800188 static_cast<size_t>(session_.InsertPacket(
189 packet_, frame_buffer_, kWithErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000190 EXPECT_TRUE(session_.decodable());
191}
192
193TEST_F(TestSessionInfo, SelectiveDecodableState) {
194 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800195 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000196 packet_.markerBit = false;
197 FillPacket(1);
198 frame_data.rolling_average_packets_per_frame = 11;
199 frame_data.rtt_ms = 150;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000200 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800201 static_cast<size_t>(session_.InsertPacket(
202 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000203 EXPECT_FALSE(session_.decodable());
204
205 packet_.seqNum -= 1;
206 FillPacket(0);
johan0d1b2b62017-01-10 04:21:35 -0800207 packet_.is_first_packet_in_frame = true;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000208 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800209 static_cast<size_t>(session_.InsertPacket(
210 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000211 EXPECT_TRUE(session_.decodable());
212
johan0d1b2b62017-01-10 04:21:35 -0800213 packet_.is_first_packet_in_frame = false;
agalusza@google.comd177c102013-08-08 01:12:33 +0000214 packet_.seqNum += 1;
215 for (int i = 2; i < 8; ++i) {
216 packet_.seqNum += 1;
217 FillPacket(i);
philipel9d3ab612015-12-21 04:12:39 -0800218 EXPECT_EQ(packet_buffer_size(),
219 static_cast<size_t>(session_.InsertPacket(
220 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000221 EXPECT_TRUE(session_.decodable());
222 }
223
224 packet_.seqNum += 1;
225 FillPacket(8);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000226 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800227 static_cast<size_t>(session_.InsertPacket(
228 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000229 EXPECT_TRUE(session_.decodable());
230}
231
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000232TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
233 packet_.seqNum = 0x0001;
johan0d1b2b62017-01-10 04:21:35 -0800234 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000235 packet_.markerBit = true;
236 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000237 EXPECT_EQ(packet_buffer_size(),
238 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
239 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000240
241 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800242 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000243 packet_.markerBit = true;
244 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800245 EXPECT_EQ(
246 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000247 packet_.seqNum = 0x0000;
johan0d1b2b62017-01-10 04:21:35 -0800248 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000249 packet_.markerBit = false;
250 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800251 EXPECT_EQ(
252 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000253}
254
255TEST_F(TestSessionInfo, SetMarkerBitOnce) {
256 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800257 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000258 packet_.markerBit = true;
259 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000260 EXPECT_EQ(packet_buffer_size(),
261 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
262 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000263 ++packet_.seqNum;
johan0d1b2b62017-01-10 04:21:35 -0800264 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000265 packet_.markerBit = true;
266 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800267 EXPECT_EQ(
268 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000269}
270
271TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
272 // Allow packets in the range 5-6.
273 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800274 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000275 packet_.markerBit = false;
276 FillPacket(1);
277 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000278 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
279 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000280 // Insert an older packet with a first packet set.
281 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800282 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000283 packet_.markerBit = true;
284 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800285 EXPECT_EQ(
286 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000287 packet_.seqNum = 0x0006;
johan0d1b2b62017-01-10 04:21:35 -0800288 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000289 packet_.markerBit = true;
290 FillPacket(1);
291 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000292 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
293 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000294 packet_.seqNum = 0x0008;
johan0d1b2b62017-01-10 04:21:35 -0800295 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000296 packet_.markerBit = true;
297 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800298 EXPECT_EQ(
299 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000300}
301
302TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
303 packet_.seqNum = 0xFFFE;
johan0d1b2b62017-01-10 04:21:35 -0800304 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000305 packet_.markerBit = false;
306 FillPacket(1);
307 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000308 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
309 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000310
311 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800312 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000313 packet_.markerBit = true;
314 FillPacket(1);
315 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000316 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
317 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000318 packet_.seqNum = 0x0002;
johan0d1b2b62017-01-10 04:21:35 -0800319 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000320 packet_.markerBit = false;
321 FillPacket(1);
322 ASSERT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000323 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
324 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000325 packet_.seqNum = 0xFFF0;
johan0d1b2b62017-01-10 04:21:35 -0800326 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000327 packet_.markerBit = false;
328 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800329 EXPECT_EQ(
330 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000331 packet_.seqNum = 0x0006;
johan0d1b2b62017-01-10 04:21:35 -0800332 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000333 packet_.markerBit = false;
334 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800335 EXPECT_EQ(
336 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000337}
338
339TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
340 // Insert out of bound regular packets, and then the first and last packet.
341 // Verify that correct bounds are maintained.
342 packet_.seqNum = 0x0003;
johan0d1b2b62017-01-10 04:21:35 -0800343 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000344 packet_.markerBit = false;
345 FillPacket(1);
346 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000347 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
348 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000349 // Insert an older packet with a first packet set.
350 packet_.seqNum = 0x0005;
johan0d1b2b62017-01-10 04:21:35 -0800351 packet_.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000352 packet_.markerBit = false;
353 FillPacket(1);
354 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000355 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
356 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000357 packet_.seqNum = 0x0004;
johan0d1b2b62017-01-10 04:21:35 -0800358 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000359 packet_.markerBit = false;
360 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800361 EXPECT_EQ(
362 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000363 packet_.seqNum = 0x0010;
johan0d1b2b62017-01-10 04:21:35 -0800364 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000365 packet_.markerBit = false;
366 FillPacket(1);
367 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000368 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
369 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000370 packet_.seqNum = 0x0008;
johan0d1b2b62017-01-10 04:21:35 -0800371 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000372 packet_.markerBit = true;
373 FillPacket(1);
374 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000375 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
376 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000377
378 packet_.seqNum = 0x0009;
johan0d1b2b62017-01-10 04:21:35 -0800379 packet_.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000380 packet_.markerBit = false;
381 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800382 EXPECT_EQ(
383 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000384}
385
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000386TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
johan0d1b2b62017-01-10 04:21:35 -0800387 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000388 packet_.completeNALU = kNaluComplete;
pbos22993e12015-10-19 02:39:06 -0700389 packet_.frameType = kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000390 packet_.sizeBytes = 0;
391 packet_.seqNum = 0;
392 packet_.markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -0800393 EXPECT_EQ(
394 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000395
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000396 EXPECT_EQ(0U, session_.MakeDecodable());
397 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000398}
399
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000400TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
johan0d1b2b62017-01-10 04:21:35 -0800401 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000402 packet_.completeNALU = kNaluComplete;
403 packet_.seqNum = 0;
404 packet_.markerBit = false;
405 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000406 EXPECT_EQ(packet_buffer_size(),
407 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
408 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000409
johan0d1b2b62017-01-10 04:21:35 -0800410 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000411 packet_.completeNALU = kNaluComplete;
412 packet_.seqNum += 2;
413 packet_.markerBit = true;
414 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000415 EXPECT_EQ(packet_buffer_size(),
416 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
417 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000418
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000419 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000420 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000421 SCOPED_TRACE("Calling VerifyNalu");
422 EXPECT_TRUE(VerifyNalu(0, 1, 0));
423 SCOPED_TRACE("Calling VerifyNalu");
424 EXPECT_TRUE(VerifyNalu(1, 1, 2));
425}
426
427TEST_F(TestNalUnits, LossInMiddleOfNalu) {
johan0d1b2b62017-01-10 04:21:35 -0800428 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000429 packet_.completeNALU = kNaluComplete;
430 packet_.seqNum = 0;
431 packet_.markerBit = false;
432 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000433 EXPECT_EQ(packet_buffer_size(),
434 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
435 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000436
johan0d1b2b62017-01-10 04:21:35 -0800437 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000438 packet_.completeNALU = kNaluEnd;
439 packet_.seqNum += 2;
440 packet_.markerBit = true;
441 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000442 EXPECT_EQ(packet_buffer_size(),
443 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
444 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000445
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000446 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
447 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000448 SCOPED_TRACE("Calling VerifyNalu");
449 EXPECT_TRUE(VerifyNalu(0, 1, 0));
450}
451
452TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
johan0d1b2b62017-01-10 04:21:35 -0800453 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000454 packet_.completeNALU = kNaluComplete;
455 packet_.seqNum = 0;
456 packet_.markerBit = false;
457 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000458 EXPECT_EQ(packet_buffer_size(),
459 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
460 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000461
johan0d1b2b62017-01-10 04:21:35 -0800462 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000463 packet_.completeNALU = kNaluIncomplete;
464 packet_.seqNum += 2;
465 packet_.markerBit = false;
466 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000467 EXPECT_EQ(packet_buffer_size(),
468 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
469 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000470
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000471 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
472 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000473 SCOPED_TRACE("Calling VerifyNalu");
474 EXPECT_TRUE(VerifyNalu(0, 1, 0));
475}
476
477TEST_F(TestNalUnits, ReorderWrapNoLoss) {
478 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800479 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000480 packet_.completeNALU = kNaluIncomplete;
481 packet_.seqNum += 1;
482 packet_.markerBit = false;
483 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000484 EXPECT_EQ(packet_buffer_size(),
485 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
486 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000487
johan0d1b2b62017-01-10 04:21:35 -0800488 packet_.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000489 packet_.completeNALU = kNaluComplete;
490 packet_.seqNum -= 1;
491 packet_.markerBit = false;
492 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000493 EXPECT_EQ(packet_buffer_size(),
494 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
495 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000496
johan0d1b2b62017-01-10 04:21:35 -0800497 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000498 packet_.completeNALU = kNaluEnd;
499 packet_.seqNum += 2;
500 packet_.markerBit = true;
501 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000502 EXPECT_EQ(packet_buffer_size(),
503 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
504 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000505
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000506 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000507 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000508 SCOPED_TRACE("Calling VerifyNalu");
509 EXPECT_TRUE(VerifyNalu(0, 1, 0));
510}
511
512TEST_F(TestNalUnits, WrapLosses) {
513 packet_.seqNum = 0xFFFF;
johan0d1b2b62017-01-10 04:21:35 -0800514 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000515 packet_.completeNALU = kNaluIncomplete;
516 packet_.markerBit = false;
517 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000518 EXPECT_EQ(packet_buffer_size(),
519 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
520 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000521
johan0d1b2b62017-01-10 04:21:35 -0800522 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000523 packet_.completeNALU = kNaluEnd;
524 packet_.seqNum += 2;
525 packet_.markerBit = true;
526 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000527 EXPECT_EQ(packet_buffer_size(),
528 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
529 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000530
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000531 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000532 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000533}
534
535TEST_F(TestNalUnits, ReorderWrapLosses) {
536 packet_.seqNum = 0xFFFF;
537
johan0d1b2b62017-01-10 04:21:35 -0800538 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000539 packet_.completeNALU = kNaluEnd;
540 packet_.seqNum += 2;
541 packet_.markerBit = true;
542 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000543 EXPECT_EQ(packet_buffer_size(),
544 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
545 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000546
547 packet_.seqNum -= 2;
johan0d1b2b62017-01-10 04:21:35 -0800548 packet_.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000549 packet_.completeNALU = kNaluIncomplete;
550 packet_.markerBit = false;
551 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000552 EXPECT_EQ(packet_buffer_size(),
553 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
554 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000555
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000556 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000557 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000558}
agalusza@google.comd177c102013-08-08 01:12:33 +0000559
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000560} // namespace webrtc