Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[media] Move StarboardRenderer to MojoRenderer #5113

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions cobalt/build/configs/common.gn
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,11 @@ enable_platform_ac3_eac3_audio = true
# We use Angle+EGL based graphics pipeline, not Dawn path
# see //ui/gl/features.gni
use_dawn = false

# Use MojoRenderer for StarboardRenderer.
# Use MojoCdm for StarboardCdm.
mojo_media_host = "gpu"
mojo_media_services = [
"renderer",
"cdm",
]
1 change: 1 addition & 0 deletions cobalt/renderer/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ source_set("renderer") {
"//content/test:content_test_mojo_bindings",
"//media",
"//media/mojo:buildflags",
"//media/mojo/clients",
"//starboard:starboard_headers_only",
"//v8",
]
Expand Down
27 changes: 9 additions & 18 deletions cobalt/renderer/cobalt_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,10 @@
#include "components/js_injection/renderer/js_communication.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_thread.h"
#include "media/base/decoder_factory.h"
#include "media/base/media_log.h"
#include "media/base/renderer_factory.h"
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
#include "media/starboard/bind_host_receiver_callback.h"
#include "media/starboard/starboard_renderer_factory.h"
#include "media/video/gpu_video_accelerator_factories.h"
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
#include "starboard/media.h"
#include "starboard/player.h"
Expand Down Expand Up @@ -180,26 +178,19 @@ void CobaltContentRendererClient::BindHostReceiver(
BindHostReceiverWithValuation(std::move(receiver));
}

std::unique_ptr<::media::RendererFactory>
CobaltContentRendererClient::GetBaseRendererFactory(
content::RenderFrame* /* render_frame */,
::media::MediaLog* media_log,
::media::DecoderFactory* /* decoder_factory */,
base::RepeatingCallback<::media::GpuVideoAcceleratorFactories*()>
/* get_gpu_factories_cb */) {
void CobaltContentRendererClient::GetStarboardRendererFactoryTraits(
media::RendererFactoryTraits* renderer_factory_traits) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
// TODO(b/394368542): Add Content API to create StarboardRenderer.
base::TimeDelta audio_write_duration_local =
// TODO(b/383327725) - Cobalt: Inject these values from the web app.
renderer_factory_traits->audio_write_duration_local =
base::Microseconds(kSbPlayerWriteDurationLocal);
base::TimeDelta audio_write_duration_remote =
renderer_factory_traits->audio_write_duration_remote =
base::Microseconds(kSbPlayerWriteDurationRemote);
return std::make_unique<::media::StarboardRendererFactory>(
media_log,
// TODO(b/383327725) - Cobalt: Inject these values from the web app.
audio_write_duration_local, audio_write_duration_remote,
// TODO(b/405424096) - Cobalt: Move VideoGeometrySetterService to Gpu thread.
renderer_factory_traits->bind_host_receiver_callback =
base::BindPostTaskToCurrentDefault(
base::BindRepeating(&CobaltContentRendererClient::BindHostReceiver,
weak_factory_.GetWeakPtr())));
weak_factory_.GetWeakPtr()));
}

} // namespace cobalt
13 changes: 3 additions & 10 deletions cobalt/renderer/cobalt_content_renderer_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@
#include "base/threading/thread_checker.h"
#include "cobalt/media/audio/cobalt_audio_device_factory.h"
#include "content/public/renderer/content_renderer_client.h"
#include "media/base/starboard/renderer_factory_traits.h"

namespace content {
class RenderFrame;
class RenderThread;
} // namespace content

namespace media {
class MediaLog;
class DecoderFactory;
class GpuVideoAcceleratorFactories;
class RendererFactory;
} // namespace media

Expand Down Expand Up @@ -48,13 +46,8 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
bool IsSupportedVideoType(const ::media::VideoType& type) override;
// JS Injection hook
void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override;
// TODO(b/394368542): Add Content API to create StarboardRenderer.
std::unique_ptr<::media::RendererFactory> GetBaseRendererFactory(
content::RenderFrame* render_frame,
::media::MediaLog* media_log,
::media::DecoderFactory* decoder_factory,
base::RepeatingCallback<::media::GpuVideoAcceleratorFactories*()>
get_gpu_factories_cb) override;
void GetStarboardRendererFactoryTraits(
media::RendererFactoryTraits* traits) override;

