Commit 48bd0a07 authored by Ken MacKay's avatar Ken MacKay Committed by Commit Bot

Reland "[Chromecast] Statically link CMA backend when possible"

This reverts commit 51439d26.

Merge-With: eureka-internal/321778

Bug: internal b/127963522
Bug: internal b/141138924
Change-Id: I192bd87c0e766aef66ed6b8c7004c026cde0fbc6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1846314Reviewed-by: default avatarMichael Spang <spang@chromium.org>
Commit-Queue: Kenneth MacKay <kmackay@chromium.org>
Cr-Commit-Position: refs/heads/master@{#703850}
parent 67d88fb5
...@@ -6,6 +6,22 @@ import("//chromecast/chromecast.gni") ...@@ -6,6 +6,22 @@ import("//chromecast/chromecast.gni")
import("//media/media_options.gni") import("//media/media_options.gni")
import("//testing/test.gni") import("//testing/test.gni")
declare_args() {
if (is_cast_desktop_build) {
# Desktop builds should set cast_static_media_lib_target explicitly if
# desired.
cast_static_media_lib_target = ""
} else if (is_cast_audio_only) {
cast_static_media_lib_target =
"//chromecast/media/cma/backend/alsa:libcast_media_1.0_audio"
} else if (enable_video_with_mixed_audio) {
cast_static_media_lib_target =
"//chromecast/media/cma/backend/video:libcast_media_1.0_avsync"
} else {
cast_static_media_lib_target = ""
}
}
group("media") { group("media") {
public_deps = [ public_deps = [
"//chromecast/media/audio", "//chromecast/media/audio",
...@@ -27,14 +43,22 @@ group("libcast_media") { ...@@ -27,14 +43,22 @@ group("libcast_media") {
deps = [ deps = [
"//chromecast/media/cma/backend/fuchsia:media_backend", "//chromecast/media/cma/backend/fuchsia:media_backend",
] ]
} else if (cast_static_media_lib_target != "") {
deps = [
"$cast_static_media_lib_target",
]
} else if (is_cast_desktop_build) {
deps = [
"//chromecast/media/cma/backend/desktop",
]
} else { } else {
deps = [ deps = [
"//chromecast/media/cma/backend:libcast_media_1.0", "//chromecast/media/cma/backend:libcast_media_1.0",
] ]
}
if (cast_volume_control_in_avsettings) { if (cast_volume_control_in_avsettings) {
deps += [ "//chromecast/media/avsettings:libcast_avsettings_1.0" ] deps += [ "//chromecast/media/avsettings:libcast_avsettings_1.0" ]
}
} }
} }
......
...@@ -43,7 +43,7 @@ cast_source_set("test_support") { ...@@ -43,7 +43,7 @@ cast_source_set("test_support") {
"//ui/gfx/geometry", "//ui/gfx/geometry",
] ]
if (!enable_video_with_mixed_audio) { if (is_cast_audio_only) {
deps += [ "//chromecast/media/cma/backend:null_video" ] deps += [ "//chromecast/media/cma/backend:null_video" ]
} }
} }
...@@ -77,16 +77,6 @@ cast_source_set("unittests") { ...@@ -77,16 +77,6 @@ cast_source_set("unittests") {
if (enable_video_with_mixed_audio) { if (enable_video_with_mixed_audio) {
defines = [ "ENABLE_VIDEO_WITH_MIXED_AUDIO" ] defines = [ "ENABLE_VIDEO_WITH_MIXED_AUDIO" ]
# libvideodecoderformixer is linked here for the
# VideoDecoderForMixer::InitializeGraphicsForTesting symbol. Currently only
# alsa platforms do anything useful in this initialization, so otherwise
# just link in a dummy.
if (use_alsa) {
libs = [ "videodecoderformixer" ]
} else {
sources += [ "backend/dummy_initialize_graphics_for_testing.cc" ]
}
} }
data = [ data = [
......
...@@ -51,20 +51,6 @@ cast_source_set("backend") { ...@@ -51,20 +51,6 @@ cast_source_set("backend") {
# libcast_media_1.0.so. This target is only used to build executables # libcast_media_1.0.so. This target is only used to build executables
# with correct linkage information. # with correct linkage information.
cast_shared_library("libcast_media_1.0") { cast_shared_library("libcast_media_1.0") {
if (is_cast_desktop_build) {
deps = [
"//chromecast/media/cma/backend/desktop",
]
} else {
deps = [
":dummy",
]
}
}
# Dummy implementation of media backend used on chromecast devices.
# Must not depend on anything outside //chromecast/public.
cast_source_set("dummy") {
sources = [ sources = [
"cast_media_dummy.cc", "cast_media_dummy.cc",
] ]
......
...@@ -10,7 +10,7 @@ import("//testing/test.gni") ...@@ -10,7 +10,7 @@ import("//testing/test.gni")
# Alsa must be used for these targets to build. # Alsa must be used for these targets to build.
assert(use_alsa) assert(use_alsa)
cast_shared_library("libcast_media_1.0_audio") { cast_source_set("libcast_media_1.0_audio") {
sources = [ sources = [
"cast_media_shlib.cc", "cast_media_shlib.cc",
] ]
......
...@@ -4,16 +4,9 @@ ...@@ -4,16 +4,9 @@
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#include "base/at_exit.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/files/scoped_file.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chromecast/base/init_command_line_shlib.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h" #include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h"
#include "chromecast/media/cma/backend/stream_mixer.h"
#include "chromecast/public/cast_media_shlib.h" #include "chromecast/public/cast_media_shlib.h"
#include "chromecast/public/graphics_types.h" #include "chromecast/public/graphics_types.h"
#include "chromecast/public/video_plane.h" #include "chromecast/public/video_plane.h"
...@@ -81,19 +74,9 @@ void InitializeAlsaControls() { ...@@ -81,19 +74,9 @@ void InitializeAlsaControls() {
DefaultVideoPlane* g_video_plane = nullptr; DefaultVideoPlane* g_video_plane = nullptr;
base::AtExitManager g_at_exit_manager;
std::unique_ptr<base::ThreadTaskRunnerHandle> g_thread_task_runner_handle;
} // namespace } // namespace
void CastMediaShlib::Initialize(const std::vector<std::string>& argv) { void CastMediaShlib::Initialize(const std::vector<std::string>& argv) {
// Sets logging to display process and thread ID.
logging::SetLogItems(true, true, false, false);
chromecast::InitCommandLineShlib(argv);
g_video_plane = new DefaultVideoPlane();
InitializeAlsaControls(); InitializeAlsaControls();
::media::InitializeMediaLibrary(); ::media::InitializeMediaLibrary();
} }
...@@ -111,29 +94,17 @@ void CastMediaShlib::Finalize() { ...@@ -111,29 +94,17 @@ void CastMediaShlib::Finalize() {
delete g_video_plane; delete g_video_plane;
g_video_plane = nullptr; g_video_plane = nullptr;
g_thread_task_runner_handle.reset();
} }
VideoPlane* CastMediaShlib::GetVideoPlane() { VideoPlane* CastMediaShlib::GetVideoPlane() {
if (!g_video_plane) {
g_video_plane = new DefaultVideoPlane();
}
return g_video_plane; return g_video_plane;
} }
MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend( MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) { const MediaPipelineDeviceParams& params) {
// Set up the static reference in base::ThreadTaskRunnerHandle::Get
// for the media thread in this shared library. We can extract the
// SingleThreadTaskRunner passed in from cast_shell for this.
if (!base::ThreadTaskRunnerHandle::IsSet()) {
DCHECK(!g_thread_task_runner_handle);
const scoped_refptr<base::SingleThreadTaskRunner> task_runner =
static_cast<TaskRunnerImpl*>(params.task_runner)->runner();
DCHECK(task_runner->BelongsToCurrentThread());
g_thread_task_runner_handle.reset(
new base::ThreadTaskRunnerHandle(task_runner));
}
// TODO(cleichner): Implement MediaSyncType in MediaPipelineDeviceAlsa.
return new MediaPipelineBackendForMixer(params); return new MediaPipelineBackendForMixer(params);
} }
......
...@@ -4,15 +4,10 @@ ...@@ -4,15 +4,10 @@
#include <memory> #include <memory>
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/cma/backend/desktop/media_pipeline_backend_desktop.h" #include "chromecast/media/cma/backend/desktop/media_pipeline_backend_desktop.h"
#include "chromecast/public/cast_media_shlib.h" #include "chromecast/public/cast_media_shlib.h"
#include "chromecast/public/graphics_types.h" #include "chromecast/public/graphics_types.h"
#include "chromecast/public/media/media_capabilities_shlib.h" #include "chromecast/public/media/media_capabilities_shlib.h"
#include "chromecast/public/media/media_pipeline_device_params.h"
#include "chromecast/public/video_plane.h" #include "chromecast/public/video_plane.h"
namespace chromecast { namespace chromecast {
...@@ -27,7 +22,6 @@ class DesktopVideoPlane : public VideoPlane { ...@@ -27,7 +22,6 @@ class DesktopVideoPlane : public VideoPlane {
}; };
DesktopVideoPlane* g_video_plane = nullptr; DesktopVideoPlane* g_video_plane = nullptr;
base::ThreadTaskRunnerHandle* g_thread_task_runner_handle = nullptr;
} // namespace } // namespace
...@@ -38,8 +32,6 @@ void CastMediaShlib::Initialize(const std::vector<std::string>& argv) { ...@@ -38,8 +32,6 @@ void CastMediaShlib::Initialize(const std::vector<std::string>& argv) {
void CastMediaShlib::Finalize() { void CastMediaShlib::Finalize() {
delete g_video_plane; delete g_video_plane;
g_video_plane = nullptr; g_video_plane = nullptr;
delete g_thread_task_runner_handle;
g_thread_task_runner_handle = nullptr;
} }
VideoPlane* CastMediaShlib::GetVideoPlane() { VideoPlane* CastMediaShlib::GetVideoPlane() {
...@@ -48,17 +40,6 @@ VideoPlane* CastMediaShlib::GetVideoPlane() { ...@@ -48,17 +40,6 @@ VideoPlane* CastMediaShlib::GetVideoPlane() {
MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend( MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) { const MediaPipelineDeviceParams& params) {
// Set up the static reference in base::ThreadTaskRunnerHandle::Get
// for the media thread in this shared library. We can extract the
// SingleThreadTaskRunner passed in from cast_shell for this.
if (!base::ThreadTaskRunnerHandle::IsSet()) {
DCHECK(!g_thread_task_runner_handle);
const scoped_refptr<base::SingleThreadTaskRunner> task_runner =
static_cast<TaskRunnerImpl*>(params.task_runner)->runner();
DCHECK(task_runner->BelongsToCurrentThread());
g_thread_task_runner_handle = new base::ThreadTaskRunnerHandle(task_runner);
}
return new MediaPipelineBackendDesktop(); return new MediaPipelineBackendDesktop();
} }
......
// Copyright 2019 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.
#include "chromecast/media/cma/backend/video_decoder_for_mixer.h"
namespace chromecast {
namespace media {
CHROMECAST_EXPORT void VideoDecoderForMixer::InitializeGraphicsForTesting() {
// No initialization required.
}
} // namespace media
} // namespace chromecast
...@@ -4,21 +4,11 @@ ...@@ -4,21 +4,11 @@
#include "chromecast/public/cast_media_shlib.h" #include "chromecast/public/cast_media_shlib.h"
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/files/scoped_file.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chromecast/base/init_command_line_shlib.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h" #include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h"
#include "chromecast/media/cma/backend/stream_mixer.h" #include "chromecast/media/cma/backend/stream_mixer.h"
#include "chromecast/public/graphics_types.h" #include "chromecast/public/graphics_types.h"
#include "chromecast/public/media/media_pipeline_device_params.h"
#include "chromecast/public/video_plane.h" #include "chromecast/public/video_plane.h"
#include "media/base/media.h" #include "media/base/media.h"
#include "media/base/media_switches.h"
namespace chromecast { namespace chromecast {
namespace media { namespace media {
...@@ -36,7 +26,6 @@ class DefaultVideoPlane : public VideoPlane { ...@@ -36,7 +26,6 @@ class DefaultVideoPlane : public VideoPlane {
}; };
DefaultVideoPlane* g_video_plane = nullptr; DefaultVideoPlane* g_video_plane = nullptr;
base::ThreadTaskRunnerHandle* g_thread_task_runner_handle = nullptr;
} // namespace } // namespace
...@@ -52,9 +41,6 @@ void CastMediaShlib::Initialize(const std::vector<std::string>& argv) { ...@@ -52,9 +41,6 @@ void CastMediaShlib::Initialize(const std::vector<std::string>& argv) {
void CastMediaShlib::Finalize() { void CastMediaShlib::Finalize() {
delete g_video_plane; delete g_video_plane;
g_video_plane = nullptr; g_video_plane = nullptr;
delete g_thread_task_runner_handle;
g_thread_task_runner_handle = nullptr;
} }
VideoPlane* CastMediaShlib::GetVideoPlane() { VideoPlane* CastMediaShlib::GetVideoPlane() {
...@@ -63,18 +49,6 @@ VideoPlane* CastMediaShlib::GetVideoPlane() { ...@@ -63,18 +49,6 @@ VideoPlane* CastMediaShlib::GetVideoPlane() {
MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend( MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) { const MediaPipelineDeviceParams& params) {
// Set up the static reference in base::ThreadTaskRunnerHandle::Get()
// for the media thread in this shared library. We can extract the
// SingleThreadTaskRunner passed in from cast_shell for this.
if (!base::ThreadTaskRunnerHandle::IsSet()) {
DCHECK(!g_thread_task_runner_handle);
const scoped_refptr<base::SingleThreadTaskRunner> task_runner =
static_cast<TaskRunnerImpl*>(params.task_runner)->runner();
DCHECK(task_runner->BelongsToCurrentThread());
g_thread_task_runner_handle = new base::ThreadTaskRunnerHandle(task_runner);
}
return new MediaPipelineBackendForMixer(params); return new MediaPipelineBackendForMixer(params);
} }
......
...@@ -20,18 +20,6 @@ cast_source_set("av_sync_video") { ...@@ -20,18 +20,6 @@ cast_source_set("av_sync_video") {
] ]
} }
cast_source_set("task_runner_lifetime_handler") {
sources = [
"task_runner_lifetime_handler.cc",
"task_runner_lifetime_handler.h",
]
deps = [
"//base",
"//chromecast/base",
"//chromecast/public",
]
}
cast_source_set("cast_media_shlib_common") { cast_source_set("cast_media_shlib_common") {
sources = [ sources = [
"cast_media_shlib_common.cc", "cast_media_shlib_common.cc",
...@@ -48,7 +36,6 @@ cast_source_set("cast_media_shlib_default") { ...@@ -48,7 +36,6 @@ cast_source_set("cast_media_shlib_default") {
] ]
deps = [ deps = [
":cast_media_shlib_common", ":cast_media_shlib_common",
":task_runner_lifetime_handler",
"//base", "//base",
"//chromecast/base", "//chromecast/base",
"//chromecast/media/cma/backend:for_mixer_audio", "//chromecast/media/cma/backend:for_mixer_audio",
...@@ -56,11 +43,11 @@ cast_source_set("cast_media_shlib_default") { ...@@ -56,11 +43,11 @@ cast_source_set("cast_media_shlib_default") {
] ]
} }
cast_shared_library("libcast_media_1.0_avsync") { cast_source_set("libcast_media_1.0_avsync") {
deps = [ deps = [
":av_sync_video", ":av_sync_video",
":cast_media_shlib_default", ":cast_media_shlib_default",
"//chromecast/base:base", "//chromecast/base",
"//chromecast/media/cma/backend:for_mixer_audio", "//chromecast/media/cma/backend:for_mixer_audio",
"//chromecast/public/media", "//chromecast/public/media",
"//media", "//media",
......
...@@ -2,16 +2,11 @@ ...@@ -2,16 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "base/at_exit.h"
#include "chromecast/public/media/media_capabilities_shlib.h" #include "chromecast/public/media/media_capabilities_shlib.h"
namespace chromecast { namespace chromecast {
namespace media { namespace media {
namespace {
base::AtExitManager g_at_exit_manager;
} // namespace
bool MediaCapabilitiesShlib::IsSupportedAudioConfig(const AudioConfig& config) { bool MediaCapabilitiesShlib::IsSupportedAudioConfig(const AudioConfig& config) {
switch (config.codec) { switch (config.codec) {
case kCodecPCM: case kCodecPCM:
......
...@@ -4,27 +4,16 @@ ...@@ -4,27 +4,16 @@
#include "chromecast/public/cast_media_shlib.h" #include "chromecast/public/cast_media_shlib.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h" #include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h"
#include "chromecast/media/cma/backend/video/task_runner_lifetime_handler.h"
namespace chromecast { namespace chromecast {
namespace media { namespace media {
MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend( MediaPipelineBackend* CastMediaShlib::CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) { const MediaPipelineDeviceParams& params) {
TaskRunnerLifetimeHandler::SetTaskRunnerHandle(
static_cast<TaskRunnerImpl*>(params.task_runner));
return new MediaPipelineBackendForMixer(params); return new MediaPipelineBackendForMixer(params);
} }
void CastMediaShlib::Finalize() {
TaskRunnerLifetimeHandler::ResetTaskRunnerHandle();
}
bool CastMediaShlib::SupportsMediaClockRateChange() { bool CastMediaShlib::SupportsMediaClockRateChange() {
return false; return false;
} }
......
// Copyright 2018 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.
#include "chromecast/media/cma/backend/video/task_runner_lifetime_handler.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chromecast/base/task_runner_impl.h"
namespace chromecast {
namespace media {
std::unique_ptr<base::ThreadTaskRunnerHandle> g_thread_task_runner_handle;
// static
void TaskRunnerLifetimeHandler::SetTaskRunnerHandle(
const TaskRunnerImpl* task_runner_in) {
// Set up the static reference in base::ThreadTaskRunnerHandle::Get
// for the media thread in this shared library. We can extract the
// SingleThreadTaskRunner passed in from cast_shell for this.
if (!base::ThreadTaskRunnerHandle::IsSet()) {
DCHECK(!g_thread_task_runner_handle);
const scoped_refptr<base::SingleThreadTaskRunner> task_runner =
task_runner_in->runner();
DCHECK(task_runner->BelongsToCurrentThread());
g_thread_task_runner_handle.reset(
new base::ThreadTaskRunnerHandle(task_runner));
}
}
// static
void TaskRunnerLifetimeHandler::ResetTaskRunnerHandle() {
g_thread_task_runner_handle.reset();
}
} // namespace media
} // namespace chromecast
// Copyright 2018 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.
#ifndef CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_TASK_RUNNER_LIFETIME_HANDLER_H_
#define CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_TASK_RUNNER_LIFETIME_HANDLER_H_
namespace chromecast {
class TaskRunnerImpl;
namespace media {
// This helper class is used to handle the lifetime of a task runner that needs
// to stay alive for a set amount of time while other compontents are using it.
class TaskRunnerLifetimeHandler {
public:
// Sets the task runner whose lifetime this class will handle.
// TaskRunnerLifetimeHandler will create a handle to this task_runner, and
// keep the handle alive until ResetTaskRunnerHandle is called.
static void SetTaskRunnerHandle(const TaskRunnerImpl* task_runner_in);
// Resets the task runner handle.
static void ResetTaskRunnerHandle();
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_TASK_RUNNER_LIFETIME_HANDLER_H_
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