Skip to content
Closed
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
6 changes: 6 additions & 0 deletions build/build_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,12 @@
#define BUILDFLAG_INTERNAL_USE_STARBOARD_MEDIA() (0)
#endif

#if defined(ENABLE_BUILDFLAG_USE_STARBOARD_URL_PLAYER)
#define BUILDFLAG_INTERNAL_USE_STARBOARD_URL_PLAYER() (1)
#else
#define BUILDFLAG_INTERNAL_USE_STARBOARD_URL_PLAYER() (0)
#endif

#if defined(ENABLE_BUILDFLAG_USE_EVERGREEN)
#define BUILDFLAG_INTERNAL_USE_EVERGREEN() (1)
#else
Expand Down
8 changes: 8 additions & 0 deletions cobalt/build/configs/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ config("buildflag_defines") {
defines += [ "ENABLE_BUILDFLAG_USE_STARBOARD_MEDIA" ]
}

# use_starboard_url_player and BUILDFLAG(USE_STARBOARD_URL_PLAYER) should be
# used to wrap URL-based player functionality (e.g., HLS via AVPlayer on
# tvOS). This is a derived capability that is true only for tvOS builds with
# Starboard media enabled.
if (use_starboard_url_player) {
defines += [ "ENABLE_BUILDFLAG_USE_STARBOARD_URL_PLAYER" ]
}

# use_evergreen and BUILDFLAG(USE_EVERGREEN) should be used for
# Evergreen-specific functionality, i.e. the Evergreen loader_app. Do not use
# this flag for hermetic build functionality, instead use
Expand Down
19 changes: 19 additions & 0 deletions cobalt/renderer/cobalt_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include "base/task/bind_post_task.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "cobalt/media/service/mojom/platform_window_provider.mojom.h"
#include "cobalt/renderer/cobalt_render_frame_observer.h"
#include "cobalt/shell/common/url_constants.h"
Expand All @@ -30,6 +31,7 @@
#include "media/base/key_systems_support_registration.h"
#include "media/base/media_log.h"
#include "media/base/renderer_factory.h"
#include "media/media_buildflags.h"
#include "media/mojo/clients/starboard/starboard_renderer_client_factory.h"
#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
#include "starboard/media.h"
Expand All @@ -41,6 +43,9 @@
#include "third_party/blink/public/web/web_security_policy.h"
#include "third_party/blink/public/web/web_view.h"
#include "ui/gfx/geometry/size_conversions.h"
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
#include "media/starboard/url_player_demuxer.h"
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

namespace cobalt {

Expand Down Expand Up @@ -509,4 +514,18 @@ void CobaltContentRendererClient::PostSandboxInitialized() {
}
}

std::unique_ptr<::media::Demuxer>
CobaltContentRendererClient::OverrideDemuxerForUrl(
content::RenderFrame* render_frame,
const GURL& url,
scoped_refptr<base::SequencedTaskRunner> task_runner) {
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
if (::media::IsHlsUrl(url)) {
return std::make_unique<::media::UrlPlayerDemuxer>(std::move(task_runner),
url);
}
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)
return nullptr;
}

} // namespace cobalt
6 changes: 6 additions & 0 deletions cobalt/renderer/cobalt_content_renderer_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#define COBALT_RENDERER_COBALT_CONTENT_RENDERER_CLIENT_H_

#include <atomic>
#include <memory>

#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
Expand All @@ -26,6 +27,7 @@
#include "cobalt/media/audio/cobalt_audio_device_factory.h"
#include "cobalt/media/service/mojom/platform_window_provider.mojom.h"
#include "content/public/renderer/content_renderer_client.h"
#include "media/base/demuxer.h"
#include "media/base/key_systems_support_registration.h"
#include "media/base/starboard/renderer_factory_traits.h"
#include "mojo/public/cpp/bindings/remote.h"
Expand Down Expand Up @@ -66,6 +68,10 @@ class CobaltContentRendererClient : public content::ContentRendererClient {
void GetStarboardRendererFactoryTraits(
::media::RendererFactoryTraits* traits) override;
void PostSandboxInitialized() override;
std::unique_ptr<::media::Demuxer> OverrideDemuxerForUrl(
content::RenderFrame* render_frame,
const GURL& url,
scoped_refptr<base::SequencedTaskRunner> task_runner) override;

uint64_t GetSbWindowHandle() const { return sb_window_handle_; }

Expand Down
11 changes: 11 additions & 0 deletions content/browser/media/frameless_media_interface_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,17 @@ void FramelessMediaInterfaceProxy::CreateStarboardRenderer(
client_extension_remote) {}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void FramelessMediaInterfaceProxy::CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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_URL_PLAYER)

void FramelessMediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) {
std::move(callback).Run(mojo::NullRemote(), nullptr,
Expand Down
10 changes: 10 additions & 0 deletions content/browser/media/frameless_media_interface_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,16 @@ class FramelessMediaInterfaceProxy final
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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_URL_PLAYER)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) final;

Expand Down
22 changes: 22 additions & 0 deletions content/browser/media/media_interface_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,28 @@ void MediaInterfaceProxy::CreateStarboardRenderer(
}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void MediaInterfaceProxy::CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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->CreateUrlPlayerRenderer(
std::move(media_log_remote), config,
std::move(receiver), std::move(renderer_extension_receiver),
std::move(client_extension_remote));
}
}
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

void MediaInterfaceProxy::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback create_cdm_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
Expand Down
10 changes: 10 additions & 0 deletions content/browser/media/media_interface_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,16 @@ class MediaInterfaceProxy final : public DocumentUserData<MediaInterfaceProxy>,
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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_URL_PLAYER)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback create_cdm_cb) final;