// Bind Host Receiver to VideoGeometryChangeSubscriber on Browser thread.
// This is called from StarboardRenderer with |BindPostTaskToCurrentDefault|
Expand Down
13 changes: 13 additions & 0 deletions content/browser/media/frameless_media_interface_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,19 @@ void FramelessMediaInterfaceProxy::CreateMediaFoundationRenderer(
client_extension_remote) {}
#endif // BUILDFLAG(IS_WIN)

#if BUILDFLAG(USE_STARBOARD_MEDIA)
void FramelessMediaInterfaceProxy::CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) {}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

void FramelessMediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) {
std::move(callback).Run(mojo::NullRemote(), nullptr, "CDM not supported");
Expand Down
12 changes: 12 additions & 0 deletions content/browser/media/frameless_media_interface_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,18 @@ class FramelessMediaInterfaceProxy final
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) final;

Expand Down
25 changes: 25 additions & 0 deletions content/browser/media/media_interface_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,31 @@ void MediaInterfaceProxy::CreateMediaFoundationRenderer(
}
#endif // BUILDFLAG(IS_WIN)

#if BUILDFLAG(USE_STARBOARD_MEDIA)
void MediaInterfaceProxy::CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) {
DCHECK(thread_checker_.CalledOnValidThread());
DVLOG(1) << __func__ << ": this=" << this;

InterfaceFactory* factory = media_interface_factory_ptr_->Get();
if (factory) {
factory->CreateStarboardRenderer(
std::move(media_log_remote), overlay_plane_id,
audio_write_duration_local, video_write_duration_remote,
std::move(receiver), std::move(renderer_extension_receiver),
std::move(client_extension_remote));
}
}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

void MediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback create_cdm_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
Expand Down
12 changes: 12 additions & 0 deletions content/browser/media/media_interface_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ class MediaInterfaceProxy final : public DocumentUserData<MediaInterfaceProxy>,
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback create_cdm_cb) final;

Expand Down
4 changes: 4 additions & 0 deletions content/public/renderer/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import("//build/config/features.gni")
import("//media/media_options.gni")
import("//ppapi/buildflags/buildflags.gni")

if (is_cobalt) {
import("//starboard/build/buildflags.gni")
}

# See //content/BUILD.gn for how this works.
group("renderer") {
if (is_component_build) {
Expand Down
4 changes: 4 additions & 0 deletions content/public/renderer/content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -274,4 +274,8 @@ ContentRendererClient::CreateCastStreamingResourceProvider() {
}
#endif

#if BUILDFLAG(USE_STARBOARD_MEDIA)
void ContentRendererClient::GetStarboardRendererFactoryTraits(
media::RendererFactoryTraits* renderer_factory_traits) {}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
} // namespace content
11 changes: 11 additions & 0 deletions content/public/renderer/content_renderer_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
#include "ui/base/page_transition_types.h"
#include "v8/include/v8-forward.h"

#if BUILDFLAG(USE_STARBOARD_MEDIA)
#include "media/base/starboard/renderer_factory_traits.h"
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

#if !BUILDFLAG(IS_ANDROID)
#include "media/base/speech_recognition_client.h"
#endif
Expand Down Expand Up @@ -429,6 +433,13 @@ class CONTENT_EXPORT ContentRendererClient {
virtual std::unique_ptr<cast_streaming::ResourceProvider>
CreateCastStreamingResourceProvider();
#endif

#if BUILDFLAG(USE_STARBOARD_MEDIA)
// This is used for StarboardRenderer to acquire customizations
// as MojoRenderer from cobalt_content_renderer_client.cc.
virtual void GetStarboardRendererFactoryTraits(
media::RendererFactoryTraits* renderer_factory_traits);
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
};

} // namespace content
Expand Down
25 changes: 14 additions & 11 deletions content/renderer/media/media_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,6 @@
#include "media/cdm/fuchsia/fuchsia_cdm_factory.h"
#include "media/fuchsia/video/fuchsia_decoder_factory.h"
#include "media/mojo/clients/mojo_fuchsia_cdm_provider.h"
#elif BUILDFLAG(USE_STARBOARD_MEDIA)
#include "media/starboard/starboard_cdm_factory.h"
#elif BUILDFLAG(ENABLE_MOJO_CDM)
#include "media/mojo/clients/mojo_cdm_factory.h" // nogncheck
#else
Expand Down Expand Up @@ -136,6 +134,11 @@
#include "media/mojo/mojom/speech_recognition_service.mojom.h"
#endif // BUILDFLAG(IS_WIN)

