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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 | 71 |
72 return std::move(fec_packets.front()); | 72 return std::move(fec_packets.front()); |
73 } | 73 } |
74 | 74 |
75 } // namespace | 75 } // namespace |
76 | 76 |
77 TEST(FlexfecSenderTest, Ssrc) { | 77 TEST(FlexfecSenderTest, Ssrc) { |
78 SimulatedClock clock(kInitialSimulatedClockTime); | 78 SimulatedClock clock(kInitialSimulatedClockTime); |
79 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 79 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
80 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 80 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
81 &clock); | 81 nullptr /* rtp_state */, &clock); |
82 | 82 |
83 EXPECT_EQ(kFlexfecSsrc, sender.ssrc()); | 83 EXPECT_EQ(kFlexfecSsrc, sender.ssrc()); |
84 } | 84 } |
85 | 85 |
86 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) { | 86 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) { |
87 SimulatedClock clock(kInitialSimulatedClockTime); | 87 SimulatedClock clock(kInitialSimulatedClockTime); |
88 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 88 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
89 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 89 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
90 &clock); | 90 nullptr /* rtp_state */, &clock); |
91 | 91 |
92 EXPECT_FALSE(sender.FecAvailable()); | 92 EXPECT_FALSE(sender.FecAvailable()); |
93 auto fec_packets = sender.GetFecPackets(); | 93 auto fec_packets = sender.GetFecPackets(); |
94 EXPECT_EQ(0U, fec_packets.size()); | 94 EXPECT_EQ(0U, fec_packets.size()); |
95 } | 95 } |
96 | 96 |
97 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) { | 97 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) { |
98 SimulatedClock clock(kInitialSimulatedClockTime); | 98 SimulatedClock clock(kInitialSimulatedClockTime); |
99 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 99 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
100 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 100 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
101 &clock); | 101 nullptr /* rtp_state */, &clock); |
102 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 102 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
103 | 103 |
104 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size()); | 104 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size()); |
105 EXPECT_FALSE(fec_packet->Marker()); | 105 EXPECT_FALSE(fec_packet->Marker()); |
106 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType()); | 106 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType()); |
107 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber()); | 107 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber()); |
108 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); | 108 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp()); |
109 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); | 109 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); |
110 EXPECT_LE(kPayloadLength, fec_packet->payload_size()); | 110 EXPECT_LE(kPayloadLength, fec_packet->payload_size()); |
111 } | 111 } |
112 | 112 |
113 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) { | 113 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) { |
114 // FEC parameters selected to generate a single FEC packet per frame. | 114 // FEC parameters selected to generate a single FEC packet per frame. |
115 FecProtectionParams params; | 115 FecProtectionParams params; |
116 params.fec_rate = 15; | 116 params.fec_rate = 15; |
117 params.max_fec_frames = 2; | 117 params.max_fec_frames = 2; |
118 params.fec_mask_type = kFecMaskRandom; | 118 params.fec_mask_type = kFecMaskRandom; |
119 constexpr size_t kNumFrames = 2; | 119 constexpr size_t kNumFrames = 2; |
120 constexpr size_t kNumPacketsPerFrame = 2; | 120 constexpr size_t kNumPacketsPerFrame = 2; |
121 SimulatedClock clock(kInitialSimulatedClockTime); | 121 SimulatedClock clock(kInitialSimulatedClockTime); |
122 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 122 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
123 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 123 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
124 &clock); | 124 nullptr /* rtp_state */, &clock); |
125 sender.SetFecParameters(params); | 125 sender.SetFecParameters(params); |
126 | 126 |
127 AugmentedPacketGenerator packet_generator(kMediaSsrc); | 127 AugmentedPacketGenerator packet_generator(kMediaSsrc); |
128 for (size_t i = 0; i < kNumFrames; ++i) { | 128 for (size_t i = 0; i < kNumFrames; ++i) { |
129 packet_generator.NewFrame(kNumPacketsPerFrame); | 129 packet_generator.NewFrame(kNumPacketsPerFrame); |
130 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { | 130 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { |
131 std::unique_ptr<AugmentedPacket> packet = | 131 std::unique_ptr<AugmentedPacket> packet = |
132 packet_generator.NextPacket(i, kPayloadLength); | 132 packet_generator.NextPacket(i, kPayloadLength); |
133 RtpPacketToSend rtp_packet(nullptr); | 133 RtpPacketToSend rtp_packet(nullptr); |
134 rtp_packet.Parse(packet->data, packet->length); | 134 rtp_packet.Parse(packet->data, packet->length); |
(...skipping 19 matching lines...) Expand all Loading... |
154 // FEC parameters selected to generate a single FEC packet per frame. | 154 // FEC parameters selected to generate a single FEC packet per frame. |
155 FecProtectionParams params; | 155 FecProtectionParams params; |
156 params.fec_rate = 30; | 156 params.fec_rate = 30; |
157 params.max_fec_frames = 1; | 157 params.max_fec_frames = 1; |
158 params.fec_mask_type = kFecMaskRandom; | 158 params.fec_mask_type = kFecMaskRandom; |
159 constexpr size_t kNumFrames = 2; | 159 constexpr size_t kNumFrames = 2; |
160 constexpr size_t kNumPacketsPerFrame = 2; | 160 constexpr size_t kNumPacketsPerFrame = 2; |
161 SimulatedClock clock(kInitialSimulatedClockTime); | 161 SimulatedClock clock(kInitialSimulatedClockTime); |
162 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 162 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
163 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 163 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
164 &clock); | 164 nullptr /* rtp_state */, &clock); |
165 sender.SetFecParameters(params); | 165 sender.SetFecParameters(params); |
166 | 166 |
167 AugmentedPacketGenerator packet_generator(kMediaSsrc); | 167 AugmentedPacketGenerator packet_generator(kMediaSsrc); |
168 for (size_t i = 0; i < kNumFrames; ++i) { | 168 for (size_t i = 0; i < kNumFrames; ++i) { |
169 packet_generator.NewFrame(kNumPacketsPerFrame); | 169 packet_generator.NewFrame(kNumPacketsPerFrame); |
170 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { | 170 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) { |
171 std::unique_ptr<AugmentedPacket> packet = | 171 std::unique_ptr<AugmentedPacket> packet = |
172 packet_generator.NextPacket(i, kPayloadLength); | 172 packet_generator.NextPacket(i, kPayloadLength); |
173 RtpPacketToSend rtp_packet(nullptr); | 173 RtpPacketToSend rtp_packet(nullptr); |
174 rtp_packet.Parse(packet->data, packet->length); | 174 rtp_packet.Parse(packet->data, packet->length); |
(...skipping 15 matching lines...) Expand all Loading... |
190 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); | 190 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc()); |
191 } | 191 } |
192 } | 192 } |
193 | 193 |
194 // In the tests, we only consider RTP header extensions that are useful for BWE. | 194 // In the tests, we only consider RTP header extensions that are useful for BWE. |
195 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) { | 195 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) { |
196 const std::vector<RtpExtension> kRtpHeaderExtensions{}; | 196 const std::vector<RtpExtension> kRtpHeaderExtensions{}; |
197 SimulatedClock clock(kInitialSimulatedClockTime); | 197 SimulatedClock clock(kInitialSimulatedClockTime); |
198 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 198 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
199 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 199 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
200 &clock); | 200 nullptr /* rtp_state */, &clock); |
201 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 201 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
202 | 202 |
203 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 203 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
204 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 204 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
205 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 205 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
206 } | 206 } |
207 | 207 |
208 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) { | 208 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) { |
209 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 209 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
210 {RtpExtension::kAbsSendTimeUri, 1}}; | 210 {RtpExtension::kAbsSendTimeUri, 1}}; |
211 SimulatedClock clock(kInitialSimulatedClockTime); | 211 SimulatedClock clock(kInitialSimulatedClockTime); |
212 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 212 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
213 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 213 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
214 &clock); | 214 nullptr /* rtp_state */, &clock); |
215 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 215 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
216 | 216 |
217 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); | 217 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); |
218 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 218 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
219 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 219 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
220 } | 220 } |
221 | 221 |
222 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) { | 222 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) { |
223 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 223 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
224 {RtpExtension::kTimestampOffsetUri, 1}}; | 224 {RtpExtension::kTimestampOffsetUri, 1}}; |
225 SimulatedClock clock(kInitialSimulatedClockTime); | 225 SimulatedClock clock(kInitialSimulatedClockTime); |
226 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 226 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
227 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 227 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
228 &clock); | 228 nullptr /* rtp_state */, &clock); |
229 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 229 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
230 | 230 |
231 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 231 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
232 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); | 232 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); |
233 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); | 233 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>()); |
234 } | 234 } |
235 | 235 |
236 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) { | 236 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) { |
237 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 237 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
238 {RtpExtension::kTransportSequenceNumberUri, 1}}; | 238 {RtpExtension::kTransportSequenceNumberUri, 1}}; |
239 SimulatedClock clock(kInitialSimulatedClockTime); | 239 SimulatedClock clock(kInitialSimulatedClockTime); |
240 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 240 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
241 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 241 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
242 &clock); | 242 nullptr /* rtp_state */, &clock); |
243 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 243 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
244 | 244 |
245 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); | 245 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>()); |
246 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); | 246 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>()); |
247 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); | 247 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); |
248 } | 248 } |
249 | 249 |
250 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) { | 250 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) { |
251 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 251 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
252 {RtpExtension::kAbsSendTimeUri, 1}, | 252 {RtpExtension::kAbsSendTimeUri, 1}, |
253 {RtpExtension::kTimestampOffsetUri, 2}, | 253 {RtpExtension::kTimestampOffsetUri, 2}, |
254 {RtpExtension::kTransportSequenceNumberUri, 3}}; | 254 {RtpExtension::kTransportSequenceNumberUri, 3}}; |
255 SimulatedClock clock(kInitialSimulatedClockTime); | 255 SimulatedClock clock(kInitialSimulatedClockTime); |
256 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 256 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
257 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 257 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
258 &clock); | 258 nullptr /* rtp_state */, &clock); |
259 auto fec_packet = GenerateSingleFlexfecPacket(&sender); | 259 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
260 | 260 |
261 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); | 261 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>()); |
262 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); | 262 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>()); |
263 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); | 263 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>()); |
264 } | 264 } |
265 | 265 |
266 TEST(FlexfecSenderTest, MaxPacketOverhead) { | 266 TEST(FlexfecSenderTest, MaxPacketOverhead) { |
267 SimulatedClock clock(kInitialSimulatedClockTime); | 267 SimulatedClock clock(kInitialSimulatedClockTime); |
268 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 268 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
269 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, | 269 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
270 &clock); | 270 nullptr /* rtp_state */, &clock); |
271 | 271 |
272 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead()); | 272 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead()); |
273 } | 273 } |
274 | 274 |
275 TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) { | 275 TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) { |
276 const std::vector<RtpExtension> kRtpHeaderExtensions{ | 276 const std::vector<RtpExtension> kRtpHeaderExtensions{ |
277 {RtpExtension::kAbsSendTimeUri, 1}, | 277 {RtpExtension::kAbsSendTimeUri, 1}, |
278 {RtpExtension::kTimestampOffsetUri, 2}, | 278 {RtpExtension::kTimestampOffsetUri, 2}, |
279 {RtpExtension::kTransportSequenceNumberUri, 3}}; | 279 {RtpExtension::kTransportSequenceNumberUri, 3}}; |
280 SimulatedClock clock(kInitialSimulatedClockTime); | 280 SimulatedClock clock(kInitialSimulatedClockTime); |
281 const size_t kExtensionHeaderLength = 1; | 281 const size_t kExtensionHeaderLength = 1; |
282 const size_t kRtpOneByteHeaderLength = 4; | 282 const size_t kRtpOneByteHeaderLength = 4; |
283 const size_t kExtensionsTotalSize = Word32Align( | 283 const size_t kExtensionsTotalSize = Word32Align( |
284 kRtpOneByteHeaderLength + | 284 kRtpOneByteHeaderLength + |
285 kExtensionHeaderLength + AbsoluteSendTime::kValueSizeBytes + | 285 kExtensionHeaderLength + AbsoluteSendTime::kValueSizeBytes + |
286 kExtensionHeaderLength + TransmissionOffset::kValueSizeBytes + | 286 kExtensionHeaderLength + TransmissionOffset::kValueSizeBytes + |
287 kExtensionHeaderLength + TransportSequenceNumber::kValueSizeBytes); | 287 kExtensionHeaderLength + TransportSequenceNumber::kValueSizeBytes); |
288 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, | 288 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
289 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(), | 289 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(), |
290 &clock); | 290 nullptr /* rtp_state */, &clock); |
291 | 291 |
292 EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize, | 292 EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize, |
293 sender.MaxPacketOverhead()); | 293 sender.MaxPacketOverhead()); |
294 } | 294 } |
295 | 295 |
| 296 TEST(FlexfecSenderTest, SetsAndGetsRtpState) { |
| 297 RtpState initial_rtp_state; |
| 298 initial_rtp_state.sequence_number = 100; |
| 299 initial_rtp_state.start_timestamp = 200; |
| 300 SimulatedClock clock(kInitialSimulatedClockTime); |
| 301 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, |
| 302 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes, |
| 303 &initial_rtp_state, &clock); |
| 304 |
| 305 auto fec_packet = GenerateSingleFlexfecPacket(&sender); |
| 306 EXPECT_EQ(initial_rtp_state.sequence_number, fec_packet->SequenceNumber()); |
| 307 EXPECT_EQ(initial_rtp_state.start_timestamp, fec_packet->Timestamp()); |
| 308 |
| 309 clock.AdvanceTimeMilliseconds(1000); |
| 310 fec_packet = GenerateSingleFlexfecPacket(&sender); |
| 311 EXPECT_EQ(initial_rtp_state.sequence_number + 1, |
| 312 fec_packet->SequenceNumber()); |
| 313 EXPECT_EQ(initial_rtp_state.start_timestamp + 1 * 90000, |
| 314 fec_packet->Timestamp()); |
| 315 |
| 316 RtpState updated_rtp_state = sender.GetRtpState(); |
| 317 EXPECT_EQ(initial_rtp_state.sequence_number + 2, |
| 318 updated_rtp_state.sequence_number); |
| 319 EXPECT_EQ(initial_rtp_state.start_timestamp, |
| 320 updated_rtp_state.start_timestamp); |
| 321 } |
| 322 |
296 } // namespace webrtc | 323 } // namespace webrtc |
OLD | NEW |