OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 #include <algorithm> // max | 10 #include <algorithm> // max |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 void PerformTest() override { | 120 void PerformTest() override { |
121 EXPECT_EQ(kEventSignaled, Wait()) | 121 EXPECT_EQ(kEventSignaled, Wait()) |
122 << "Timed out while waiting for RTCP with CNAME."; | 122 << "Timed out while waiting for RTCP with CNAME."; |
123 } | 123 } |
124 } test; | 124 } test; |
125 | 125 |
126 RunBaseTest(&test, FakeNetworkPipe::Config()); | 126 RunBaseTest(&test, FakeNetworkPipe::Config()); |
127 } | 127 } |
128 | 128 |
129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { | 129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { |
130 static const uint8_t kAbsSendTimeExtensionId = 13; | |
131 class AbsoluteSendTimeObserver : public test::SendTest { | 130 class AbsoluteSendTimeObserver : public test::SendTest { |
132 public: | 131 public: |
133 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { | 132 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { |
134 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( | 133 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( |
135 kRtpExtensionAbsoluteSendTime, kAbsSendTimeExtensionId)); | 134 kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId)); |
136 } | 135 } |
137 | 136 |
138 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 137 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
139 RTPHeader header; | 138 RTPHeader header; |
140 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 139 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
141 | 140 |
142 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); | 141 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); |
143 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); | 142 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
144 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); | 143 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); |
145 EXPECT_GT(header.extension.absoluteSendTime, 0u); | 144 EXPECT_GT(header.extension.absoluteSendTime, 0u); |
146 observation_complete_->Set(); | 145 observation_complete_->Set(); |
147 | 146 |
148 return SEND_PACKET; | 147 return SEND_PACKET; |
149 } | 148 } |
150 | 149 |
151 void ModifyConfigs(VideoSendStream::Config* send_config, | 150 void ModifyConfigs(VideoSendStream::Config* send_config, |
152 std::vector<VideoReceiveStream::Config>* receive_configs, | 151 std::vector<VideoReceiveStream::Config>* receive_configs, |
153 VideoEncoderConfig* encoder_config) override { | 152 VideoEncoderConfig* encoder_config) override { |
154 send_config->rtp.extensions.clear(); | 153 send_config->rtp.extensions.clear(); |
155 send_config->rtp.extensions.push_back( | 154 send_config->rtp.extensions.push_back(RtpExtension( |
156 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId)); | 155 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId)); |
157 } | 156 } |
158 | 157 |
159 void PerformTest() override { | 158 void PerformTest() override { |
160 EXPECT_EQ(kEventSignaled, Wait()) | 159 EXPECT_EQ(kEventSignaled, Wait()) |
161 << "Timed out while waiting for single RTP packet."; | 160 << "Timed out while waiting for single RTP packet."; |
162 } | 161 } |
163 } test; | 162 } test; |
164 | 163 |
165 RunBaseTest(&test, FakeNetworkPipe::Config()); | 164 RunBaseTest(&test, FakeNetworkPipe::Config()); |
166 } | 165 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 return true; | 302 return true; |
304 } | 303 } |
305 | 304 |
306 RtcpStatistics stats_; | 305 RtcpStatistics stats_; |
307 }; | 306 }; |
308 | 307 |
309 rtc::scoped_ptr<LossyStatistician> lossy_stats_; | 308 rtc::scoped_ptr<LossyStatistician> lossy_stats_; |
310 StatisticianMap stats_map_; | 309 StatisticianMap stats_map_; |
311 }; | 310 }; |
312 | 311 |
313 TEST_F(VideoSendStreamTest, SupportsFec) { | 312 class FecObserver : public test::SendTest { |
314 class FecObserver : public test::SendTest { | 313 public: |
315 public: | 314 explicit FecObserver(bool header_extensions_enabled) |
316 FecObserver() | 315 : SendTest(VideoSendStreamTest::kDefaultTimeoutMs), |
317 : SendTest(kDefaultTimeoutMs), | 316 send_count_(0), |
318 send_count_(0), | 317 received_media_(false), |
319 received_media_(false), | 318 received_fec_(false), |
320 received_fec_(false) { | 319 header_extensions_enabled_(header_extensions_enabled) {} |
| 320 |
| 321 private: |
| 322 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 323 RTPHeader header; |
| 324 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
| 325 |
| 326 // Send lossy receive reports to trigger FEC enabling. |
| 327 if (send_count_++ % 2 != 0) { |
| 328 // Receive statistics reporting having lost 50% of the packets. |
| 329 FakeReceiveStatistics lossy_receive_stats( |
| 330 VideoSendStreamTest::kSendSsrcs[0], header.sequenceNumber, |
| 331 send_count_ / 2, 127); |
| 332 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), |
| 333 &lossy_receive_stats, nullptr, |
| 334 transport_adapter_.get()); |
| 335 |
| 336 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize); |
| 337 rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kSendSsrcs[0]); |
| 338 |
| 339 RTCPSender::FeedbackState feedback_state; |
| 340 |
| 341 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); |
321 } | 342 } |
322 | 343 |
323 private: | 344 int encapsulated_payload_type = -1; |
324 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 345 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { |
325 RTPHeader header; | 346 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); |
326 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 347 if (encapsulated_payload_type != |
327 | 348 VideoSendStreamTest::kFakeSendPayloadType) |
328 // Send lossy receive reports to trigger FEC enabling. | 349 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType, |
329 if (send_count_++ % 2 != 0) { | 350 encapsulated_payload_type); |
330 // Receive statistics reporting having lost 50% of the packets. | 351 } else { |
331 FakeReceiveStatistics lossy_receive_stats( | 352 EXPECT_EQ(VideoSendStreamTest::kFakeSendPayloadType, header.payloadType); |
332 kSendSsrcs[0], header.sequenceNumber, send_count_ / 2, 127); | |
333 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), | |
334 &lossy_receive_stats, nullptr, | |
335 transport_adapter_.get()); | |
336 | |
337 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize); | |
338 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); | |
339 | |
340 RTCPSender::FeedbackState feedback_state; | |
341 | |
342 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); | |
343 } | |
344 | |
345 int encapsulated_payload_type = -1; | |
346 if (header.payloadType == kRedPayloadType) { | |
347 encapsulated_payload_type = | |
348 static_cast<int>(packet[header.headerLength]); | |
349 if (encapsulated_payload_type != kFakeSendPayloadType) | |
350 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | |
351 } else { | |
352 EXPECT_EQ(kFakeSendPayloadType, header.payloadType); | |
353 } | |
354 | |
355 if (encapsulated_payload_type != -1) { | |
356 if (encapsulated_payload_type == kUlpfecPayloadType) { | |
357 received_fec_ = true; | |
358 } else { | |
359 received_media_ = true; | |
360 } | |
361 } | |
362 | |
363 if (received_media_ && received_fec_) | |
364 observation_complete_->Set(); | |
365 | |
366 return SEND_PACKET; | |
367 } | 353 } |
368 | 354 |
369 void ModifyConfigs(VideoSendStream::Config* send_config, | 355 if (header_extensions_enabled_) { |
370 std::vector<VideoReceiveStream::Config>* receive_configs, | 356 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
371 VideoEncoderConfig* encoder_config) override { | 357 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2; |
372 transport_adapter_.reset( | 358 if (header.extension.absoluteSendTime <= kHalf24BitsSpace && |
373 new internal::TransportAdapter(send_config->send_transport)); | 359 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) { |
374 transport_adapter_->Enable(); | 360 // 24 bits wrap. |
375 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 361 EXPECT_GT(prev_header_.extension.absoluteSendTime, |
376 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 362 header.extension.absoluteSendTime); |
| 363 } else { |
| 364 EXPECT_GE(header.extension.absoluteSendTime, |
| 365 prev_header_.extension.absoluteSendTime); |
| 366 } |
| 367 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
| 368 uint16_t seq_num_diff = header.extension.transportSequenceNumber - |
| 369 prev_header_.extension.transportSequenceNumber; |
| 370 EXPECT_EQ(1, seq_num_diff); |
377 } | 371 } |
378 | 372 |
379 void PerformTest() override { | 373 if (encapsulated_payload_type != -1) { |
380 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; | 374 if (encapsulated_payload_type == |
| 375 VideoSendStreamTest::kUlpfecPayloadType) { |
| 376 received_fec_ = true; |
| 377 } else { |
| 378 received_media_ = true; |
| 379 } |
381 } | 380 } |
382 | 381 |
383 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; | 382 if (received_media_ && received_fec_ && send_count_ > 100) |
384 int send_count_; | 383 observation_complete_->Set(); |
385 bool received_media_; | 384 |
386 bool received_fec_; | 385 prev_header_ = header; |
387 } test; | 386 |
| 387 return SEND_PACKET; |
| 388 } |
| 389 |
| 390 void ModifyConfigs(VideoSendStream::Config* send_config, |
| 391 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 392 VideoEncoderConfig* encoder_config) override { |
| 393 transport_adapter_.reset( |
| 394 new internal::TransportAdapter(send_config->send_transport)); |
| 395 transport_adapter_->Enable(); |
| 396 send_config->rtp.fec.red_payload_type = |
| 397 VideoSendStreamTest::kRedPayloadType; |
| 398 send_config->rtp.fec.ulpfec_payload_type = |
| 399 VideoSendStreamTest::kUlpfecPayloadType; |
| 400 if (header_extensions_enabled_) { |
| 401 send_config->rtp.extensions.push_back(RtpExtension( |
| 402 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId)); |
| 403 send_config->rtp.extensions.push_back( |
| 404 RtpExtension(RtpExtension::kTransportSequenceNumber, |
| 405 test::kTransportSequenceNumberExtensionId)); |
| 406 } |
| 407 } |
| 408 |
| 409 void PerformTest() override { |
| 410 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; |
| 411 } |
| 412 |
| 413 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; |
| 414 int send_count_; |
| 415 bool received_media_; |
| 416 bool received_fec_; |
| 417 bool header_extensions_enabled_; |
| 418 RTPHeader prev_header_; |
| 419 }; |
| 420 |
| 421 TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) { |
| 422 FecObserver test(true); |
388 | 423 |
389 RunBaseTest(&test, FakeNetworkPipe::Config()); | 424 RunBaseTest(&test, FakeNetworkPipe::Config()); |
390 } | 425 } |
| 426 |
| 427 TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) { |
| 428 FecObserver test(false); |
| 429 |
| 430 RunBaseTest(&test, FakeNetworkPipe::Config()); |
| 431 } |
391 | 432 |
392 void VideoSendStreamTest::TestNackRetransmission( | 433 void VideoSendStreamTest::TestNackRetransmission( |
393 uint32_t retransmit_ssrc, | 434 uint32_t retransmit_ssrc, |
394 uint8_t retransmit_payload_type) { | 435 uint8_t retransmit_payload_type) { |
395 class NackObserver : public test::SendTest { | 436 class NackObserver : public test::SendTest { |
396 public: | 437 public: |
397 explicit NackObserver(uint32_t retransmit_ssrc, | 438 explicit NackObserver(uint32_t retransmit_ssrc, |
398 uint8_t retransmit_payload_type) | 439 uint8_t retransmit_payload_type) |
399 : SendTest(kDefaultTimeoutMs), | 440 : SendTest(kDefaultTimeoutMs), |
400 send_count_(0), | 441 send_count_(0), |
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2169 EXPECT_GT(vp9_header.num_ref_pics, 0u); | 2210 EXPECT_GT(vp9_header.num_ref_pics, 0u); |
2170 observation_complete_->Set(); | 2211 observation_complete_->Set(); |
2171 } | 2212 } |
2172 } | 2213 } |
2173 } test; | 2214 } test; |
2174 | 2215 |
2175 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2216 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2176 } | 2217 } |
2177 | 2218 |
2178 } // namespace webrtc | 2219 } // namespace webrtc |
OLD | NEW |