Commit 7b4fb10c authored by Chih-Hsuan Kuo's avatar Chih-Hsuan Kuo Committed by Commit Bot

Add remoting mode into WebMediaPlayerImpl

Bug=1054761
Test=build and pass CQ

Merge-With: eureka-internal/367058
Change-Id: I64e33d87398eab09704ea63b6eaf8e3922e3f98d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2066397
Commit-Queue: Chih-Hsuan Kuo <chkuo@google.com>
Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarYuchen Liu <yucliu@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746695}
parent 2f69de56
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/string_piece_forward.h" #include "base/strings/string_piece_forward.h"
#include "chromecast/common/mojom/feature_manager.mojom.h" #include "chromecast/common/mojom/feature_manager.mojom.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_registry.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/messaging/web_message_port.h" #include "third_party/blink/public/common/messaging/web_message_port.h"
...@@ -204,7 +205,8 @@ class CastWebContents { ...@@ -204,7 +205,8 @@ class CastWebContents {
// debugging interfaces. // debugging interfaces.
bool enabled_for_dev = false; bool enabled_for_dev = false;
// Chooses a media renderer for the WebContents. // Chooses a media renderer for the WebContents.
bool use_cma_renderer = false; content::mojom::RendererType renderer_type =
content::mojom::RendererType::DEFAULT_RENDERER;
// Whether the WebContents is a root native window, or if it is embedded in // Whether the WebContents is a root native window, or if it is embedded in
// another WebContents (see Delegate::InnerContentsCreated()). // another WebContents (see Delegate::InnerContentsCreated()).
bool is_root_window = false; bool is_root_window = false;
......
...@@ -137,7 +137,7 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents, ...@@ -137,7 +137,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), renderer_type_(init_params.renderer_type),
handle_inner_contents_(init_params.handle_inner_contents), handle_inner_contents_(init_params.handle_inner_contents),
view_background_color_(init_params.background_color), view_background_color_(init_params.background_color),
remote_debugging_server_( remote_debugging_server_(
...@@ -175,8 +175,9 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents, ...@@ -175,8 +175,9 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
} }
// TODO(yucliu): Change the flag name to kDisableCmaRenderer in a latter diff. // TODO(yucliu): Change the flag name to kDisableCmaRenderer in a latter diff.
if (GetSwitchValueBoolean(switches::kDisableMojoRenderer, false)) { if (GetSwitchValueBoolean(switches::kDisableMojoRenderer, false) &&
use_cma_renderer_ = false; renderer_type_ == content::mojom::RendererType::MOJO_RENDERER) {
renderer_type_ = content::mojom::RendererType::DEFAULT_RENDERER;
} }
// Provides QueryableDataHostCast if the new QueryableData bindings is not // Provides QueryableDataHostCast if the new QueryableData bindings is not
...@@ -482,7 +483,7 @@ void CastWebContentsImpl::RenderFrameCreated( ...@@ -482,7 +483,7 @@ void CastWebContentsImpl::RenderFrameCreated(
media_playback_options; media_playback_options;
render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
&media_playback_options); &media_playback_options);
media_playback_options->SetUseCmaRenderer(use_cma_renderer_); media_playback_options->SetRendererType(renderer_type_);
// Send queryable values // Send queryable values
mojo::Remote<chromecast::shell::mojom::QueryableDataStore> mojo::Remote<chromecast::shell::mojom::QueryableDataStore>
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h"
...@@ -165,7 +166,7 @@ class CastWebContentsImpl : public CastWebContents, ...@@ -165,7 +166,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_; content::mojom::RendererType renderer_type_;
const bool handle_inner_contents_; const bool handle_inner_contents_;
BackgroundColor view_background_color_; BackgroundColor view_background_color_;
shell::RemoteDebuggingServer* const remote_debugging_server_; shell::RemoteDebuggingServer* const remote_debugging_server_;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_navigation_observer.h"
...@@ -60,7 +61,9 @@ content::WebContents* CastBrowserTest::CreateWebView() { ...@@ -60,7 +61,9 @@ content::WebContents* CastBrowserTest::CreateWebView() {
CastWebView::CreateParams params; CastWebView::CreateParams params;
params.delegate = weak_factory_.GetWeakPtr(); params.delegate = weak_factory_.GetWeakPtr();
params.web_contents_params.delegate = weak_factory_.GetWeakPtr(); params.web_contents_params.delegate = weak_factory_.GetWeakPtr();
params.web_contents_params.use_cma_renderer = true; // MOJO_RENDERER is CMA renderer on Chromecast
params.web_contents_params.renderer_type =
content::mojom::RendererType::MOJO_RENDERER;
params.web_contents_params.enabled_for_dev = true; params.web_contents_params.enabled_for_dev = true;
params.window_params.delegate = weak_factory_.GetWeakPtr(); params.window_params.delegate = weak_factory_.GetWeakPtr();
cast_web_view_ = cast_web_view_ =
......
...@@ -20,5 +20,8 @@ mojom("mojom") { ...@@ -20,5 +20,8 @@ mojom("mojom") {
"service_connector.mojom", "service_connector.mojom",
] ]
public_deps = [ "//mojo/public/mojom/base" ] public_deps = [
"//content/public/common:renderer_type",
"//mojo/public/mojom/base",
]
} }
...@@ -4,17 +4,18 @@ ...@@ -4,17 +4,18 @@
module chromecast.shell.mojom; module chromecast.shell.mojom;
import "content/public/common/media_playback_renderer_type.mojom";
// Receives messages from browser process to control media playback options // Receives messages from browser process to control media playback options
// (block loading, background playback) for a specific RenderFrame. // (block loading, background playback) for a specific RenderFrame.
// Implemented by a RenderFrameObserver. // Implemented by a RenderFrameObserver.
interface MediaPlaybackOptions { interface MediaPlaybackOptions {
// Set true to enable background suspend
SetMediaLoadingBlocked(bool blocked); SetMediaLoadingBlocked(bool blocked);
// Set true to allow video playback to be played in the background
SetBackgroundVideoPlaybackEnabled(bool enabled); SetBackgroundVideoPlaybackEnabled(bool enabled);
// Enable CMA (MojoRenderer) for media playback. // Set the renderer type that will be used in WebMediaPlayerImpl
// Otherwise, media playback uses RendererImpl, which is the same as other SetRendererType(content.mojom.RendererType type);
// 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);
}; };
...@@ -78,8 +78,9 @@ void CastMediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) { ...@@ -78,8 +78,9 @@ void CastMediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) {
renderer_media_playback_options_); renderer_media_playback_options_);
} }
void CastMediaPlaybackOptions::SetUseCmaRenderer(bool enable) { void CastMediaPlaybackOptions::SetRendererType(
renderer_media_playback_options_.is_mojo_renderer_enabled = enable; content::mojom::RendererType type) {
renderer_media_playback_options_.renderer_type = type;
render_frame()->SetRenderFrameMediaPlaybackOptions( render_frame()->SetRenderFrameMediaPlaybackOptions(
renderer_media_playback_options_); renderer_media_playback_options_);
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "chromecast/common/mojom/media_playback_options.mojom.h" #include "chromecast/common/mojom/media_playback_options.mojom.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
#include "content/public/renderer/render_frame_media_playback_options.h" #include "content/public/renderer/render_frame_media_playback_options.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "content/public/renderer/render_frame_observer_tracker.h" #include "content/public/renderer/render_frame_observer_tracker.h"
...@@ -49,7 +50,7 @@ class CastMediaPlaybackOptions ...@@ -49,7 +50,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 SetRendererType(content::mojom::RendererType type) override;
void OnMediaPlaybackOptionsAssociatedReceiver( void OnMediaPlaybackOptionsAssociatedReceiver(
mojo::PendingAssociatedReceiver< mojo::PendingAssociatedReceiver<
......
...@@ -200,6 +200,7 @@ jumbo_source_set("common_sources") { ...@@ -200,6 +200,7 @@ jumbo_source_set("common_sources") {
public_deps = [ public_deps = [
":interfaces", ":interfaces",
":renderer_type",
":service_names", ":service_names",
"//content/common", "//content/common",
"//ipc", "//ipc",
...@@ -327,6 +328,10 @@ mojom("interfaces") { ...@@ -327,6 +328,10 @@ mojom("interfaces") {
export_header = "content/common/content_export.h" export_header = "content/common/content_export.h"
} }
mojom("renderer_type") {
sources = [ "media_playback_renderer_type.mojom" ]
}
mojom("web_preferences_mojom") { mojom("web_preferences_mojom") {
sources = [ "web_preferences.mojom" ] sources = [ "web_preferences.mojom" ]
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module content.mojom;
enum RendererType {
// 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.
DEFAULT_RENDERER = 0,
// Enables Mojo Renderer (MojoRenderer) for media playback.
// On Chromecast, CMA renderer is enabled here.
MOJO_RENDERER = 1,
// Enables RemotingRenderer for playing remoting media in
// blink::WebMediaPlayer.
REMOTING_RENDERER = 2,
};
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CONTENT_PUBLIC_RENDERER_RENDER_FRAME_MEDIA_PLAYBACK_OPTIONS_H_ #define CONTENT_PUBLIC_RENDERER_RENDER_FRAME_MEDIA_PLAYBACK_OPTIONS_H_
#include "build/build_config.h" #include "build/build_config.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
namespace content { namespace content {
...@@ -29,8 +30,16 @@ struct RenderFrameMediaPlaybackOptions { ...@@ -29,8 +30,16 @@ 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|. // Which renderer should be used in this media playback.
bool is_mojo_renderer_enabled = true; mojom::RendererType renderer_type = mojom::RendererType::DEFAULT_RENDERER;
bool is_mojo_renderer_enabled() const {
return renderer_type == mojom::RendererType::MOJO_RENDERER;
}
bool is_remoting_renderer_enabled() const {
return renderer_type == mojom::RendererType::REMOTING_RENDERER;
}
}; };
} // namespace content } // namespace content
......
...@@ -349,7 +349,7 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer( ...@@ -349,7 +349,7 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
auto factory_selector = CreateRendererFactorySelector( auto factory_selector = CreateRendererFactorySelector(
media_log.get(), use_media_player_renderer, media_log.get(), use_media_player_renderer,
render_frame_->GetRenderFrameMediaPlaybackOptions() render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_mojo_renderer_enabled, .is_mojo_renderer_enabled(),
GetDecoderFactory(), GetDecoderFactory(),
std::make_unique<media::RemotePlaybackClientWrapperImpl>(client), std::make_unique<media::RemotePlaybackClientWrapperImpl>(client),
&media_observer); &media_observer);
...@@ -432,6 +432,8 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer( ...@@ -432,6 +432,8 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
.is_background_video_playback_enabled, .is_background_video_playback_enabled,
render_frame_->GetRenderFrameMediaPlaybackOptions() render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_background_video_track_optimization_supported, .is_background_video_track_optimization_supported,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_remoting_renderer_enabled(),
std::move(power_status_helper))); std::move(power_status_helper)));
std::unique_ptr<media::VideoFrameCompositor> vfc = std::unique_ptr<media::VideoFrameCompositor> vfc =
......
...@@ -315,6 +315,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( ...@@ -315,6 +315,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
params->IsBackgroundVideoPlaybackEnabled()), params->IsBackgroundVideoPlaybackEnabled()),
is_background_video_track_optimization_supported_( is_background_video_track_optimization_supported_(
params->IsBackgroundVideoTrackOptimizationSupported()), params->IsBackgroundVideoTrackOptimizationSupported()),
is_remoting_renderer_enabled_(params->IsRemotingRendererEnabled()),
reported_renderer_type_(RendererFactoryType::kDefault), reported_renderer_type_(RendererFactoryType::kDefault),
simple_watch_timer_( simple_watch_timer_(
base::BindRepeating(&WebMediaPlayerImpl::OnSimpleWatchTimerTick, base::BindRepeating(&WebMediaPlayerImpl::OnSimpleWatchTimerTick,
......
...@@ -1018,6 +1018,15 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl ...@@ -1018,6 +1018,15 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
// 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 the media in this frame is a remoting media.
//
// Remoting media is a special media that has the media streams are delivered
// to the browser directly from somewhere without any URL request
// (http, file, ...)
// When setting to true, a remoting renderer will be created as the remoting
// target in the client.
bool is_remoting_renderer_enabled_ = false;
base::CancelableOnceClosure have_enough_after_lazy_load_cb_; base::CancelableOnceClosure have_enough_after_lazy_load_cb_;
// State for simplified watch time reporting. // State for simplified watch time reporting.
......
...@@ -396,7 +396,7 @@ class WebMediaPlayerImplTest : public testing::Test { ...@@ -396,7 +396,7 @@ class WebMediaPlayerImplTest : public testing::Test {
viz::TestContextProvider::Create(), viz::TestContextProvider::Create(),
blink::WebMediaPlayer::SurfaceLayerMode::kAlways, blink::WebMediaPlayer::SurfaceLayerMode::kAlways,
is_background_suspend_enabled_, is_background_video_playback_enabled_, is_background_suspend_enabled_, is_background_video_playback_enabled_,
true, nullptr); true, false, nullptr);
auto compositor = std::make_unique<NiceMock<MockVideoFrameCompositor>>( auto compositor = std::make_unique<NiceMock<MockVideoFrameCompositor>>(
params->video_frame_compositor_task_runner()); params->video_frame_compositor_task_runner());
......
...@@ -32,6 +32,7 @@ WebMediaPlayerParams::WebMediaPlayerParams( ...@@ -32,6 +32,7 @@ WebMediaPlayerParams::WebMediaPlayerParams(
bool is_background_suspend_enabled, bool is_background_suspend_enabled,
bool is_background_video_playback_enabled, bool is_background_video_playback_enabled,
bool is_background_video_track_optimization_supported, bool is_background_video_track_optimization_supported,
bool is_remoting_renderer_enabled,
std::unique_ptr<PowerStatusHelper> power_status_helper) std::unique_ptr<PowerStatusHelper> power_status_helper)
: defer_load_cb_(defer_load_cb), : defer_load_cb_(defer_load_cb),
audio_renderer_sink_(audio_renderer_sink), audio_renderer_sink_(audio_renderer_sink),
...@@ -55,6 +56,7 @@ WebMediaPlayerParams::WebMediaPlayerParams( ...@@ -55,6 +56,7 @@ WebMediaPlayerParams::WebMediaPlayerParams(
is_background_video_playback_enabled), is_background_video_playback_enabled),
is_background_video_track_optimization_supported_( is_background_video_track_optimization_supported_(
is_background_video_track_optimization_supported), is_background_video_track_optimization_supported),
is_remoting_renderer_enabled_(is_remoting_renderer_enabled),
power_status_helper_(std::move(power_status_helper)) {} power_status_helper_(std::move(power_status_helper)) {}
WebMediaPlayerParams::~WebMediaPlayerParams() = default; WebMediaPlayerParams::~WebMediaPlayerParams() = default;
......
...@@ -84,6 +84,7 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams { ...@@ -84,6 +84,7 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
bool is_background_suspend_enabled, bool is_background_suspend_enabled,
bool is_background_video_play_enabled, bool is_background_video_play_enabled,
bool is_background_video_track_optimization_supported, bool is_background_video_track_optimization_supported,
bool is_remoting_renderer_enabled,
std::unique_ptr<PowerStatusHelper> power_status_helper); std::unique_ptr<PowerStatusHelper> power_status_helper);
~WebMediaPlayerParams(); ~WebMediaPlayerParams();
...@@ -167,6 +168,10 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams { ...@@ -167,6 +168,10 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
return is_background_video_track_optimization_supported_; return is_background_video_track_optimization_supported_;
} }
bool IsRemotingRendererEnabled() const {
return is_remoting_renderer_enabled_;
}
std::unique_ptr<PowerStatusHelper> TakePowerStatusHelper() { std::unique_ptr<PowerStatusHelper> TakePowerStatusHelper() {
return std::move(power_status_helper_); return std::move(power_status_helper_);
} }
...@@ -199,6 +204,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams { ...@@ -199,6 +204,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
bool is_background_video_playback_enabled_ = true; bool is_background_video_playback_enabled_ = true;
// 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 the media in this frame is a remoting media.
bool is_remoting_renderer_enabled_ = false;
std::unique_ptr<PowerStatusHelper> power_status_helper_; std::unique_ptr<PowerStatusHelper> power_status_helper_;
......
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