blob: 490604843fe637de1607226bce172afca436789e [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
pbos@webrtc.orga4407322013-07-16 12:32:05 +000013#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010014#include "webrtc/modules/include/module_common_types.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010015#include "webrtc/modules/video_coding/packet.h"
16#include "webrtc/modules/video_coding/session_info.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
64class TestVP8Partitions : public TestSessionInfo {
65 protected:
66 enum { kMaxVP8Partitions = 9 };
67
68 virtual void SetUp() {
69 TestSessionInfo::SetUp();
70 vp8_header_ = &packet_header_.type.Video.codecHeader.VP8;
71 packet_header_.frameType = kVideoFrameDelta;
wu@webrtc.org822fbd82013-08-15 23:38:54 +000072 packet_header_.type.Video.codec = kRtpVideoVp8;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000073 vp8_header_->InitRTPVideoHeaderVP8();
74 fragmentation_.VerifyAndAllocateFragmentationHeader(kMaxVP8Partitions);
75 }
76
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000077 bool VerifyPartition(int partition_id,
78 int packets_expected,
79 int start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000080 EXPECT_EQ(packets_expected * packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000081 fragmentation_.fragmentationLength[partition_id]);
82 for (int i = 0; i < packets_expected; ++i) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000083 size_t packet_index = fragmentation_.fragmentationOffset[partition_id] +
pbos@webrtc.org3004c792013-05-07 12:36:21 +000084 i * packet_buffer_size();
85 if (packet_index + packet_buffer_size() > frame_buffer_size())
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000086 return false;
87 VerifyPacket(frame_buffer_ + packet_index, start_value + i);
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000088 }
89 return true;
90 }
91
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000092 WebRtcRTPHeader packet_header_;
93 RTPVideoHeaderVP8* vp8_header_;
94 RTPFragmentationHeader fragmentation_;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000095};
96
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000097class TestNalUnits : public TestSessionInfo {
98 protected:
99 virtual void SetUp() {
100 TestSessionInfo::SetUp();
pwestin@webrtc.org56210572012-01-17 12:45:47 +0000101 packet_.codec = kVideoCodecVP8;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000102 }
103
104 bool VerifyNalu(int offset, int packets_expected, int start_value) {
105 EXPECT_GE(session_.SessionLength(),
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000106 packets_expected * packet_buffer_size());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000107 for (int i = 0; i < packets_expected; ++i) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000108 int packet_index = (offset + i) * packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000109 VerifyPacket(frame_buffer_ + packet_index, start_value + i);
110 }
111 return true;
112 }
113};
114
mikhal@webrtc.orgcd648862012-01-03 23:59:42 +0000115class TestNackList : public TestSessionInfo {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000116 protected:
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000117 static const size_t kMaxSeqNumListLength = 30;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000118
119 virtual void SetUp() {
120 TestSessionInfo::SetUp();
121 seq_num_list_length_ = 0;
122 memset(seq_num_list_, 0, sizeof(seq_num_list_));
123 }
124
125 void BuildSeqNumList(uint16_t low,
126 uint16_t high) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000127 size_t i = 0;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000128 while (low != high + 1) {
129 EXPECT_LT(i, kMaxSeqNumListLength);
130 if (i >= kMaxSeqNumListLength) {
131 seq_num_list_length_ = kMaxSeqNumListLength;
132 return;
133 }
134 seq_num_list_[i] = low;
135 low++;
136 i++;
137 }
138 seq_num_list_length_ = i;
139 }
140
141 void VerifyAll(int value) {
142 for (int i = 0; i < seq_num_list_length_; ++i)
143 EXPECT_EQ(seq_num_list_[i], value);
144 }
145
146 int seq_num_list_[kMaxSeqNumListLength];
147 int seq_num_list_length_;
148};
149
150TEST_F(TestSessionInfo, TestSimpleAPIs) {
151 packet_.isFirstPacket = true;
152 packet_.seqNum = 0xFFFE;
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000153 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000154 packet_.frameType = kVideoFrameKey;
155 FillPacket(0);
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000156 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000157 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
158 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000159 EXPECT_FALSE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000160 EXPECT_EQ(kVideoFrameKey, session_.FrameType());
161
162 packet_.isFirstPacket = false;
163 packet_.markerBit = true;
164 packet_.seqNum += 1;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000165 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000166 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
167 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000168 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000169 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
170 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
171
172 // Insert empty packet which will be the new high sequence number.
173 // To make things more difficult we will make sure to have a wrap here.
174 packet_.isFirstPacket = false;
175 packet_.markerBit = true;
176 packet_.seqNum = 2;
177 packet_.sizeBytes = 0;
pbos22993e12015-10-19 02:39:06 -0700178 packet_.frameType = kEmptyFrame;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000179 EXPECT_EQ(0,
agalusza@google.coma7e360e2013-08-01 03:15:08 +0000180 session_.InsertPacket(packet_,
181 frame_buffer_,
182 kNoErrors,
183 frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000184 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
185}
186
187TEST_F(TestSessionInfo, NormalOperation) {
188 packet_.seqNum = 0xFFFF;
189 packet_.isFirstPacket = true;
190 packet_.markerBit = false;
191 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000192 EXPECT_EQ(packet_buffer_size(),
193 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
194 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000195
196 packet_.isFirstPacket = false;
197 for (int i = 1; i < 9; ++i) {
198 packet_.seqNum += 1;
199 FillPacket(i);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000200 ASSERT_EQ(packet_buffer_size(),
201 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
202 kNoErrors,
203 frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000204 }
205
206 packet_.seqNum += 1;
207 packet_.markerBit = true;
208 FillPacket(9);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000209 EXPECT_EQ(packet_buffer_size(),
210 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
211 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000212
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000213 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000214 for (int i = 0; i < 10; ++i) {
215 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000216 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000217 }
218}
219
agalusza@google.comd177c102013-08-08 01:12:33 +0000220TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
221 packet_.seqNum = 0xFFFF;
222 packet_.isFirstPacket = false;
223 packet_.markerBit = false;
224 FillPacket(3);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000225 EXPECT_EQ(packet_buffer_size(),
226 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
227 kWithErrors,
228 frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000229 EXPECT_TRUE(session_.decodable());
230}
231
232TEST_F(TestSessionInfo, SelectiveDecodableState) {
233 packet_.seqNum = 0xFFFF;
234 packet_.isFirstPacket = false;
235 packet_.markerBit = false;
236 FillPacket(1);
237 frame_data.rolling_average_packets_per_frame = 11;
238 frame_data.rtt_ms = 150;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000239 EXPECT_EQ(packet_buffer_size(),
240 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
241 kSelectiveErrors,
242 frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000243 EXPECT_FALSE(session_.decodable());
244
245 packet_.seqNum -= 1;
246 FillPacket(0);
247 packet_.isFirstPacket = true;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000248 EXPECT_EQ(packet_buffer_size(),
249 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
250 kSelectiveErrors,
251 frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000252 EXPECT_TRUE(session_.decodable());
253
254 packet_.isFirstPacket = false;
255 packet_.seqNum += 1;
256 for (int i = 2; i < 8; ++i) {
257 packet_.seqNum += 1;
258 FillPacket(i);
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 kSelectiveErrors,
262 frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000263 EXPECT_TRUE(session_.decodable());
264 }
265
266 packet_.seqNum += 1;
267 FillPacket(8);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000268 EXPECT_EQ(packet_buffer_size(),
269 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
270 kSelectiveErrors,
271 frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000272 EXPECT_TRUE(session_.decodable());
273}
274
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000275TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
276 packet_.seqNum = 0x0001;
277 packet_.isFirstPacket = true;
278 packet_.markerBit = true;
279 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000280 EXPECT_EQ(packet_buffer_size(),
281 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
282 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000283
284 packet_.seqNum = 0x0004;
285 packet_.isFirstPacket = true;
286 packet_.markerBit = true;
287 FillPacket(1);
288 EXPECT_EQ(-3, session_.InsertPacket(packet_,
289 frame_buffer_,
290 kNoErrors,
291 frame_data));
292 packet_.seqNum = 0x0000;
293 packet_.isFirstPacket = false;
294 packet_.markerBit = false;
295 FillPacket(1);
296 EXPECT_EQ(-3, session_.InsertPacket(packet_,
297 frame_buffer_,
298 kNoErrors,
299 frame_data));
300}
301
302TEST_F(TestSessionInfo, SetMarkerBitOnce) {
303 packet_.seqNum = 0x0005;
304 packet_.isFirstPacket = false;
305 packet_.markerBit = true;
306 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000307 EXPECT_EQ(packet_buffer_size(),
308 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
309 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000310 ++packet_.seqNum;
311 packet_.isFirstPacket = true;
312 packet_.markerBit = true;
313 FillPacket(1);
314 EXPECT_EQ(-3, session_.InsertPacket(packet_,
315 frame_buffer_,
316 kNoErrors,
317 frame_data));
318}
319
320TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
321 // Allow packets in the range 5-6.
322 packet_.seqNum = 0x0005;
323 packet_.isFirstPacket = true;
324 packet_.markerBit = false;
325 FillPacket(1);
326 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000327 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
328 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000329 // Insert an older packet with a first packet set.
330 packet_.seqNum = 0x0004;
331 packet_.isFirstPacket = true;
332 packet_.markerBit = true;
333 FillPacket(1);
334 EXPECT_EQ(-3, session_.InsertPacket(packet_,
335 frame_buffer_,
336 kNoErrors,
337 frame_data));
338 packet_.seqNum = 0x0006;
339 packet_.isFirstPacket = true;
340 packet_.markerBit = true;
341 FillPacket(1);
342 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000343 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
344 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000345 packet_.seqNum = 0x0008;
346 packet_.isFirstPacket = false;
347 packet_.markerBit = true;
348 FillPacket(1);
349 EXPECT_EQ(-3, session_.InsertPacket(packet_,
350 frame_buffer_,
351 kNoErrors,
352 frame_data));
353}
354
355TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
356 packet_.seqNum = 0xFFFE;
357 packet_.isFirstPacket = true;
358 packet_.markerBit = false;
359 FillPacket(1);
360 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000361 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
362 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000363
364 packet_.seqNum = 0x0004;
365 packet_.isFirstPacket = false;
366 packet_.markerBit = true;
367 FillPacket(1);
368 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000369 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
370 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000371 packet_.seqNum = 0x0002;
372 packet_.isFirstPacket = false;
373 packet_.markerBit = false;
374 FillPacket(1);
375 ASSERT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000376 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
377 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000378 packet_.seqNum = 0xFFF0;
379 packet_.isFirstPacket = false;
380 packet_.markerBit = false;
381 FillPacket(1);
382 EXPECT_EQ(-3,
383 session_.InsertPacket(packet_,
384 frame_buffer_,
385 kNoErrors,
386 frame_data));
387 packet_.seqNum = 0x0006;
388 packet_.isFirstPacket = false;
389 packet_.markerBit = false;
390 FillPacket(1);
391 EXPECT_EQ(-3,
392 session_.InsertPacket(packet_,
393 frame_buffer_,
394 kNoErrors,
395 frame_data));
396}
397
398TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
399 // Insert out of bound regular packets, and then the first and last packet.
400 // Verify that correct bounds are maintained.
401 packet_.seqNum = 0x0003;
402 packet_.isFirstPacket = false;
403 packet_.markerBit = false;
404 FillPacket(1);
405 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000406 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
407 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000408 // Insert an older packet with a first packet set.
409 packet_.seqNum = 0x0005;
410 packet_.isFirstPacket = true;
411 packet_.markerBit = false;
412 FillPacket(1);
413 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000414 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
415 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000416 packet_.seqNum = 0x0004;
417 packet_.isFirstPacket = false;
418 packet_.markerBit = false;
419 FillPacket(1);
420 EXPECT_EQ(-3, session_.InsertPacket(packet_,
421 frame_buffer_,
422 kNoErrors,
423 frame_data));
424 packet_.seqNum = 0x0010;
425 packet_.isFirstPacket = false;
426 packet_.markerBit = false;
427 FillPacket(1);
428 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000429 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
430 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000431 packet_.seqNum = 0x0008;
432 packet_.isFirstPacket = false;
433 packet_.markerBit = true;
434 FillPacket(1);
435 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000436 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
437 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000438
439 packet_.seqNum = 0x0009;
440 packet_.isFirstPacket = false;
441 packet_.markerBit = false;
442 FillPacket(1);
443 EXPECT_EQ(-3, session_.InsertPacket(packet_,
444 frame_buffer_,
445 kNoErrors,
446 frame_data));
447}
448
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000449TEST_F(TestVP8Partitions, TwoPartitionsOneLoss) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000450 // Partition 0 | Partition 1
451 // [ 0 ] [ 2 ] | [ 3 ]
452 packet_header_.type.Video.isFirstPacket = true;
453 vp8_header_->beginningOfPartition = true;
454 vp8_header_->partitionId = 0;
455 packet_header_.header.markerBit = false;
456 packet_header_.header.sequenceNumber = 0;
457 FillPacket(0);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000458 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000459 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000460 EXPECT_EQ(packet_buffer_size(),
461 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
462 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000463 delete packet;
464
465 packet_header_.type.Video.isFirstPacket = false;
466 vp8_header_->partitionId = 0;
467 vp8_header_->beginningOfPartition = false;
468 packet_header_.header.markerBit = false;
469 packet_header_.header.sequenceNumber += 2;
470 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000471 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000472 EXPECT_EQ(packet_buffer_size(),
473 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
474 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000475 delete packet;
476
477 packet_header_.type.Video.isFirstPacket = false;
478 vp8_header_->partitionId = 1;
479 vp8_header_->beginningOfPartition = true;
480 packet_header_.header.markerBit = true;
481 packet_header_.header.sequenceNumber += 1;
482 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000483 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
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.orgc3d89102011-09-08 06:50:28 +0000487 delete packet;
488
489 // One packet should be removed (end of partition 0).
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000490 EXPECT_EQ(2 * packet_buffer_size(),
491 session_.BuildVP8FragmentationHeader(
492 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000493 SCOPED_TRACE("Calling VerifyPartition");
494 EXPECT_TRUE(VerifyPartition(0, 1, 0));
495 SCOPED_TRACE("Calling VerifyPartition");
496 EXPECT_TRUE(VerifyPartition(1, 1, 3));
497}
498
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000499TEST_F(TestVP8Partitions, TwoPartitionsOneLoss2) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000500 // Partition 0 | Partition 1
501 // [ 1 ] [ 2 ] | [ 3 ] [ 5 ]
502 packet_header_.type.Video.isFirstPacket = true;
503 vp8_header_->beginningOfPartition = true;
504 vp8_header_->partitionId = 0;
505 packet_header_.header.markerBit = false;
506 packet_header_.header.sequenceNumber = 1;
507 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000508 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000509 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000510 EXPECT_EQ(packet_buffer_size(),
511 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
512 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000513 delete packet;
514
515 packet_header_.type.Video.isFirstPacket = false;
516 vp8_header_->partitionId = 0;
517 vp8_header_->beginningOfPartition = false;
518 packet_header_.header.markerBit = false;
519 packet_header_.header.sequenceNumber += 1;
520 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000521 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000522 EXPECT_EQ(packet_buffer_size(),
523 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
524 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000525 delete packet;
526
527 packet_header_.type.Video.isFirstPacket = false;
528 vp8_header_->partitionId = 1;
529 vp8_header_->beginningOfPartition = true;
530 packet_header_.header.markerBit = false;
531 packet_header_.header.sequenceNumber += 1;
532 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000533 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000534 EXPECT_EQ(packet_buffer_size(),
535 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
536 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000537 delete packet;
538
539 packet_header_.type.Video.isFirstPacket = false;
540 vp8_header_->partitionId = 1;
541 vp8_header_->beginningOfPartition = false;
542 packet_header_.header.markerBit = true;
543 packet_header_.header.sequenceNumber += 2;
544 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000545 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000546 EXPECT_EQ(packet_buffer_size(),
547 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
548 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000549 delete packet;
550
551 // One packet should be removed (end of partition 2), 3 left.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000552 EXPECT_EQ(3 * packet_buffer_size(),
553 session_.BuildVP8FragmentationHeader(
554 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000555 SCOPED_TRACE("Calling VerifyPartition");
556 EXPECT_TRUE(VerifyPartition(0, 2, 1));
557 SCOPED_TRACE("Calling VerifyPartition");
558 EXPECT_TRUE(VerifyPartition(1, 1, 3));
559}
560
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000561TEST_F(TestVP8Partitions, TwoPartitionsNoLossWrap) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000562 // Partition 0 | Partition 1
563 // [ fffd ] [ fffe ] | [ ffff ] [ 0 ]
564 packet_header_.type.Video.isFirstPacket = true;
565 vp8_header_->beginningOfPartition = true;
566 vp8_header_->partitionId = 0;
567 packet_header_.header.markerBit = false;
568 packet_header_.header.sequenceNumber = 0xfffd;
569 FillPacket(0);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000570 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000571 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000572 EXPECT_EQ(packet_buffer_size(),
573 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
574 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000575 delete packet;
576
577 packet_header_.type.Video.isFirstPacket = false;
578 vp8_header_->partitionId = 0;
579 vp8_header_->beginningOfPartition = false;
580 packet_header_.header.markerBit = false;
581 packet_header_.header.sequenceNumber += 1;
582 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000583 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000584 EXPECT_EQ(packet_buffer_size(),
585 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
586 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000587 delete packet;
588
589 packet_header_.type.Video.isFirstPacket = false;
590 vp8_header_->partitionId = 1;
591 vp8_header_->beginningOfPartition = true;
592 packet_header_.header.markerBit = false;
593 packet_header_.header.sequenceNumber += 1;
594 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000595 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000596 EXPECT_EQ(packet_buffer_size(),
597 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
598 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000599 delete packet;
600
601 packet_header_.type.Video.isFirstPacket = false;
602 vp8_header_->partitionId = 1;
603 vp8_header_->beginningOfPartition = false;
604 packet_header_.header.markerBit = true;
605 packet_header_.header.sequenceNumber += 1;
606 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000607 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000608 EXPECT_EQ(packet_buffer_size(),
609 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
610 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000611 delete packet;
612
613 // No packet should be removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000614 EXPECT_EQ(4 * packet_buffer_size(),
615 session_.BuildVP8FragmentationHeader(
616 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000617 SCOPED_TRACE("Calling VerifyPartition");
618 EXPECT_TRUE(VerifyPartition(0, 2, 0));
619 SCOPED_TRACE("Calling VerifyPartition");
620 EXPECT_TRUE(VerifyPartition(1, 2, 2));
621}
622
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000623TEST_F(TestVP8Partitions, TwoPartitionsLossWrap) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000624 // Partition 0 | Partition 1
625 // [ fffd ] [ fffe ] | [ ffff ] [ 1 ]
626 packet_header_.type.Video.isFirstPacket = true;
627 vp8_header_->beginningOfPartition = true;
628 vp8_header_->partitionId = 0;
629 packet_header_.header.markerBit = false;
630 packet_header_.header.sequenceNumber = 0xfffd;
631 FillPacket(0);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000632 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000633 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000634 EXPECT_EQ(packet_buffer_size(),
635 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
636 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000637 delete packet;
638
639 packet_header_.type.Video.isFirstPacket = false;
640 vp8_header_->partitionId = 0;
641 vp8_header_->beginningOfPartition = false;
642 packet_header_.header.markerBit = false;
643 packet_header_.header.sequenceNumber += 1;
644 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000645 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000646 EXPECT_EQ(packet_buffer_size(),
647 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
648 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000649 delete packet;
650
651 packet_header_.type.Video.isFirstPacket = false;
652 vp8_header_->partitionId = 1;
653 vp8_header_->beginningOfPartition = true;
654 packet_header_.header.markerBit = false;
655 packet_header_.header.sequenceNumber += 1;
656 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000657 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000658 EXPECT_EQ(packet_buffer_size(),
659 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
660 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000661 delete packet;
662
663 packet_header_.type.Video.isFirstPacket = false;
664 vp8_header_->partitionId = 1;
665 vp8_header_->beginningOfPartition = false;
666 packet_header_.header.markerBit = true;
667 packet_header_.header.sequenceNumber += 2;
668 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000669 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000670 EXPECT_EQ(packet_buffer_size(),
671 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
672 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000673 delete packet;
674
675 // One packet should be removed from the last partition
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000676 EXPECT_EQ(3 * packet_buffer_size(),
677 session_.BuildVP8FragmentationHeader(
678 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000679 SCOPED_TRACE("Calling VerifyPartition");
680 EXPECT_TRUE(VerifyPartition(0, 2, 0));
681 SCOPED_TRACE("Calling VerifyPartition");
682 EXPECT_TRUE(VerifyPartition(1, 1, 2));
683}
684
685
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000686TEST_F(TestVP8Partitions, ThreePartitionsOneMissing) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000687 // Partition 1 |Partition 2 | Partition 3
688 // [ 1 ] [ 2 ] | | [ 5 ] | [ 6 ]
689 packet_header_.type.Video.isFirstPacket = true;
690 vp8_header_->beginningOfPartition = true;
691 vp8_header_->partitionId = 0;
692 packet_header_.header.markerBit = false;
693 packet_header_.header.sequenceNumber = 1;
694 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000695 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000696 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000697 EXPECT_EQ(packet_buffer_size(),
698 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
699 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000700 delete packet;
701
702 packet_header_.type.Video.isFirstPacket = false;
703 vp8_header_->partitionId = 0;
704 vp8_header_->beginningOfPartition = false;
705 packet_header_.header.markerBit = false;
706 packet_header_.header.sequenceNumber += 1;
707 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000708 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000709 EXPECT_EQ(packet_buffer_size(),
710 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
711 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000712 delete packet;
713
714 packet_header_.type.Video.isFirstPacket = false;
715 vp8_header_->partitionId = 2;
716 vp8_header_->beginningOfPartition = true;
717 packet_header_.header.markerBit = false;
718 packet_header_.header.sequenceNumber += 3;
719 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000720 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000721 EXPECT_EQ(packet_buffer_size(),
722 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
723 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000724 delete packet;
725
726 packet_header_.type.Video.isFirstPacket = false;
727 vp8_header_->partitionId = 2;
728 vp8_header_->beginningOfPartition = false;
729 packet_header_.header.markerBit = true;
730 packet_header_.header.sequenceNumber += 1;
731 FillPacket(6);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000732 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000733 EXPECT_EQ(packet_buffer_size(),
734 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
735 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000736 delete packet;
737
738 // No packet should be removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000739 EXPECT_EQ(4 * packet_buffer_size(),
740 session_.BuildVP8FragmentationHeader(
741 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000742 SCOPED_TRACE("Calling VerifyPartition");
743 EXPECT_TRUE(VerifyPartition(0, 2, 1));
744 SCOPED_TRACE("Calling VerifyPartition");
745 EXPECT_TRUE(VerifyPartition(2, 2, 5));
746}
747
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000748TEST_F(TestVP8Partitions, ThreePartitionsLossInSecond) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000749 // Partition 0 |Partition 1 | Partition 2
750 // [ 1 ] [ 2 ] | [ 4 ] [ 5 ] | [ 6 ] [ 7 ]
751 packet_header_.type.Video.isFirstPacket = true;
752 vp8_header_->beginningOfPartition = true;
753 vp8_header_->partitionId = 0;
754 packet_header_.header.markerBit = false;
755 packet_header_.header.sequenceNumber = 1;
756 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000757 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000758 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000759 EXPECT_EQ(packet_buffer_size(),
760 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
761 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000762 delete packet;
763
764 packet_header_.type.Video.isFirstPacket = false;
765 vp8_header_->partitionId = 0;
766 vp8_header_->beginningOfPartition = false;
767 packet_header_.header.markerBit = false;
768 packet_header_.header.sequenceNumber += 1;
769 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000770 packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
771 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000772 EXPECT_EQ(packet_buffer_size(),
773 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
774 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000775 delete packet;
776
777 packet_header_.type.Video.isFirstPacket = false;
778 vp8_header_->partitionId = 1;
779 vp8_header_->beginningOfPartition = false;
780 packet_header_.header.markerBit = false;
781 packet_header_.header.sequenceNumber += 2;
782 FillPacket(4);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000783 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000784 EXPECT_EQ(packet_buffer_size(),
785 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
786 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000787 delete packet;
788
789 packet_header_.type.Video.isFirstPacket = false;
790 vp8_header_->partitionId = 1;
791 vp8_header_->beginningOfPartition = false;
792 packet_header_.header.markerBit = false;
793 packet_header_.header.sequenceNumber += 1;
794 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000795 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000796 EXPECT_EQ(packet_buffer_size(),
797 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
798 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000799 delete packet;
800
801 packet_header_.type.Video.isFirstPacket = false;
802 vp8_header_->partitionId = 2;
803 vp8_header_->beginningOfPartition = true;
804 packet_header_.header.markerBit = false;
805 packet_header_.header.sequenceNumber += 1;
806 FillPacket(6);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000807 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000808 EXPECT_EQ(packet_buffer_size(),
809 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
810 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000811 delete packet;
812
813 packet_header_.type.Video.isFirstPacket = false;
814 vp8_header_->partitionId = 2;
815 vp8_header_->beginningOfPartition = false;
816 packet_header_.header.markerBit = true;
817 packet_header_.header.sequenceNumber += 1;
818 FillPacket(7);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000819 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000820 EXPECT_EQ(packet_buffer_size(),
821 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
822 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000823 delete packet;
824
825 // 2 partitions left. 2 packets removed from second partition
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000826 EXPECT_EQ(4 * packet_buffer_size(),
827 session_.BuildVP8FragmentationHeader(
828 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000829 SCOPED_TRACE("Calling VerifyPartition");
830 EXPECT_TRUE(VerifyPartition(0, 2, 1));
831 SCOPED_TRACE("Calling VerifyPartition");
832 EXPECT_TRUE(VerifyPartition(2, 2, 6));
833}
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000834
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000835TEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000836 // Partition 0 | Partition 1 | Partition 2
837 // [ 0 | ] [ 1 ] | [ 2 ]
838 packet_header_.type.Video.isFirstPacket = true;
839 vp8_header_->beginningOfPartition = true;
840 vp8_header_->partitionId = 0;
841 packet_header_.header.markerBit = false;
842 packet_header_.header.sequenceNumber = 0;
843 FillPacket(0);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000844 VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000845 packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000846 EXPECT_EQ(packet_buffer_size(),
847 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
848 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000849 delete packet;
850
851 packet_header_.type.Video.isFirstPacket = false;
852 vp8_header_->partitionId = 1;
853 vp8_header_->beginningOfPartition = false;
854 packet_header_.header.markerBit = false;
855 packet_header_.header.sequenceNumber += 1;
856 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000857 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000858 EXPECT_EQ(packet_buffer_size(),
859 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
860 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000861 delete packet;
862
863 packet_header_.type.Video.isFirstPacket = false;
864 vp8_header_->partitionId = 2;
865 vp8_header_->beginningOfPartition = true;
866 packet_header_.header.markerBit = true;
867 packet_header_.header.sequenceNumber += 1;
868 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000869 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000870 EXPECT_EQ(packet_buffer_size(),
871 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
872 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000873 delete packet;
874
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000875 // No packets removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000876 EXPECT_EQ(3 * packet_buffer_size(),
877 session_.BuildVP8FragmentationHeader(
878 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000879 SCOPED_TRACE("Calling VerifyPartition");
880 EXPECT_TRUE(VerifyPartition(0, 2, 0));
881 // This partition is aggregated in partition 0
882 SCOPED_TRACE("Calling VerifyPartition");
883 EXPECT_TRUE(VerifyPartition(1, 0, 0));
884 SCOPED_TRACE("Calling VerifyPartition");
885 EXPECT_TRUE(VerifyPartition(2, 1, 2));
886}
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000887
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000888TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
889 packet_.isFirstPacket = false;
890 packet_.completeNALU = kNaluComplete;
pbos22993e12015-10-19 02:39:06 -0700891 packet_.frameType = kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000892 packet_.sizeBytes = 0;
893 packet_.seqNum = 0;
894 packet_.markerBit = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000895 EXPECT_EQ(0, session_.InsertPacket(packet_,
agalusza@google.coma7e360e2013-08-01 03:15:08 +0000896 frame_buffer_,
897 kNoErrors,
898 frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000899
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000900 EXPECT_EQ(0U, session_.MakeDecodable());
901 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000902}
903
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000904TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
905 packet_.isFirstPacket = true;
906 packet_.completeNALU = kNaluComplete;
907 packet_.seqNum = 0;
908 packet_.markerBit = false;
909 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000910 EXPECT_EQ(packet_buffer_size(),
911 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
912 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000913
914 packet_.isFirstPacket = false;
915 packet_.completeNALU = kNaluComplete;
916 packet_.seqNum += 2;
917 packet_.markerBit = true;
918 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000919 EXPECT_EQ(packet_buffer_size(),
920 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
921 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000922
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000923 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000924 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000925 SCOPED_TRACE("Calling VerifyNalu");
926 EXPECT_TRUE(VerifyNalu(0, 1, 0));
927 SCOPED_TRACE("Calling VerifyNalu");
928 EXPECT_TRUE(VerifyNalu(1, 1, 2));
929}
930
931TEST_F(TestNalUnits, LossInMiddleOfNalu) {
932 packet_.isFirstPacket = true;
933 packet_.completeNALU = kNaluComplete;
934 packet_.seqNum = 0;
935 packet_.markerBit = false;
936 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000937 EXPECT_EQ(packet_buffer_size(),
938 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
939 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000940
941 packet_.isFirstPacket = false;
942 packet_.completeNALU = kNaluEnd;
943 packet_.seqNum += 2;
944 packet_.markerBit = true;
945 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000946 EXPECT_EQ(packet_buffer_size(),
947 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
948 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000949
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000950 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
951 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000952 SCOPED_TRACE("Calling VerifyNalu");
953 EXPECT_TRUE(VerifyNalu(0, 1, 0));
954}
955
956TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
957 packet_.isFirstPacket = true;
958 packet_.completeNALU = kNaluComplete;
959 packet_.seqNum = 0;
960 packet_.markerBit = false;
961 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000962 EXPECT_EQ(packet_buffer_size(),
963 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
964 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000965
966 packet_.isFirstPacket = false;
967 packet_.completeNALU = kNaluIncomplete;
968 packet_.seqNum += 2;
969 packet_.markerBit = false;
970 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000971 EXPECT_EQ(packet_buffer_size(),
972 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
973 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000974
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000975 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
976 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000977 SCOPED_TRACE("Calling VerifyNalu");
978 EXPECT_TRUE(VerifyNalu(0, 1, 0));
979}
980
981TEST_F(TestNalUnits, ReorderWrapNoLoss) {
982 packet_.seqNum = 0xFFFF;
983 packet_.isFirstPacket = false;
984 packet_.completeNALU = kNaluIncomplete;
985 packet_.seqNum += 1;
986 packet_.markerBit = false;
987 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000988 EXPECT_EQ(packet_buffer_size(),
989 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
990 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000991
992 packet_.isFirstPacket = true;
993 packet_.completeNALU = kNaluComplete;
994 packet_.seqNum -= 1;
995 packet_.markerBit = false;
996 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000997 EXPECT_EQ(packet_buffer_size(),
998 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
999 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001000
1001 packet_.isFirstPacket = false;
1002 packet_.completeNALU = kNaluEnd;
1003 packet_.seqNum += 2;
1004 packet_.markerBit = true;
1005 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001006 EXPECT_EQ(packet_buffer_size(),
1007 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1008 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001009
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001010 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +00001011 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001012 SCOPED_TRACE("Calling VerifyNalu");
1013 EXPECT_TRUE(VerifyNalu(0, 1, 0));
1014}
1015
1016TEST_F(TestNalUnits, WrapLosses) {
1017 packet_.seqNum = 0xFFFF;
1018 packet_.isFirstPacket = false;
1019 packet_.completeNALU = kNaluIncomplete;
1020 packet_.markerBit = false;
1021 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001022 EXPECT_EQ(packet_buffer_size(),
1023 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1024 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001025
1026 packet_.isFirstPacket = false;
1027 packet_.completeNALU = kNaluEnd;
1028 packet_.seqNum += 2;
1029 packet_.markerBit = true;
1030 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001031 EXPECT_EQ(packet_buffer_size(),
1032 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1033 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001034
pbos@webrtc.org3004c792013-05-07 12:36:21 +00001035 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001036 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001037}
1038
1039TEST_F(TestNalUnits, ReorderWrapLosses) {
1040 packet_.seqNum = 0xFFFF;
1041
1042 packet_.isFirstPacket = false;
1043 packet_.completeNALU = kNaluEnd;
1044 packet_.seqNum += 2;
1045 packet_.markerBit = true;
1046 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001047 EXPECT_EQ(packet_buffer_size(),
1048 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1049 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001050
1051 packet_.seqNum -= 2;
1052 packet_.isFirstPacket = false;
1053 packet_.completeNALU = kNaluIncomplete;
1054 packet_.markerBit = false;
1055 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001056 EXPECT_EQ(packet_buffer_size(),
1057 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1058 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001059
pbos@webrtc.org3004c792013-05-07 12:36:21 +00001060 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001061 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001062}
agalusza@google.comd177c102013-08-08 01:12:33 +00001063
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001064} // namespace webrtc