blob: 867997701df5de8ab75a436828e9aed1434ed643 [file] [log] [blame]
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +00001/*
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/video_coding/session_info.h"
12
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000013#include <string.h>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/video_coding/packet.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "test/gtest.h"
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000017
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000018namespace webrtc {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000019
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000020class TestSessionInfo : public ::testing::Test {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000021 protected:
22 virtual void SetUp() {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000023 memset(packet_buffer_, 0, sizeof(packet_buffer_));
24 memset(frame_buffer_, 0, sizeof(frame_buffer_));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000025 session_.Reset();
Niels Möllerabbc50e2019-04-24 09:41:16 +020026 packet_.video_header.frame_type = VideoFrameType::kVideoFrameDelta;
pbos@webrtc.org3004c792013-05-07 12:36:21 +000027 packet_.sizeBytes = packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000028 packet_.dataPtr = packet_buffer_;
29 packet_.seqNum = 0;
30 packet_.timestamp = 0;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000031 frame_data.rtt_ms = 0;
32 frame_data.rolling_average_packets_per_frame = -1;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000033 }
34
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000035 void FillPacket(uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000036 for (size_t i = 0; i < packet_buffer_size(); ++i)
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000037 packet_buffer_[i] = start_value + i;
38 }
39
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000040 void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000041 for (size_t j = 0; j < packet_buffer_size(); ++j) {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000042 ASSERT_EQ(start_value + j, start_ptr[j]);
43 }
44 }
45
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000046 size_t packet_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000047 return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
48 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000049 size_t frame_buffer_size() const {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000050 return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
51 }
52
53 enum { kPacketBufferSize = 10 };
54
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000055 uint8_t packet_buffer_[kPacketBufferSize];
pbos@webrtc.org3004c792013-05-07 12:36:21 +000056 uint8_t frame_buffer_[10 * kPacketBufferSize];
57
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000058 VCMSessionInfo session_;
59 VCMPacket packet_;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000060 FrameData frame_data;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000061};
62
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000063class TestNalUnits : public TestSessionInfo {
64 protected:
65 virtual void SetUp() {
66 TestSessionInfo::SetUp();
Niels Möllerd5e02f02019-02-20 13:12:21 +010067 packet_.video_header.codec = kVideoCodecVP8;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000068 }
69
70 bool VerifyNalu(int offset, int packets_expected, int start_value) {
71 EXPECT_GE(session_.SessionLength(),
pbos@webrtc.org3004c792013-05-07 12:36:21 +000072 packets_expected * packet_buffer_size());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000073 for (int i = 0; i < packets_expected; ++i) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000074 int packet_index = (offset + i) * packet_buffer_size();
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000075 VerifyPacket(frame_buffer_ + packet_index, start_value + i);
76 }
77 return true;
78 }
79};
80
mikhal@webrtc.orgcd648862012-01-03 23:59:42 +000081class TestNackList : public TestSessionInfo {
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000082 protected:
pbos@webrtc.org3004c792013-05-07 12:36:21 +000083 static const size_t kMaxSeqNumListLength = 30;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000084
85 virtual void SetUp() {
86 TestSessionInfo::SetUp();
87 seq_num_list_length_ = 0;
88 memset(seq_num_list_, 0, sizeof(seq_num_list_));
89 }
90
philipel9d3ab612015-12-21 04:12:39 -080091 void BuildSeqNumList(uint16_t low, uint16_t high) {
pbos@webrtc.org3004c792013-05-07 12:36:21 +000092 size_t i = 0;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +000093 while (low != high + 1) {
94 EXPECT_LT(i, kMaxSeqNumListLength);
95 if (i >= kMaxSeqNumListLength) {
96 seq_num_list_length_ = kMaxSeqNumListLength;
97 return;
98 }
99 seq_num_list_[i] = low;
100 low++;
101 i++;
102 }
103 seq_num_list_length_ = i;
104 }
105
106 void VerifyAll(int value) {
107 for (int i = 0; i < seq_num_list_length_; ++i)
108 EXPECT_EQ(seq_num_list_[i], value);
109 }
110
111 int seq_num_list_[kMaxSeqNumListLength];
112 int seq_num_list_length_;
113};
114
115TEST_F(TestSessionInfo, TestSimpleAPIs) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100116 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000117 packet_.seqNum = 0xFFFE;
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000118 packet_.sizeBytes = packet_buffer_size();
Niels Möllerabbc50e2019-04-24 09:41:16 +0200119 packet_.video_header.frame_type = VideoFrameType::kVideoFrameKey;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000120 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100121 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
122 packet_, frame_buffer_, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000123 EXPECT_FALSE(session_.HaveLastPacket());
Niels Möller8f7ce222019-03-21 15:43:58 +0100124 EXPECT_EQ(VideoFrameType::kVideoFrameKey, session_.FrameType());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000125
Niels Möllerd5e02f02019-02-20 13:12:21 +0100126 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000127 packet_.markerBit = true;
128 packet_.seqNum += 1;
Niels Möller375b3462019-01-10 15:35:56 +0100129 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
130 packet_, frame_buffer_, frame_data)));
phoglund@webrtc.orgd1a860b2012-01-26 14:49:28 +0000131 EXPECT_TRUE(session_.HaveLastPacket());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000132 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
133 EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
134
135 // Insert empty packet which will be the new high sequence number.
136 // To make things more difficult we will make sure to have a wrap here.
Niels Möllerd5e02f02019-02-20 13:12:21 +0100137 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000138 packet_.markerBit = true;
philipel9d3ab612015-12-21 04:12:39 -0800139 packet_.seqNum = 2;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000140 packet_.sizeBytes = 0;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200141 packet_.video_header.frame_type = VideoFrameType::kEmptyFrame;
Niels Möller375b3462019-01-10 15:35:56 +0100142 EXPECT_EQ(0, session_.InsertPacket(packet_, frame_buffer_, frame_data));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000143 EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
144}
145
146TEST_F(TestSessionInfo, NormalOperation) {
147 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100148 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000149 packet_.markerBit = false;
150 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100151 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
152 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000153
Niels Möllerd5e02f02019-02-20 13:12:21 +0100154 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000155 for (int i = 1; i < 9; ++i) {
156 packet_.seqNum += 1;
157 FillPacket(i);
Niels Möller375b3462019-01-10 15:35:56 +0100158 ASSERT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
159 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000160 }
161
162 packet_.seqNum += 1;
163 packet_.markerBit = true;
164 FillPacket(9);
Niels Möller375b3462019-01-10 15:35:56 +0100165 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
166 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000167
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000168 EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000169 for (int i = 0; i < 10; ++i) {
170 SCOPED_TRACE("Calling VerifyPacket");
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000171 VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000172 }
173}
174
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000175TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
176 packet_.seqNum = 0x0001;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100177 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000178 packet_.markerBit = true;
179 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100180 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
181 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000182
183 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100184 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000185 packet_.markerBit = true;
186 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100187 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000188 packet_.seqNum = 0x0000;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100189 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000190 packet_.markerBit = false;
191 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100192 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000193}
194
195TEST_F(TestSessionInfo, SetMarkerBitOnce) {
196 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100197 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000198 packet_.markerBit = true;
199 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100200 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
201 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000202 ++packet_.seqNum;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100203 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000204 packet_.markerBit = true;
205 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100206 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000207}
208
209TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
210 // Allow packets in the range 5-6.
211 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100212 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000213 packet_.markerBit = false;
214 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100215 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
216 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000217 // Insert an older packet with a first packet set.
218 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100219 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000220 packet_.markerBit = true;
221 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100222 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000223 packet_.seqNum = 0x0006;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100224 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000225 packet_.markerBit = true;
226 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100227 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
228 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000229 packet_.seqNum = 0x0008;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100230 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000231 packet_.markerBit = true;
232 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100233 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000234}
235
236TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
237 packet_.seqNum = 0xFFFE;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100238 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000239 packet_.markerBit = false;
240 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100241 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
242 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000243
244 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100245 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000246 packet_.markerBit = true;
247 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100248 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
249 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000250 packet_.seqNum = 0x0002;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100251 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000252 packet_.markerBit = false;
253 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100254 ASSERT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
255 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000256 packet_.seqNum = 0xFFF0;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100257 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000258 packet_.markerBit = false;
259 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100260 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000261 packet_.seqNum = 0x0006;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100262 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000263 packet_.markerBit = false;
264 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100265 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000266}
267
268TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
269 // Insert out of bound regular packets, and then the first and last packet.
270 // Verify that correct bounds are maintained.
271 packet_.seqNum = 0x0003;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100272 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000273 packet_.markerBit = false;
274 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100275 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
276 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000277 // Insert an older packet with a first packet set.
278 packet_.seqNum = 0x0005;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100279 packet_.video_header.is_first_packet_in_frame = true;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000280 packet_.markerBit = false;
281 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100282 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
283 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000284 packet_.seqNum = 0x0004;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100285 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000286 packet_.markerBit = false;
287 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100288 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000289 packet_.seqNum = 0x0010;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100290 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000291 packet_.markerBit = false;
292 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100293 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
294 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000295 packet_.seqNum = 0x0008;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100296 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000297 packet_.markerBit = true;
298 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100299 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
300 packet_, frame_buffer_, frame_data)));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000301
302 packet_.seqNum = 0x0009;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100303 packet_.video_header.is_first_packet_in_frame = false;
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000304 packet_.markerBit = false;
305 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100306 EXPECT_EQ(-3, session_.InsertPacket(packet_, frame_buffer_, frame_data));
mikhal@webrtc.orgf31a47a2013-08-26 17:10:11 +0000307}
308
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000309TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100310 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000311 packet_.completeNALU = kNaluComplete;
Niels Möllerabbc50e2019-04-24 09:41:16 +0200312 packet_.video_header.frame_type = VideoFrameType::kEmptyFrame;
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000313 packet_.sizeBytes = 0;
314 packet_.seqNum = 0;
315 packet_.markerBit = false;
Niels Möller375b3462019-01-10 15:35:56 +0100316 EXPECT_EQ(0, session_.InsertPacket(packet_, frame_buffer_, frame_data));
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000317
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000318 EXPECT_EQ(0U, session_.MakeDecodable());
319 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org4ce0ba02012-02-28 12:09:09 +0000320}
321
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000322TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100323 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000324 packet_.completeNALU = kNaluComplete;
325 packet_.seqNum = 0;
326 packet_.markerBit = false;
327 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100328 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
329 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000330
Niels Möllerd5e02f02019-02-20 13:12:21 +0100331 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000332 packet_.completeNALU = kNaluComplete;
333 packet_.seqNum += 2;
334 packet_.markerBit = true;
335 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100336 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
337 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000338
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000339 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000340 EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000341 SCOPED_TRACE("Calling VerifyNalu");
342 EXPECT_TRUE(VerifyNalu(0, 1, 0));
343 SCOPED_TRACE("Calling VerifyNalu");
344 EXPECT_TRUE(VerifyNalu(1, 1, 2));
345}
346
347TEST_F(TestNalUnits, LossInMiddleOfNalu) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100348 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000349 packet_.completeNALU = kNaluComplete;
350 packet_.seqNum = 0;
351 packet_.markerBit = false;
352 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100353 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
354 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000355
Niels Möllerd5e02f02019-02-20 13:12:21 +0100356 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000357 packet_.completeNALU = kNaluEnd;
358 packet_.seqNum += 2;
359 packet_.markerBit = true;
360 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100361 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
362 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000363
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000364 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
365 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000366 SCOPED_TRACE("Calling VerifyNalu");
367 EXPECT_TRUE(VerifyNalu(0, 1, 0));
368}
369
370TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
Niels Möllerd5e02f02019-02-20 13:12:21 +0100371 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000372 packet_.completeNALU = kNaluComplete;
373 packet_.seqNum = 0;
374 packet_.markerBit = false;
375 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100376 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
377 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000378
Niels Möllerd5e02f02019-02-20 13:12:21 +0100379 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000380 packet_.completeNALU = kNaluIncomplete;
381 packet_.seqNum += 2;
382 packet_.markerBit = false;
383 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100384 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
385 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000386
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000387 EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
388 EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000389 SCOPED_TRACE("Calling VerifyNalu");
390 EXPECT_TRUE(VerifyNalu(0, 1, 0));
391}
392
393TEST_F(TestNalUnits, ReorderWrapNoLoss) {
394 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100395 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000396 packet_.completeNALU = kNaluIncomplete;
397 packet_.seqNum += 1;
398 packet_.markerBit = false;
399 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100400 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
401 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000402
Niels Möllerd5e02f02019-02-20 13:12:21 +0100403 packet_.video_header.is_first_packet_in_frame = true;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000404 packet_.completeNALU = kNaluComplete;
405 packet_.seqNum -= 1;
406 packet_.markerBit = false;
407 FillPacket(0);
Niels Möller375b3462019-01-10 15:35:56 +0100408 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
409 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000410
Niels Möllerd5e02f02019-02-20 13:12:21 +0100411 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000412 packet_.completeNALU = kNaluEnd;
413 packet_.seqNum += 2;
414 packet_.markerBit = true;
415 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100416 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
417 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000418
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000419 EXPECT_EQ(0U, session_.MakeDecodable());
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000420 EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000421 SCOPED_TRACE("Calling VerifyNalu");
422 EXPECT_TRUE(VerifyNalu(0, 1, 0));
423}
424
425TEST_F(TestNalUnits, WrapLosses) {
426 packet_.seqNum = 0xFFFF;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100427 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000428 packet_.completeNALU = kNaluIncomplete;
429 packet_.markerBit = false;
430 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100431 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
432 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000433
Niels Möllerd5e02f02019-02-20 13:12:21 +0100434 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000435 packet_.completeNALU = kNaluEnd;
436 packet_.seqNum += 2;
437 packet_.markerBit = true;
438 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100439 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
440 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000441
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000442 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000443 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000444}
445
446TEST_F(TestNalUnits, ReorderWrapLosses) {
447 packet_.seqNum = 0xFFFF;
448
Niels Möllerd5e02f02019-02-20 13:12:21 +0100449 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000450 packet_.completeNALU = kNaluEnd;
451 packet_.seqNum += 2;
452 packet_.markerBit = true;
453 FillPacket(2);
Niels Möller375b3462019-01-10 15:35:56 +0100454 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
455 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000456
457 packet_.seqNum -= 2;
Niels Möllerd5e02f02019-02-20 13:12:21 +0100458 packet_.video_header.is_first_packet_in_frame = false;
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000459 packet_.completeNALU = kNaluIncomplete;
460 packet_.markerBit = false;
461 FillPacket(1);
Niels Möller375b3462019-01-10 15:35:56 +0100462 EXPECT_EQ(packet_buffer_size(), static_cast<size_t>(session_.InsertPacket(
463 packet_, frame_buffer_, frame_data)));
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000464
pbos@webrtc.org3004c792013-05-07 12:36:21 +0000465 EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000466 EXPECT_EQ(0U, session_.SessionLength());
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000467}
agalusza@google.comd177c102013-08-08 01:12:33 +0000468
stefan@webrtc.org076fa6e2011-12-13 07:54:56 +0000469} // namespace webrtc