OLD | NEW |
---|---|
(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(¶ms); | |
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(¶ms); | |
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(¶ms); | |
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(¶ms); | |
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 | |
OLD | NEW |