blob: 4019d63a5fc6111f030fb17c82212c1bc2c23819 [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] +
philipel9d3ab612015-12-21 04:12:39 -080084 i * packet_buffer_size();
pbos@webrtc.org3004c792013-05-07 12:36:21 +000085 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
philipel9d3ab612015-12-21 04:12:39 -0800125 void BuildSeqNumList(uint16_t low, uint16_t high) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000126 size_t i = 0;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000127 while (low != high + 1) {
128 EXPECT_LT(i, kMaxSeqNumListLength);
129 if (i >= kMaxSeqNumListLength) {
130 seq_num_list_length_ = kMaxSeqNumListLength;
131 return;
132 }
133 seq_num_list_[i] = low;
134 low++;
135 i++;
136 }
137 seq_num_list_length_ = i;
138 }
139
140 void VerifyAll(int value) {
141 for (int i = 0; i < seq_num_list_length_; ++i)
142 EXPECT_EQ(seq_num_list_[i], value);
143 }
144
145 int seq_num_list_[kMaxSeqNumListLength];
146 int seq_num_list_length_;
147};
148
149TEST_F(TestSessionInfo, TestSimpleAPIs) {
150 packet_.isFirstPacket = true;
151 packet_.seqNum = 0xFFFE;
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000152 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000153 packet_.frameType = kVideoFrameKey;
154 FillPacket(0);
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000155 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000156 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
157 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000158 EXPECT_FALSE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000159 EXPECT_EQ(kVideoFrameKey, session_.FrameType());
160
161 packet_.isFirstPacket = false;
162 packet_.markerBit = true;
163 packet_.seqNum += 1;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000164 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000165 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
166 kNoErrors, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000167 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000168 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
169 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
170
171 // Insert empty packet which will be the new high sequence number.
172 // To make things more difficult we will make sure to have a wrap here.
173 packet_.isFirstPacket = false;
174 packet_.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -0800175 packet_.seqNum = 2;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000176 packet_.sizeBytes = 0;
pbos22993e12015-10-19 02:39:06 -0700177 packet_.frameType = kEmptyFrame;
philipel9d3ab612015-12-21 04:12:39 -0800178 EXPECT_EQ(
179 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000180 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
181}
182
183TEST_F(TestSessionInfo, NormalOperation) {
184 packet_.seqNum = 0xFFFF;
185 packet_.isFirstPacket = true;
186 packet_.markerBit = false;
187 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000188 EXPECT_EQ(packet_buffer_size(),
189 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
190 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000191
192 packet_.isFirstPacket = false;
193 for (int i = 1; i < 9; ++i) {
194 packet_.seqNum += 1;
195 FillPacket(i);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000196 ASSERT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800197 static_cast<size_t>(session_.InsertPacket(
198 packet_, frame_buffer_, kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000199 }
200
201 packet_.seqNum += 1;
202 packet_.markerBit = true;
203 FillPacket(9);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000204 EXPECT_EQ(packet_buffer_size(),
205 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
206 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000207
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000208 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000209 for (int i = 0; i < 10; ++i) {
210 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000211 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000212 }
213}
214
agalusza@google.comd177c102013-08-08 01:12:33 +0000215TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
216 packet_.seqNum = 0xFFFF;
217 packet_.isFirstPacket = false;
218 packet_.markerBit = false;
219 FillPacket(3);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000220 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800221 static_cast<size_t>(session_.InsertPacket(
222 packet_, frame_buffer_, kWithErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000223 EXPECT_TRUE(session_.decodable());
224}
225
226TEST_F(TestSessionInfo, SelectiveDecodableState) {
227 packet_.seqNum = 0xFFFF;
228 packet_.isFirstPacket = false;
229 packet_.markerBit = false;
230 FillPacket(1);
231 frame_data.rolling_average_packets_per_frame = 11;
232 frame_data.rtt_ms = 150;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000233 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800234 static_cast<size_t>(session_.InsertPacket(
235 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000236 EXPECT_FALSE(session_.decodable());
237
238 packet_.seqNum -= 1;
239 FillPacket(0);
240 packet_.isFirstPacket = true;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000241 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800242 static_cast<size_t>(session_.InsertPacket(
243 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000244 EXPECT_TRUE(session_.decodable());
245
246 packet_.isFirstPacket = false;
247 packet_.seqNum += 1;
248 for (int i = 2; i < 8; ++i) {
249 packet_.seqNum += 1;
250 FillPacket(i);
philipel9d3ab612015-12-21 04:12:39 -0800251 EXPECT_EQ(packet_buffer_size(),
252 static_cast<size_t>(session_.InsertPacket(
253 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000254 EXPECT_TRUE(session_.decodable());
255 }
256
257 packet_.seqNum += 1;
258 FillPacket(8);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000259 EXPECT_EQ(packet_buffer_size(),
philipel9d3ab612015-12-21 04:12:39 -0800260 static_cast<size_t>(session_.InsertPacket(
261 packet_, frame_buffer_, kSelectiveErrors, frame_data)));
agalusza@google.comd177c102013-08-08 01:12:33 +0000262 EXPECT_TRUE(session_.decodable());
263}
264
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000265TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
266 packet_.seqNum = 0x0001;
267 packet_.isFirstPacket = true;
268 packet_.markerBit = true;
269 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000270 EXPECT_EQ(packet_buffer_size(),
271 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
272 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000273
274 packet_.seqNum = 0x0004;
275 packet_.isFirstPacket = true;
276 packet_.markerBit = true;
277 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800278 EXPECT_EQ(
279 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000280 packet_.seqNum = 0x0000;
281 packet_.isFirstPacket = false;
282 packet_.markerBit = false;
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}
287
288TEST_F(TestSessionInfo, SetMarkerBitOnce) {
289 packet_.seqNum = 0x0005;
290 packet_.isFirstPacket = false;
291 packet_.markerBit = true;
292 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000293 EXPECT_EQ(packet_buffer_size(),
294 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
295 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000296 ++packet_.seqNum;
297 packet_.isFirstPacket = true;
298 packet_.markerBit = true;
299 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800300 EXPECT_EQ(
301 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000302}
303
304TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
305 // Allow packets in the range 5-6.
306 packet_.seqNum = 0x0005;
307 packet_.isFirstPacket = true;
308 packet_.markerBit = false;
309 FillPacket(1);
310 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000311 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
312 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000313 // Insert an older packet with a first packet set.
314 packet_.seqNum = 0x0004;
315 packet_.isFirstPacket = true;
316 packet_.markerBit = true;
317 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800318 EXPECT_EQ(
319 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000320 packet_.seqNum = 0x0006;
321 packet_.isFirstPacket = true;
322 packet_.markerBit = true;
323 FillPacket(1);
324 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000325 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
326 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000327 packet_.seqNum = 0x0008;
328 packet_.isFirstPacket = false;
329 packet_.markerBit = true;
330 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800331 EXPECT_EQ(
332 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000333}
334
335TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
336 packet_.seqNum = 0xFFFE;
337 packet_.isFirstPacket = true;
338 packet_.markerBit = false;
339 FillPacket(1);
340 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000341 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
342 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000343
344 packet_.seqNum = 0x0004;
345 packet_.isFirstPacket = false;
346 packet_.markerBit = true;
347 FillPacket(1);
348 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000349 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
350 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000351 packet_.seqNum = 0x0002;
352 packet_.isFirstPacket = false;
353 packet_.markerBit = false;
354 FillPacket(1);
355 ASSERT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000356 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
357 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000358 packet_.seqNum = 0xFFF0;
359 packet_.isFirstPacket = false;
360 packet_.markerBit = false;
361 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800362 EXPECT_EQ(
363 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000364 packet_.seqNum = 0x0006;
365 packet_.isFirstPacket = false;
366 packet_.markerBit = false;
367 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800368 EXPECT_EQ(
369 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000370}
371
372TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
373 // Insert out of bound regular packets, and then the first and last packet.
374 // Verify that correct bounds are maintained.
375 packet_.seqNum = 0x0003;
376 packet_.isFirstPacket = false;
377 packet_.markerBit = false;
378 FillPacket(1);
379 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000380 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
381 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000382 // Insert an older packet with a first packet set.
383 packet_.seqNum = 0x0005;
384 packet_.isFirstPacket = true;
385 packet_.markerBit = false;
386 FillPacket(1);
387 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000388 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
389 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000390 packet_.seqNum = 0x0004;
391 packet_.isFirstPacket = false;
392 packet_.markerBit = false;
393 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800394 EXPECT_EQ(
395 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000396 packet_.seqNum = 0x0010;
397 packet_.isFirstPacket = false;
398 packet_.markerBit = false;
399 FillPacket(1);
400 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000401 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
402 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000403 packet_.seqNum = 0x0008;
404 packet_.isFirstPacket = false;
405 packet_.markerBit = true;
406 FillPacket(1);
407 EXPECT_EQ(packet_buffer_size(),
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000408 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
409 kNoErrors, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000410
411 packet_.seqNum = 0x0009;
412 packet_.isFirstPacket = false;
413 packet_.markerBit = false;
414 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800415 EXPECT_EQ(
416 -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000417}
418
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000419TEST_F(TestVP8Partitions, TwoPartitionsOneLoss) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000420 // Partition 0 | Partition 1
421 // [ 0 ] [ 2 ] | [ 3 ]
422 packet_header_.type.Video.isFirstPacket = true;
423 vp8_header_->beginningOfPartition = true;
424 vp8_header_->partitionId = 0;
425 packet_header_.header.markerBit = false;
426 packet_header_.header.sequenceNumber = 0;
427 FillPacket(0);
philipel9d3ab612015-12-21 04:12:39 -0800428 VCMPacket* packet =
429 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000430 EXPECT_EQ(packet_buffer_size(),
431 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
432 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000433 delete packet;
434
435 packet_header_.type.Video.isFirstPacket = false;
436 vp8_header_->partitionId = 0;
437 vp8_header_->beginningOfPartition = false;
438 packet_header_.header.markerBit = false;
439 packet_header_.header.sequenceNumber += 2;
440 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000441 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
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.orgc3d89102011-09-08 06:50:28 +0000445 delete packet;
446
447 packet_header_.type.Video.isFirstPacket = false;
448 vp8_header_->partitionId = 1;
449 vp8_header_->beginningOfPartition = true;
450 packet_header_.header.markerBit = true;
451 packet_header_.header.sequenceNumber += 1;
452 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000453 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000454 EXPECT_EQ(packet_buffer_size(),
455 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
456 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000457 delete packet;
458
459 // One packet should be removed (end of partition 0).
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000460 EXPECT_EQ(2 * packet_buffer_size(),
461 session_.BuildVP8FragmentationHeader(
462 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000463 SCOPED_TRACE("Calling VerifyPartition");
464 EXPECT_TRUE(VerifyPartition(0, 1, 0));
465 SCOPED_TRACE("Calling VerifyPartition");
466 EXPECT_TRUE(VerifyPartition(1, 1, 3));
467}
468
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000469TEST_F(TestVP8Partitions, TwoPartitionsOneLoss2) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000470 // Partition 0 | Partition 1
471 // [ 1 ] [ 2 ] | [ 3 ] [ 5 ]
472 packet_header_.type.Video.isFirstPacket = true;
473 vp8_header_->beginningOfPartition = true;
474 vp8_header_->partitionId = 0;
475 packet_header_.header.markerBit = false;
476 packet_header_.header.sequenceNumber = 1;
477 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800478 VCMPacket* packet =
479 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000480 EXPECT_EQ(packet_buffer_size(),
481 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
482 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000483 delete packet;
484
485 packet_header_.type.Video.isFirstPacket = false;
486 vp8_header_->partitionId = 0;
487 vp8_header_->beginningOfPartition = false;
488 packet_header_.header.markerBit = false;
489 packet_header_.header.sequenceNumber += 1;
490 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000491 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
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.orgc3d89102011-09-08 06:50:28 +0000495 delete packet;
496
497 packet_header_.type.Video.isFirstPacket = false;
498 vp8_header_->partitionId = 1;
499 vp8_header_->beginningOfPartition = true;
500 packet_header_.header.markerBit = false;
501 packet_header_.header.sequenceNumber += 1;
502 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000503 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000504 EXPECT_EQ(packet_buffer_size(),
505 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
506 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000507 delete packet;
508
509 packet_header_.type.Video.isFirstPacket = false;
510 vp8_header_->partitionId = 1;
511 vp8_header_->beginningOfPartition = false;
512 packet_header_.header.markerBit = true;
513 packet_header_.header.sequenceNumber += 2;
514 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000515 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000516 EXPECT_EQ(packet_buffer_size(),
517 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
518 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000519 delete packet;
520
521 // One packet should be removed (end of partition 2), 3 left.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000522 EXPECT_EQ(3 * packet_buffer_size(),
523 session_.BuildVP8FragmentationHeader(
524 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000525 SCOPED_TRACE("Calling VerifyPartition");
526 EXPECT_TRUE(VerifyPartition(0, 2, 1));
527 SCOPED_TRACE("Calling VerifyPartition");
528 EXPECT_TRUE(VerifyPartition(1, 1, 3));
529}
530
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000531TEST_F(TestVP8Partitions, TwoPartitionsNoLossWrap) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000532 // Partition 0 | Partition 1
533 // [ fffd ] [ fffe ] | [ ffff ] [ 0 ]
534 packet_header_.type.Video.isFirstPacket = true;
535 vp8_header_->beginningOfPartition = true;
536 vp8_header_->partitionId = 0;
537 packet_header_.header.markerBit = false;
538 packet_header_.header.sequenceNumber = 0xfffd;
539 FillPacket(0);
philipel9d3ab612015-12-21 04:12:39 -0800540 VCMPacket* packet =
541 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
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.orgc3d89102011-09-08 06:50:28 +0000545 delete packet;
546
547 packet_header_.type.Video.isFirstPacket = false;
548 vp8_header_->partitionId = 0;
549 vp8_header_->beginningOfPartition = false;
550 packet_header_.header.markerBit = false;
551 packet_header_.header.sequenceNumber += 1;
552 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000553 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000554 EXPECT_EQ(packet_buffer_size(),
555 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
556 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000557 delete packet;
558
559 packet_header_.type.Video.isFirstPacket = false;
560 vp8_header_->partitionId = 1;
561 vp8_header_->beginningOfPartition = true;
562 packet_header_.header.markerBit = false;
563 packet_header_.header.sequenceNumber += 1;
564 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000565 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000566 EXPECT_EQ(packet_buffer_size(),
567 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
568 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000569 delete packet;
570
571 packet_header_.type.Video.isFirstPacket = false;
572 vp8_header_->partitionId = 1;
573 vp8_header_->beginningOfPartition = false;
574 packet_header_.header.markerBit = true;
575 packet_header_.header.sequenceNumber += 1;
576 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000577 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000578 EXPECT_EQ(packet_buffer_size(),
579 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
580 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000581 delete packet;
582
583 // No packet should be removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000584 EXPECT_EQ(4 * packet_buffer_size(),
585 session_.BuildVP8FragmentationHeader(
586 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000587 SCOPED_TRACE("Calling VerifyPartition");
588 EXPECT_TRUE(VerifyPartition(0, 2, 0));
589 SCOPED_TRACE("Calling VerifyPartition");
590 EXPECT_TRUE(VerifyPartition(1, 2, 2));
591}
592
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000593TEST_F(TestVP8Partitions, TwoPartitionsLossWrap) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000594 // Partition 0 | Partition 1
595 // [ fffd ] [ fffe ] | [ ffff ] [ 1 ]
596 packet_header_.type.Video.isFirstPacket = true;
597 vp8_header_->beginningOfPartition = true;
598 vp8_header_->partitionId = 0;
599 packet_header_.header.markerBit = false;
600 packet_header_.header.sequenceNumber = 0xfffd;
601 FillPacket(0);
philipel9d3ab612015-12-21 04:12:39 -0800602 VCMPacket* packet =
603 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000604 EXPECT_EQ(packet_buffer_size(),
605 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
606 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000607 delete packet;
608
609 packet_header_.type.Video.isFirstPacket = false;
610 vp8_header_->partitionId = 0;
611 vp8_header_->beginningOfPartition = false;
612 packet_header_.header.markerBit = false;
613 packet_header_.header.sequenceNumber += 1;
614 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000615 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000616 EXPECT_EQ(packet_buffer_size(),
617 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
618 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000619 delete packet;
620
621 packet_header_.type.Video.isFirstPacket = false;
622 vp8_header_->partitionId = 1;
623 vp8_header_->beginningOfPartition = true;
624 packet_header_.header.markerBit = false;
625 packet_header_.header.sequenceNumber += 1;
626 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000627 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000628 EXPECT_EQ(packet_buffer_size(),
629 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
630 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000631 delete packet;
632
633 packet_header_.type.Video.isFirstPacket = false;
634 vp8_header_->partitionId = 1;
635 vp8_header_->beginningOfPartition = false;
636 packet_header_.header.markerBit = true;
637 packet_header_.header.sequenceNumber += 2;
638 FillPacket(3);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000639 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000640 EXPECT_EQ(packet_buffer_size(),
641 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
642 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000643 delete packet;
644
645 // One packet should be removed from the last partition
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000646 EXPECT_EQ(3 * packet_buffer_size(),
647 session_.BuildVP8FragmentationHeader(
648 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000649 SCOPED_TRACE("Calling VerifyPartition");
650 EXPECT_TRUE(VerifyPartition(0, 2, 0));
651 SCOPED_TRACE("Calling VerifyPartition");
652 EXPECT_TRUE(VerifyPartition(1, 1, 2));
653}
654
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000655TEST_F(TestVP8Partitions, ThreePartitionsOneMissing) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000656 // Partition 1 |Partition 2 | Partition 3
657 // [ 1 ] [ 2 ] | | [ 5 ] | [ 6 ]
658 packet_header_.type.Video.isFirstPacket = true;
659 vp8_header_->beginningOfPartition = true;
660 vp8_header_->partitionId = 0;
661 packet_header_.header.markerBit = false;
662 packet_header_.header.sequenceNumber = 1;
663 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800664 VCMPacket* packet =
665 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000666 EXPECT_EQ(packet_buffer_size(),
667 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
668 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000669 delete packet;
670
671 packet_header_.type.Video.isFirstPacket = false;
672 vp8_header_->partitionId = 0;
673 vp8_header_->beginningOfPartition = false;
674 packet_header_.header.markerBit = false;
675 packet_header_.header.sequenceNumber += 1;
676 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000677 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000678 EXPECT_EQ(packet_buffer_size(),
679 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
680 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000681 delete packet;
682
683 packet_header_.type.Video.isFirstPacket = false;
684 vp8_header_->partitionId = 2;
685 vp8_header_->beginningOfPartition = true;
686 packet_header_.header.markerBit = false;
687 packet_header_.header.sequenceNumber += 3;
688 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000689 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000690 EXPECT_EQ(packet_buffer_size(),
691 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
692 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000693 delete packet;
694
695 packet_header_.type.Video.isFirstPacket = false;
696 vp8_header_->partitionId = 2;
697 vp8_header_->beginningOfPartition = false;
698 packet_header_.header.markerBit = true;
699 packet_header_.header.sequenceNumber += 1;
700 FillPacket(6);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000701 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000702 EXPECT_EQ(packet_buffer_size(),
703 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
704 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000705 delete packet;
706
707 // No packet should be removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000708 EXPECT_EQ(4 * packet_buffer_size(),
709 session_.BuildVP8FragmentationHeader(
710 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000711 SCOPED_TRACE("Calling VerifyPartition");
712 EXPECT_TRUE(VerifyPartition(0, 2, 1));
713 SCOPED_TRACE("Calling VerifyPartition");
714 EXPECT_TRUE(VerifyPartition(2, 2, 5));
715}
716
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000717TEST_F(TestVP8Partitions, ThreePartitionsLossInSecond) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000718 // Partition 0 |Partition 1 | Partition 2
719 // [ 1 ] [ 2 ] | [ 4 ] [ 5 ] | [ 6 ] [ 7 ]
720 packet_header_.type.Video.isFirstPacket = true;
721 vp8_header_->beginningOfPartition = true;
722 vp8_header_->partitionId = 0;
723 packet_header_.header.markerBit = false;
724 packet_header_.header.sequenceNumber = 1;
725 FillPacket(1);
philipel9d3ab612015-12-21 04:12:39 -0800726 VCMPacket* packet =
727 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000728 EXPECT_EQ(packet_buffer_size(),
729 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
730 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000731 delete packet;
732
733 packet_header_.type.Video.isFirstPacket = false;
734 vp8_header_->partitionId = 0;
735 vp8_header_->beginningOfPartition = false;
736 packet_header_.header.markerBit = false;
737 packet_header_.header.sequenceNumber += 1;
738 FillPacket(2);
philipel9d3ab612015-12-21 04:12:39 -0800739 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000740 EXPECT_EQ(packet_buffer_size(),
741 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
742 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000743 delete packet;
744
745 packet_header_.type.Video.isFirstPacket = false;
746 vp8_header_->partitionId = 1;
747 vp8_header_->beginningOfPartition = false;
748 packet_header_.header.markerBit = false;
749 packet_header_.header.sequenceNumber += 2;
750 FillPacket(4);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000751 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000752 EXPECT_EQ(packet_buffer_size(),
753 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
754 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000755 delete packet;
756
757 packet_header_.type.Video.isFirstPacket = false;
758 vp8_header_->partitionId = 1;
759 vp8_header_->beginningOfPartition = false;
760 packet_header_.header.markerBit = false;
761 packet_header_.header.sequenceNumber += 1;
762 FillPacket(5);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000763 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000764 EXPECT_EQ(packet_buffer_size(),
765 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
766 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000767 delete packet;
768
769 packet_header_.type.Video.isFirstPacket = false;
770 vp8_header_->partitionId = 2;
771 vp8_header_->beginningOfPartition = true;
772 packet_header_.header.markerBit = false;
773 packet_header_.header.sequenceNumber += 1;
774 FillPacket(6);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000775 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000776 EXPECT_EQ(packet_buffer_size(),
777 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
778 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000779 delete packet;
780
781 packet_header_.type.Video.isFirstPacket = false;
782 vp8_header_->partitionId = 2;
783 vp8_header_->beginningOfPartition = false;
784 packet_header_.header.markerBit = true;
785 packet_header_.header.sequenceNumber += 1;
786 FillPacket(7);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000787 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000788 EXPECT_EQ(packet_buffer_size(),
789 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
790 kNoErrors, frame_data)));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000791 delete packet;
792
793 // 2 partitions left. 2 packets removed from second partition
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000794 EXPECT_EQ(4 * packet_buffer_size(),
795 session_.BuildVP8FragmentationHeader(
796 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +0000797 SCOPED_TRACE("Calling VerifyPartition");
798 EXPECT_TRUE(VerifyPartition(0, 2, 1));
799 SCOPED_TRACE("Calling VerifyPartition");
800 EXPECT_TRUE(VerifyPartition(2, 2, 6));
801}
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000802
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000803TEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000804 // Partition 0 | Partition 1 | Partition 2
805 // [ 0 | ] [ 1 ] | [ 2 ]
806 packet_header_.type.Video.isFirstPacket = true;
807 vp8_header_->beginningOfPartition = true;
808 vp8_header_->partitionId = 0;
809 packet_header_.header.markerBit = false;
810 packet_header_.header.sequenceNumber = 0;
811 FillPacket(0);
philipel9d3ab612015-12-21 04:12:39 -0800812 VCMPacket* packet =
813 new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000814 EXPECT_EQ(packet_buffer_size(),
815 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
816 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000817 delete packet;
818
819 packet_header_.type.Video.isFirstPacket = false;
820 vp8_header_->partitionId = 1;
821 vp8_header_->beginningOfPartition = false;
822 packet_header_.header.markerBit = false;
823 packet_header_.header.sequenceNumber += 1;
824 FillPacket(1);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000825 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000826 EXPECT_EQ(packet_buffer_size(),
827 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
828 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000829 delete packet;
830
831 packet_header_.type.Video.isFirstPacket = false;
832 vp8_header_->partitionId = 2;
833 vp8_header_->beginningOfPartition = true;
834 packet_header_.header.markerBit = true;
835 packet_header_.header.sequenceNumber += 1;
836 FillPacket(2);
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000837 packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000838 EXPECT_EQ(packet_buffer_size(),
839 static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
840 kNoErrors, frame_data)));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000841 delete packet;
842
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000843 // No packets removed.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000844 EXPECT_EQ(3 * packet_buffer_size(),
845 session_.BuildVP8FragmentationHeader(
846 frame_buffer_, frame_buffer_size(), &fragmentation_));
stefan@webrtc.org5b914642011-10-03 10:26:12 +0000847 SCOPED_TRACE("Calling VerifyPartition");
848 EXPECT_TRUE(VerifyPartition(0, 2, 0));
849 // This partition is aggregated in partition 0
850 SCOPED_TRACE("Calling VerifyPartition");
851 EXPECT_TRUE(VerifyPartition(1, 0, 0));
852 SCOPED_TRACE("Calling VerifyPartition");
853 EXPECT_TRUE(VerifyPartition(2, 1, 2));
854}
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000855
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000856TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
857 packet_.isFirstPacket = false;
858 packet_.completeNALU = kNaluComplete;
pbos22993e12015-10-19 02:39:06 -0700859 packet_.frameType = kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000860 packet_.sizeBytes = 0;
861 packet_.seqNum = 0;
862 packet_.markerBit = false;
philipel9d3ab612015-12-21 04:12:39 -0800863 EXPECT_EQ(
864 0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000865
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000866 EXPECT_EQ(0U, session_.MakeDecodable());
867 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000868}
869
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000870TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
871 packet_.isFirstPacket = true;
872 packet_.completeNALU = kNaluComplete;
873 packet_.seqNum = 0;
874 packet_.markerBit = false;
875 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000876 EXPECT_EQ(packet_buffer_size(),
877 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
878 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000879
880 packet_.isFirstPacket = false;
881 packet_.completeNALU = kNaluComplete;
882 packet_.seqNum += 2;
883 packet_.markerBit = true;
884 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000885 EXPECT_EQ(packet_buffer_size(),
886 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
887 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000888
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000889 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000890 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000891 SCOPED_TRACE("Calling VerifyNalu");
892 EXPECT_TRUE(VerifyNalu(0, 1, 0));
893 SCOPED_TRACE("Calling VerifyNalu");
894 EXPECT_TRUE(VerifyNalu(1, 1, 2));
895}
896
897TEST_F(TestNalUnits, LossInMiddleOfNalu) {
898 packet_.isFirstPacket = true;
899 packet_.completeNALU = kNaluComplete;
900 packet_.seqNum = 0;
901 packet_.markerBit = false;
902 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000903 EXPECT_EQ(packet_buffer_size(),
904 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
905 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000906
907 packet_.isFirstPacket = false;
908 packet_.completeNALU = kNaluEnd;
909 packet_.seqNum += 2;
910 packet_.markerBit = true;
911 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000912 EXPECT_EQ(packet_buffer_size(),
913 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
914 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000915
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000916 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
917 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000918 SCOPED_TRACE("Calling VerifyNalu");
919 EXPECT_TRUE(VerifyNalu(0, 1, 0));
920}
921
922TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
923 packet_.isFirstPacket = true;
924 packet_.completeNALU = kNaluComplete;
925 packet_.seqNum = 0;
926 packet_.markerBit = false;
927 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000928 EXPECT_EQ(packet_buffer_size(),
929 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
930 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000931
932 packet_.isFirstPacket = false;
933 packet_.completeNALU = kNaluIncomplete;
934 packet_.seqNum += 2;
935 packet_.markerBit = false;
936 FillPacket(1);
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
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000941 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
942 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000943 SCOPED_TRACE("Calling VerifyNalu");
944 EXPECT_TRUE(VerifyNalu(0, 1, 0));
945}
946
947TEST_F(TestNalUnits, ReorderWrapNoLoss) {
948 packet_.seqNum = 0xFFFF;
949 packet_.isFirstPacket = false;
950 packet_.completeNALU = kNaluIncomplete;
951 packet_.seqNum += 1;
952 packet_.markerBit = false;
953 FillPacket(1);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000954 EXPECT_EQ(packet_buffer_size(),
955 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
956 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000957
958 packet_.isFirstPacket = true;
959 packet_.completeNALU = kNaluComplete;
960 packet_.seqNum -= 1;
961 packet_.markerBit = false;
962 FillPacket(0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000963 EXPECT_EQ(packet_buffer_size(),
964 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
965 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000966
967 packet_.isFirstPacket = false;
968 packet_.completeNALU = kNaluEnd;
969 packet_.seqNum += 2;
970 packet_.markerBit = true;
971 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000972 EXPECT_EQ(packet_buffer_size(),
973 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
974 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000975
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000976 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000977 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000978 SCOPED_TRACE("Calling VerifyNalu");
979 EXPECT_TRUE(VerifyNalu(0, 1, 0));
980}
981
982TEST_F(TestNalUnits, WrapLosses) {
983 packet_.seqNum = 0xFFFF;
984 packet_.isFirstPacket = false;
985 packet_.completeNALU = kNaluIncomplete;
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 = false;
993 packet_.completeNALU = kNaluEnd;
994 packet_.seqNum += 2;
995 packet_.markerBit = true;
996 FillPacket(2);
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
pbos@webrtc.org3004c792013-05-07 12:36:21 +00001001 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001002 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001003}
1004
1005TEST_F(TestNalUnits, ReorderWrapLosses) {
1006 packet_.seqNum = 0xFFFF;
1007
1008 packet_.isFirstPacket = false;
1009 packet_.completeNALU = kNaluEnd;
1010 packet_.seqNum += 2;
1011 packet_.markerBit = true;
1012 FillPacket(2);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001013 EXPECT_EQ(packet_buffer_size(),
1014 static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1015 kNoErrors, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001016
1017 packet_.seqNum -= 2;
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
pbos@webrtc.org3004c792013-05-07 12:36:21 +00001026 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001027 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001028}
agalusza@google.comd177c102013-08-08 01:12:33 +00001029
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +00001030} // namespace webrtc