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 335 matching lines...) Loading... |
346 RtcpStatistics stats_; | 346 RtcpStatistics stats_; |
347 }; | 347 }; |
348 | 348 |
349 std::unique_ptr<LossyStatistician> lossy_stats_; | 349 std::unique_ptr<LossyStatistician> lossy_stats_; |
350 StatisticianMap stats_map_; | 350 StatisticianMap stats_map_; |
351 }; | 351 }; |
352 | 352 |
353 class UlpfecObserver : public test::EndToEndTest { | 353 class UlpfecObserver : public test::EndToEndTest { |
354 public: | 354 public: |
355 UlpfecObserver(bool header_extensions_enabled, | 355 UlpfecObserver(bool header_extensions_enabled, |
356 bool use_nack, | 356 bool use_nack, |
357 bool expect_red, | 357 bool expect_red, |
358 bool expect_ulpfec, | 358 bool expect_ulpfec, |
359 const std::string& codec) | 359 const std::string& codec) |
360 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), | 360 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), |
361 payload_name_(codec), | 361 payload_name_(codec), |
362 use_nack_(use_nack), | 362 use_nack_(use_nack), |
363 expect_red_(expect_red), | 363 expect_red_(expect_red), |
364 expect_ulpfec_(expect_ulpfec), | 364 expect_ulpfec_(expect_ulpfec), |
365 send_count_(0), | 365 sent_media_(false), |
366 received_media_(false), | 366 sent_ulpfec_(false), |
367 received_fec_(false), | |
368 header_extensions_enabled_(header_extensions_enabled) { | 367 header_extensions_enabled_(header_extensions_enabled) { |
369 if (codec == "H264") { | 368 if (codec == "H264") { |
370 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); | 369 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
371 } else if (codec == "VP8") { | 370 } else if (codec == "VP8") { |
372 encoder_.reset(VP8Encoder::Create()); | 371 encoder_.reset(VP8Encoder::Create()); |
373 } else if (codec == "VP9") { | 372 } else if (codec == "VP9") { |
374 encoder_.reset(VP9Encoder::Create()); | 373 encoder_.reset(VP9Encoder::Create()); |
375 } else { | 374 } else { |
376 RTC_NOTREACHED(); | 375 RTC_NOTREACHED(); |
377 } | 376 } |
378 } | 377 } |
379 | 378 |
380 private: | 379 private: |
381 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 380 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
382 RTPHeader header; | 381 RTPHeader header; |
383 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 382 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
384 | 383 |
385 ++send_count_; | |
386 int encapsulated_payload_type = -1; | 384 int encapsulated_payload_type = -1; |
387 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { | 385 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { |
388 EXPECT_TRUE(expect_red_); | 386 EXPECT_TRUE(expect_red_); |
389 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); | 387 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); |
390 if (encapsulated_payload_type != | 388 if (encapsulated_payload_type != |
391 VideoSendStreamTest::kFakeVideoSendPayloadType) { | 389 VideoSendStreamTest::kFakeVideoSendPayloadType) { |
392 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType, | 390 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType, |
393 encapsulated_payload_type); | 391 encapsulated_payload_type); |
394 } | 392 } |
395 } else { | 393 } else { |
396 EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType, | 394 EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType, |
397 header.payloadType); | 395 header.payloadType); |
398 if (static_cast<size_t>(header.headerLength + header.paddingLength) < | 396 if (static_cast<size_t>(header.headerLength + header.paddingLength) < |
399 length) { | 397 length) { |
400 // Not padding-only, media received outside of RED. | 398 // Not padding-only, media received outside of RED. |
401 EXPECT_FALSE(expect_red_); | 399 EXPECT_FALSE(expect_red_); |
402 received_media_ = true; | 400 sent_media_ = true; |
403 } | 401 } |
404 } | 402 } |
405 | 403 |
406 if (header_extensions_enabled_) { | 404 if (header_extensions_enabled_) { |
407 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); | 405 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
408 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2; | 406 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2; |
409 if (header.extension.absoluteSendTime <= kHalf24BitsSpace && | 407 if (header.extension.absoluteSendTime <= kHalf24BitsSpace && |
410 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) { | 408 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) { |
411 // 24 bits wrap. | 409 // 24 bits wrap. |
412 EXPECT_GT(prev_header_.extension.absoluteSendTime, | 410 EXPECT_GT(prev_header_.extension.absoluteSendTime, |
413 header.extension.absoluteSendTime); | 411 header.extension.absoluteSendTime); |
414 } else { | 412 } else { |
415 EXPECT_GE(header.extension.absoluteSendTime, | 413 EXPECT_GE(header.extension.absoluteSendTime, |
416 prev_header_.extension.absoluteSendTime); | 414 prev_header_.extension.absoluteSendTime); |
417 } | 415 } |
418 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); | 416 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
419 uint16_t seq_num_diff = header.extension.transportSequenceNumber - | 417 uint16_t seq_num_diff = header.extension.transportSequenceNumber - |
420 prev_header_.extension.transportSequenceNumber; | 418 prev_header_.extension.transportSequenceNumber; |
421 EXPECT_EQ(1, seq_num_diff); | 419 EXPECT_EQ(1, seq_num_diff); |
422 } | 420 } |
423 | 421 |
424 if (encapsulated_payload_type != -1) { | 422 if (encapsulated_payload_type != -1) { |
425 if (encapsulated_payload_type == | 423 if (encapsulated_payload_type == |
426 VideoSendStreamTest::kUlpfecPayloadType) { | 424 VideoSendStreamTest::kUlpfecPayloadType) { |
427 EXPECT_TRUE(expect_ulpfec_); | 425 EXPECT_TRUE(expect_ulpfec_); |
428 received_fec_ = true; | 426 sent_ulpfec_ = true; |
429 } else { | 427 } else { |
430 received_media_ = true; | 428 sent_media_ = true; |
431 } | 429 } |
432 } | 430 } |
433 | 431 |
434 if (send_count_ > 100 && received_media_) { | 432 if (sent_media_) { |
435 if (received_fec_ || !expect_ulpfec_) | 433 if (sent_ulpfec_ || !expect_ulpfec_) |
436 observation_complete_.Set(); | 434 observation_complete_.Set(); |
437 } | 435 } |
438 | 436 |
439 prev_header_ = header; | 437 prev_header_ = header; |
440 | 438 |
441 return SEND_PACKET; | 439 return SEND_PACKET; |
442 } | 440 } |
443 | 441 |
444 test::PacketTransport* CreateSendTransport(Call* sender_call) override { | 442 test::PacketTransport* CreateSendTransport(Call* sender_call) override { |
445 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | 443 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |
446 // Configure some network delay. | 444 // Configure some network delay. |
447 const int kNetworkDelayMs = 100; | 445 const int kNetworkDelayMs = 100; |
448 FakeNetworkPipe::Config config; | 446 FakeNetworkPipe::Config config; |
449 config.loss_percent = 50; | 447 config.loss_percent = 5; |
450 config.queue_delay_ms = kNetworkDelayMs; | 448 config.queue_delay_ms = kNetworkDelayMs; |
451 return new test::PacketTransport(sender_call, this, | 449 return new test::PacketTransport(sender_call, this, |
452 test::PacketTransport::kSender, config); | 450 test::PacketTransport::kSender, config); |
453 } | 451 } |
454 | 452 |
455 void ModifyVideoConfigs( | 453 void ModifyVideoConfigs( |
456 VideoSendStream::Config* send_config, | 454 VideoSendStream::Config* send_config, |
457 std::vector<VideoReceiveStream::Config>* receive_configs, | 455 std::vector<VideoReceiveStream::Config>* receive_configs, |
458 VideoEncoderConfig* encoder_config) override { | 456 VideoEncoderConfig* encoder_config) override { |
459 transport_adapter_.reset( | 457 transport_adapter_.reset( |
(...skipping 17 matching lines...) Loading... |
477 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 475 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
478 test::kTransportSequenceNumberExtensionId)); | 476 test::kTransportSequenceNumberExtensionId)); |
479 } | 477 } |
480 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 478 (*receive_configs)[0].rtp.ulpfec.red_payload_type = |
481 send_config->rtp.ulpfec.red_payload_type; | 479 send_config->rtp.ulpfec.red_payload_type; |
482 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 480 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = |
483 send_config->rtp.ulpfec.ulpfec_payload_type; | 481 send_config->rtp.ulpfec.ulpfec_payload_type; |
484 } | 482 } |
485 | 483 |
486 void PerformTest() override { | 484 void PerformTest() override { |
487 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; | 485 EXPECT_TRUE(Wait()) << "Timed out waiting for ULPFEC and/or media packets."; |
488 } | 486 } |
489 | 487 |
490 std::unique_ptr<internal::TransportAdapter> transport_adapter_; | 488 std::unique_ptr<internal::TransportAdapter> transport_adapter_; |
491 std::unique_ptr<VideoEncoder> encoder_; | 489 std::unique_ptr<VideoEncoder> encoder_; |
492 const std::string payload_name_; | 490 const std::string payload_name_; |
493 const bool use_nack_; | 491 const bool use_nack_; |
494 const bool expect_red_; | 492 const bool expect_red_; |
495 const bool expect_ulpfec_; | 493 const bool expect_ulpfec_; |
496 int send_count_; | 494 bool sent_media_; |
497 bool received_media_; | 495 bool sent_ulpfec_; |
498 bool received_fec_; | |
499 bool header_extensions_enabled_; | 496 bool header_extensions_enabled_; |
500 RTPHeader prev_header_; | 497 RTPHeader prev_header_; |
501 }; | 498 }; |
502 | 499 |
503 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) { | 500 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) { |
504 UlpfecObserver test(true, false, true, true, "VP8"); | 501 UlpfecObserver test(true, false, true, true, "VP8"); |
505 RunBaseTest(&test); | 502 RunBaseTest(&test); |
506 } | 503 } |
507 | 504 |
508 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) { | 505 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) { |
(...skipping 2705 matching lines...) Loading... |
3214 private: | 3211 private: |
3215 Call* call_; | 3212 Call* call_; |
3216 rtc::CriticalSection crit_; | 3213 rtc::CriticalSection crit_; |
3217 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); | 3214 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); |
3218 } test; | 3215 } test; |
3219 | 3216 |
3220 RunBaseTest(&test); | 3217 RunBaseTest(&test); |
3221 } | 3218 } |
3222 | 3219 |
3223 } // namespace webrtc | 3220 } // namespace webrtc |
OLD | NEW |