summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxhwang <xhwang@chromium.org>2016-02-19 10:45:31 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-19 18:47:43 +0000
commitbe7200308b792d1549c49ec485d06901347a5746 (patch)
tree607fc8cbb54c2b5f61a819d4e142c17996a8fc99
parentd418af7217ad7650923e7480dbb82b07e7b3254d (diff)
downloadchromium_src-be7200308b792d1549c49ec485d06901347a5746.zip
chromium_src-be7200308b792d1549c49ec485d06901347a5746.tar.gz
chromium_src-be7200308b792d1549c49ec485d06901347a5746.tar.bz2
media: Refactor mojo media gn arguments.
This CL makes mojo media services highly configurable by providing finer control on what service is enabled on which platform. For example, on Android and Desktop, we want use the default media Renderer but use the mojo CDM. On ChromeCast, we want to use the mojo Renderer and the mojo CDM. Tested with various gn argument combinations, e.g. - mojo_media_host="utility", mojo_media_services=["cdm"] Both clear and encrypted playback (Clear Key) work. In the encrypted case, we use DecryptingDemuxerStream and MojoDecryptor to do decrypt-only. - mojo_media_host="utility", mojo_media_services=["renderer"] Clear playback works using remote renderer. Encrypted playback doesn't work because a remote renderer doesn't support a local CDM. - mojo_media_host="gpu", mojo_media_services=["renderer", "cdm"] Both clear and encrypted playback work. In both cases a remote renderer is used. In the encrytped case, the remote renderer uses a remote CDM in the GPU process. BUG=571247 TEST=See above. CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation Review URL: https://codereview.chromium.org/1712033002 Cr-Commit-Position: refs/heads/master@{#376498}
-rw-r--r--chrome/browser/BUILD.gn6
-rw-r--r--chromecast/browser/media/BUILD.gn4
-rw-r--r--content/browser/BUILD.gn4
-rw-r--r--content/browser/frame_host/frame_mojo_shell.cc4
-rw-r--r--content/common/BUILD.gn2
-rw-r--r--content/gpu/BUILD.gn2
-rw-r--r--content/renderer/BUILD.gn2
-rw-r--r--content/renderer/render_frame_impl.cc22
-rw-r--r--content/shell/BUILD.gn2
-rw-r--r--content/utility/BUILD.gn2
-rw-r--r--media/media_options.gni65
-rw-r--r--media/mojo/services/BUILD.gn45
12 files changed, 109 insertions, 51 deletions
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 13c73b2..e86e462 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -963,10 +963,10 @@ source_set("browser") {
deps += [ "//chrome/browser/media/router" ]
}
- if (enable_mojo_media == "browser") {
+ if (mojo_media_host == "browser") {
deps += [ "//media/mojo/services:application_factory" ]
- } else if (enable_mojo_media != "none") {
- configs += [ "//media/mojo/services:enable_mojo_media_config" ]
+ } else if (enable_mojo_media) {
+ configs += [ "//media/mojo/services:mojo_media_config" ]
}
if (enable_wayland_server) {
diff --git a/chromecast/browser/media/BUILD.gn b/chromecast/browser/media/BUILD.gn
index b4612d0..a2d6519 100644
--- a/chromecast/browser/media/BUILD.gn
+++ b/chromecast/browser/media/BUILD.gn
@@ -15,7 +15,7 @@ source_set("media") {
"media_pipeline_host.h",
]
- if (enable_mojo_media == "browser") {
+ if (mojo_media_host == "browser") {
sources += [
"cast_mojo_media_client.cc",
"cast_mojo_media_client.h",
@@ -28,7 +28,7 @@ source_set("media") {
public_configs = [ "//chromecast:playready_config" ]
}
- if (enable_mojo_media == "browser") {
+ if (mojo_media_host == "browser") {
public_deps = [
"//media/mojo/services:application",
]
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 6f2f609..7559b7f 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -518,8 +518,8 @@ source_set("browser") {
deps += [ "//third_party/boringssl" ]
}
- if (enable_mojo_media != "none") {
- configs += [ "//media/mojo/services:enable_mojo_media_config" ]
+ if (enable_mojo_media) {
+ configs += [ "//media/mojo/services:mojo_media_config" ]
}
if (enable_webvr) {
diff --git a/content/browser/frame_host/frame_mojo_shell.cc b/content/browser/frame_host/frame_mojo_shell.cc
index 7ec676e..b72123b 100644
--- a/content/browser/frame_host/frame_mojo_shell.cc
+++ b/content/browser/frame_host/frame_mojo_shell.cc
@@ -14,7 +14,7 @@
#include "content/public/browser/site_instance.h"
#include "content/public/common/content_client.h"
-#if defined(OS_ANDROID) && defined(ENABLE_MOJO_MEDIA)
+#if defined(OS_ANDROID) && defined(ENABLE_MOJO_CDM)
#include "content/browser/media/android/provision_fetcher_impl.h"
#endif
@@ -24,7 +24,7 @@ namespace {
void RegisterFrameMojoShellServices(ServiceRegistry* registry,
RenderFrameHost* render_frame_host) {
-#if defined(OS_ANDROID) && defined(ENABLE_MOJO_MEDIA)
+#if defined(OS_ANDROID) && defined(ENABLE_MOJO_CDM)
registry->AddService(
base::Bind(&ProvisionFetcherImpl::Create, render_frame_host));
#endif
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 6534ca2..af8f370 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -374,7 +374,7 @@ source_set("common") {
]
}
- if (enable_mojo_media == "gpu") {
+ if (mojo_media_host == "gpu") {
deps += [ "//media/mojo/services:cdm_service" ]
}
}
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn
index 82248c6..3bc1845 100644
--- a/content/gpu/BUILD.gn
+++ b/content/gpu/BUILD.gn
@@ -53,7 +53,7 @@ source_set("gpu_sources") {
"//content/common:mojo_bindings",
]
- if (enable_mojo_media == "gpu") {
+ if (mojo_media_host == "gpu") {
deps += [ "//media/mojo/services:application_factory" ]
}
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index c304490..c4f4510 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -220,7 +220,7 @@ source_set("renderer") {
]
}
- if (enable_mojo_media != "none") {
+ if (enable_mojo_media) {
deps += [
"//media/mojo/interfaces",
"//media/mojo/services:proxy",
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index bfdbd00..ea267fb 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -94,7 +94,6 @@
#include "content/renderer/internal_document_state_data.h"
#include "content/renderer/manifest/manifest_manager.h"
#include "content/renderer/media/audio_device_factory.h"
-#include "content/renderer/media/cdm/render_cdm_factory.h"
#include "content/renderer/media/media_permission_dispatcher.h"
#include "content/renderer/media/media_stream_dispatcher.h"
#include "content/renderer/media/media_stream_renderer_factory_impl.h"
@@ -217,13 +216,18 @@
#endif
#if defined(ENABLE_MOJO_MEDIA)
-#include "media/mojo/services/mojo_cdm_factory.h" // nogncheck
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/shell/public/cpp/connect.h"
#include "mojo/shell/public/interfaces/shell.mojom.h"
#endif
-#if defined(ENABLE_MOJO_MEDIA) && !defined(OS_ANDROID)
+#if defined(ENABLE_MOJO_CDM)
+#include "media/mojo/services/mojo_cdm_factory.h" // nogncheck
+#else
+#include "content/renderer/media/cdm/render_cdm_factory.h"
+#endif
+
+#if defined(ENABLE_MOJO_RENDERER)
#include "media/mojo/services/mojo_renderer_factory.h" // nogncheck
#else
#include "media/renderers/default_renderer_factory.h"
@@ -2522,7 +2526,7 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
}
#endif // defined(OS_ANDROID)
-#if defined(ENABLE_MOJO_MEDIA) && !defined(OS_ANDROID)
+#if defined(ENABLE_MOJO_RENDERER)
scoped_ptr<media::RendererFactory> media_renderer_factory(
new media::MojoRendererFactory(GetMediaServiceFactory()));
#else
@@ -2535,7 +2539,7 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
media_log, render_thread->GetGpuFactories(),
*render_thread->GetAudioHardwareConfig()));
}
-#endif // defined(ENABLE_MOJO_MEDIA) && !defined(OS_ANDROID)
+#endif // defined(ENABLE_MOJO_RENDERER)
if (!url_index_.get() || url_index_->frame() != frame_)
url_index_.reset(new media::UrlIndex(frame_));
@@ -5993,7 +5997,7 @@ void RenderFrameImpl::OnMediaServiceFactoryConnectionError() {
// this.
// media_service_factory_.reset();
}
-#endif
+#endif // defined(ENABLE_MOJO_MEDIA)
bool RenderFrameImpl::AreSecureCodecsSupported() {
#if defined(OS_ANDROID)
@@ -6014,7 +6018,7 @@ media::CdmFactory* RenderFrameImpl::GetCdmFactory() {
if (!cdm_factory_) {
DCHECK(frame_);
-#if defined(ENABLE_MOJO_MEDIA)
+#if defined(ENABLE_MOJO_CDM)
cdm_factory_.reset(new media::MojoCdmFactory(GetMediaServiceFactory()));
#else
cdm_factory_.reset(new RenderCdmFactory(
@@ -6023,8 +6027,8 @@ media::CdmFactory* RenderFrameImpl::GetCdmFactory() {
#elif defined(ENABLE_BROWSER_CDMS)
cdm_manager_
#endif
- ));
-#endif // defined(ENABLE_MOJO_MEDIA)
+ ));
+#endif // defined(ENABLE_MOJO_CDM)
}
return cdm_factory_.get();
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 61b7eb6..57538e9 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -245,7 +245,7 @@ static_library("content_shell_lib") {
"//ppapi:blink_test_plugin",
]
}
- if (enable_mojo_media == "browser") {
+ if (mojo_media_host == "browser") {
deps += [ "//media/mojo/services:application_factory" ]
}
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn
index 59bc7c5..9aea9db 100644
--- a/content/utility/BUILD.gn
+++ b/content/utility/BUILD.gn
@@ -31,7 +31,7 @@ source_set("utility") {
"//url",
]
- if (enable_mojo_media == "utility") {
+ if (mojo_media_host == "utility") {
deps += [ "//media/mojo/services:application_factory" ]
}
}
diff --git a/media/media_options.gni b/media/media_options.gni
index 22a076f..2e91d75 100644
--- a/media/media_options.gni
+++ b/media/media_options.gni
@@ -44,22 +44,11 @@ declare_args() {
# platform. Enable by default for Chromecast.
enable_hevc_demuxing = proprietary_codecs && is_chromecast
- # Experiment to enable mojo media application: http://crbug.com/431776
- # Valid options are:
- # - "none": Do not use mojo media application.
- # - "browser": Use mojo media application hosted in the browser process.
- # - "gpu": Use mojo media application hosted in the gpu process.
- # - "utility": Use mojo media application hosted in the utility process.
- enable_mojo_media = "none"
-
- # Enable the TestMojoMediaClient to be used in MojoMediaApplication. This is
- # for testing only and will override the default platform MojoMediaClient.
- enable_test_mojo_media_client = false
-
# TODO(GYP): This should be a platform define.
is_openbsd = false
}
+# Use a second declare_args() to pick up possible overrides of |use_cras|.
declare_args() {
# Enables runtime selection of PulseAudio library.
use_pulseaudio = false
@@ -77,3 +66,55 @@ declare_args() {
}
}
}
+
+declare_args() {
+ # Experiment to enable mojo media services (e.g. "renderer", "cdm", see
+ # |mojo_media_services|). When enabled, selected mojo paths will be enabled in
+ # the media pipeline and corresponding services will hosted in the selected
+ # remote process (e.g. "utility" process, see |mojo_media_host|).
+ enable_mojo_media = false
+
+ # Enable the TestMojoMediaClient to be used in MojoMediaApplication. This is
+ # for testing only and will override the default platform MojoMediaClient.
+ enable_test_mojo_media_client = false
+}
+
+# Use a second declare_args() to pick up possible overrides of enable_mojo_media
+# from --args command line flags. See "gn help declare_args".
+declare_args() {
+ # A list of mojo media services that should be used in the media pipeline.
+ # Must not be empty if |enable_mojo_media| is true.
+ # Valid entries in the list are:
+ # - "renderer": Use mojo based media Renderer service.
+ # - "cdm": Use mojo based Content Decryption Module.
+ # TODO(xhwang): Support mojo base audio/video decoders here.
+ # See http://crbug.com/542910 and http://crbug.com/522298
+ mojo_media_services = []
+
+ # The process to host the mojo media application.
+ # Valid options are:
+ # - "none": Do not use mojo media application.
+ # - "browser": Use mojo media application hosted in the browser process.
+ # - "gpu": Use mojo media application hosted in the gpu process.
+ # - "utility": Use mojo media application hosted in the utility process.
+ mojo_media_host = "none"
+
+ # Default mojo_media_services and mojo_media_host on various platforms.
+ # Can be overridden by gn build arguments from the --args command line flag
+ # for local testing.
+ if (enable_mojo_media) {
+ if (is_android) {
+ mojo_media_services = [ "cdm" ]
+ mojo_media_host = "gpu"
+ } else if (is_chromecast) {
+ mojo_media_services = [
+ "cdm",
+ "renderer",
+ ]
+ mojo_media_host = "browser"
+ } else {
+ mojo_media_services = [ "cdm" ]
+ mojo_media_host = "utility"
+ }
+ }
+}
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index f0072da..7736ff37 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -13,20 +13,33 @@ import("//mojo/public/mojo_application.gni")
# - unittests: Unit tests for a particular class/file.
# - test: Tests for a particular app, e.g. media.
-config("enable_mojo_media_config") {
- assert(enable_mojo_media == "none" || enable_mojo_media == "browser" ||
- enable_mojo_media == "gpu" || enable_mojo_media == "utility")
-
- if (enable_mojo_media != "none") {
+config("mojo_media_config") {
+ if (!enable_mojo_media) {
+ assert(mojo_media_services == [], "Mojo media is not enabled")
+ assert(mojo_media_host == "none", "Mojo media is not enabled")
+ } else {
defines = [ "ENABLE_MOJO_MEDIA" ]
- }
- if (enable_mojo_media == "browser") {
- defines += [ "ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS" ]
- } else if (enable_mojo_media == "gpu") {
- defines += [ "ENABLE_MOJO_MEDIA_IN_GPU_PROCESS" ]
- } else if (enable_mojo_media == "utility") {
- defines += [ "ENABLE_MOJO_MEDIA_IN_UTILITY_PROCESS" ]
+ assert(mojo_media_services != [], "No mojo media service specified")
+ foreach(service, mojo_media_services) {
+ if (service == "renderer") {
+ defines += [ "ENABLE_MOJO_RENDERER" ]
+ } else if (service == "cdm") {
+ defines += [ "ENABLE_MOJO_CDM" ]
+ } else {
+ assert(false, "Invalid mojo media service: $service")
+ }
+ }
+
+ if (mojo_media_host == "browser") {
+ defines += [ "ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS" ]
+ } else if (mojo_media_host == "gpu") {
+ defines += [ "ENABLE_MOJO_MEDIA_IN_GPU_PROCESS" ]
+ } else if (mojo_media_host == "utility") {
+ defines += [ "ENABLE_MOJO_MEDIA_IN_UTILITY_PROCESS" ]
+ } else {
+ assert(false, "Invalid mojo media host: $mojo_media_host")
+ }
}
}
@@ -66,7 +79,7 @@ source_set("proxy") {
"mojo_type_trait.h",
]
- public_configs = [ ":enable_mojo_media_config" ]
+ public_configs = [ ":mojo_media_config" ]
deps = [
":converters",
@@ -115,7 +128,7 @@ source_set("cdm_service") {
# which is a bit hacky since we need to access CdmService directly
# from C++ code (AVDA). In the future we'll make those decoders part of
# MojoMediaApplication, then we won't need this.
- public_configs = [ ":enable_mojo_media_config" ]
+ public_configs = [ ":mojo_media_config" ]
configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
}
@@ -150,7 +163,7 @@ source_set("application") {
"service_factory_impl.h",
]
- public_configs = [ ":enable_mojo_media_config" ]
+ public_configs = [ ":mojo_media_config" ]
deps = [
":cdm_service",
@@ -167,7 +180,7 @@ source_set("application_factory") {
"mojo_media_application_factory.h",
]
- public_configs = [ ":enable_mojo_media_config" ]
+ public_configs = [ ":mojo_media_config" ]
deps = [
":application",