Skip to content

Commit e1f18bb

Browse files
committed
[media] Move StarboardRenderer to MojoRenderer
Move StarboardRenderer to Gpu thread, and each of StarboardRenderer is ran on PooledSingleThreadTaskRunner. This allows Starboard to access Chrome_InProcGpuThread for graphical tasks. b/394368542
1 parent a6e5022 commit e1f18bb

40 files changed

+983
-190
lines changed

cobalt/build/configs/common.gn

+8
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,11 @@ enable_platform_ac3_eac3_audio = true
2222
# We use Angle+EGL based graphics pipeline, not Dawn path
2323
# see //ui/gl/features.gni
2424
use_dawn = false
25+
26+
# Use MojoRenderer for StarboardRenderer.
27+
# Use MojoCdm for StarboardCdm.
28+
mojo_media_host = "gpu"
29+
mojo_media_services = [
30+
"renderer",
31+
"cdm",
32+
]

cobalt/renderer/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ source_set("renderer") {
3131
"//content/test:content_test_mojo_bindings",
3232
"//media",
3333
"//media/mojo:buildflags",
34+
"//media/mojo/clients",
3435
"//starboard:starboard_headers_only",
3536
"//v8",
3637
]

cobalt/renderer/cobalt_content_renderer_client.cc

+9-18
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@
1313
#include "components/js_injection/renderer/js_communication.h"
1414
#include "content/public/renderer/render_frame.h"
1515
#include "content/public/renderer/render_thread.h"
16-
#include "media/base/decoder_factory.h"
1716
#include "media/base/media_log.h"
1817
#include "media/base/renderer_factory.h"
18+
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
1919
#include "media/starboard/bind_host_receiver_callback.h"
20-
#include "media/starboard/starboard_renderer_factory.h"
21-
#include "media/video/gpu_video_accelerator_factories.h"
2220
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
2321
#include "starboard/media.h"
2422
#include "starboard/player.h"
@@ -180,26 +178,19 @@ void CobaltContentRendererClient::BindHostReceiver(
180178
BindHostReceiverWithValuation(std::move(receiver));
181179
}
182180

183-
std::unique_ptr<::media::RendererFactory>
184-
CobaltContentRendererClient::GetBaseRendererFactory(
185-
content::RenderFrame* /* render_frame */,
186-
::media::MediaLog* media_log,
187-
::media::DecoderFactory* /* decoder_factory */,
188-
base::RepeatingCallback<::media::GpuVideoAcceleratorFactories*()>
189-
/* get_gpu_factories_cb */) {
181+
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
182+
media::RendererFactoryTraits* renderer_factory_traits) {
190183
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
191-
// TODO(b/394368542): Add Content API to create StarboardRenderer.
192-
base::TimeDelta audio_write_duration_local =
184+
// TODO(b/383327725) - Cobalt: Inject these values from the web app.
185+
renderer_factory_traits->audio_write_duration_local =
193186
base::Microseconds(kSbPlayerWriteDurationLocal);
194-
base::TimeDelta audio_write_duration_remote =
187+
renderer_factory_traits->audio_write_duration_remote =
195188
base::Microseconds(kSbPlayerWriteDurationRemote);
196-
return std::make_unique<::media::StarboardRendererFactory>(
197-
media_log,
198-
// TODO(b/383327725) - Cobalt: Inject these values from the web app.
199-
audio_write_duration_local, audio_write_duration_remote,
189+
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
190+
renderer_factory_traits->bind_host_receiver_callback =
200191
base::BindPostTaskToCurrentDefault(
201192
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
202-
weak_factory_.GetWeakPtr())));
193+
weak_factory_.GetWeakPtr()));
203194
}
204195

205196
} // namespace cobalt

cobalt/renderer/cobalt_content_renderer_client.h

+3-10
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@
1111
#include "base/threading/thread_checker.h"
1212
#include "cobalt/media/audio/cobalt_audio_device_factory.h"
1313
#include "content/public/renderer/content_renderer_client.h"
14+
#include "media/base/starboard/renderer_factory_traits.h"
1415

1516
namespace content {
1617
class RenderFrame;
17-
class RenderThread;
1818
} // namespace content
1919

2020
namespace media {
2121
class MediaLog;
22-
class DecoderFactory;
23-
class GpuVideoAcceleratorFactories;
2422
class RendererFactory;
2523
} // namespace media
2624

