Commit 49e19ab9 authored by Sergey Silkin's avatar Sergey Silkin Committed by Commit Bot

Reland "media: use VEA SupportedProfile |min_resolution| for PeerConnection"

This reverts commit a629c52f.

Reason for revert: M80/81 blocker. Bug 1046501.

Original change's description:
> Revert "media: use VEA SupportedProfile |min_resolution| for PeerConnection"
> 
> This reverts commit 72037f82.
> 
> Reason for revert: M80 Stable blocker bug 1046501
> 
> Original change's description:
> > media: use VEA SupportedProfile |min_resolution| for PeerConnection
> > 
> > crrev.com/c/1828078 added and wired the video encode acceleration
> > minimum resolution; this CL uses this information from peerconnection's
> > rtc_video_encoder.cc and video_codec_factory.cc to avoid using a
> > hw accelerator for resolutions below the given one.
> > 
> > TEST=https://codepen.io/miguelao/full/jONQBYb on nocturne (pixel slate), then
> > inspecting chrome:webrtc-internals, verifying that resolutions below 321x241
> > are encoded using libvpx while larger ones are encoded using "ExternalEncoder",
> > i.e. the video encode accelerator in Chrome, in this case VA-API.
> > 
> > Bug: 1008491
> > Change-Id: Iccfe6be8811ca265d6dbc742beb3ec0901406a40
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1848398
> > Commit-Queue: Miguel Casas <mcasas@chromium.org>
> > Reviewed-by: Guido Urdaneta <guidou@chromium.org>
> > Reviewed-by: Kentaro Hara <haraken@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#720981}
> 
> TBR=mcasas@chromium.org,haraken@chromium.org,sprang@chromium.org,hbos@google.com,guidou@chromium.org,ilnik@chromium.org
> 
> # Not skipping CQ checks because original CL landed > 1 day ago.
> 
> Bug: 1008491
> Change-Id: Ie7279fcc02e041f4e1a4a0ed0cef248aa24d472e
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2028889
> Reviewed-by: Miguel Casas <mcasas@chromium.org>
> Reviewed-by: Guido Urdaneta <guidou@chromium.org>
> Reviewed-by: Henrik Boström <hbos@chromium.org>
> Commit-Queue: Miguel Casas <mcasas@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#736904}

TBR=mcasas@chromium.org,haraken@chromium.org,sprang@chromium.org,hbos@google.com,hbos@chromium.org,guidou@chromium.org,ilnik@chromium.org,ssilkin@chromium.org

