Commit 38c96095 authored by tsunghung's avatar tsunghung Committed by Commit bot

[Chromecast] Use CMA backend on headless cast for Android

Use CMA backend media pipeline instead of spitzer on headless cast
receiver for Android.

BUG=Internal b/36179732

Review-Url: https://codereview.chromium.org/2746243002
Cr-Commit-Position: refs/heads/master@{#457497}
parent 5484f678
......@@ -447,7 +447,10 @@ action("chromecast_locales_pak") {
buildflag_header("chromecast_features") {
header = "chromecast_features.h"
flags = [ "IS_CAST_AUDIO_ONLY=$is_cast_audio_only" ]
flags = [
"IS_CAST_AUDIO_ONLY=$is_cast_audio_only",
"IS_CAST_USING_CMA_BACKEND=$is_cast_using_cma_backend",
]
}
if (is_android) {
......
......@@ -284,13 +284,13 @@ CastBrowserMainParts::CastBrowserMainParts(
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
AddDefaultCommandLineSwitches(command_line);
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media_resource_tracker_ = nullptr;
#endif // !defined(OS_ANDROID)
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
}
CastBrowserMainParts::~CastBrowserMainParts() {
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
if (media_thread_ && media_pipeline_backend_manager_) {
// Make sure that media_pipeline_backend_manager_ is destroyed after any
// pending media thread tasks. The CastAudioOutputStream implementation
......@@ -306,14 +306,12 @@ CastBrowserMainParts::~CastBrowserMainParts() {
media_thread_->task_runner()->DeleteSoon(
FROM_HERE, media_pipeline_backend_manager_.release());
}
#endif // !defined(OS_ANDROID)
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
}
scoped_refptr<base::SingleThreadTaskRunner>
CastBrowserMainParts::GetMediaTaskRunner() {
#if defined(OS_ANDROID)
return nullptr;
#else
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
if (!media_thread_) {
media_thread_.reset(new base::Thread("CastMediaThread"));
base::Thread::Options options;
......@@ -321,10 +319,12 @@ CastBrowserMainParts::GetMediaTaskRunner() {
CHECK(media_thread_->StartWithOptions(options));
}
return media_thread_->task_runner();
#endif
#else
return nullptr;
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
}
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::MediaResourceTracker* CastBrowserMainParts::media_resource_tracker() {
if (!media_resource_tracker_) {
media_resource_tracker_ = new media::MediaResourceTracker(
......@@ -341,7 +341,7 @@ CastBrowserMainParts::media_pipeline_backend_manager() {
}
return media_pipeline_backend_manager_.get();
}
#endif
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::MediaCapsImpl* CastBrowserMainParts::media_caps() {
return media_caps_.get();
......@@ -495,7 +495,7 @@ void CastBrowserMainParts::PreMainMessageLoopRun() {
video_plane_controller_.get(), window_manager_.get()));
cast_browser_process_->cast_service()->Initialize();
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media_resource_tracker()->InitializeMediaLib();
#endif
::media::InitializeMediaLibrary();
......
......@@ -9,6 +9,8 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "build/buildflag.h"
#include "chromecast/chromecast_features.h"
#include "content/public/browser/browser_main_parts.h"
#include "content/public/common/main_function_params.h"
......@@ -45,7 +47,7 @@ class CastBrowserMainParts : public content::BrowserMainParts {
scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner();
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::MediaResourceTracker* media_resource_tracker();
media::MediaPipelineBackendManager* media_pipeline_backend_manager();
#endif
......@@ -70,7 +72,7 @@ class CastBrowserMainParts : public content::BrowserMainParts {
std::unique_ptr<media::MediaCapsImpl> media_caps_;
std::unique_ptr<CastWindowManager> window_manager_;
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
// CMA thread used by AudioManager, MojoRenderer, and MediaPipelineBackend.
std::unique_ptr<base::Thread> media_thread_;
......
......@@ -71,10 +71,12 @@
#if defined(OS_ANDROID)
#include "components/cdm/browser/cdm_message_filter_android.h"
#include "components/crash/content/browser/crash_dump_manager_android.h"
#else
#include "chromecast/media/cdm/cast_cdm_factory.h"
#endif // defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
#include "chromecast/media/cdm/cast_cdm_factory.h"
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
namespace chromecast {
namespace shell {
......@@ -146,7 +148,7 @@ media::VideoModeSwitcher* CastContentBrowserClient::GetVideoModeSwitcher() {
return nullptr;
}
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::VideoResolutionPolicy*
CastContentBrowserClient::GetVideoResolutionPolicy() {
return nullptr;
......@@ -195,7 +197,7 @@ CastContentBrowserClient::CreateCdmFactory() {
#endif // defined(ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS)
return nullptr;
}
#endif // !defined(OS_ANDROID)
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::MediaCapsImpl* CastContentBrowserClient::media_caps() {
DCHECK(cast_browser_main_parts_);
......
......@@ -13,6 +13,8 @@
#include "base/callback_forward.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "build/buildflag.h"
#include "chromecast/chromecast_features.h"
#include "content/public/browser/certificate_request_result_type.h"
#include "content/public/browser/content_browser_client.h"
......@@ -84,7 +86,7 @@ class CastContentBrowserClient : public content::ContentBrowserClient {
virtual media::VideoModeSwitcher* GetVideoModeSwitcher();
#if !defined(OS_ANDROID)
#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
// Gets object for enforcing video resolution policy restrictions.
virtual media::VideoResolutionPolicy* GetVideoResolutionPolicy();
......@@ -101,7 +103,7 @@ class CastContentBrowserClient : public content::ContentBrowserClient {
::media::ScopedAudioManagerPtr CreateAudioManager(
::media::AudioLogFactory* audio_log_factory) override;
std::unique_ptr<::media::CdmFactory> CreateCdmFactory() override;
#endif
#endif // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
media::MediaCapsImpl* media_caps();
// Invoked when the metrics client ID changes.
......
......@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//chromecast/chromecast.gni")
import("//media/media_options.gni")
source_set("cdm") {
sources = [
......@@ -15,7 +16,7 @@ source_set("cdm") {
"//media",
]
if (!is_android) {
if (is_cast_using_cma_backend) {
sources += [
"cast_cdm.cc",
"cast_cdm.h",
......@@ -29,14 +30,14 @@ source_set("cdm") {
"//chromecast/media/base",
"//url:url",
]
} else {
if (use_playready) {
sources += [
"playready_drm_delegate_android.cc",
"playready_drm_delegate_android.h",
]
}
if (is_android && use_playready) {
sources += [
"playready_drm_delegate_android.cc",
"playready_drm_delegate_android.h",
]
deps += [ "//media/base/android" ]
}
deps += [ "//media/base/android" ]
}
}
......@@ -4,6 +4,7 @@
import("//build/config/chromecast_build.gni")
import("//chromecast/chromecast.gni")
import("//media/media_options.gni")
source_set("backend") {
sources = [
......@@ -26,7 +27,12 @@ source_set("backend") {
]
if (is_android) {
deps += [ ":cast_media_android" ]
if (is_cast_using_cma_backend) {
# TODO(tsunghung): use the real implementation when it's done.
deps += [ ":default" ]
} else {
deps += [ ":cast_media_android" ]
}
} else {
deps += [ ":libcast_media_1.0" ]
}
......
......@@ -60,6 +60,9 @@ declare_args() {
# Enabled by default on the cast desktop implementation to allow unit tests of
# MP2TS parsing support.
enable_hls_sample_aes = proprietary_codecs && is_cast_desktop_build
# If true, use cast CMA backend instead of default chromium media pipeline.
is_cast_using_cma_backend = is_cast_audio_only || !is_android
}
# enable_hls_sample_aes can only be true if enable_mse_mpeg2ts_stream_parser is.
......@@ -149,18 +152,19 @@ declare_args() {
# Can be overridden by gn build arguments from the --args command line flag
# for local testing.
if (enable_mojo_media) {
if (is_android) {
if (is_chromecast && is_cast_using_cma_backend) {
mojo_media_services = [
"cdm",
"audio_decoder",
"renderer",
]
mojo_media_host = "gpu"
} else if (is_chromecast) {
mojo_media_host = "browser"
} else if (is_android) {
# Both chrome for Android and cast for ATV belongs to this case
mojo_media_services = [
"cdm",
"renderer",
"audio_decoder",
]
mojo_media_host = "browser"
mojo_media_host = "gpu"
} else {
mojo_media_services = [ "video_decoder" ]
mojo_media_host = "gpu"
......
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