@@ -48,13 +46,8 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
4846
bool IsSupportedVideoType(const ::media::VideoType& type) override;
4947
// JS Injection hook
5048
void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override;
51-
// TODO(b/394368542): Add Content API to create StarboardRenderer.
52-
std::unique_ptr<::media::RendererFactory> GetBaseRendererFactory(
53-
content::RenderFrame* render_frame,
54-
::media::MediaLog* media_log,
55-
::media::DecoderFactory* decoder_factory,
56-
base::RepeatingCallback<::media::GpuVideoAcceleratorFactories*()>
57-
get_gpu_factories_cb) override;
49+
void GetStarboardRendererFactoryTraits(
50+
media::RendererFactoryTraits* traits) override;
5851

5952
// Bind Host Receiver to VideoGeometryChangeSubscriber on Browser thread.
6053
// This is called from StarboardRenderer with |BindPostTaskToCurrentDefault|

content/browser/media/frameless_media_interface_proxy.cc

+13
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,19 @@ void FramelessMediaInterfaceProxy::CreateMediaFoundationRenderer(
137137
client_extension_remote) {}
138138
#endif // BUILDFLAG(IS_WIN)
139139

140+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
141+
void FramelessMediaInterfaceProxy::CreateStarboardRenderer(
142+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
143+
const base::UnguessableToken& overlay_plane_id,
144+
base::TimeDelta audio_write_duration_local,
145+
base::TimeDelta video_write_duration_remote,
146+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
147+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
148+
renderer_extension_receiver,
149+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
150+
client_extension_remote) {}
151+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
152+
140153
void FramelessMediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
141154
CreateCdmCallback callback) {
142155
std::move(callback).Run(mojo::NullRemote(), nullptr, "CDM not supported");

content/browser/media/frameless_media_interface_proxy.h

+12
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,18 @@ class FramelessMediaInterfaceProxy final
8686
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
8787
client_extension_remote) final;
8888
#endif // BUILDFLAG(IS_WIN)
89+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
90+
void CreateStarboardRenderer(
91+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
92+
const base::UnguessableToken& overlay_plane_id,
93+
base::TimeDelta audio_write_duration_local,
94+
base::TimeDelta video_write_duration_remote,
95+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
96+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
97+
renderer_extension_receiver,
98+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
99+
client_extension_remote) final;
100+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
89101
void CreateCdm(const media::CdmConfig& cdm_config,
90102
CreateCdmCallback callback) final;
91103

content/browser/media/media_interface_proxy.cc

+25
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,31 @@ void MediaInterfaceProxy::CreateMediaFoundationRenderer(
391391
}
392392
#endif // BUILDFLAG(IS_WIN)
393393

394+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
395+
void MediaInterfaceProxy::CreateStarboardRenderer(
396+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
397+
const base::UnguessableToken& overlay_plane_id,
398+
base::TimeDelta audio_write_duration_local,
399+
base::TimeDelta video_write_duration_remote,
400+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
401+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
402+
renderer_extension_receiver,
403+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
404+
client_extension_remote) {
405+
DCHECK(thread_checker_.CalledOnValidThread());
406+
DVLOG(1) << __func__ << ": this=" << this;
407+
408+
InterfaceFactory* factory = media_interface_factory_ptr_->Get();
409+
if (factory) {
410+
factory->CreateStarboardRenderer(
411+
std::move(media_log_remote), overlay_plane_id,
412+
audio_write_duration_local, video_write_duration_remote,
413+
std::move(receiver), std::move(renderer_extension_receiver),
414+
std::move(client_extension_remote));
415+
}
416+
}
417+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
418+
394419
void MediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
395420
CreateCdmCallback create_cdm_cb) {
396421
DCHECK(thread_checker_.CalledOnValidThread());

content/browser/media/media_interface_proxy.h

+12
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,18 @@ class MediaInterfaceProxy final : public DocumentUserData<MediaInterfaceProxy>,
9090
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
9191
client_extension_remote) final;
9292
#endif // BUILDFLAG(IS_WIN)
93+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
94+
void CreateStarboardRenderer(
95+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
96+
const base::UnguessableToken& overlay_plane_id,
97+
base::TimeDelta audio_write_duration_local,
98+
base::TimeDelta video_write_duration_remote,
99+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
100+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
101+
renderer_extension_receiver,
102+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
103+
client_extension_remote) final;
104+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
93105
void CreateCdm(const media::CdmConfig& cdm_config,
94106
CreateCdmCallback create_cdm_cb) final;
95107

