Skip to content

Commit 5e9e7a5

Browse files
committed
cobalt: Move VideoGeometrySetterService on gpu thread (#8962)
Relocate the VideoGeometrySetterService from the browser process to the GPU process. This change instantiates the service within the CobaltContentGpuClient, allowing it to be managed directly on the GPU thread. This improves performance and reduces IPC overhead for video geometry updates by co-locating the service closer to the GPU and compositing operations. The StarboardRendererWrapper now directly subscribes to video geometry changes from this local service. Mojo communications: - Before: viz (gpu) --> browser thread --> StarboardRendererClient (media) --> StarboardRendererWrapper (gpu) - After: viz (gpu) --> StarboardRendererWrapper (gpu) Note this is called nearly per UI frame update. Issue: 405424096 (cherry picked from commit d1376b1)
1 parent e8e5b7e commit 5e9e7a5

27 files changed

+203
-197
lines changed

cobalt/browser/cobalt_content_browser_client.cc

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
#include "cobalt/browser/mojom/h5vcc_settings.mojom.h"
3737
#include "cobalt/browser/user_agent/user_agent_platform_info.h"
3838
#include "cobalt/common/features/starboard_features_initialization.h"
39-
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
40-
#include "cobalt/media/service/video_geometry_setter_service.h"
4139
#include "cobalt/shell/browser/shell.h"
4240
#include "cobalt/shell/browser/shell_paths.h"
4341
#include "cobalt/shell/common/shell_switches.h"
@@ -153,12 +151,7 @@ blink::UserAgentMetadata GetCobaltUserAgentMetadata() {
153151
return metadata;
154152
}
155153

156-
CobaltContentBrowserClient::CobaltContentBrowserClient()
157-
: video_geometry_setter_service_(
158-
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
159-
base::OnTaskRunnerDeleter>(
160-
nullptr,
161-
base::OnTaskRunnerDeleter(nullptr))) {
154+
CobaltContentBrowserClient::CobaltContentBrowserClient() {
162155
DETACH_FROM_THREAD(thread_checker_);
163156
}
164157

@@ -340,43 +333,16 @@ void CobaltContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
340333
render_frame_host, map);
341334
}
342335

343-
void CobaltContentBrowserClient::CreateVideoGeometrySetterService() {
344-
DCHECK(!video_geometry_setter_service_);
345-
video_geometry_setter_service_ =
346-
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
347-
base::OnTaskRunnerDeleter>(
348-
new media::VideoGeometrySetterService,
349-
base::OnTaskRunnerDeleter(
350-
base::SingleThreadTaskRunner::GetCurrentDefault()));
351-
}
352-
353336
void CobaltContentBrowserClient::ExposeInterfacesToRenderer(
354337
service_manager::BinderRegistry* registry,
355338
blink::AssociatedInterfaceRegistry* associated_registry,
356339
content::RenderProcessHost* render_process_host) {
357340
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
358-
if (!video_geometry_setter_service_) {
359-
CreateVideoGeometrySetterService();
360-
}
361-
registry->AddInterface<cobalt::media::mojom::VideoGeometryChangeSubscriber>(
362-
video_geometry_setter_service_->GetBindSubscriberCallback(),
363-
base::SingleThreadTaskRunner::GetCurrentDefault());
364341
registry->AddInterface<cobalt::mojom::H5vccSettings>(
365342
base::BindRepeating(&H5vccSettingsImpl::Create),
366343
base::SingleThreadTaskRunner::GetCurrentDefault());
367344
}
368345

