OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 using test::fec::AugmentedPacket; | 26 using test::fec::AugmentedPacket; |
27 using test::fec::AugmentedPacketGenerator; | 27 using test::fec::AugmentedPacketGenerator; |
28 | 28 |
29 constexpr int kFlexfecPayloadType = 123; | 29 constexpr int kFlexfecPayloadType = 123; |
30 constexpr uint32_t kMediaSsrc = 1234; | 30 constexpr uint32_t kMediaSsrc = 1234; |
31 constexpr uint32_t kFlexfecSsrc = 5678; | 31 constexpr uint32_t kFlexfecSsrc = 5678; |
32 const std::vector<RtpExtension> kNoRtpHeaderExtensions; | 32 const std::vector<RtpExtension> kNoRtpHeaderExtensions; |
| 33 const std::vector<RtpExtensionSize> kNoRtpHeaderExtensionSizes; |
33 // Assume a single protected media SSRC. | 34 // Assume a single protected media SSRC. |
34 constexpr size_t kFlexfecMaxHeaderSize = 32; | 35 constexpr size_t kFlexfecMaxHeaderSize = 32; |
35 constexpr size_t kPayloadLength = 50; | 36 constexpr size_t kPayloadLength = 50; |
36 | 37 |
37 constexpr int64_t kInitialSimulatedClockTime = 1; | 38 constexpr int64_t kInitialSimulatedClockTime = 1; |
38 // These values are deterministically given by the PRNG, due to our fixed seed. | 39 // These values are deterministically given by the PRNG, due to our fixed seed. |
39 // They should be updated if the PRNG implementation changes. | 40 // They should be updated if the PRNG implementation changes. |
40 constexpr uint16_t kDeterministicSequenceNumber = 28732; | 41 constexpr uint16_t kDeterministicSequenceNumber = 28732; |
41 constexpr uint32_t kDeterministicTimestamp = 2305613085; | 42 constexpr uint32_t kDeterministicTimestamp = 2305613085; |
42 | 43 |
(...skipping 23 matching lines...) Expand all Loading... |
66 EXPECT_EQ(1U, fec_packets.size()); | 67 EXPECT_EQ(1U, fec_packets.size()); |
67 | 68 |
68 return std::move(fec_packets.front()); | 69 return std::move(fec_packets.front()); |
69 } | 70 } |
70 | 71 |
71 } // namespace | 72 } // namespace |
72 | 73 |
73 TEST(FlexfecSenderTest, Ssrc) { | 74 TEST(FlexfecSenderTest, Ssrc) { |
74 SimulatedClock clock(kInitialSimulatedClockTime); | 75 SimulatedClock clock(kInitialSimulatedClockTime); |
75 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 76 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
76 kNoRtpHeaderExtensions, &clock); | 77 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 78 &clock); |
77 | 79 |
78 EXPECT_EQ(kFlexfecSsrc, sender.ssrc()); | 80 EXPECT_EQ(kFlexfecSsrc, sender.ssrc()); |
79 } | 81 } |
80 | 82 |
81 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) { | 83 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) { |
82 SimulatedClock clock(kInitialSimulatedClockTime); | 84 SimulatedClock clock(kInitialSimulatedClockTime); |
83 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 85 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
84 kNoRtpHeaderExtensions, &clock); | 86 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 87 &clock); |
85 | 88 |
86 EXPECT_FALSE(sender.FecAvailable()); | 89 EXPECT_FALSE(sender.FecAvailable()); |
87 auto fec_packets = sender.GetFecPackets(); | 90 auto fec_packets = sender.GetFecPackets(); |
88 EXPECT_EQ(0U, fec_packets.size()); | 91 EXPECT_EQ(0U, fec_packets.size()); |
89 } | 92 } |
90 | 93 |
91 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) { | 94 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) { |
92 SimulatedClock clock(kInitialSimulatedClockTime); | 95 SimulatedClock clock(kInitialSimulatedClockTime); |
93 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 96 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
94 kNoRtpHeaderExtensions, &clock); | 97 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 98 &clock); |
95 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 99 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
96 | 100 |
97 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size()); | 101 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size()); |
98 EXPECT_FALSE(fec_packet->Marker()); | 102 EXPECT_FALSE(fec_packet->Marker()); |
99 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType()); | 103 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType()); |
100 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber()); | 104 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber()); |
101 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); | 105 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); |
102 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); | 106 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); |
103 EXPECT_LE(kPayloadLength, fec_packet->payload_size()); | 107 EXPECT_LE(kPayloadLength, fec_packet->payload_size()); |
104 } | 108 } |
105 | 109 |
106 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) { | 110 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) { |
107 // FEC parameters selected to generate a single FEC packet per frame. | 111 // FEC parameters selected to generate a single FEC packet per frame. |
108 FecProtectionParams params; | 112 FecProtectionParams params; |
109 params.fec_rate = 15; | 113 params.fec_rate = 15; |
110 params.max_fec_frames = 2; | 114 params.max_fec_frames = 2; |
111 params.fec_mask_type = kFecMaskRandom; | 115 params.fec_mask_type = kFecMaskRandom; |
112 constexpr size_t kNumFrames = 2; | 116 constexpr size_t kNumFrames = 2; |
113 constexpr size_t kNumPacketsPerFrame = 2; | 117 constexpr size_t kNumPacketsPerFrame = 2; |
114 SimulatedClock clock(kInitialSimulatedClockTime); | 118 SimulatedClock clock(kInitialSimulatedClockTime); |
115 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 119 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
116 kNoRtpHeaderExtensions, &clock); | 120 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 121 &clock); |
117 sender.SetFecParameters(params); | 122 sender.SetFecParameters(params); |
118 | 123 |
119 AugmentedPacketGenerator packet_generator(kMediaSsrc); | 124 AugmentedPacketGenerator packet_generator(kMediaSsrc); |
120 for (size_t i = 0; i < kNumFrames; ++i) { | 125 for (size_t i = 0; i < kNumFrames; ++i) { |
121 packet_generator.NewFrame(kNumPacketsPerFrame); | 126 packet_generator.NewFrame(kNumPacketsPerFrame); |
122 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { | 127 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { |
123 std::unique_ptr<AugmentedPacket> packet = | 128 std::unique_ptr<AugmentedPacket> packet = |
124 packet_generator.NextPacket(i, kPayloadLength); | 129 packet_generator.NextPacket(i, kPayloadLength); |
125 RtpPacketToSend rtp_packet(nullptr); | 130 RtpPacketToSend rtp_packet(nullptr); |
126 rtp_packet.Parse(packet->data, packet->length); | 131 rtp_packet.Parse(packet->data, packet->length); |
(...skipping 18 matching lines...) Expand all Loading... |
145 TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) { | 150 TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) { |
146 // FEC parameters selected to generate a single FEC packet per frame. | 151 // FEC parameters selected to generate a single FEC packet per frame. |
147 FecProtectionParams params; | 152 FecProtectionParams params; |
148 params.fec_rate = 30; | 153 params.fec_rate = 30; |
149 params.max_fec_frames = 1; | 154 params.max_fec_frames = 1; |
150 params.fec_mask_type = kFecMaskRandom; | 155 params.fec_mask_type = kFecMaskRandom; |
151 constexpr size_t kNumFrames = 2; | 156 constexpr size_t kNumFrames = 2; |
152 constexpr size_t kNumPacketsPerFrame = 2; | 157 constexpr size_t kNumPacketsPerFrame = 2; |
153 SimulatedClock clock(kInitialSimulatedClockTime); | 158 SimulatedClock clock(kInitialSimulatedClockTime); |
154 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 159 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
155 kNoRtpHeaderExtensions, &clock); | 160 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 161 &clock); |
156 sender.SetFecParameters(params); | 162 sender.SetFecParameters(params); |
157 | 163 |
158 AugmentedPacketGenerator packet_generator(kMediaSsrc); | 164 AugmentedPacketGenerator packet_generator(kMediaSsrc); |
159 for (size_t i = 0; i < kNumFrames; ++i) { | 165 for (size_t i = 0; i < kNumFrames; ++i) { |
160 packet_generator.NewFrame(kNumPacketsPerFrame); | 166 packet_generator.NewFrame(kNumPacketsPerFrame); |
161 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { | 167 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { |
162 std::unique_ptr<AugmentedPacket> packet = | 168 std::unique_ptr<AugmentedPacket> packet = |
163 packet_generator.NextPacket(i, kPayloadLength); | 169 packet_generator.NextPacket(i, kPayloadLength); |
164 RtpPacketToSend rtp_packet(nullptr); | 170 RtpPacketToSend rtp_packet(nullptr); |
165 rtp_packet.Parse(packet->data, packet->length); | 171 rtp_packet.Parse(packet->data, packet->length); |
(...skipping 14 matching lines...) Expand all Loading... |
180 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); | 186 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); |
181 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); | 187 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); |
182 } | 188 } |
183 } | 189 } |
184 | 190 |
185 // In the tests, we only consider RTP header extensions that are useful for BWE. | 191 // In the tests, we only consider RTP header extensions that are useful for BWE. |
186 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) { | 192 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) { |
187 const std::vector<RtpExtension> kRtpHeaderExtensions{}; | 193 const std::vector<RtpExtension> kRtpHeaderExtensions{}; |
188 SimulatedClock clock(kInitialSimulatedClockTime); | 194 SimulatedClock clock(kInitialSimulatedClockTime); |
189 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 195 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
190 kRtpHeaderExtensions, &clock); | 196 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 197 &clock); |
191 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 198 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
192 | 199 |
193 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 200 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
194 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 201 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
195 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 202 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
196 } | 203 } |
197 | 204 |
198 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) { | 205 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) { |
199 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 206 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
200 {RtpExtension::kAbsSendTimeUri, 1}}; | 207 {RtpExtension::kAbsSendTimeUri, 1}}; |
201 SimulatedClock clock(kInitialSimulatedClockTime); | 208 SimulatedClock clock(kInitialSimulatedClockTime); |
202 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 209 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
203 kRtpHeaderExtensions, &clock); | 210 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 211 &clock); |
204 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 212 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
205 | 213 |
206 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); | 214 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); |
207 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 215 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
208 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 216 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
209 } | 217 } |
210 | 218 |
211 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) { | 219 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) { |
212 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 220 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
213 {RtpExtension::kTimestampOffsetUri, 1}}; | 221 {RtpExtension::kTimestampOffsetUri, 1}}; |
214 SimulatedClock clock(kInitialSimulatedClockTime); | 222 SimulatedClock clock(kInitialSimulatedClockTime); |
215 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 223 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
216 kRtpHeaderExtensions, &clock); | 224 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 225 &clock); |
217 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 226 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
218 | 227 |
219 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 228 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
220 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); | 229 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); |
221 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 230 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
222 } | 231 } |
223 | 232 |
224 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) { | 233 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) { |
225 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 234 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
226 {RtpExtension::kTransportSequenceNumberUri, 1}}; | 235 {RtpExtension::kTransportSequenceNumberUri, 1}}; |
227 SimulatedClock clock(kInitialSimulatedClockTime); | 236 SimulatedClock clock(kInitialSimulatedClockTime); |
228 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 237 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
229 kRtpHeaderExtensions, &clock); | 238 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 239 &clock); |
230 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 240 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
231 | 241 |
232 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 242 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
233 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 243 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
234 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); | 244 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); |
235 } | 245 } |
236 | 246 |
237 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) { | 247 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) { |
238 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 248 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
239 {RtpExtension::kAbsSendTimeUri, 1}, | 249 {RtpExtension::kAbsSendTimeUri, 1}, |
240 {RtpExtension::kTimestampOffsetUri, 2}, | 250 {RtpExtension::kTimestampOffsetUri, 2}, |
241 {RtpExtension::kTransportSequenceNumberUri, 3}}; | 251 {RtpExtension::kTransportSequenceNumberUri, 3}}; |
242 SimulatedClock clock(kInitialSimulatedClockTime); | 252 SimulatedClock clock(kInitialSimulatedClockTime); |
243 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 253 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
244 kRtpHeaderExtensions, &clock); | 254 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 255 &clock); |
245 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 256 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
246 | 257 |
247 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); | 258 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); |
248 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); | 259 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); |
249 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); | 260 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); |
250 } | 261 } |
251 | 262 |
252 TEST(FlexfecSenderTest, MaxPacketOverhead) { | 263 TEST(FlexfecSenderTest, MaxPacketOverhead) { |
253 SimulatedClock clock(kInitialSimulatedClockTime); | 264 SimulatedClock clock(kInitialSimulatedClockTime); |
254 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 265 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
255 kNoRtpHeaderExtensions, &clock); | 266 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 267 &clock); |
256 | 268 |
257 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead()); | 269 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead()); |
258 } | 270 } |
259 | 271 |
260 } // namespace webrtc | 272 } // namespace webrtc |
OLD | NEW |