| 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 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 config.loss_percent = 5; | 442 config.loss_percent = 5; |
| 443 config.queue_delay_ms = kNetworkDelayMs; | 443 config.queue_delay_ms = kNetworkDelayMs; |
| 444 return new test::PacketTransport(sender_call, this, | 444 return new test::PacketTransport(sender_call, this, |
| 445 test::PacketTransport::kSender, config); | 445 test::PacketTransport::kSender, config); |
| 446 } | 446 } |
| 447 | 447 |
| 448 void ModifyVideoConfigs( | 448 void ModifyVideoConfigs( |
| 449 VideoSendStream::Config* send_config, | 449 VideoSendStream::Config* send_config, |
| 450 std::vector<VideoReceiveStream::Config>* receive_configs, | 450 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 451 VideoEncoderConfig* encoder_config) override { | 451 VideoEncoderConfig* encoder_config) override { |
| 452 transport_adapter_.reset( | |
| 453 new internal::TransportAdapter(send_config->send_transport)); | |
| 454 transport_adapter_->Enable(); | |
| 455 if (use_nack_) { | 452 if (use_nack_) { |
| 456 send_config->rtp.nack.rtp_history_ms = | 453 send_config->rtp.nack.rtp_history_ms = |
| 457 (*receive_configs)[0].rtp.nack.rtp_history_ms = | 454 (*receive_configs)[0].rtp.nack.rtp_history_ms = |
| 458 VideoSendStreamTest::kNackRtpHistoryMs; | 455 VideoSendStreamTest::kNackRtpHistoryMs; |
| 459 } | 456 } |
| 460 send_config->encoder_settings.encoder = encoder_; | 457 send_config->encoder_settings.encoder = encoder_; |
| 461 send_config->encoder_settings.payload_name = payload_name_; | 458 send_config->encoder_settings.payload_name = payload_name_; |
| 462 send_config->rtp.ulpfec.red_payload_type = | 459 send_config->rtp.ulpfec.red_payload_type = |
| 463 VideoSendStreamTest::kRedPayloadType; | 460 VideoSendStreamTest::kRedPayloadType; |
| 464 send_config->rtp.ulpfec.ulpfec_payload_type = | 461 send_config->rtp.ulpfec.ulpfec_payload_type = |
| 465 VideoSendStreamTest::kUlpfecPayloadType; | 462 VideoSendStreamTest::kUlpfecPayloadType; |
| 466 if (header_extensions_enabled_) { | 463 if (header_extensions_enabled_) { |
| 467 send_config->rtp.extensions.push_back(RtpExtension( | 464 send_config->rtp.extensions.push_back(RtpExtension( |
| 468 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); | 465 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
| 469 send_config->rtp.extensions.push_back( | 466 send_config->rtp.extensions.push_back( |
| 470 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 467 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
| 471 test::kTransportSequenceNumberExtensionId)); | 468 test::kTransportSequenceNumberExtensionId)); |
| 472 } | 469 } |
| 473 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 470 (*receive_configs)[0].rtp.ulpfec.red_payload_type = |
| 474 send_config->rtp.ulpfec.red_payload_type; | 471 send_config->rtp.ulpfec.red_payload_type; |
| 475 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 472 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = |
| 476 send_config->rtp.ulpfec.ulpfec_payload_type; | 473 send_config->rtp.ulpfec.ulpfec_payload_type; |
| 477 } | 474 } |
| 478 | 475 |
| 479 void PerformTest() override { | 476 void PerformTest() override { |
| 480 EXPECT_EQ(expect_ulpfec_, Wait()) | 477 EXPECT_EQ(expect_ulpfec_, Wait()) |
| 481 << "Timed out waiting for ULPFEC and/or media packets."; | 478 << "Timed out waiting for ULPFEC and/or media packets."; |
| 482 } | 479 } |
| 483 | 480 |
| 484 std::unique_ptr<internal::TransportAdapter> transport_adapter_; | |
| 485 VideoEncoder* const encoder_; | 481 VideoEncoder* const encoder_; |
| 486 std::string payload_name_; | 482 std::string payload_name_; |
| 487 const bool use_nack_; | 483 const bool use_nack_; |
| 488 const bool expect_red_; | 484 const bool expect_red_; |
| 489 const bool expect_ulpfec_; | 485 const bool expect_ulpfec_; |
| 490 bool sent_media_; | 486 bool sent_media_; |
| 491 bool sent_ulpfec_; | 487 bool sent_ulpfec_; |
| 492 bool header_extensions_enabled_; | 488 bool header_extensions_enabled_; |
| 493 RTPHeader prev_header_; | 489 RTPHeader prev_header_; |
| 494 }; | 490 }; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 } | 527 } |
| 532 | 528 |
| 533 #if !defined(RTC_DISABLE_VP9) | 529 #if !defined(RTC_DISABLE_VP9) |
| 534 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp9WithNackEnabled) { | 530 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp9WithNackEnabled) { |
| 535 std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create()); | 531 std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create()); |
| 536 UlpfecObserver test(false, true, true, true, "VP9", encoder.get()); | 532 UlpfecObserver test(false, true, true, true, "VP9", encoder.get()); |
| 537 RunBaseTest(&test); | 533 RunBaseTest(&test); |
| 538 } | 534 } |
| 539 #endif // !defined(RTC_DISABLE_VP9) | 535 #endif // !defined(RTC_DISABLE_VP9) |
| 540 | 536 |
| 541 TEST_F(VideoSendStreamTest, SupportsUlpfecWithMultiThreadedH264) { | 537 TEST_F(VideoSendStreamTest, SupportsUlpfecWithMultithreadedH264) { |
| 542 std::unique_ptr<VideoEncoder> encoder( | 538 std::unique_ptr<VideoEncoder> encoder( |
| 543 new test::MultiThreadedFakeH264Encoder(Clock::GetRealTimeClock())); | 539 new test::MultithreadedFakeH264Encoder(Clock::GetRealTimeClock())); |
| 544 UlpfecObserver test(false, false, true, true, "H264", encoder.get()); | 540 UlpfecObserver test(false, false, true, true, "H264", encoder.get()); |
| 545 RunBaseTest(&test); | 541 RunBaseTest(&test); |
| 546 } | 542 } |
| 547 | 543 |
| 548 // TODO(brandtr): Move these FlexFEC tests when we have created | 544 // TODO(brandtr): Move these FlexFEC tests when we have created |
| 549 // FlexfecSendStream. | 545 // FlexfecSendStream. |
| 550 class FlexfecObserver : public test::EndToEndTest { | 546 class FlexfecObserver : public test::EndToEndTest { |
| 551 public: | 547 public: |
| 552 FlexfecObserver(bool header_extensions_enabled, | 548 FlexfecObserver(bool header_extensions_enabled, |
| 553 bool use_nack, | 549 bool use_nack, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 config.loss_percent = 5; | 595 config.loss_percent = 5; |
| 600 config.queue_delay_ms = kNetworkDelayMs; | 596 config.queue_delay_ms = kNetworkDelayMs; |
| 601 return new test::PacketTransport(sender_call, this, | 597 return new test::PacketTransport(sender_call, this, |
| 602 test::PacketTransport::kSender, config); | 598 test::PacketTransport::kSender, config); |
| 603 } | 599 } |
| 604 | 600 |
| 605 void ModifyVideoConfigs( | 601 void ModifyVideoConfigs( |
| 606 VideoSendStream::Config* send_config, | 602 VideoSendStream::Config* send_config, |
| 607 std::vector<VideoReceiveStream::Config>* receive_configs, | 603 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 608 VideoEncoderConfig* encoder_config) override { | 604 VideoEncoderConfig* encoder_config) override { |
| 609 transport_adapter_.reset( | |
| 610 new internal::TransportAdapter(send_config->send_transport)); | |
| 611 transport_adapter_->Enable(); | |
| 612 if (use_nack_) { | 605 if (use_nack_) { |
| 613 send_config->rtp.nack.rtp_history_ms = | 606 send_config->rtp.nack.rtp_history_ms = |
| 614 (*receive_configs)[0].rtp.nack.rtp_history_ms = | 607 (*receive_configs)[0].rtp.nack.rtp_history_ms = |
| 615 VideoSendStreamTest::kNackRtpHistoryMs; | 608 VideoSendStreamTest::kNackRtpHistoryMs; |
| 616 } | 609 } |
| 617 send_config->encoder_settings.encoder = encoder_; | 610 send_config->encoder_settings.encoder = encoder_; |
| 618 send_config->encoder_settings.payload_name = payload_name_; | 611 send_config->encoder_settings.payload_name = payload_name_; |
| 619 if (header_extensions_enabled_) { | 612 if (header_extensions_enabled_) { |
| 620 send_config->rtp.extensions.push_back(RtpExtension( | 613 send_config->rtp.extensions.push_back(RtpExtension( |
| 621 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); | 614 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
| 622 send_config->rtp.extensions.push_back(RtpExtension( | 615 send_config->rtp.extensions.push_back(RtpExtension( |
| 623 RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId)); | 616 RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId)); |
| 624 send_config->rtp.extensions.push_back( | 617 send_config->rtp.extensions.push_back( |
| 625 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 618 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
| 626 test::kTransportSequenceNumberExtensionId)); | 619 test::kTransportSequenceNumberExtensionId)); |
| 627 } | 620 } |
| 628 } | 621 } |
| 629 | 622 |
| 630 void PerformTest() override { | 623 void PerformTest() override { |
| 631 EXPECT_TRUE(Wait()) | 624 EXPECT_TRUE(Wait()) |
| 632 << "Timed out waiting for FlexFEC and/or media packets."; | 625 << "Timed out waiting for FlexFEC and/or media packets."; |
| 633 } | 626 } |
| 634 | 627 |
| 635 std::unique_ptr<internal::TransportAdapter> transport_adapter_; | |
| 636 VideoEncoder* const encoder_; | 628 VideoEncoder* const encoder_; |
| 637 std::string payload_name_; | 629 std::string payload_name_; |
| 638 const bool use_nack_; | 630 const bool use_nack_; |
| 639 bool sent_media_; | 631 bool sent_media_; |
| 640 bool sent_flexfec_; | 632 bool sent_flexfec_; |
| 641 bool header_extensions_enabled_; | 633 bool header_extensions_enabled_; |
| 642 }; | 634 }; |
| 643 | 635 |
| 644 TEST_F(VideoSendStreamTest, SupportsFlexfecVp8) { | 636 TEST_F(VideoSendStreamTest, SupportsFlexfecVp8) { |
| 645 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); | 637 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 RunBaseTest(&test); | 672 RunBaseTest(&test); |
| 681 } | 673 } |
| 682 | 674 |
| 683 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackH264) { | 675 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackH264) { |
| 684 std::unique_ptr<VideoEncoder> encoder( | 676 std::unique_ptr<VideoEncoder> encoder( |
| 685 new test::FakeH264Encoder(Clock::GetRealTimeClock())); | 677 new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| 686 FlexfecObserver test(false, true, "H264", encoder.get()); | 678 FlexfecObserver test(false, true, "H264", encoder.get()); |
| 687 RunBaseTest(&test); | 679 RunBaseTest(&test); |
| 688 } | 680 } |
| 689 | 681 |
| 690 TEST_F(VideoSendStreamTest, SupportsFlexfecWithMultiThreadedH264) { | 682 TEST_F(VideoSendStreamTest, SupportsFlexfecWithMultithreadedH264) { |
| 691 std::unique_ptr<VideoEncoder> encoder( | 683 std::unique_ptr<VideoEncoder> encoder( |
| 692 new test::MultiThreadedFakeH264Encoder(Clock::GetRealTimeClock())); | 684 new test::MultithreadedFakeH264Encoder(Clock::GetRealTimeClock())); |
| 693 FlexfecObserver test(false, false, "H264", encoder.get()); | 685 FlexfecObserver test(false, false, "H264", encoder.get()); |
| 694 RunBaseTest(&test); | 686 RunBaseTest(&test); |
| 695 } | 687 } |
| 696 | 688 |
| 697 void VideoSendStreamTest::TestNackRetransmission( | 689 void VideoSendStreamTest::TestNackRetransmission( |
| 698 uint32_t retransmit_ssrc, | 690 uint32_t retransmit_ssrc, |
| 699 uint8_t retransmit_payload_type) { | 691 uint8_t retransmit_payload_type) { |
| 700 class NackObserver : public test::SendTest { | 692 class NackObserver : public test::SendTest { |
| 701 public: | 693 public: |
| 702 explicit NackObserver(uint32_t retransmit_ssrc, | 694 explicit NackObserver(uint32_t retransmit_ssrc, |
| (...skipping 1929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2632 uint8_t buffer[16] = {0}; | 2624 uint8_t buffer[16] = {0}; |
| 2633 EncodedImage encoded(buffer, sizeof(buffer), sizeof(buffer)); | 2625 EncodedImage encoded(buffer, sizeof(buffer), sizeof(buffer)); |
| 2634 encoded._timeStamp = input_image.timestamp(); | 2626 encoded._timeStamp = input_image.timestamp(); |
| 2635 encoded.capture_time_ms_ = input_image.render_time_ms(); | 2627 encoded.capture_time_ms_ = input_image.render_time_ms(); |
| 2636 | 2628 |
| 2637 for (size_t i = 0; i < kNumStreams; ++i) { | 2629 for (size_t i = 0; i < kNumStreams; ++i) { |
| 2638 specifics.codecSpecific.generic.simulcast_idx = static_cast<uint8_t>(i); | 2630 specifics.codecSpecific.generic.simulcast_idx = static_cast<uint8_t>(i); |
| 2639 encoded._frameType = (*frame_types)[i]; | 2631 encoded._frameType = (*frame_types)[i]; |
| 2640 encoded._encodedWidth = kEncodedResolution[i].width; | 2632 encoded._encodedWidth = kEncodedResolution[i].width; |
| 2641 encoded._encodedHeight = kEncodedResolution[i].height; | 2633 encoded._encodedHeight = kEncodedResolution[i].height; |
| 2642 RTC_DCHECK(callback_); | 2634 EncodedImageCallback* callback; |
| 2643 if (callback_->OnEncodedImage(encoded, &specifics, nullptr).error != | 2635 { |
| 2636 rtc::CritScope cs(&crit_sect_); |
| 2637 callback = callback_; |
| 2638 } |
| 2639 RTC_DCHECK(callback); |
| 2640 if (callback->OnEncodedImage(encoded, &specifics, nullptr).error != |
| 2644 EncodedImageCallback::Result::OK) { | 2641 EncodedImageCallback::Result::OK) { |
| 2645 return -1; | 2642 return -1; |
| 2646 } | 2643 } |
| 2647 } | 2644 } |
| 2648 | 2645 |
| 2649 observation_complete_.Set(); | 2646 observation_complete_.Set(); |
| 2650 return 0; | 2647 return 0; |
| 2651 } | 2648 } |
| 2652 void ModifyVideoConfigs( | 2649 void ModifyVideoConfigs( |
| 2653 VideoSendStream::Config* send_config, | 2650 VideoSendStream::Config* send_config, |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3236 private: | 3233 private: |
| 3237 Call* call_; | 3234 Call* call_; |
| 3238 rtc::CriticalSection crit_; | 3235 rtc::CriticalSection crit_; |
| 3239 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); | 3236 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); |
| 3240 } test; | 3237 } test; |
| 3241 | 3238 |
| 3242 RunBaseTest(&test); | 3239 RunBaseTest(&test); |
| 3243 } | 3240 } |
| 3244 | 3241 |
| 3245 } // namespace webrtc | 3242 } // namespace webrtc |
| OLD | NEW |