content/public/renderer/BUILD.gn

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import("//build/config/features.gni")
66
import("//media/media_options.gni")
77
import("//ppapi/buildflags/buildflags.gni")
88

9+
if (is_cobalt) {
10+
import("//starboard/build/buildflags.gni")
11+
}
12+
913
# See //content/BUILD.gn for how this works.
1014
group("renderer") {
1115
if (is_component_build) {

content/public/renderer/content_renderer_client.cc

+4
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,8 @@ ContentRendererClient::CreateCastStreamingResourceProvider() {
274274
}
275275
#endif
276276

277+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
278+
void ContentRendererClient::GetStarboardRendererFactoryTraits(
279+
media::RendererFactoryTraits* renderer_factory_traits) {}
280+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
277281
} // namespace content

content/public/renderer/content_renderer_client.h

+11
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include "ui/base/page_transition_types.h"
3535
#include "v8/include/v8-forward.h"
3636

37+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
38+
#include "media/base/starboard/renderer_factory_traits.h"
39+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
40+
3741
#if !BUILDFLAG(IS_ANDROID)
3842
#include "media/base/speech_recognition_client.h"
3943
#endif
@@ -429,6 +433,13 @@ class CONTENT_EXPORT ContentRendererClient {
429433
virtual std::unique_ptr<cast_streaming::ResourceProvider>
430434
CreateCastStreamingResourceProvider();
431435
#endif
436+
437+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
438+
// This is used for StarboardRenderer to acquire customizations
439+
// as MojoRenderer from cobalt_content_renderer_client.cc.
440+
virtual void GetStarboardRendererFactoryTraits(
441+
media::RendererFactoryTraits* renderer_factory_traits);
442+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
432443
};
433444

434445
} // namespace content

content/renderer/media/media_factory.cc

+14-11
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@
9292
#include "media/cdm/fuchsia/fuchsia_cdm_factory.h"
9393
#include "media/fuchsia/video/fuchsia_decoder_factory.h"
9494
#include "media/mojo/clients/mojo_fuchsia_cdm_provider.h"
95-
#elif BUILDFLAG(USE_STARBOARD_MEDIA)
96-
#include "media/starboard/starboard_cdm_factory.h"
9795
#elif BUILDFLAG(ENABLE_MOJO_CDM)
9896
#include "media/mojo/clients/mojo_cdm_factory.h" // nogncheck
9997
#else
@@ -136,6 +134,11 @@
136134
#include "media/mojo/mojom/speech_recognition_service.mojom.h"
137135
#endif // BUILDFLAG(IS_WIN)
138136

137+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
138+
#include "media/base/starboard/renderer_factory_traits.h"
139+
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
140+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
141+
139142
namespace {
140143

141144
// This limit is much higher than it needs to be right now, because the logic
@@ -570,15 +573,8 @@ MediaFactory::CreateRendererFactorySelector(
570573
base::Unretained(render_thread)));
571574
if (factory) {
572575
is_base_renderer_factory_set = true;
573-
#if BUILDFLAG(USE_STARBOARD_MEDIA)
574-
// TODO(b/326827007): Revisit renderer to support secondary videos.
575-
// TODO(b/394368542): Add Content API to create StarboardRenderer.
576-
factory_selector->AddBaseFactory(RendererType::kStarboard,
577-
std::move(factory));
578-
#else // BUILDFLAG(USE_STARBOARD_MEDIA)
579576
factory_selector->AddBaseFactory(RendererType::kContentEmbedderDefined,
580577
std::move(factory));
581-
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
582578
}
583579

