diff options
author | Florent Castelli <orphis@webrtc.org> | 2020-03-05 13:39:55 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-05 14:24:25 +0000 |
commit | b05ca4b6168ccad0db5f6350d438272e59a3b9ca (patch) | |
tree | 8ee92845a7b46d5524521a6edbb5845443353dec /media | |
parent | 3c91b31162b88a3b38f227a0c681115f2a20a1dd (diff) | |
download | webrtc-b05ca4b6168ccad0db5f6350d438272e59a3b9ca.tar.gz |
Implement new specification for degradation preference
The degradation preference is now based on the content hint of the track
if it's unspecified.
Bug: webrtc:11164
Change-Id: Iaa0dbf1c1bf68a46fc5131e534d423c30c5439c7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161233
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30691}
Diffstat (limited to 'media')
-rw-r--r-- | media/BUILD.gn | 1 | ||||
-rw-r--r-- | media/base/media_channel.cc | 3 | ||||
-rw-r--r-- | media/base/media_channel.h | 2 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine.cc | 45 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine_unittest.cc | 3 |
5 files changed, 35 insertions, 19 deletions
diff --git a/media/BUILD.gn b/media/BUILD.gn index f68f9911f3..8c2d8c0d0c 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -280,6 +280,7 @@ rtc_library("rtc_audio_video") { "..:webrtc_common", "../api:call_api", "../api:libjingle_peerconnection_api", + "../api:media_stream_interface", "../api:rtp_parameters", "../api:scoped_refptr", "../api:transport_api", diff --git a/media/base/media_channel.cc b/media/base/media_channel.cc index 3417924730..2e9bfc3d31 100644 --- a/media/base/media_channel.cc +++ b/media/base/media_channel.cc @@ -12,7 +12,8 @@ namespace cricket { -VideoOptions::VideoOptions() = default; +VideoOptions::VideoOptions() + : content_hint(webrtc::VideoTrackInterface::ContentHint::kNone) {} VideoOptions::~VideoOptions() = default; MediaChannel::MediaChannel(const MediaConfig& config) diff --git a/media/base/media_channel.h b/media/base/media_channel.h index 8ee4a238a1..a62c618562 100644 --- a/media/base/media_channel.h +++ b/media/base/media_channel.h @@ -23,6 +23,7 @@ #include "api/crypto/frame_decryptor_interface.h" #include "api/crypto/frame_encryptor_interface.h" #include "api/frame_transformer_interface.h" +#include "api/media_stream_interface.h" #include "api/rtc_error.h" #include "api/rtp_parameters.h" #include "api/transport/media/media_transport_config.h" @@ -144,6 +145,7 @@ struct VideoOptions { // things, e.g., screencast of a text document and screencast of a // youtube video have different needs. absl::optional<bool> is_screencast; + webrtc::VideoTrackInterface::ContentHint content_hint; private: template <typename T> diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index b2f842950e..48aea63cf8 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -19,6 +19,7 @@ #include "absl/algorithm/container.h" #include "absl/strings/match.h" +#include "api/media_stream_interface.h" #include "api/transport/datagram_transport_interface.h" #include "api/units/data_rate.h" #include "api/video/video_codec_constants.h" @@ -1948,25 +1949,37 @@ WebRtcVideoChannel::WebRtcVideoSendStream::GetDegradationPreference() const { // result in blurry and unreadable text. // |this| acts like a VideoSource to make sure SinkWants are handled on the // correct thread. + if (!enable_cpu_overuse_detection_) { + return webrtc::DegradationPreference::DISABLED; + } + webrtc::DegradationPreference degradation_preference; - if (rtp_parameters_.degradation_preference != - webrtc::DegradationPreference::BALANCED) { - // If the degradationPreference is different from the default value, assume - // it is what we want, regardless of trials or other internal settings. - degradation_preference = rtp_parameters_.degradation_preference; - } else if (!enable_cpu_overuse_detection_) { - degradation_preference = webrtc::DegradationPreference::DISABLED; - } else if (parameters_.options.is_screencast.value_or(false)) { - degradation_preference = webrtc::DegradationPreference::MAINTAIN_RESOLUTION; - } else if (webrtc::field_trial::IsEnabled( - "WebRTC-Video-BalancedDegradation")) { - degradation_preference = webrtc::DegradationPreference::BALANCED; + if (rtp_parameters_.degradation_preference.has_value()) { + degradation_preference = *rtp_parameters_.degradation_preference; } else { - // TODO(orphis): The default should be BALANCED as the standard mandates. - // Right now, there is no way to set it to BALANCED as it would change - // the behavior for any project expecting MAINTAIN_FRAMERATE by default. - degradation_preference = webrtc::DegradationPreference::MAINTAIN_FRAMERATE; + if (parameters_.options.content_hint == + webrtc::VideoTrackInterface::ContentHint::kFluid) { + degradation_preference = + webrtc::DegradationPreference::MAINTAIN_FRAMERATE; + } else if (parameters_.options.is_screencast.value_or(false) || + parameters_.options.content_hint == + webrtc::VideoTrackInterface::ContentHint::kDetailed || + parameters_.options.content_hint == + webrtc::VideoTrackInterface::ContentHint::kText) { + degradation_preference = + webrtc::DegradationPreference::MAINTAIN_RESOLUTION; + } else if (webrtc::field_trial::IsEnabled( + "WebRTC-Video-BalancedDegradation")) { + // Standard wants balanced by default, but it needs to be tuned first. + degradation_preference = webrtc::DegradationPreference::BALANCED; + } else { + // Keep MAINTAIN_FRAMERATE by default until BALANCED has been tuned for + // all codecs and launched. + degradation_preference = + webrtc::DegradationPreference::MAINTAIN_FRAMERATE; + } } + return degradation_preference; } diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc index d294d3153b..d33a2c3532 100644 --- a/media/engine/webrtc_video_engine_unittest.cc +++ b/media/engine/webrtc_video_engine_unittest.cc @@ -7318,8 +7318,7 @@ TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersDegradationPreference) { webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(last_ssrc_); - EXPECT_EQ(rtp_parameters.degradation_preference, - webrtc::DegradationPreference::BALANCED); + EXPECT_FALSE(rtp_parameters.degradation_preference.has_value()); rtp_parameters.degradation_preference = webrtc::DegradationPreference::MAINTAIN_FRAMERATE; |