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 @@
#include "base/strings/string16.h"
#include "base/strings/string_piece_forward.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/interface_provider.h"
#include "third_party/blink/public/common/messaging/web_message_port.h"
......@@ -204,7 +205,8 @@ class CastWebContents {
// debugging interfaces.
bool enabled_for_dev = false;
// 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
// another WebContents (see Delegate::InnerContentsCreated()).
bool is_root_window = false;
......
......@@ -137,7 +137,7 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
page_state_(PageState::IDLE),
last_state_(PageState::IDLE),
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),
view_background_color_(init_params.background_color),
remote_debugging_server_(
......@@ -175,8 +175,9 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
}
// TODO(yucliu): Change the flag name to kDisableCmaRenderer in a latter diff.
if (GetSwitchValueBoolean(switches::kDisableMojoRenderer, false)) {
use_cma_renderer_ = false;
if (GetSwitchValueBoolean(switches::kDisableMojoRenderer, false) &&
renderer_type_ == content::mojom::RendererType::MOJO_RENDERER) {
renderer_type_ = content::mojom::RendererType::DEFAULT_RENDERER;
}
// Provides QueryableDataHostCast if the new QueryableData bindings is not
......@@ -482,7 +483,7 @@ void CastWebContentsImpl::RenderFrameCreated(
media_playback_options;
render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
&media_playback_options);
media_playback_options->SetUseCmaRenderer(use_cma_renderer_);
media_playback_options->SetRendererType(renderer_type_);
// Send queryable values
mojo::Remote<chromecast::shell::mojom::QueryableDataStore>
......
......@@ -26,6 +26,7 @@
#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/web_contents.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/interface_provider.h"
#include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h"
......@@ -165,7 +166,7 @@ class CastWebContentsImpl : public CastWebContents,
PageState page_state_;
PageState last_state_;
const bool enabled_for_dev_;
bool use_cma_renderer_;
content::mojom::RendererType renderer_type_;
const bool handle_inner_contents_;
BackgroundColor view_background_color_;
shell::RemoteDebuggingServer* const remote_debugging_server_;
......
......@@ -18,6 +18,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.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/test_navigation_observer.h"
......@@ -60,7 +61,9 @@ content::WebContents* CastBrowserTest::CreateWebView() {
CastWebView::CreateParams params;
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.window_params.delegate = weak_factory_.GetWeakPtr();
cast_web_view_ =
......
......@@ -20,5 +20,8 @@ mojom("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 @@
module chromecast.shell.mojom;
import "content/public/common/media_playback_renderer_type.mojom";
// Receives messages from browser process to control media playback options
// (block loading, background playback) for a specific RenderFrame.
// Implemented by a RenderFrameObserver.
interface MediaPlaybackOptions {
// Set true to enable background suspend
SetMediaLoadingBlocked(bool blocked);
// Set true to allow video playback to be played in the background
SetBackgroundVideoPlaybackEnabled(bool enabled);
// 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);
// Set the renderer type that will be used in WebMediaPlayerImpl
SetRendererType(content.mojom.RendererType type);
};
......@@ -78,8 +78,9 @@ void CastMediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) {
renderer_media_playback_options_);
}
void CastMediaPlaybackOptions::SetUseCmaRenderer(bool enable) {
renderer_media_playback_options_.is_mojo_renderer_enabled = enable;
void CastMediaPlaybackOptions::SetRendererType(
content::mojom::RendererType type) {
renderer_media_playback_options_.renderer_type = type;
render_frame()->SetRenderFrameMediaPlaybackOptions(
renderer_media_playback_options_);
}
......
......@@ -11,6 +11,7 @@
#include "base/callback_forward.h"
#include "base/sequence_checker.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_observer.h"
#include "content/public/renderer/render_frame_observer_tracker.h"
......@@ -49,7 +50,7 @@ class CastMediaPlaybackOptions
// MediaPlaybackOptions implementation
void SetMediaLoadingBlocked(bool blocked) override;
void SetBackgroundVideoPlaybackEnabled(bool enabled) override;
void SetUseCmaRenderer(bool enable) override;
void SetRendererType(content::mojom::RendererType type) override;
void OnMediaPlaybackOptionsAssociatedReceiver(
mojo::PendingAssociatedReceiver<
......
......@@ -200,6 +200,7 @@ jumbo_source_set("common_sources") {
public_deps = [
":interfaces",
":renderer_type",
":service_names",
"//content/common",
"//ipc",
......@@ -327,6 +328,10 @@ mojom("interfaces") {
export_header = "content/common/content_export.h"
}
mojom("renderer_type") {
sources = [ "media_playback_renderer_type.mojom" ]
}
mojom("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 @@
#define CONTENT_PUBLIC_RENDERER_RENDER_FRAME_MEDIA_PLAYBACK_OPTIONS_H_
#include "build/build_config.h"
#include "content/public/common/media_playback_renderer_type.mojom.h"
namespace content {
......@@ -29,8 +30,16 @@ struct RenderFrameMediaPlaybackOptions {
// Whether background video optimization is supported on current platform.
bool is_background_video_track_optimization_supported = true;
// Whether MojoRenderer should be used for given |render_frame|.
bool is_mojo_renderer_enabled = true;
// Which renderer should be used in this media playback.
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
......
......@@ -349,7 +349,7 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
auto factory_selector = CreateRendererFactorySelector(
media_log.get(), use_media_player_renderer,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_mojo_renderer_enabled,
.is_mojo_renderer_enabled(),
GetDecoderFactory(),
std::make_unique<media::RemotePlaybackClientWrapperImpl>(client),
&media_observer);
......@@ -432,6 +432,8 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
.is_background_video_playback_enabled,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_background_video_track_optimization_supported,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_remoting_renderer_enabled(),
std::move(power_status_helper)));
std::unique_ptr<media::VideoFrameCompositor> vfc =
......
......@@ -315,6 +315,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
params->IsBackgroundVideoPlaybackEnabled()),
is_background_video_track_optimization_supported_(
params->IsBackgroundVideoTrackOptimizationSupported()),
is_remoting_renderer_enabled_(params->IsRemotingRendererEnabled()),
reported_renderer_type_(RendererFactoryType::kDefault),
simple_watch_timer_(
base::BindRepeating(&WebMediaPlayerImpl::OnSimpleWatchTimerTick,
......
......@@ -1018,6 +1018,15 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
// Whether background video optimization is supported on current platform.
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_;
// State for simplified watch time reporting.
......
......@@ -396,7 +396,7 @@ class WebMediaPlayerImplTest : public testing::Test {
viz::TestContextProvider::Create(),
blink::WebMediaPlayer::SurfaceLayerMode::kAlways,
is_background_suspend_enabled_, is_background_video_playback_enabled_,
true, nullptr);
true, false, nullptr);
auto compositor = std::make_unique<NiceMock<MockVideoFrameCompositor>>(
params->video_frame_compositor_task_runner());
......
......@@ -32,6 +32,7 @@ WebMediaPlayerParams::WebMediaPlayerParams(
bool is_background_suspend_enabled,
bool is_background_video_playback_enabled,
bool is_background_video_track_optimization_supported,
bool is_remoting_renderer_enabled,
std::unique_ptr<PowerStatusHelper> power_status_helper)
: defer_load_cb_(defer_load_cb),
audio_renderer_sink_(audio_renderer_sink),
......@@ -55,6 +56,7 @@ WebMediaPlayerParams::WebMediaPlayerParams(
is_background_video_playback_enabled),
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)) {}
WebMediaPlayerParams::~WebMediaPlayerParams() = default;
......
......@@ -84,6 +84,7 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
bool is_background_suspend_enabled,
bool is_background_video_play_enabled,
bool is_background_video_track_optimization_supported,
bool is_remoting_renderer_enabled,
std::unique_ptr<PowerStatusHelper> power_status_helper);
~WebMediaPlayerParams();
......@@ -167,6 +168,10 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
return is_background_video_track_optimization_supported_;
}
bool IsRemotingRendererEnabled() const {
return is_remoting_renderer_enabled_;
}
std::unique_ptr<PowerStatusHelper> TakePowerStatusHelper() {
return std::move(power_status_helper_);
}
......@@ -199,6 +204,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerParams {
bool is_background_video_playback_enabled_ = true;
// Whether background video optimization is supported on current platform.
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_;
......
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