584580
#if BUILDFLAG(IS_ANDROID)
@@ -619,6 +615,15 @@ MediaFactory::CreateRendererFactorySelector(
619615
#endif // BUILDFLAG(IS_ANDROID)
620616

621617
#if BUILDFLAG(ENABLE_MOJO_RENDERER)
618+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
619+
// TODO(b/326827007): Revisit renderer to support secondary videos.
620+
media::RendererFactoryTraits renderer_factory_traits;
621+
GetContentClient()->renderer()->GetStarboardRendererFactoryTraits(&renderer_factory_traits);
622+
is_base_renderer_factory_set = true;
623+
factory_selector->AddBaseFactory(RendererType::kStarboard,
624+
std::make_unique<media::StarboardRendererClientFactory>(media_log,
625+
CreateMojoRendererFactory(), &renderer_factory_traits));
626+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
622627
if (!is_base_renderer_factory_set &&
623628
renderer_media_playback_options.is_mojo_renderer_enabled()) {
624629
is_base_renderer_factory_set = true;
@@ -864,8 +869,6 @@ media::CdmFactory* MediaFactory::GetCdmFactory() {
864869
DCHECK(interface_broker_);
865870
cdm_factory_ = std::make_unique<media::FuchsiaCdmFactory>(
866871
std::make_unique<media::MojoFuchsiaCdmProvider>(interface_broker_));
867-
#elif BUILDFLAG(USE_STARBOARD_MEDIA)
868-
cdm_factory_ = std::make_unique<media::StarboardCdmFactory>();
869872
#elif BUILDFLAG(ENABLE_MOJO_CDM)
870873
cdm_factory_ =
871874
std::make_unique<media::MojoCdmFactory>(GetMediaInterfaceFactory());

content/renderer/media/media_interface_factory.cc

+33
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,39 @@ void MediaInterfaceFactory::CreateMediaFoundationRenderer(
189189
}
190190
#endif // BUILDFLAG(IS_WIN)
191191

192+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
193+
void MediaInterfaceFactory::CreateStarboardRenderer(
194+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
195+
const base::UnguessableToken& overlay_plane_id,
196+
base::TimeDelta audio_write_duration_local,
197+
base::TimeDelta video_write_duration_remote,
198+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
199+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
200+
renderer_extension_receiver,
201+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
202+
client_extension_remote) {
203+
if (!task_runner_->BelongsToCurrentThread()) {
204+
task_runner_->PostTask(
205+
FROM_HERE,
206+
base::BindOnce(&MediaInterfaceFactory::CreateStarboardRenderer,
207+
weak_this_, std::move(media_log_remote),
208+
overlay_plane_id, audio_write_duration_local,
209+
video_write_duration_remote,
210+
std::move(receiver),
211+
std::move(renderer_extension_receiver),
212+
std::move(client_extension_remote)));
213+
return;
214+
}
215+
216+
DVLOG(1) << __func__;
217+
GetMediaInterfaceFactory()->CreateStarboardRenderer(
218+
std::move(media_log_remote), overlay_plane_id,
219+
audio_write_duration_local, video_write_duration_remote,
220+
std::move(receiver), std::move(renderer_extension_receiver),
221+
std::move(client_extension_remote));
222+
}
223+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
224+
192225
void MediaInterfaceFactory::CreateCdm(const media::CdmConfig& cdm_config,
193226
CreateCdmCallback callback) {
194227
if (!task_runner_->BelongsToCurrentThread()) {

content/renderer/media/media_interface_factory.h

+12
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ class MediaInterfaceFactory final : public media::mojom::InterfaceFactory {
8383
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
8484
client_extension_remote) final;
8585
#endif // BUILDFLAG(IS_WIN)
86+
#if BUILDFLAG(USE_STARBOARD_MEDIA)
87+
void CreateStarboardRenderer(
88+
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
89+
const base::UnguessableToken& overlay_plane_id,
90+
base::TimeDelta audio_write_duration_local,
91+
base::TimeDelta video_write_duration_remote,
92+
mojo::PendingReceiver<media::mojom::Renderer> receiver,
93+
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
94+
renderer_extension_receiver,
95+
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
96+
client_extension_remote) final;
97+
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
8698
void CreateCdm(const media::CdmConfig& cdm_config,
8799
CreateCdmCallback callback) final;
88100

media/base/BUILD.gn

+4-1
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,10 @@ source_set("base") {
463463
}
464464

465465
if (is_cobalt && use_starboard_media) {
466-
sources += [ "starboard/demuxer_memory_limit_starboard.cc" ]
466+
sources += [
467+
"starboard/demuxer_memory_limit_starboard.cc",
468+
"starboard/renderer_factory_traits.h",
469+
]
467470
} else if (is_android) {
468471
sources += [ "demuxer_memory_limit_android.cc" ]
469472
} else if (is_castos) {

0 commit comments

Comments
 (0)