369-
void CobaltContentBrowserClient::BindGpuHostReceiver(
370-
mojo::GenericPendingReceiver receiver) {
371-
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
372-
if (!video_geometry_setter_service_) {
373-
CreateVideoGeometrySetterService();
374-
}
375-
if (auto r = receiver.As<media::mojom::VideoGeometrySetter>()) {
376-
video_geometry_setter_service_->GetVideoGeometrySetter(std::move(r));
377-
}
378-
}
379-
380346
bool CobaltContentBrowserClient::WillCreateURLLoaderFactory(
381347
content::BrowserContext* browser_context,
382348
content::RenderFrameHost* frame,

cobalt/browser/cobalt_content_browser_client.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ class BinderMapWithContext;
4141

4242
namespace cobalt {
4343

44-
namespace media {
45-
class VideoGeometrySetterService;
46-
} // namespace media
47-
4844
class CobaltMetricsServicesManagerClient;
4945
class CobaltWebContentsObserver;
5046

@@ -98,7 +94,6 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
9894
service_manager::BinderRegistry* registry,
9995
blink::AssociatedInterfaceRegistry* associated_registry,
10096
content::RenderProcessHost* render_process_host) override;
101-
void BindGpuHostReceiver(mojo::GenericPendingReceiver receiver) override;
10297

10398
// Initializes all necessary parameters to create the feature list and calls
10499
// base::FeatureList::SetInstance() to set the global instance.
@@ -128,11 +123,7 @@ class CobaltContentBrowserClient : public content::ShellContentBrowserClient {
128123
void DispatchFocus();
129124

130125
private:
131-
void CreateVideoGeometrySetterService();
132-
133126
std::unique_ptr<CobaltWebContentsObserver> web_contents_observer_;
134-
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
135-
video_geometry_setter_service_;
136127

137128
THREAD_CHECKER(thread_checker_);
138129
};

cobalt/gpu/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ source_set("gpu") {
2020

2121
deps = [
2222
"//base",
23+
"//cobalt/media/service",
2324
"//cobalt/media/service/mojom",
2425
"//components/viz/common",
2526
"//components/viz/service",

cobalt/gpu/cobalt_content_gpu_client.cc

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,36 @@
1616

1717
#include "base/memory/ptr_util.h"
1818
#include "base/task/single_thread_task_runner.h"
19+
#include "cobalt/media/service/mojom/video_geometry_setter.mojom.h"
20+
#include "cobalt/media/service/video_geometry_setter_service.h"
1921
#include "components/viz/service/display/starboard/overlay_strategy_underlay_starboard.h"
2022
#include "content/public/child/child_thread.h"
2123

2224
namespace cobalt {
2325

24-
CobaltContentGpuClient::CobaltContentGpuClient() = default;
26+
CobaltContentGpuClient::CobaltContentGpuClient()
27+
: video_geometry_setter_service_(
28+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
29+
base::OnTaskRunnerDeleter>(
30+
nullptr,
31+
base::OnTaskRunnerDeleter(nullptr))) {}
32+
2533
CobaltContentGpuClient::~CobaltContentGpuClient() = default;
2634

2735
void CobaltContentGpuClient::PostCompositorThreadCreated(
2836
base::SingleThreadTaskRunner* task_runner) {
37+
if (!video_geometry_setter_service_) {
38+
CreateVideoGeometrySetterService();
39+
}
2940
// Initialize PendingRemote for VideoGeometrySetter and post it
3041
// to compositor thread (viz service). This is called on gpu thread
3142
// right after the compositor thread is created.
3243
mojo::PendingRemote<cobalt::media::mojom::VideoGeometrySetter>
3344
video_geometry_setter;
34-
content::ChildThread::Get()->BindHostReceiver(
35-
video_geometry_setter.InitWithNewPipeAndPassReceiver());
45+
mojo::PendingReceiver<cobalt::media::mojom::VideoGeometrySetter>
46+
pending_receiver = video_geometry_setter.InitWithNewPipeAndPassReceiver();
47+
video_geometry_setter_service_->GetVideoGeometrySetter(
48+
std::move(pending_receiver));
3649

3750
task_runner->PostTask(
3851
FROM_HERE,
@@ -41,4 +54,22 @@ void CobaltContentGpuClient::PostCompositorThreadCreated(
4154
std::move(video_geometry_setter)));
4255
}
4356

57+
media::VideoGeometrySetterService*
58+
CobaltContentGpuClient::GetVideoGeometrySetterService() {
59+
if (!video_geometry_setter_service_) {
60+
CreateVideoGeometrySetterService();
61+
}
62+
return video_geometry_setter_service_.get();
63+
}
64+
65+
void CobaltContentGpuClient::CreateVideoGeometrySetterService() {
66+
DCHECK(!video_geometry_setter_service_);
67+
video_geometry_setter_service_ =
68+
std::unique_ptr<cobalt::media::VideoGeometrySetterService,
69+
base::OnTaskRunnerDeleter>(
70+
new media::VideoGeometrySetterService,
71+
base::OnTaskRunnerDeleter(
72+
base::SingleThreadTaskRunner::GetCurrentDefault()));
73+
}
74+
4475
} // namespace cobalt

cobalt/gpu/cobalt_content_gpu_client.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
namespace cobalt {
2424

25+
namespace media {
26+
class VideoGeometrySetterService;
27+
} // namespace media
28+
2529
// This class utilizes embedder API for participating in gpu logic.
2630
// It allows Cobalt to interact with viz service and compositor thread.
2731
class CobaltContentGpuClient : public content::ContentGpuClient {
@@ -36,6 +40,13 @@ class CobaltContentGpuClient : public content::ContentGpuClient {
3640
// content::ContentGpuClient:
3741
void PostCompositorThreadCreated(
3842
base::SingleThreadTaskRunner* task_runner) override;
43+
media::VideoGeometrySetterService* GetVideoGeometrySetterService() override;
44+
45+
private:
46+
void CreateVideoGeometrySetterService();
47+
48+
std::unique_ptr<media::VideoGeometrySetterService, base::OnTaskRunnerDeleter>
49+
video_geometry_setter_service_;
3950
};
4051

4152
} // namespace cobalt

cobalt/renderer/cobalt_content_renderer_client.cc

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
#include "media/base/media_switches.h"
2424
#include "media/base/renderer_factory.h"
2525
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
26-
#include "media/starboard/bind_host_receiver_callback.h"
2726
#include "media/starboard/decoder_buffer_allocator.h"
28-
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
2927
#include "starboard/media.h"
3028
#include "starboard/player.h"
3129
#include "third_party/blink/public/platform/web_string.h"
@@ -121,10 +119,6 @@ ::media::SupportedCodecs GetStarboardEmeSupportedCodecs() {
121119
return codecs;
122120
}
123121

124-
void BindHostReceiverWithValuation(mojo::GenericPendingReceiver receiver) {
125-
content::RenderThread::Get()->BindHostReceiver(std::move(receiver));
126-
}
127-
128122
// TODO: b/460292554 - This code is a tentative solution, and will be replaced
129123
// once base::Feature is fully supported.
130124
//
@@ -254,11 +248,6 @@ ExperimentalFeatures ProcessH5vccSettings(
254248

255249
} // namespace
256250

257-
static_assert(std::is_same<::media::BindHostReceiverCallback,
258-
base::RepeatingCallback<
259-
decltype(BindHostReceiverWithValuation)>>::value,
260-
"These two types must be the same");
261-
262251
CobaltContentRendererClient::CobaltContentRendererClient() {
263252
DETACH_FROM_THREAD(thread_checker_);
264253
}
@@ -363,12 +352,6 @@ void CobaltContentRendererClient::RunScriptsAtDocumentStart(
363352
communication->RunScriptsAtDocumentStart();
364353
}
365354

366-
void CobaltContentRendererClient::BindHostReceiver(
367-
mojo::GenericPendingReceiver receiver) {
368-
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
369-
BindHostReceiverWithValuation(std::move(receiver));
370-
}
371-
372355
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
373356
media::RendererFactoryTraits* renderer_factory_traits) {
374357
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -392,11 +375,6 @@ void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
392375
renderer_factory_traits->experimental_features = experimental_features;
393376

394377
renderer_factory_traits->viewport_size = viewport_size_;
395-
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
396-
renderer_factory_traits->bind_host_receiver_callback =
397-
base::BindPostTaskToCurrentDefault(
398-
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
399-
weak_factory_.GetWeakPtr()));
400378
}
401379

402380
void CobaltContentRendererClient::PostSandboxInitialized() {

cobalt/renderer/cobalt_content_renderer_client.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ class MediaLog;
2626
class RendererFactory;
2727
} // namespace media
2828

29-
namespace mojo {
30-
class GenericPendingReceiver;
31-
} // namespace mojo
32-
3329
namespace cobalt {
3430
// This class utilizes embedder API for participating in renderer logic.
3531
// It allows Cobalt to customize content Renderer module.
@@ -55,11 +51,6 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
5551
::media::RendererFactoryTraits* traits) override;
5652
void PostSandboxInitialized() override;
5753

58-
// Bind Host Receiver to VideoGeometryChangeSubscriber on Browser thread.
59-
// This is called from StarboardRenderer with |BindPostTaskToCurrentDefault|
60-
// on media thread to post the task on Renderer thread.
61-
void BindHostReceiver(mojo::GenericPendingReceiver receiver);
62-
6354
private:
6455
// Registers a custom content::AudioDeviceFactory
6556
::media::CobaltAudioDeviceFactory cobalt_audio_device_factory_;

content/gpu/gpu_service_factory.cc

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
#include "ui/gl/gl_angle_util_win.h"
2727
#endif
2828

29+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
30+
#include "content/public/common/content_client.h"
31+
#include "content/public/gpu/content_gpu_client.h"
32+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
33+
2934
namespace content {
3035

3136
GpuServiceFactory::GpuServiceFactory(
@@ -81,13 +86,27 @@ void GpuServiceFactory::RunMediaService(
8186
#endif
8287
}
8388

89+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
90+
content::ContentGpuClient* client = GetContentClient()->gpu();
91+
cobalt::media::VideoGeometrySetterService* video_geometry_setter_service = nullptr;
92+
if (client) {
93+
video_geometry_setter_service =
94+
client->GetVideoGeometrySetterService();
95+
}
96+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
97+
8498
using FactoryCallback =
8599
base::OnceCallback<std::unique_ptr<media::MediaService>()>;
86100
FactoryCallback factory =
87101
base::BindOnce(&media::CreateGpuMediaService, std::move(receiver),
88102
gpu_preferences_, gpu_workarounds_, gpu_feature_info_,
89103
gpu_info_, task_runner_, media_gpu_channel_manager_,
90-
gpu_memory_buffer_factory_, android_overlay_factory_cb_);
104+
gpu_memory_buffer_factory_, android_overlay_factory_cb_
105+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
106+
,
107+
video_geometry_setter_service
108+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
109+
);
91110
task_runner->PostTask(
92111
FROM_HERE,
93112
base::BindOnce(

content/public/gpu/content_gpu_client.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,11 @@ ContentGpuClient::GetVizCompositorThreadRunner() {
2323
return nullptr;
2424
}
2525

26+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
27+
cobalt::media::VideoGeometrySetterService*
28+
ContentGpuClient::GetVideoGeometrySetterService() {
29+
return nullptr;
30+
}
31+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
32+
2633
} // namespace content

content/public/gpu/content_gpu_client.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
#include "content/public/common/content_client.h"
1212
#include "mojo/public/cpp/bindings/binder_map.h"
1313

14+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
15+
namespace cobalt::media {
16+
class VideoGeometrySetterService;
17+
}
18+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
19+
1420
namespace gpu {
1521
struct GpuPreferences;
1622
class GpuDriverBugWorkarounds;
@@ -55,6 +61,10 @@ class CONTENT_EXPORT ContentGpuClient {
5561
virtual gpu::SharedImageManager* GetSharedImageManager();
5662
virtual gpu::Scheduler* GetScheduler();
5763
virtual viz::VizCompositorThreadRunner* GetVizCompositorThreadRunner();
64+
65+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
66+
virtual cobalt::media::VideoGeometrySetterService* GetVideoGeometrySetterService();
67+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
5868
};
5969

6070
} // namespace content

0 commit comments

Comments
 (0)