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