blob: c7291b02c4c38146048670437d9eca5aa6fa49e9 [file] [log] [blame]
brandtrc295e002016-11-03 09:22:33 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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/rtp_rtcp/include/flexfec_sender.h"
12
brandtrc295e002016-11-03 09:22:33 -070013#include <vector>
14
Steve Anton10542f22019-01-11 09:11:00 -080015#include "api/rtp_parameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
17#include "modules/rtp_rtcp/source/fec_test_helper.h"
18#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
19#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
20#include "modules/rtp_rtcp/source/rtp_sender.h"
21#include "modules/rtp_rtcp/source/rtp_utility.h"
22#include "system_wrappers/include/clock.h"
23#include "test/gtest.h"
brandtrc295e002016-11-03 09:22:33 -070024
25namespace webrtc {
26
27namespace {
28
erikvarga27883732017-05-17 05:08:38 -070029using RtpUtility::Word32Align;
brandtrc295e002016-11-03 09:22:33 -070030using test::fec::AugmentedPacket;
31using test::fec::AugmentedPacketGenerator;
32
33constexpr int kFlexfecPayloadType = 123;
34constexpr uint32_t kMediaSsrc = 1234;
35constexpr uint32_t kFlexfecSsrc = 5678;
Steve Antonf0482ea2018-04-09 13:33:52 -070036const char kNoMid[] = "";
brandtrc295e002016-11-03 09:22:33 -070037const std::vector<RtpExtension> kNoRtpHeaderExtensions;
erikvarga27883732017-05-17 05:08:38 -070038const std::vector<RtpExtensionSize> kNoRtpHeaderExtensionSizes;
brandtrc295e002016-11-03 09:22:33 -070039// Assume a single protected media SSRC.
40constexpr size_t kFlexfecMaxHeaderSize = 32;
41constexpr size_t kPayloadLength = 50;
42
43constexpr int64_t kInitialSimulatedClockTime = 1;
44// These values are deterministically given by the PRNG, due to our fixed seed.
45// They should be updated if the PRNG implementation changes.
46constexpr uint16_t kDeterministicSequenceNumber = 28732;
47constexpr uint32_t kDeterministicTimestamp = 2305613085;
48
49std::unique_ptr<RtpPacketToSend> GenerateSingleFlexfecPacket(
50 FlexfecSender* sender) {
51 // Parameters selected to generate a single FEC packet.
52 FecProtectionParams params;
53 params.fec_rate = 15;
54 params.max_fec_frames = 1;
55 params.fec_mask_type = kFecMaskRandom;
56 constexpr size_t kNumPackets = 4;
57
58 sender->SetFecParameters(params);
59 AugmentedPacketGenerator packet_generator(kMediaSsrc);
60 packet_generator.NewFrame(kNumPackets);
61 for (size_t i = 0; i < kNumPackets; ++i) {
62 std::unique_ptr<AugmentedPacket> packet =
63 packet_generator.NextPacket(i, kPayloadLength);
64 RtpPacketToSend rtp_packet(nullptr); // No header extensions.
Ilya Nikolaevskiy082696e2019-09-03 07:52:52 +000065 rtp_packet.Parse(packet->data, packet->length);
brandtrc295e002016-11-03 09:22:33 -070066 EXPECT_TRUE(sender->AddRtpPacketAndGenerateFec(rtp_packet));
67 }
68 EXPECT_TRUE(sender->FecAvailable());
69 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
70 sender->GetFecPackets();
71 EXPECT_FALSE(sender->FecAvailable());
72 EXPECT_EQ(1U, fec_packets.size());
73
74 return std::move(fec_packets.front());
75}
76
77} // namespace
78
brandtr9dfff292016-11-14 05:14:50 -080079TEST(FlexfecSenderTest, Ssrc) {
80 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -070081 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -070082 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -070083 nullptr /* rtp_state */, &clock);
brandtr9dfff292016-11-14 05:14:50 -080084
85 EXPECT_EQ(kFlexfecSsrc, sender.ssrc());
86}
87
brandtrc295e002016-11-03 09:22:33 -070088TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) {
89 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -070090 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -070091 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -070092 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -070093
94 EXPECT_FALSE(sender.FecAvailable());
95 auto fec_packets = sender.GetFecPackets();
96 EXPECT_EQ(0U, fec_packets.size());
97}
98
99TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) {
100 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700101 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700102 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700103 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700104 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
105
106 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
107 EXPECT_FALSE(fec_packet->Marker());
108 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
109 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
110 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
111 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
112 EXPECT_LE(kPayloadLength, fec_packet->payload_size());
113}
114
115TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) {
116 // FEC parameters selected to generate a single FEC packet per frame.
117 FecProtectionParams params;
118 params.fec_rate = 15;
119 params.max_fec_frames = 2;
120 params.fec_mask_type = kFecMaskRandom;
121 constexpr size_t kNumFrames = 2;
122 constexpr size_t kNumPacketsPerFrame = 2;
123 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700124 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700125 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700126 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700127 sender.SetFecParameters(params);
128
129 AugmentedPacketGenerator packet_generator(kMediaSsrc);
130 for (size_t i = 0; i < kNumFrames; ++i) {
131 packet_generator.NewFrame(kNumPacketsPerFrame);
132 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
133 std::unique_ptr<AugmentedPacket> packet =
134 packet_generator.NextPacket(i, kPayloadLength);
135 RtpPacketToSend rtp_packet(nullptr);
Ilya Nikolaevskiy082696e2019-09-03 07:52:52 +0000136 rtp_packet.Parse(packet->data, packet->length);
brandtrc295e002016-11-03 09:22:33 -0700137 EXPECT_TRUE(sender.AddRtpPacketAndGenerateFec(rtp_packet));
138 }
139 }
140 EXPECT_TRUE(sender.FecAvailable());
141 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
142 sender.GetFecPackets();
143 EXPECT_FALSE(sender.FecAvailable());
144 ASSERT_EQ(1U, fec_packets.size());
145
146 RtpPacketToSend* fec_packet = fec_packets.front().get();
147 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
148 EXPECT_FALSE(fec_packet->Marker());
149 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
150 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
151 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
152 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
153}
154
155TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) {
156 // FEC parameters selected to generate a single FEC packet per frame.
157 FecProtectionParams params;
158 params.fec_rate = 30;
159 params.max_fec_frames = 1;
160 params.fec_mask_type = kFecMaskRandom;
161 constexpr size_t kNumFrames = 2;
162 constexpr size_t kNumPacketsPerFrame = 2;
163 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700164 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700165 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700166 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700167 sender.SetFecParameters(params);
168
169 AugmentedPacketGenerator packet_generator(kMediaSsrc);
170 for (size_t i = 0; i < kNumFrames; ++i) {
171 packet_generator.NewFrame(kNumPacketsPerFrame);
172 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
173 std::unique_ptr<AugmentedPacket> packet =
174 packet_generator.NextPacket(i, kPayloadLength);
175 RtpPacketToSend rtp_packet(nullptr);
Ilya Nikolaevskiy082696e2019-09-03 07:52:52 +0000176 rtp_packet.Parse(packet->data, packet->length);
brandtrc295e002016-11-03 09:22:33 -0700177 EXPECT_TRUE(sender.AddRtpPacketAndGenerateFec(rtp_packet));
178 }
179 EXPECT_TRUE(sender.FecAvailable());
180 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
181 sender.GetFecPackets();
182 EXPECT_FALSE(sender.FecAvailable());
183 ASSERT_EQ(1U, fec_packets.size());
184
185 RtpPacketToSend* fec_packet = fec_packets.front().get();
186 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
187 EXPECT_FALSE(fec_packet->Marker());
188 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
189 EXPECT_EQ(static_cast<uint16_t>(kDeterministicSequenceNumber + i),
190 fec_packet->SequenceNumber());
191 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
192 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
193 }
194}
195
196// In the tests, we only consider RTP header extensions that are useful for BWE.
197TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) {
198 const std::vector<RtpExtension> kRtpHeaderExtensions{};
199 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700200 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700201 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700202 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700203 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
204
205 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
206 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
207 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
208}
209
210TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) {
211 const std::vector<RtpExtension> kRtpHeaderExtensions{
212 {RtpExtension::kAbsSendTimeUri, 1}};
213 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700214 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700215 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700216 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700217 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
218
219 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
220 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
221 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
222}
223
224TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) {
225 const std::vector<RtpExtension> kRtpHeaderExtensions{
226 {RtpExtension::kTimestampOffsetUri, 1}};
227 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700228 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700229 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700230 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700231 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
232
233 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
234 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
235 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
236}
237
238TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) {
239 const std::vector<RtpExtension> kRtpHeaderExtensions{
240 {RtpExtension::kTransportSequenceNumberUri, 1}};
241 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700242 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700243 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700244 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700245 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
246
247 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
248 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
249 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
250}
251
252TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) {
253 const std::vector<RtpExtension> kRtpHeaderExtensions{
254 {RtpExtension::kAbsSendTimeUri, 1},
255 {RtpExtension::kTimestampOffsetUri, 2},
256 {RtpExtension::kTransportSequenceNumberUri, 3}};
257 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700258 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700259 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700260 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700261 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
262
263 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
264 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
265 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
266}
267
268TEST(FlexfecSenderTest, MaxPacketOverhead) {
269 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700270 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700271 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700272 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700273
274 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead());
275}
276
erikvarga27883732017-05-17 05:08:38 -0700277TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) {
278 const std::vector<RtpExtension> kRtpHeaderExtensions{
279 {RtpExtension::kAbsSendTimeUri, 1},
280 {RtpExtension::kTimestampOffsetUri, 2},
281 {RtpExtension::kTransportSequenceNumberUri, 3}};
282 SimulatedClock clock(kInitialSimulatedClockTime);
283 const size_t kExtensionHeaderLength = 1;
284 const size_t kRtpOneByteHeaderLength = 4;
Yves Gerey665174f2018-06-19 15:03:05 +0200285 const size_t kExtensionsTotalSize =
286 Word32Align(kRtpOneByteHeaderLength + kExtensionHeaderLength +
287 AbsoluteSendTime::kValueSizeBytes + kExtensionHeaderLength +
288 TransmissionOffset::kValueSizeBytes + kExtensionHeaderLength +
289 TransportSequenceNumber::kValueSizeBytes);
Steve Antonf0482ea2018-04-09 13:33:52 -0700290 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700291 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
brandtr48d21a22017-05-30 02:32:12 -0700292 nullptr /* rtp_state */, &clock);
erikvarga27883732017-05-17 05:08:38 -0700293
294 EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize,
295 sender.MaxPacketOverhead());
296}
297
Steve Antonf0482ea2018-04-09 13:33:52 -0700298TEST(FlexfecSenderTest, MidIncludedInPacketsWhenSet) {
299 const std::vector<RtpExtension> kRtpHeaderExtensions{
300 {RtpExtension::kMidUri, 1}};
301 const char kMid[] = "mid";
302 SimulatedClock clock(kInitialSimulatedClockTime);
303 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kMid,
304 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
305 nullptr /* rtp_state */, &clock);
306
307 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
308
309 std::string mid;
310 ASSERT_TRUE(fec_packet->GetExtension<RtpMid>(&mid));
311 EXPECT_EQ(kMid, mid);
312}
313
brandtr48d21a22017-05-30 02:32:12 -0700314TEST(FlexfecSenderTest, SetsAndGetsRtpState) {
315 RtpState initial_rtp_state;
316 initial_rtp_state.sequence_number = 100;
317 initial_rtp_state.start_timestamp = 200;
318 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700319 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
brandtr48d21a22017-05-30 02:32:12 -0700320 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
321 &initial_rtp_state, &clock);
322
323 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
324 EXPECT_EQ(initial_rtp_state.sequence_number, fec_packet->SequenceNumber());
325 EXPECT_EQ(initial_rtp_state.start_timestamp, fec_packet->Timestamp());
326
327 clock.AdvanceTimeMilliseconds(1000);
328 fec_packet = GenerateSingleFlexfecPacket(&sender);
329 EXPECT_EQ(initial_rtp_state.sequence_number + 1,
330 fec_packet->SequenceNumber());
331 EXPECT_EQ(initial_rtp_state.start_timestamp + 1 * kVideoPayloadTypeFrequency,
332 fec_packet->Timestamp());
333
334 RtpState updated_rtp_state = sender.GetRtpState();
335 EXPECT_EQ(initial_rtp_state.sequence_number + 2,
336 updated_rtp_state.sequence_number);
337 EXPECT_EQ(initial_rtp_state.start_timestamp,
338 updated_rtp_state.start_timestamp);
339}
340
brandtrc295e002016-11-03 09:22:33 -0700341} // namespace webrtc