From bdc6c402132caba014b54801d7ce7a238d2fbaf4 Mon Sep 17 00:00:00 2001 From: Rasmus Brandt Date: Tue, 6 Nov 2018 12:55:53 +0100 Subject: [PATCH] Add field trial for target bitrate RTCP XR message. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9969 Change-Id: I71ce59556f43b0c0547d095793c59ab721cf1daf Reviewed-on: https://webrtc-review.googlesource.com/c/109566 Reviewed-by: Erik Språng Commit-Queue: Rasmus Brandt Cr-Commit-Position: refs/heads/master@{#25546} --- .../extended_reports_tests.cc | 56 ++++++++++++------- video/video_send_stream.cc | 10 +++- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/video/end_to_end_tests/extended_reports_tests.cc b/video/end_to_end_tests/extended_reports_tests.cc index 007337024b..4de0441b3d 100644 --- a/video/end_to_end_tests/extended_reports_tests.cc +++ b/video/end_to_end_tests/extended_reports_tests.cc @@ -8,9 +8,11 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "api/video_codecs/video_encoder_config.h" #include "call/fake_network_pipe.h" #include "call/simulated_network.h" #include "test/call_test.h" +#include "test/field_trial.h" #include "test/gtest.h" #include "test/rtcp_packet_parser.h" @@ -21,12 +23,14 @@ class ExtendedReportsEndToEndTest : public test::CallTest {}; class RtcpXrObserver : public test::EndToEndTest { public: RtcpXrObserver(bool enable_rrtr, - bool enable_target_bitrate, - bool enable_zero_target_bitrate) + bool expect_target_bitrate, + bool enable_zero_target_bitrate, + VideoEncoderConfig::ContentType content_type) : EndToEndTest(test::CallTest::kDefaultTimeoutMs), enable_rrtr_(enable_rrtr), - enable_target_bitrate_(enable_target_bitrate), + expect_target_bitrate_(expect_target_bitrate), enable_zero_target_bitrate_(enable_zero_target_bitrate), + content_type_(content_type), sent_rtcp_sr_(0), sent_rtcp_rr_(0), sent_rtcp_rrtr_(0), @@ -95,7 +99,7 @@ class RtcpXrObserver : public test::EndToEndTest { if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve && - (sent_rtcp_target_bitrate_ || !enable_target_bitrate_) && + (sent_rtcp_target_bitrate_ || !expect_target_bitrate_) && (sent_zero_rtcp_target_bitrate_ || !enable_zero_target_bitrate_)) { if (enable_rrtr_) { EXPECT_GT(sent_rtcp_rrtr_, 0); @@ -104,7 +108,7 @@ class RtcpXrObserver : public test::EndToEndTest { EXPECT_EQ(sent_rtcp_rrtr_, 0); EXPECT_EQ(sent_rtcp_dlrr_, 0); } - EXPECT_EQ(enable_target_bitrate_, sent_rtcp_target_bitrate_); + EXPECT_EQ(expect_target_bitrate_, sent_rtcp_target_bitrate_); EXPECT_EQ(enable_zero_target_bitrate_, sent_zero_rtcp_target_bitrate_); observation_complete_.Set(); } @@ -144,10 +148,7 @@ class RtcpXrObserver : public test::EndToEndTest { (*receive_configs)[0].decoders[0].video_format = SdpVideoFormat(send_config->rtp.payload_name); } - if (enable_target_bitrate_) { - // TargetBitrate only signaled for screensharing. - encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; - } + encoder_config->content_type = content_type_; (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = enable_rrtr_; @@ -162,8 +163,9 @@ class RtcpXrObserver : public test::EndToEndTest { rtc::CriticalSection crit_; const bool enable_rrtr_; - const bool enable_target_bitrate_; + const bool expect_target_bitrate_; const bool enable_zero_target_bitrate_; + const VideoEncoderConfig::ContentType content_type_; int sent_rtcp_sr_; int sent_rtcp_rr_ RTC_GUARDED_BY(&crit_); int sent_rtcp_rrtr_ RTC_GUARDED_BY(&crit_); @@ -176,36 +178,50 @@ class RtcpXrObserver : public test::EndToEndTest { TEST_F(ExtendedReportsEndToEndTest, TestExtendedReportsWithRrtrWithoutTargetBitrate) { - RtcpXrObserver test(/*enable_rrtr=*/true, /*enable_target_bitrate=*/false, - /*enable_zero_target_bitrate=*/false); + RtcpXrObserver test(/*enable_rrtr=*/true, /*expect_target_bitrate=*/false, + /*enable_zero_target_bitrate=*/false, + VideoEncoderConfig::ContentType::kRealtimeVideo); RunBaseTest(&test); } TEST_F(ExtendedReportsEndToEndTest, TestExtendedReportsWithoutRrtrWithoutTargetBitrate) { - RtcpXrObserver test(/*enable_rrtr=*/false, /*enable_target_bitrate=*/false, - /*enable_zero_target_bitrate=*/false); + RtcpXrObserver test(/*enable_rrtr=*/false, /*expect_target_bitrate=*/false, + /*enable_zero_target_bitrate=*/false, + VideoEncoderConfig::ContentType::kRealtimeVideo); RunBaseTest(&test); } TEST_F(ExtendedReportsEndToEndTest, TestExtendedReportsWithRrtrWithTargetBitrate) { - RtcpXrObserver test(/*enable_rrtr=*/true, /*enable_target_bitrate=*/true, - /*enable_zero_target_bitrate=*/false); + RtcpXrObserver test(/*enable_rrtr=*/true, /*expect_target_bitrate=*/true, + /*enable_zero_target_bitrate=*/false, + VideoEncoderConfig::ContentType::kScreen); RunBaseTest(&test); } TEST_F(ExtendedReportsEndToEndTest, TestExtendedReportsWithoutRrtrWithTargetBitrate) { - RtcpXrObserver test(/*enable_rrtr=*/false, /*enable_target_bitrate=*/true, - /*enable_zero_target_bitrate=*/false); + RtcpXrObserver test(/*enable_rrtr=*/false, /*expect_target_bitrate=*/true, + /*enable_zero_target_bitrate=*/false, + VideoEncoderConfig::ContentType::kScreen); + RunBaseTest(&test); +} + +TEST_F(ExtendedReportsEndToEndTest, + TestExtendedReportsWithoutRrtrWithTargetBitrateFromFieldTrial) { + test::ScopedFieldTrials field_trials("WebRTC-Target-Bitrate-Rtcp/Enabled/"); + RtcpXrObserver test(/*enable_rrtr=*/false, /*expect_target_bitrate=*/true, + /*enable_zero_target_bitrate=*/false, + VideoEncoderConfig::ContentType::kRealtimeVideo); RunBaseTest(&test); } TEST_F(ExtendedReportsEndToEndTest, TestExtendedReportsCanSignalZeroTargetBitrate) { - RtcpXrObserver test(/*enable_rrtr=*/false, /*enable_target_bitrate=*/true, - /*enable_zero_target_bitrate=*/true); + RtcpXrObserver test(/*enable_rrtr=*/false, /*expect_target_bitrate=*/true, + /*enable_zero_target_bitrate=*/true, + VideoEncoderConfig::ContentType::kScreen); RunBaseTest(&test); } } // namespace webrtc diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc index 8f78222e7d..544c809a6e 100644 --- a/video/video_send_stream.cc +++ b/video/video_send_stream.cc @@ -15,12 +15,15 @@ #include "modules/rtp_rtcp/source/rtp_header_extension_size.h" #include "modules/rtp_rtcp/source/rtp_sender.h" #include "rtc_base/logging.h" +#include "system_wrappers/include/field_trial.h" #include "video/video_send_stream_impl.h" namespace webrtc { namespace { +constexpr char kTargetBitrateRtcpFieldTrial[] = "WebRTC-Target-Bitrate-Rtcp"; + size_t CalculateMaxHeaderSize(const RtpConfig& config) { size_t header_size = kRtpHeaderSize; size_t extensions_size = 0; @@ -103,9 +106,10 @@ VideoSendStream::VideoSendStream( // it was created on. thread_sync_event_.Wait(rtc::Event::kForever); send_stream_->RegisterProcessThread(module_process_thread); - // TODO(sprang): Enable this also for regular video calls if it works well. - if (encoder_config.content_type == VideoEncoderConfig::ContentType::kScreen) { - // Only signal target bitrate for screenshare streams, for now. + // TODO(sprang): Enable this also for regular video calls by default, if it + // works well. + if (encoder_config.content_type == VideoEncoderConfig::ContentType::kScreen || + field_trial::IsEnabled(kTargetBitrateRtcpFieldTrial)) { video_stream_encoder_->SetBitrateAllocationObserver(send_stream_.get()); }