#if BUILDFLAG(USE_STARBOARD_MEDIA)
#include "media/base/starboard/renderer_factory_traits.h"
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

namespace {

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

#if BUILDFLAG(IS_ANDROID)
Expand Down Expand Up @@ -619,6 +615,15 @@ MediaFactory::CreateRendererFactorySelector(
#endif // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(ENABLE_MOJO_RENDERER)
#if BUILDFLAG(USE_STARBOARD_MEDIA)
// TODO(b/326827007): Revisit renderer to support secondary videos.
media::RendererFactoryTraits renderer_factory_traits;
GetContentClient()->renderer()->GetStarboardRendererFactoryTraits(&renderer_factory_traits);
is_base_renderer_factory_set = true;
factory_selector->AddBaseFactory(RendererType::kStarboard,
std::make_unique<media::StarboardRendererClientFactory>(media_log,
CreateMojoRendererFactory(), &renderer_factory_traits));
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
if (!is_base_renderer_factory_set &&
renderer_media_playback_options.is_mojo_renderer_enabled()) {
is_base_renderer_factory_set = true;
Expand Down Expand Up @@ -864,8 +869,6 @@ media::CdmFactory* MediaFactory::GetCdmFactory() {
DCHECK(interface_broker_);
cdm_factory_ = std::make_unique<media::FuchsiaCdmFactory>(
std::make_unique<media::MojoFuchsiaCdmProvider>(interface_broker_));
#elif BUILDFLAG(USE_STARBOARD_MEDIA)
cdm_factory_ = std::make_unique<media::StarboardCdmFactory>();
#elif BUILDFLAG(ENABLE_MOJO_CDM)
cdm_factory_ =
std::make_unique<media::MojoCdmFactory>(GetMediaInterfaceFactory());
Expand Down
33 changes: 33 additions & 0 deletions content/renderer/media/media_interface_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,39 @@ void MediaInterfaceFactory::CreateMediaFoundationRenderer(
}
#endif // BUILDFLAG(IS_WIN)

#if BUILDFLAG(USE_STARBOARD_MEDIA)
void MediaInterfaceFactory::CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) {
if (!task_runner_->BelongsToCurrentThread()) {
task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&MediaInterfaceFactory::CreateStarboardRenderer,
weak_this_, std::move(media_log_remote),
overlay_plane_id, audio_write_duration_local,
video_write_duration_remote,
std::move(receiver),
std::move(renderer_extension_receiver),
std::move(client_extension_remote)));
return;
}

DVLOG(1) << __func__;
GetMediaInterfaceFactory()->CreateStarboardRenderer(
std::move(media_log_remote), overlay_plane_id,
audio_write_duration_local, video_write_duration_remote,
std::move(receiver), std::move(renderer_extension_receiver),
std::move(client_extension_remote));
}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

void MediaInterfaceFactory::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) {
if (!task_runner_->BelongsToCurrentThread()) {
Expand Down
12 changes: 12 additions & 0 deletions content/renderer/media/media_interface_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,18 @@ class MediaInterfaceFactory final : public media::mojom::InterfaceFactory {
mojo::PendingRemote<media::mojom::MediaFoundationRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateStarboardRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const base::UnguessableToken& overlay_plane_id,
base::TimeDelta audio_write_duration_local,
base::TimeDelta video_write_duration_remote,
mojo::PendingReceiver<media::mojom::Renderer> receiver,
mojo::PendingReceiver<media::mojom::StarboardRendererExtension>
renderer_extension_receiver,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) final;

Expand Down
5 changes: 4 additions & 1 deletion media/base/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,10 @@ source_set("base") {
}

if (is_cobalt && use_starboard_media) {
sources += [ "starboard/demuxer_memory_limit_starboard.cc" ]
sources += [
"starboard/demuxer_memory_limit_starboard.cc",
"starboard/renderer_factory_traits.h",
]
} else if (is_android) {
sources += [ "demuxer_memory_limit_android.cc" ]
} else if (is_castos) {
Expand Down
Loading
Loading