Commit ea568d28 authored by Yuchen Liu's avatar Yuchen Liu Committed by Commit Bot

[Chromecast] Disable media::MojoRenderer for some web pages

For some web pages, we'd like to use DefaultRendererFactory, so that we
can render video on graphics plane. This is mainly used to support
playing short video on top of another Cast web page.

Bug: internal b/125912333
Test: Playing video on top of YT doesn't break any pages.
Merge-With: eureka-internal/247900
Change-Id: Ibbcd3ee13e6642aa4d9ab1548a8f64ce95329fdf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1496008
Commit-Queue: Yuchen Liu <yucliu@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Reviewed-by: default avatarEmily Stark <estark@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarSean Topping <seantopping@chromium.org>
Cr-Commit-Position: refs/heads/master@{#637824}
parent 348da1d0
...@@ -190,6 +190,11 @@ extern const char kCastMemoryPressureCriticalFraction[] = ...@@ -190,6 +190,11 @@ extern const char kCastMemoryPressureCriticalFraction[] =
extern const char kCastMemoryPressureModerateFraction[] = extern const char kCastMemoryPressureModerateFraction[] =
"memory-pressure-moderate-fraction"; "memory-pressure-moderate-fraction";
// Rather than use the renderer hosted remotely in the media service, fall back
// to the default renderer within content_renderer. Does not change the behavior
// of the media service.
const char kDisableMojoRenderer[] = "disable-mojo-renderer";
} // namespace switches } // namespace switches
namespace chromecast { namespace chromecast {
......
...@@ -91,6 +91,8 @@ extern const char kMixerServiceEndpoint[]; ...@@ -91,6 +91,8 @@ extern const char kMixerServiceEndpoint[];
extern const char kCastMemoryPressureCriticalFraction[]; extern const char kCastMemoryPressureCriticalFraction[];
extern const char kCastMemoryPressureModerateFraction[]; extern const char kCastMemoryPressureModerateFraction[];
extern const char kDisableMojoRenderer[];
} // namespace switches } // namespace switches
namespace chromecast { namespace chromecast {
......
...@@ -44,6 +44,7 @@ include_rules = [ ...@@ -44,6 +44,7 @@ include_rules = [
"+services/network/public/cpp", "+services/network/public/cpp",
"+services/service_manager/public", "+services/service_manager/public",
"+services/service_manager/embedder", "+services/service_manager/embedder",
"+third_party/blink/public/common",
"+ui/accessibility", "+ui/accessibility",
"+ui/aura", "+ui/aura",
"+ui/base", "+ui/base",
......
...@@ -86,6 +86,7 @@ class CastWebContents { ...@@ -86,6 +86,7 @@ class CastWebContents {
struct InitParams { struct InitParams {
Delegate* delegate; Delegate* delegate;
bool enabled_for_dev; bool enabled_for_dev;
bool use_cma_renderer;
}; };
// Page state for the main frame. // Page state for the main frame.
......
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "chromecast/base/chromecast_switches.h"
#include "chromecast/browser/cast_browser_process.h" #include "chromecast/browser/cast_browser_process.h"
#include "chromecast/browser/devtools/remote_debugging_server.h" #include "chromecast/browser/devtools/remote_debugging_server.h"
#include "chromecast/common/mojom/media_playback_options.mojom.h"
#include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
...@@ -19,6 +21,7 @@ ...@@ -19,6 +21,7 @@
#include "content/public/common/bindings_policy.h" #include "content/public/common/bindings_policy.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace chromecast { namespace chromecast {
...@@ -30,6 +33,7 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents, ...@@ -30,6 +33,7 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
page_state_(PageState::IDLE), page_state_(PageState::IDLE),
last_state_(PageState::IDLE), last_state_(PageState::IDLE),
enabled_for_dev_(init_params.enabled_for_dev), enabled_for_dev_(init_params.enabled_for_dev),
use_cma_renderer_(init_params.use_cma_renderer),
remote_debugging_server_( remote_debugging_server_(
shell::CastBrowserProcess::GetInstance()->remote_debugging_server()), shell::CastBrowserProcess::GetInstance()->remote_debugging_server()),
closing_(false), closing_(false),
...@@ -47,6 +51,11 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents, ...@@ -47,6 +51,11 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
LOG(INFO) << "Enabling dev console for CastWebContentsImpl"; LOG(INFO) << "Enabling dev console for CastWebContentsImpl";
remote_debugging_server_->EnableWebContentsForDebugging(web_contents_); remote_debugging_server_->EnableWebContentsForDebugging(web_contents_);
} }
// TODO(yucliu): Change the flag name to kDisableCmaRenderer in a latter diff.
if (GetSwitchValueBoolean(switches::kDisableMojoRenderer, false)) {
use_cma_renderer_ = false;
}
} }
CastWebContentsImpl::~CastWebContentsImpl() { CastWebContentsImpl::~CastWebContentsImpl() {
...@@ -214,6 +223,12 @@ void CastWebContentsImpl::RenderFrameCreated( ...@@ -214,6 +223,12 @@ void CastWebContentsImpl::RenderFrameCreated(
chromecast::shell::mojom::FeatureManagerPtr feature_manager_ptr; chromecast::shell::mojom::FeatureManagerPtr feature_manager_ptr;
render_frame_host->GetRemoteInterfaces()->GetInterface(&feature_manager_ptr); render_frame_host->GetRemoteInterfaces()->GetInterface(&feature_manager_ptr);
feature_manager_ptr->ConfigureFeatures(GetRendererFeatures()); feature_manager_ptr->ConfigureFeatures(GetRendererFeatures());
chromecast::shell::mojom::MediaPlaybackOptionsAssociatedPtr
media_playback_options;
render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
&media_playback_options);
media_playback_options->SetUseCmaRenderer(use_cma_renderer_);
} }
std::vector<chromecast::shell::mojom::FeaturePtr> std::vector<chromecast::shell::mojom::FeaturePtr>
......
...@@ -89,6 +89,7 @@ class CastWebContentsImpl : public CastWebContents, ...@@ -89,6 +89,7 @@ class CastWebContentsImpl : public CastWebContents,
PageState page_state_; PageState page_state_;
PageState last_state_; PageState last_state_;
const bool enabled_for_dev_; const bool enabled_for_dev_;
bool use_cma_renderer_;
shell::RemoteDebuggingServer* const remote_debugging_server_; shell::RemoteDebuggingServer* const remote_debugging_server_;
base::flat_set<std::unique_ptr<CastWebContents>> inner_contents_; base::flat_set<std::unique_ptr<CastWebContents>> inner_contents_;
......
...@@ -80,6 +80,9 @@ class CastWebView { ...@@ -80,6 +80,9 @@ class CastWebView {
// Whether this CastWebView is granted media access. // Whether this CastWebView is granted media access.
bool allow_media_access = false; bool allow_media_access = false;
// Whether this CastWebView will use CMA for media playback.
bool use_cma_renderer = true;
// Enable development mode for this CastWebView. Whitelists certain // Enable development mode for this CastWebView. Whitelists certain
// functionality for the WebContents, like remote debugging and debugging // functionality for the WebContents, like remote debugging and debugging
// interfaces. // interfaces.
......
...@@ -63,8 +63,9 @@ CastWebViewDefault::CastWebViewDefault( ...@@ -63,8 +63,9 @@ CastWebViewDefault::CastWebViewDefault(
transparent_(params.transparent), transparent_(params.transparent),
allow_media_access_(params.allow_media_access), allow_media_access_(params.allow_media_access),
web_contents_(CreateWebContents(browser_context_, site_instance_)), web_contents_(CreateWebContents(browser_context_, site_instance_)),
cast_web_contents_(web_contents_.get(), cast_web_contents_(
{delegate_, params.enabled_for_dev}), web_contents_.get(),
{delegate_, params.enabled_for_dev, params.use_cma_renderer}),
window_(shell::CastContentWindow::Create(params.window_params)), window_(shell::CastContentWindow::Create(params.window_params)),
resize_window_when_navigation_starts_(true) { resize_window_when_navigation_starts_(true) {
DCHECK(delegate_); DCHECK(delegate_);
......
...@@ -30,8 +30,9 @@ CastWebViewExtension::CastWebViewExtension( ...@@ -30,8 +30,9 @@ CastWebViewExtension::CastWebViewExtension(
initial_url, initial_url,
site_instance.get(), site_instance.get(),
extensions::VIEW_TYPE_EXTENSION_POPUP)), extensions::VIEW_TYPE_EXTENSION_POPUP)),
cast_web_contents_(extension_host_->host_contents(), cast_web_contents_(
{delegate_, params.enabled_for_dev}) { extension_host_->host_contents(),
{delegate_, params.enabled_for_dev, params.use_cma_renderer}) {
DCHECK(delegate_); DCHECK(delegate_);
content::WebContentsObserver::Observe(web_contents()); content::WebContentsObserver::Observe(web_contents());
web_contents()->GetNativeView()->SetName(params.activity_id); web_contents()->GetNativeView()->SetName(params.activity_id);
......
...@@ -11,4 +11,10 @@ interface MediaPlaybackOptions { ...@@ -11,4 +11,10 @@ interface MediaPlaybackOptions {
SetMediaLoadingBlocked(bool blocked); SetMediaLoadingBlocked(bool blocked);
SetBackgroundVideoPlaybackEnabled(bool enabled); SetBackgroundVideoPlaybackEnabled(bool enabled);
};
\ No newline at end of file // Enable CMA (MojoRenderer) for media playback.
// Otherwise, media playback uses RendererImpl, which is the same as other
// platforms. For video codec supported by v4l2 (e.g. h264), it's still
// accelerated by hardware. Video will be rendererd on graphics plane.
SetUseCmaRenderer(bool enabled);
};
...@@ -79,6 +79,12 @@ void CastMediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) { ...@@ -79,6 +79,12 @@ void CastMediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) {
renderer_media_playback_options_); renderer_media_playback_options_);
} }
void CastMediaPlaybackOptions::SetUseCmaRenderer(bool enable) {
renderer_media_playback_options_.is_mojo_renderer_enabled = enable;
render_frame()->SetRenderFrameMediaPlaybackOptions(
renderer_media_playback_options_);
}
void CastMediaPlaybackOptions::OnMediaPlaybackOptionsAssociatedRequest( void CastMediaPlaybackOptions::OnMediaPlaybackOptionsAssociatedRequest(
chromecast::shell::mojom::MediaPlaybackOptionsAssociatedRequest request) { chromecast::shell::mojom::MediaPlaybackOptionsAssociatedRequest request) {
bindings_.AddBinding(this, std::move(request)); bindings_.AddBinding(this, std::move(request));
......
...@@ -48,6 +48,7 @@ class CastMediaPlaybackOptions ...@@ -48,6 +48,7 @@ class CastMediaPlaybackOptions
// MediaPlaybackOptions implementation // MediaPlaybackOptions implementation
void SetMediaLoadingBlocked(bool blocked) override; void SetMediaLoadingBlocked(bool blocked) override;
void SetBackgroundVideoPlaybackEnabled(bool enabled) override; void SetBackgroundVideoPlaybackEnabled(bool enabled) override;
void SetUseCmaRenderer(bool enable) override;
void OnMediaPlaybackOptionsAssociatedRequest( void OnMediaPlaybackOptionsAssociatedRequest(
chromecast::shell::mojom::MediaPlaybackOptionsAssociatedRequest request); chromecast::shell::mojom::MediaPlaybackOptionsAssociatedRequest request);
......
...@@ -3089,9 +3089,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer( ...@@ -3089,9 +3089,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
#if BUILDFLAG(ENABLE_PLUGINS) #if BUILDFLAG(ENABLE_PLUGINS)
switches::kEnablePepperTesting, switches::kEnablePepperTesting,
#endif
#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
switches::kDisableMojoRenderer,
#endif #endif
switches::kDisableWebRtcHWDecoding, switches::kDisableWebRtcHWDecoding,
switches::kDisableWebRtcHWEncoding, switches::kDisableWebRtcHWEncoding,
......
...@@ -28,6 +28,9 @@ struct RenderFrameMediaPlaybackOptions { ...@@ -28,6 +28,9 @@ struct RenderFrameMediaPlaybackOptions {
// Whether background video optimization is supported on current platform. // Whether background video optimization is supported on current platform.
bool is_background_video_track_optimization_supported = true; bool is_background_video_track_optimization_supported = true;
// Whether MojoRenderer should be used for given |render_frame|.
bool is_mojo_renderer_enabled = true;
}; };
} // namespace content } // namespace content
......
...@@ -330,7 +330,10 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer( ...@@ -330,7 +330,10 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
base::WeakPtr<media::MediaObserver> media_observer; base::WeakPtr<media::MediaObserver> media_observer;
auto factory_selector = CreateRendererFactorySelector( auto factory_selector = CreateRendererFactorySelector(
media_log.get(), use_media_player_renderer, GetDecoderFactory(), media_log.get(), use_media_player_renderer,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_mojo_renderer_enabled,
GetDecoderFactory(),
std::make_unique<media::RemotePlaybackClientWrapperImpl>(client), std::make_unique<media::RemotePlaybackClientWrapperImpl>(client),
&media_observer); &media_observer);
...@@ -416,6 +419,7 @@ std::unique_ptr<media::RendererFactorySelector> ...@@ -416,6 +419,7 @@ std::unique_ptr<media::RendererFactorySelector>
MediaFactory::CreateRendererFactorySelector( MediaFactory::CreateRendererFactorySelector(
media::MediaLog* media_log, media::MediaLog* media_log,
bool use_media_player, bool use_media_player,
bool enable_mojo_renderer,
media::DecoderFactory* decoder_factory, media::DecoderFactory* decoder_factory,
std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper, std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper,
base::WeakPtr<media::MediaObserver>* out_media_observer) { base::WeakPtr<media::MediaObserver>* out_media_observer) {
...@@ -470,13 +474,7 @@ MediaFactory::CreateRendererFactorySelector( ...@@ -470,13 +474,7 @@ MediaFactory::CreateRendererFactorySelector(
bool use_mojo_renderer_factory = false; bool use_mojo_renderer_factory = false;
#if BUILDFLAG(ENABLE_MOJO_RENDERER) #if BUILDFLAG(ENABLE_MOJO_RENDERER)
#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION) use_mojo_renderer_factory = enable_mojo_renderer;
use_mojo_renderer_factory =
!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableMojoRenderer);
#else
use_mojo_renderer_factory = true;
#endif // BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
if (use_mojo_renderer_factory) { if (use_mojo_renderer_factory) {
auto mojo_renderer_factory = std::make_unique<media::MojoRendererFactory>( auto mojo_renderer_factory = std::make_unique<media::MojoRendererFactory>(
base::Bind(&RenderThreadImpl::GetGpuFactories, base::Bind(&RenderThreadImpl::GetGpuFactories,
......
...@@ -119,6 +119,7 @@ class MediaFactory { ...@@ -119,6 +119,7 @@ class MediaFactory {
std::unique_ptr<media::RendererFactorySelector> CreateRendererFactorySelector( std::unique_ptr<media::RendererFactorySelector> CreateRendererFactorySelector(
media::MediaLog* media_log, media::MediaLog* media_log,
bool use_media_player, bool use_media_player,
bool enable_mojo_renderer,
media::DecoderFactory* decoder_factory, media::DecoderFactory* decoder_factory,
std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper, std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper,
base::WeakPtr<media::MediaObserver>* out_media_observer); base::WeakPtr<media::MediaObserver>* out_media_observer);
......
...@@ -35,7 +35,6 @@ buildflag_header("media_buildflags") { ...@@ -35,7 +35,6 @@ buildflag_header("media_buildflags") {
"ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc", "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc",
"ENABLE_MPEG_H_AUDIO_DEMUXING=$enable_mpeg_h_audio_demuxing", "ENABLE_MPEG_H_AUDIO_DEMUXING=$enable_mpeg_h_audio_demuxing",
"ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser", "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
"ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION=$enable_runtime_media_renderer_selection",
"USE_PROPRIETARY_CODECS=$proprietary_codecs", "USE_PROPRIETARY_CODECS=$proprietary_codecs",
] ]
} }
......
...@@ -81,13 +81,6 @@ const char kUseCras[] = "use-cras"; ...@@ -81,13 +81,6 @@ const char kUseCras[] = "use-cras";
const char kUnsafelyAllowProtectedMediaIdentifierForDomain[] = const char kUnsafelyAllowProtectedMediaIdentifierForDomain[] =
"unsafely-allow-protected-media-identifier-for-domain"; "unsafely-allow-protected-media-identifier-for-domain";
#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
// Rather than use the renderer hosted remotely in the media service, fall back
// to the default renderer within content_renderer. Does not change the behavior
// of the media service.
const char kDisableMojoRenderer[] = "disable-mojo-renderer";
#endif // BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
// Use fake device for Media Stream to replace actual camera and microphone. // Use fake device for Media Stream to replace actual camera and microphone.
const char kUseFakeDeviceForMediaStream[] = "use-fake-device-for-media-stream"; const char kUseFakeDeviceForMediaStream[] = "use-fake-device-for-media-stream";
......
...@@ -56,10 +56,6 @@ MEDIA_EXPORT extern const char kUseCras[]; ...@@ -56,10 +56,6 @@ MEDIA_EXPORT extern const char kUseCras[];
MEDIA_EXPORT extern const char MEDIA_EXPORT extern const char
kUnsafelyAllowProtectedMediaIdentifierForDomain[]; kUnsafelyAllowProtectedMediaIdentifierForDomain[];
#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
MEDIA_EXPORT extern const char kDisableMojoRenderer[];
#endif // BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
MEDIA_EXPORT extern const char kUseFakeDeviceForMediaStream[]; MEDIA_EXPORT extern const char kUseFakeDeviceForMediaStream[];
MEDIA_EXPORT extern const char kUseFileForFakeVideoCapture[]; MEDIA_EXPORT extern const char kUseFileForFakeVideoCapture[];
MEDIA_EXPORT extern const char kUseFileForFakeAudioCapture[]; MEDIA_EXPORT extern const char kUseFileForFakeAudioCapture[];
......
...@@ -36,9 +36,6 @@ buildflag_header("buildflags") { ...@@ -36,9 +36,6 @@ buildflag_header("buildflags") {
assert(false, "Invalid mojo media service: $service") assert(false, "Invalid mojo media service: $service")
} }
} }
assert(
enable_mojo_renderer || !enable_runtime_media_renderer_selection,
"The mojo renderer must be enabled to use runtime media renderer selection.")
if (mojo_media_host == "browser") { if (mojo_media_host == "browser") {
enable_mojo_media_in_browser_process = true enable_mojo_media_in_browser_process = true
......
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