Expand Down
18 changes: 16 additions & 2 deletions content/renderer/media/media_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@
#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)
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
#include "media/mojo/clients/starboard/url_player_renderer_client_factory.h"
#include "media/starboard/url_player_demuxer.h"
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

namespace {

Expand Down Expand Up @@ -616,7 +620,17 @@ MediaFactory::CreateRendererFactorySelector(
base::BindRepeating(&RenderThreadImpl::GetGpuFactories,
base::Unretained(render_thread)),
&renderer_factory_traits));
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
GURL media_url(url);
factory_selector->AddConditionalFactory(
RendererType::kUrlPlayer,
std::make_unique<media::UrlPlayerRendererClientFactory>(
media_log, CreateMojoRendererFactory(), &renderer_factory_traits),
base::BindRepeating(
[](const GURL& u) { return media::IsHlsUrl(u); },
media_url));
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)
#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
27 changes: 27 additions & 0 deletions content/renderer/media/media_interface_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,33 @@ void MediaInterfaceFactory::CreateStarboardRenderer(
}
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)

#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void MediaInterfaceFactory::CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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::CreateUrlPlayerRenderer,
weak_this_, std::move(media_log_remote),
config, std::move(receiver),
std::move(renderer_extension_receiver),
std::move(client_extension_remote)));
return;
}

GetMediaInterfaceFactory()->CreateUrlPlayerRenderer(
std::move(media_log_remote), config,
std::move(receiver), std::move(renderer_extension_receiver),
std::move(client_extension_remote));
}
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

void MediaInterfaceFactory::CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) {
if (!task_runner_->BelongsToCurrentThread()) {
Expand Down
10 changes: 10 additions & 0 deletions content/renderer/media/media_interface_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,16 @@ class MediaInterfaceFactory final : public media::mojom::InterfaceFactory {
mojo::PendingRemote<media::mojom::StarboardRendererClientExtension>
client_extension_remote) final;
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
void CreateUrlPlayerRenderer(
mojo::PendingRemote<media::mojom::MediaLog> media_log_remote,
const media::StarboardRendererConfig& config,
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_URL_PLAYER)
void CreateCdm(const media::CdmConfig& cdm_config,
CreateCdmCallback callback) final;

Expand Down
1 change: 1 addition & 0 deletions media/base/demuxer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ enum class DemuxerType {
kFrameInjectingDemuxer = 5,
kStreamProviderDemuxer = 6,
kManifestDemuxer = 7,
kUrlPlayerDemuxer = 8, // URL-based native player (e.g., HLS on tvOS).
};

class MEDIA_EXPORT DemuxerHost {
Expand Down
7 changes: 7 additions & 0 deletions media/base/media_resource.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "media/base/media_resource.h"

#include "base/no_destructor.h"
#include "media/media_buildflags.h"
#include "net/cookies/site_for_cookies.h"
#include "net/storage_access_api/status.h"
#include "url/gurl.h"
Expand All @@ -25,4 +26,10 @@ DemuxerStream* MediaResource::GetFirstStream(DemuxerStream::Type type) {
return nullptr;
}

#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
GURL MediaResource::GetMediaUrl() const {
return GURL();
}
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

} // namespace media
10 changes: 10 additions & 0 deletions media/base/media_resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
#include "base/time/time.h"
#include "media/base/demuxer_stream.h"
#include "media/base/media_export.h"
#include "build/build_config.h"
#include "media/media_buildflags.h"
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
#include "url/gurl.h"
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)

namespace media {

Expand Down Expand Up @@ -41,6 +46,11 @@ class MEDIA_EXPORT MediaResource {
// A helper function that return the first stream of the given `type` if one
// exists or a null pointer if there is no streams of that type.
DemuxerStream* GetFirstStream(DemuxerStream::Type type);

#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
// Returns the media URL for URL based players (e.g., HLS via AVPlayer).
virtual GURL GetMediaUrl() const;
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)
};

} // namespace media
Expand Down
8 changes: 7 additions & 1 deletion media/base/renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
// found in the LICENSE file.

#include "media/base/renderer.h"

#include "base/logging.h"
#include "build/build_config.h"

namespace media {

Expand Down Expand Up @@ -34,7 +36,11 @@ std::string GetRendererName(RendererType renderer_type) {
#if BUILDFLAG(USE_STARBOARD_MEDIA)
case RendererType::kStarboard:
return "StarboardRenderer";
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
case RendererType::kUrlPlayer:
return "UrlPlayerRenderer";
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)
}
}

Expand Down
10 changes: 8 additions & 2 deletions media/base/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "base/functional/callback.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "media/base/buffering_state.h"
#include "media/base/demuxer_stream.h"
#include "media/base/media_export.h"
Expand Down Expand Up @@ -39,10 +40,15 @@ enum class RendererType {
kTest = 11, // Renderer implementations used in tests
#if BUILDFLAG(USE_STARBOARD_MEDIA)
kStarboard = 12, // StarboardRendererFactory
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#if BUILDFLAG(USE_STARBOARD_URL_PLAYER)
kUrlPlayer = 13, // UrlPlayerRendererClientFactory
kMaxValue = kUrlPlayer,
#elif BUILDFLAG(USE_STARBOARD_MEDIA)
kMaxValue = kStarboard,
#else // BUILDFLAG(USE_STARBOARD_MEDIA)
#else
kMaxValue = kTest,
#endif // BUILDFLAG(USE_STARBOARD_MEDIA)
#endif // BUILDFLAG(USE_STARBOARD_URL_PLAYER)
};

// Get the name of the Renderer for `renderer_type`. The returned name could be
Expand Down
Loading
Loading