Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/flexfec_sender_unittest.cc

Issue 2441613002: Add FlexfecSender. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
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
13 #include "webrtc/config.h"
14 #include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
16 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
18 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
19 #include "webrtc/system_wrappers/include/clock.h"
20 #include "webrtc/test/gtest.h"
21
22 namespace webrtc {
23
24 namespace {
25
26 using test::fec::AugmentedPacket;
27 using test::fec::AugmentedPacketGenerator;
28
29 constexpr int kFlexfecPayloadType = 123;
30 constexpr uint32_t kMediaSsrc = 1234;
31 constexpr uint32_t kFlexfecSsrc = 5678;
32 const std::vector<RtpExtension> kNoRtpHeaderExtensions;
33 // Assume a single protected media SSRC.
34 constexpr size_t kFlexfecMaxHeaderSize = 32;
35 constexpr size_t kPayloadLength = 50;
36
37 constexpr int64_t kInitialSimulatedClockTime = 1;
38 // These values are deterministically given by the PRNG, due to our fixed seed.
39 // They should be updated if the PRNG implementation changes.
40 constexpr uint16_t kDeterministicSequenceNumber = 17590;
41 constexpr uint32_t kDeterministicTimestamp = 3016887581;
42
43 std::unique_ptr<RtpPacketToSend> GenerateSingleFlexfecPacket(
44 FlexfecSender* sender) {
45 // Parameters selected to generate a single FEC packet.
46 constexpr size_t kNumPackets = 4;
47 FecProtectionParams params = {15, 3, kFecMaskRandom};
48
49 sender->SetFecParameters(&params);
50 AugmentedPacketGenerator packet_generator(kMediaSsrc);
51 packet_generator.NewFrame(kNumPackets);
52 for (size_t i = 0; i < kNumPackets; ++i) {
53 std::unique_ptr<AugmentedPacket> packet =
54 packet_generator.NextPacket(i, kPayloadLength);
55 RtpPacketToSend rtp_packet(nullptr); // No header extensions.
56 rtp_packet.Parse(packet->data, packet->length);
57 EXPECT_EQ(0, sender->AddRtpPacketAndGenerateFec(&rtp_packet));
58 }
59 EXPECT_TRUE(sender->FecAvailable());
60 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
61 sender->GetFecPackets();
62 EXPECT_FALSE(sender->FecAvailable());
63 EXPECT_EQ(1U, fec_packets.size());
64
65 return std::move(fec_packets.front());
66 }
67
68 } // namespace
69
70 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) {
71 SimulatedClock clock(kInitialSimulatedClockTime);
72 std::unique_ptr<FlexfecSender> sender =
73 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
74 kNoRtpHeaderExtensions, &clock);
75
76 EXPECT_FALSE(sender->FecAvailable());
77 auto fec_packets = sender->GetFecPackets();
78 EXPECT_EQ(0U, fec_packets.size());
79 }
80
81 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) {
82 SimulatedClock clock(kInitialSimulatedClockTime);
83 std::unique_ptr<FlexfecSender> sender =
84 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
85 kNoRtpHeaderExtensions, &clock);
86 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
87
88 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
89 EXPECT_FALSE(fec_packet->Marker());
90 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
91 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
92 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
93 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
94 EXPECT_GE(fec_packet->payload_size(), kPayloadLength);
danilchap 2016/10/20 15:12:58 constant 1st for EXPECT macros (i.e. EXPECT_LE(kPa
brandtr 2016/10/24 12:52:08 Done.
95 }
96
97 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) {
98 // Parameters selected to generate a single FEC packet per frame.
99 constexpr size_t kNumFrames = 2;
100 constexpr size_t kNumPacketsPerFrame = 2;
101 FecProtectionParams params = {15, 3, kFecMaskRandom};
danilchap 2016/10/20 15:12:58 Are values 15 and 3 important? If they are, may be
brandtr 2016/10/24 12:52:08 Yes, they are important. Clarified according to yo
102 SimulatedClock clock(kInitialSimulatedClockTime);
103 std::unique_ptr<FlexfecSender> sender =
104 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
105 kNoRtpHeaderExtensions, &clock);
106 sender->SetFecParameters(&params);
107
108 AugmentedPacketGenerator packet_generator(kMediaSsrc);
109 for (size_t i = 0; i < kNumFrames; ++i) {
110 packet_generator.NewFrame(kNumPacketsPerFrame);
111 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
112 std::unique_ptr<AugmentedPacket> packet =
113 packet_generator.NextPacket(i, kPayloadLength);
114 RtpPacketToSend rtp_packet(nullptr);
115 rtp_packet.Parse(packet->data, packet->length);
116 EXPECT_EQ(0, sender->AddRtpPacketAndGenerateFec(&rtp_packet));
117 }
118 }
119 EXPECT_TRUE(sender->FecAvailable());
120 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
121 sender->GetFecPackets();
122 EXPECT_FALSE(sender->FecAvailable());
123 EXPECT_EQ(1U, fec_packets.size());
124
125 RtpPacketToSend* fec_packet = fec_packets.front().get();
126 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
127 EXPECT_FALSE(fec_packet->Marker());
128 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
129 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
130 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
131 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
132 }
133
134 TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) {
135 // Parameters selected to generate a single FEC packet per frame.
136 constexpr size_t kNumFrames = 2;
137 constexpr size_t kNumPacketsPerFrame = 4;
138 FecProtectionParams params = {15, 3, kFecMaskRandom};
139 SimulatedClock clock(kInitialSimulatedClockTime);
140 std::unique_ptr<FlexfecSender> sender =
141 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
142 kNoRtpHeaderExtensions, &clock);
143 sender->SetFecParameters(&params);
144
145 AugmentedPacketGenerator packet_generator(kMediaSsrc);
146 for (size_t i = 0; i < kNumFrames; ++i) {
147 packet_generator.NewFrame(kNumPacketsPerFrame);
148 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
149 std::unique_ptr<AugmentedPacket> packet =
150 packet_generator.NextPacket(i, kPayloadLength);
151 RtpPacketToSend rtp_packet(nullptr);
152 rtp_packet.Parse(packet->data, packet->length);
153 EXPECT_EQ(0, sender->AddRtpPacketAndGenerateFec(&rtp_packet));
154 }
155 EXPECT_TRUE(sender->FecAvailable());
156 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
157 sender->GetFecPackets();
158 EXPECT_FALSE(sender->FecAvailable());
159 EXPECT_EQ(1U, fec_packets.size());
160
161 RtpPacketToSend* fec_packet = fec_packets.front().get();
162 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
163 EXPECT_FALSE(fec_packet->Marker());
164 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
165 EXPECT_EQ(static_cast<uint16_t>(kDeterministicSequenceNumber + i),
166 fec_packet->SequenceNumber());
167 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
168 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
169 }
170 }
171
172 // In the tests, we only consider RTP header extensions that are useful for BWE.
173 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) {
174 const std::vector<RtpExtension> kRtpHeaderExtensions{};
175 SimulatedClock clock(kInitialSimulatedClockTime);
176 std::unique_ptr<FlexfecSender> sender =
177 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
178 kRtpHeaderExtensions, &clock);
179 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
180
181 EXPECT_FALSE(fec_packet->ReserveExtension<AbsoluteSendTime>());
182 EXPECT_FALSE(fec_packet->ReserveExtension<TransmissionOffset>());
183 EXPECT_FALSE(fec_packet->ReserveExtension<TransportSequenceNumber>());
184 }
185
186 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) {
187 const std::vector<RtpExtension> kRtpHeaderExtensions{
188 {RtpExtension::kAbsSendTimeUri, 1}};
189 SimulatedClock clock(kInitialSimulatedClockTime);
190 std::unique_ptr<FlexfecSender> sender =
191 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
192 kRtpHeaderExtensions, &clock);
193 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
194
195 EXPECT_TRUE(fec_packet->ReserveExtension<AbsoluteSendTime>());
danilchap 2016/10/20 15:12:58 may be fec_packet->HasExtension<AbsoluteSendTime>(
brandtr 2016/10/24 12:52:08 Of course! Fixed.
196 EXPECT_FALSE(fec_packet->ReserveExtension<TransmissionOffset>());
197 EXPECT_FALSE(fec_packet->ReserveExtension<TransportSequenceNumber>());
198 }
199
200 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) {
201 const std::vector<RtpExtension> kRtpHeaderExtensions{
202 {RtpExtension::kTimestampOffsetUri, 1}};
203 SimulatedClock clock(kInitialSimulatedClockTime);
204 std::unique_ptr<FlexfecSender> sender =
205 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
206 kRtpHeaderExtensions, &clock);
207 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
208
209 EXPECT_FALSE(fec_packet->ReserveExtension<AbsoluteSendTime>());
210 EXPECT_TRUE(fec_packet->ReserveExtension<TransmissionOffset>());
211 EXPECT_FALSE(fec_packet->ReserveExtension<TransportSequenceNumber>());
212 }
213
214 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) {
215 const std::vector<RtpExtension> kRtpHeaderExtensions{
216 {RtpExtension::kTransportSequenceNumberUri, 1}};
217 SimulatedClock clock(kInitialSimulatedClockTime);
218 std::unique_ptr<FlexfecSender> sender =
219 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
220 kRtpHeaderExtensions, &clock);
221 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
222
223 EXPECT_FALSE(fec_packet->ReserveExtension<AbsoluteSendTime>());
224 EXPECT_FALSE(fec_packet->ReserveExtension<TransmissionOffset>());
225 EXPECT_TRUE(fec_packet->ReserveExtension<TransportSequenceNumber>());
226 }
227
228 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) {
229 const std::vector<RtpExtension> kRtpHeaderExtensions{
230 {RtpExtension::kAbsSendTimeUri, 1},
231 {RtpExtension::kTimestampOffsetUri, 2},
232 {RtpExtension::kTransportSequenceNumberUri, 3}};
233 SimulatedClock clock(kInitialSimulatedClockTime);
234 std::unique_ptr<FlexfecSender> sender =
235 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
236 kRtpHeaderExtensions, &clock);
237 auto fec_packet = GenerateSingleFlexfecPacket(sender.get());
238
239 EXPECT_TRUE(fec_packet->ReserveExtension<AbsoluteSendTime>());
240 EXPECT_TRUE(fec_packet->ReserveExtension<TransmissionOffset>());
241 EXPECT_TRUE(fec_packet->ReserveExtension<TransportSequenceNumber>());
242 }
243
244 TEST(FlexfecSenderTest, MaxPacketOverhead) {
245 SimulatedClock clock(kInitialSimulatedClockTime);
246 std::unique_ptr<FlexfecSender> sender =
247 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
248 kNoRtpHeaderExtensions, &clock);
249
250 EXPECT_EQ(kFlexfecMaxHeaderSize, sender->MaxPacketOverhead());
251 }
252
253 // TODO(brandtr): Remove this test when we support multistream protection.
254 TEST(FlexfecSenderTest, DoesNotProtectMultipleMediaStreams) {
255 // Parameters selected to generate a single FEC packet.
256 constexpr size_t kNumPacketsStream1 = 4;
257 constexpr size_t kNumPacketsStream2 = 4;
258 constexpr uint32_t kMediaSsrcStream1 = kMediaSsrc;
259 constexpr uint32_t kMediaSsrcStream2 = kMediaSsrc + 1;
260 FecProtectionParams params = {15, 3, kFecMaskRandom};
261 SimulatedClock clock(kInitialSimulatedClockTime);
262 std::unique_ptr<FlexfecSender> sender =
263 FlexfecSender::Create(kFlexfecPayloadType, kFlexfecSsrc,
264 kMediaSsrcStream2, kNoRtpHeaderExtensions, &clock);
265 sender->SetFecParameters(&params);
266
267 // Feed FlexfecSender media packets from stream 1, which IS NOT protected.
268 AugmentedPacketGenerator packet_generator1(kMediaSsrcStream1);
269 packet_generator1.NewFrame(kNumPacketsStream1);
270 for (size_t i = 0; i < kNumPacketsStream1; ++i) {
271 std::unique_ptr<AugmentedPacket> packet =
272 packet_generator1.NextPacket(i, kPayloadLength);
273 RtpPacketToSend rtp_packet(nullptr);
274 rtp_packet.Parse(packet->data, packet->length);
275 EXPECT_EQ(0, sender->AddRtpPacketAndGenerateFec(&rtp_packet));
276 }
277 EXPECT_FALSE(sender->FecAvailable());
278
279 // Feed FlexfecSender media packets from stream 2, which IS protected.
280 AugmentedPacketGenerator packet_generator2(kMediaSsrcStream2);
281 packet_generator2.NewFrame(kNumPacketsStream2);
282 for (size_t i = 0; i < kNumPacketsStream2; ++i) {
283 std::unique_ptr<AugmentedPacket> packet =
284 packet_generator2.NextPacket(i, kPayloadLength);
285 RtpPacketToSend rtp_packet(nullptr);
286 rtp_packet.Parse(packet->data, packet->length);
287 EXPECT_EQ(0, sender->AddRtpPacketAndGenerateFec(&rtp_packet));
288 }
289 EXPECT_TRUE(sender->FecAvailable());
290 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
291 sender->GetFecPackets();
292 EXPECT_FALSE(sender->FecAvailable());
293 EXPECT_EQ(1U, fec_packets.size());
294
295 RtpPacketToSend* fec_packet = fec_packets.front().get();
296 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
297 EXPECT_FALSE(fec_packet->Marker());
298 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
299 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
300 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
301 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
302 EXPECT_GE(fec_packet->payload_size(), kPayloadLength);
303 }
304
305 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698