aboutsummaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorFlorent Castelli <orphis@webrtc.org>2020-03-05 13:39:55 +0100
committerCommit Bot <commit-bot@chromium.org>2020-03-05 14:24:25 +0000
commitb05ca4b6168ccad0db5f6350d438272e59a3b9ca (patch)
tree8ee92845a7b46d5524521a6edbb5845443353dec /media
parent3c91b31162b88a3b38f227a0c681115f2a20a1dd (diff)
downloadwebrtc-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.gn1
-rw-r--r--media/base/media_channel.cc3
-rw-r--r--media/base/media_channel.h2
-rw-r--r--media/engine/webrtc_video_engine.cc45
-rw-r--r--media/engine/webrtc_video_engine_unittest.cc3
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;