0

Setup GPU channel for video capture utility service on Android.

Build GPU channel by creating the viz::Gpu in the video capture utility
service, which is bind to viz::GpuClient of browser process. By this
way, video capture service can setup GPU channel to GPU process on
Android platform to create shared images.

Bug: 40264379
Change-Id: Iae8a573ca04bb25ab9715c65166e981a261264fc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5957728
Commit-Queue: vikas soni <vikassoni@chromium.org>
Reviewed-by: Fred Shih <ffred@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Reviewed-by: Dave Tapuska <dtapuska@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1378303}
This commit is contained in:
vikas soni
2024-11-05 14:57:58 +00:00
committed by Chromium LUCI CQ
parent 08de76a99d
commit f09e2a6fec
11 changed files with 49 additions and 65 deletions

@ -75,13 +75,12 @@
#include "services/network/public/mojom/network_service.mojom.h"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#include "base/task/sequenced_task_runner.h"
#include "components/viz/host/gpu_client.h"
#include "media/capture/capture_switches.h"
#include "services/video_capture/public/mojom/video_capture_service.mojom.h"
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace content {
@ -152,11 +151,10 @@ UtilityProcessHost::UtilityProcessHost(std::unique_ptr<Client> client)
started_(false),
name_(u"utility process"),
file_data_(std::make_unique<ChildProcessLauncherFileData>()),
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
allowed_gpu_(false),
gpu_client_(nullptr, base::OnTaskRunnerDeleter(nullptr)),
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
client_(std::move(client)) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
process_ = std::make_unique<BrowserChildProcessHostImpl>(
@ -212,10 +210,9 @@ void UtilityProcessHost::SetPreloadLibraries(
#endif // BUILDFLAG(IS_WIN)
void UtilityProcessHost::SetAllowGpuClient() {
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
allowed_gpu_ = true;
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
}
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
@ -417,7 +414,7 @@ bool UtilityProcessHost::StartProcess() {
}
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE) && !BUILDFLAG(IS_WIN)
// Pass `kVideoCaptureUseGpuMemoryBuffer` flag to video capture service only
// when the video capture use GPU memory buffer enabled.
if (metrics_name_ == video_capture::mojom::VideoCaptureService::Name_) {
@ -433,8 +430,7 @@ bool UtilityProcessHost::StartProcess() {
cmd_line->AppendSwitch(switches::kVideoCaptureUseGpuMemoryBuffer);
}
}
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) ||
// BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE) && !BUILDFLAG(IS_WIN)
std::unique_ptr<UtilitySandboxedProcessLauncherDelegate> delegate =
std::make_unique<UtilitySandboxedProcessLauncherDelegate>(

@ -20,6 +20,7 @@
#include "content/common/content_export.h"
#include "content/public/browser/browser_child_process_host_delegate.h"
#include "content/public/common/zygote/zygote_buildflags.h"
#include "media/media_buildflags.h"
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "sandbox/policy/mojom/sandbox.mojom.h"
@ -33,12 +34,11 @@ namespace base {
class Thread;
} // namespace base
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace viz {
class GpuClient;
} // namespace viz
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace content {
class BrowserChildProcessHostImpl;
@ -201,11 +201,10 @@ class CONTENT_EXPORT UtilityProcessHost
};
LaunchState launch_state_ = LaunchState::kLaunchInProgress;
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
bool allowed_gpu_;
std::unique_ptr<viz::GpuClient, base::OnTaskRunnerDeleter> gpu_client_;
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
std::unique_ptr<Client> client_;

@ -4,22 +4,21 @@
// This file exposes services in the browser to the utility process.
#include "content/browser/utility_process_host.h"
#include "build/build_config.h"
#include "content/browser/utility_process_host.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
#include "media/media_buildflags.h"
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "components/services/font/public/mojom/font_service.mojom.h" // nogncheck
#include "content/browser/font_service.h" // nogncheck
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#include "components/viz/host/gpu_client.h"
#include "content/public/browser/gpu_client.h"
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace content {
@ -31,8 +30,7 @@ void UtilityProcessHost::BindHostReceiver(
return;
}
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
if (allowed_gpu_) {
// TODO(crbug.com/328099369) Remove once all clients get this directly.
if (auto gpu_receiver = receiver.As<viz::mojom::Gpu>()) {
@ -40,7 +38,7 @@ void UtilityProcessHost::BindHostReceiver(
return;
}
}
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
GetContentClient()->browser()->BindUtilityHostReceiver(std::move(receiver));
}

@ -6,6 +6,7 @@
#include "base/strings/utf_string_conversions.h"
#include "content/public/common/content_client.h"
#include "media/media_buildflags.h"
namespace content {
@ -70,10 +71,9 @@ ServiceProcessHost::Options::WithPreloadedLibraries(
ServiceProcessHost::Options& ServiceProcessHost::Options::WithGpuClient(
base::PassKey<ServiceProcessHostGpuClient> passkey) {
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
allow_gpu_client = true;
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
return *this;
}

@ -119,13 +119,11 @@ extern sandbox::TargetServices* g_utility_target_services;
#include "ui/accessibility/accessibility_features.h"
#endif // BUILDFLAG(ENABLE_ACCESSIBILITY_SERVICE)
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#include "media/capture/capture_switches.h"
#include "services/viz/public/cpp/gpu/gpu.h"
#include "services/viz/public/mojom/gpu.mojom.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace content {
base::LazyInstance<NetworkBinderCreationCallback>::Leaky
@ -336,8 +334,7 @@ auto RunVideoCapture(
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
auto service = std::make_unique<UtilityThreadVideoCaptureServiceImpl>(
std::move(receiver), base::SingleThreadTaskRunner::GetCurrentDefault());
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#if BUILDFLAG(IS_CHROMEOS_ASH)
{
#else
@ -350,8 +347,7 @@ auto RunVideoCapture(
std::move(remote_gpu), UtilityThread::Get()->GetIOTaskRunner());
service->SetVizGpu(std::move(viz_gpu));
}
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
return service;
}

@ -67,6 +67,7 @@ buildflag_header("media_buildflags") {
"USE_CHROMEOS_PROTECTED_MEDIA=$use_chromeos_protected_media",
"USE_CRAS=$use_cras",
"USE_PROPRIETARY_CODECS=$proprietary_codecs",
"ENABLE_GPU_CHANNEL_MEDIA_CAPTURE=$enable_gpu_channel_media_capture",
]
if (enable_library_cdms) {

@ -392,7 +392,7 @@ source_set("capture_gpu_channel") {
deps = []
# Establish GPU Channel
if (is_linux || is_win || is_chromeos_ash || is_mac) {
if (enable_gpu_channel_media_capture) {
sources += [
"video/video_capture_gpu_channel_host.cc",
"video/video_capture_gpu_channel_host.h",

@ -124,6 +124,11 @@ declare_args() {
# Enable inclusion of VVC/H.266 parser/demuxer, and also enable VVC/H.266 decoding
# with hardware acceleration provided by platform. Disabled by default for all builds.
enable_platform_vvc = false
# Determines if a GpuChannel is needed between media capture utility process
# and gpu process for a given platform.
enable_gpu_channel_media_capture =
is_linux || is_win || is_chromeos_ash || is_mac || is_android
}
# Use another declare_args() to allow dependence on args defined above.

@ -7,6 +7,7 @@ include_rules = [
"+media/device_monitors",
"+media/mojo",
"+media/capture",
"+media/media_buildflags.h",
"+ui/gfx",
"+services/video_effects/public/mojom/video_effects_processor.mojom-forward.h",
"+services/viz/public/cpp/gpu",

@ -42,13 +42,11 @@
#include "services/video_capture/lacros/device_factory_adapter_lacros.h"
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#include "media/capture/capture_switches.h"
#include "media/capture/video/video_capture_gpu_channel_host.h"
#include "services/viz/public/cpp/gpu/context_provider_command_buffer.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
namespace video_capture {
@ -111,8 +109,7 @@ class VideoCaptureServiceImpl::GpuDependenciesContext {
this};
};
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
// Intended usage of this class is to create viz::Gpu in utility process and
// connect to viz::GpuClient of browser process, which will call to Gpu service.
// Also, this class holds the viz::ContextProvider to listen and monitor Gpu
@ -230,8 +227,7 @@ class VideoCaptureServiceImpl::VizGpuContextProvider
scoped_refptr<viz::ContextProvider> context_provider_;
base::WeakPtrFactory<VizGpuContextProvider> weak_ptr_factory_{this};
};
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
bool ShouldUseVCDFromAsh() {
@ -333,8 +329,7 @@ void VideoCaptureServiceImpl::LazyInitializeGpuDependenciesContext() {
if (!gpu_dependencies_context_)
gpu_dependencies_context_ = std::make_unique<GpuDependenciesContext>();
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#if BUILDFLAG(IS_CHROMEOS_ASH)
{
#else
@ -345,8 +340,7 @@ void VideoCaptureServiceImpl::LazyInitializeGpuDependenciesContext() {
std::make_unique<VizGpuContextProvider>(std::move(viz_gpu_));
}
}
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
}
void VideoCaptureServiceImpl::LazyInitializeDeviceFactory() {
@ -467,12 +461,11 @@ void VideoCaptureServiceImpl::OnGpuInfoUpdate(const CHROME_LUID& luid) {
}
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
void VideoCaptureServiceImpl::SetVizGpu(std::unique_ptr<viz::Gpu> viz_gpu) {
viz_gpu_ = std::move(viz_gpu);
}
#endif
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
void VideoCaptureServiceImpl::OnDisconnectedFromVCDFactoryAsh() {

@ -15,6 +15,7 @@
#include "base/threading/thread.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "media/media_buildflags.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
@ -27,11 +28,9 @@
#include "services/video_capture/ash/video_capture_device_factory_ash.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#include "services/viz/public/cpp/gpu/gpu.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
#if BUILDFLAG(IS_MAC)
#include "media/device_monitors/device_monitor_mac.h"
@ -76,11 +75,9 @@ class VideoCaptureServiceImpl : public mojom::VideoCaptureService {
#if BUILDFLAG(IS_WIN)
void OnGpuInfoUpdate(const CHROME_LUID& luid) override;
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
void SetVizGpu(std::unique_ptr<viz::Gpu> viz_gpu);
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
private:
class GpuDependenciesContext;
@ -122,13 +119,11 @@ class VideoCaptureServiceImpl : public mojom::VideoCaptureService {
factory_receivers_ash_;
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_MAC)
#if BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
class VizGpuContextProvider;
std::unique_ptr<VizGpuContextProvider> viz_gpu_context_provider_;
std::unique_ptr<viz::Gpu> viz_gpu_;
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
// BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC)
#endif // BUILDFLAG(ENABLE_GPU_CHANNEL_MEDIA_CAPTURE)
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;