Change-Id: I92b4e10f9ef39d2c642a6c9ae4d3a1e3f0fbb609
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 1008491
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2033345
Commit-Queue: Miguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarMiguel Casas <mcasas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737332}
parent 3899701d
......@@ -1576,6 +1576,10 @@ const FeatureEntry kFeatureEntries[] = {
flag_descriptions::kWebrtcHideLocalIpsWithMdnsName,
flag_descriptions::kWebrtcHideLocalIpsWithMdnsDecription, kOsDesktop,
FEATURE_VALUE_TYPE(blink::features::kWebRtcHideLocalIpsWithMdns)},
{"enable-webrtc-use-min-max-vea-dimensions",
flag_descriptions::kWebrtcUseMinMaxVEADimensionsName,
flag_descriptions::kWebrtcUseMinMaxVEADimensionsDescription, kOsAll,
FEATURE_VALUE_TYPE(blink::features::kWebRtcUseMinMaxVEADimensions)},
#if defined(OS_ANDROID)
{"clear-old-browsing-data", flag_descriptions::kClearOldBrowsingDataName,
flag_descriptions::kClearOldBrowsingDataDescription, kOsAndroid,
......
......@@ -2150,6 +2150,11 @@
"owners": [ "qingsi", "jeroendb" ],
"expiry_milestone": 78
},
{
"name": "enable-webrtc-use-min-max-vea-dimensions",
"owners": [ "mcasas", "chromeos-gfx-video@google.com" ],
"expiry_milestone": 88
},
{
"name": "enable-winrt-geolocation-implementation",
"owners": [ "pelavall@microsoft.com" ],
......
......@@ -2132,6 +2132,12 @@ const char kWebrtcStunOriginDescription[] =
"When enabled, Stun messages generated by WebRTC will contain the Origin "
"header.";
const char kWebrtcUseMinMaxVEADimensionsName[] =
"WebRTC Min/Max Video Encode Accelerator dimensions";
const char kWebrtcUseMinMaxVEADimensionsDescription[] =
"When enabled, WebRTC will only use the Video Encode Accelerator for "
"video resolutions inside those published as supported.";
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
const char kWebUITabStripName[] = "WebUI tab strip";
const char kWebUITabStripDescription[] =
......
......@@ -1231,6 +1231,9 @@ extern const char kWebrtcSrtpAesGcmDescription[];
extern const char kWebrtcStunOriginName[];
extern const char kWebrtcStunOriginDescription[];
extern const char kWebrtcUseMinMaxVEADimensionsName[];
extern const char kWebrtcUseMinMaxVEADimensionsDescription[];
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
extern const char kWebUITabStripName[];
extern const char kWebUITabStripDescription[];
......
......@@ -338,6 +338,10 @@ const base::FeatureParam<int> kForceDarkTextLightnessThresholdParam{
const base::FeatureParam<int> kForceDarkBackgroundLightnessThresholdParam{
&kForceWebContentsDarkMode, "background_lightness_threshold", -1};
// Instructs WebRTC to honor the Min/Max Video Encode Accelerator dimensions.
const base::Feature kWebRtcUseMinMaxVEADimensions{
"WebRtcUseMinMaxVEADimensions", base::FEATURE_DISABLED_BY_DEFAULT};
// Blink garbage collection.
// Enables compaction of backing stores on Blink's heap.
const base::Feature kBlinkHeapCompaction{"BlinkHeapCompaction",
......
......@@ -101,6 +101,8 @@ BLINK_COMMON_EXPORT extern const base::FeatureParam<int>
// Returns true when PlzDedicatedWorker is enabled.
BLINK_COMMON_EXPORT bool IsPlzDedicatedWorkerEnabled();
BLINK_COMMON_EXPORT extern const base::Feature kWebRtcUseMinMaxVEADimensions;
// Blink garbage collection.
BLINK_COMMON_EXPORT extern const base::Feature kBlinkHeapCompaction;
BLINK_COMMON_EXPORT extern const base::Feature kBlinkHeapConcurrentMarking;
......
......@@ -17,6 +17,7 @@
#include "base/numerics/safe_conversions.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
#include "base/synchronization/lock.h"
#include "base/synchronization/waitable_event.h"
#include "base/thread_annotations.h"
......@@ -33,6 +34,7 @@
#include "media/video/h264_parser.h"
#include "media/video/video_encode_accelerator.h"
#include "mojo/public/cpp/base/shared_memory_utils.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
......@@ -411,6 +413,30 @@ void RTCVideoEncoder::Impl::CreateAndInitializeVEA(
if (IsBitrateTooHigh(bitrate))
return;
// Check that |profile| supports |input_visible_size|.
if (base::FeatureList::IsEnabled(features::kWebRtcUseMinMaxVEADimensions)) {
const auto vea_supported_profiles =
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
for (const auto vea_profile : vea_supported_profiles) {
if (vea_profile.profile == profile &&
(input_visible_size.width() > vea_profile.max_resolution.width() ||
input_visible_size.height() > vea_profile.max_resolution.height() ||
input_visible_size.width() < vea_profile.min_resolution.width() ||
input_visible_size.height() < vea_profile.min_resolution.height())) {
LogAndNotifyError(
FROM_HERE,
base::StringPrintf(
"Requested dimensions (%s) beyond accelerator limits (%s - %s)",
input_visible_size.ToString().c_str(),
vea_profile.min_resolution.ToString().c_str(),
vea_profile.max_resolution.ToString().c_str())
.c_str(),
media::VideoEncodeAccelerator::kInvalidArgumentError);
return;
}
}
}
video_encoder_ = gpu_factories_->CreateVideoEncodeAccelerator();
if (!video_encoder_) {
LogAndNotifyError(FROM_HERE, "Error creating VideoEncodeAccelerator",
......
......@@ -104,23 +104,32 @@ class EncoderAdapter : public webrtc::VideoEncoderFactory {
std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
const webrtc::SdpVideoFormat& format) override {
std::unique_ptr<webrtc::VideoEncoder> software_encoder;
if (IsFormatSupported(&software_encoder_factory_, format)) {
software_encoder = std::make_unique<webrtc::EncoderSimulcastProxy>(
&software_encoder_factory_, format);
const bool supported_in_software =
IsFormatSupported(&software_encoder_factory_, format);
const bool supported_in_hardware =
IsFormatSupported(hardware_encoder_factory_.get(), format);
if (!supported_in_software && !supported_in_hardware)
return nullptr;
if (base::EqualsCaseInsensitiveASCII(format.name.c_str(),
cricket::kVp9CodecName)) {
// For VP9, we don't use simulcast.
if (supported_in_hardware && supported_in_software) {
return Wrap(software_encoder_factory_.CreateVideoEncoder(format),
hardware_encoder_factory_->CreateVideoEncoder(format));
} else if (supported_in_software) {
return software_encoder_factory_.CreateVideoEncoder(format);
}
return hardware_encoder_factory_->CreateVideoEncoder(format);
}
std::unique_ptr<webrtc::VideoEncoder> hardware_encoder;
if (IsFormatSupported(hardware_encoder_factory_.get(), format)) {
hardware_encoder =
base::EqualsCaseInsensitiveASCII(format.name.c_str(),
cricket::kVp9CodecName)
? hardware_encoder_factory_->CreateVideoEncoder(format)
: std::make_unique<webrtc::SimulcastEncoderAdapter>(
hardware_encoder_factory_.get(), format);
if (!supported_in_hardware || !hardware_encoder_factory_.get()) {
return std::make_unique<webrtc::SimulcastEncoderAdapter>(
&software_encoder_factory_, nullptr, format);
}
return Wrap(std::move(software_encoder), std::move(hardware_encoder));
return std::make_unique<webrtc::SimulcastEncoderAdapter>(
hardware_encoder_factory_.get(), &software_encoder_factory_, format);
}
std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override {
......
......@@ -39415,6 +39415,7 @@ from previous Chrome versions.
<int value="1182356056" label="MacV2GPUSandbox:enabled"/>
<int value="1183260592" label="WebAssemblyBaseline:enabled"/>
<int value="1183431946" label="v8-cache-options"/>
<int value="1184093076" label="WebRtcUseMinMaxVEADimensions:enabled"/>
<int value="1184225265" label="AllowSyncXHRInPageDismissal:enabled"/>
<int value="1185424279" label="enable-media-router"/>
<int value="1188109510" label="AssistantAudioEraser:enabled"/>
......@@ -39728,6 +39729,7 @@ from previous Chrome versions.
<int value="1559034872" label="AutofillPrefilledFields:enabled"/>
<int value="1560188739" label="reader-mode-heuristics"/>
<int value="1561781431" label="VirtualKeyboardBorderedKey:enabled"/>
<int value="1562855415" label="WebRtcUseMinMaxVEADimensions:disabled"/>
<int value="1563255033" label="memlog-stack-mode"/>
<int value="1567839560"
label="ChromeHomePersonalizedOmniboxSuggestions:disabled"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment