1414
1515#include " media/mojo/clients/starboard/starboard_renderer_client.h"
1616
17+ #include < atomic>
18+
19+ #include " base/feature_list.h"
1720#include " base/functional/bind.h"
1821#include " base/time/time.h"
1922#include " base/unguessable_token.h"
2023#include " media/base/media_log.h"
2124#include " media/base/media_resource.h"
25+ #include " media/base/media_switches.h"
2226#include " media/base/video_frame.h"
2327#include " media/mojo/clients/mojo_renderer.h"
2428#include " media/renderers/video_overlay_factory.h"
2529#include " media/video/gpu_video_accelerator_factories.h"
30+ #include " mojo/public/cpp/bindings/callback_helpers.h"
2631#include " mojo/public/cpp/bindings/pending_receiver.h"
2732
2833#if BUILDFLAG(IS_ANDROID)
3136
3237namespace media {
3338
39+ namespace {
40+ std::atomic<uint32_t > g_next_bypass_id{1 };
41+ } // namespace
42+
3443StarboardRendererClient::StarboardRendererClient (
3544 const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
3645 std::unique_ptr<MediaLog> media_log,
@@ -45,7 +54,8 @@ StarboardRendererClient::StarboardRendererClient(
4554 ,
4655 RequestOverlayInfoCB request_overlay_info_cb
4756#endif // BUILDFLAG(IS_ANDROID)
48- )
57+ ,
58+ bool bypass_mojo_for_media)
4959 : MojoRendererWrapper(std::move(mojo_renderer)),
5060 media_task_runner_ (media_task_runner),
5161 media_log_(std::move(media_log)),
@@ -60,7 +70,8 @@ StarboardRendererClient::StarboardRendererClient(
6070 ,
6171 request_overlay_info_cb_ (std::move(request_overlay_info_cb))
6272#endif // BUILDFLAG(IS_ANDROID)
63- {
73+ ,
74+ bypass_mojo_for_media_ (bypass_mojo_for_media) {
6475 DCHECK (media_task_runner_);
6576 DCHECK (video_renderer_sink_);
6677 DCHECK (video_overlay_factory_);
@@ -71,6 +82,11 @@ StarboardRendererClient::~StarboardRendererClient() {
7182 SetPlayingState (false );
7283 DCHECK (!video_renderer_sink_started_);
7384
85+ if (bypass_bridge_) {
86+ bypass_bridge_->Invalidate ();
87+ BypassBridgeRegistry::Unregister (bypass_id_);
88+ }
89+
7490#if BUILDFLAG(IS_ANDROID)
7591 if (request_overlay_info_cb_ && overlay_info_requested_) {
7692 request_overlay_info_cb_.Run (false , base::NullCallback ());
@@ -334,6 +350,72 @@ void StarboardRendererClient::InitializeMojoRenderer(
334350 PipelineStatusCallback init_cb) {
335351 DCHECK (media_task_runner_->RunsTasksInCurrentSequence ());
336352 DCHECK (AreMojoPipesConnected ());
353+
354+ if (base::FeatureList::IsEnabled (kCobaltBypassMojoForMedia ) ||
355+ bypass_mojo_for_media_) {
356+ bypass_bridge_ = base::MakeRefCounted<MojoRendererBypassBridge>(
357+ media_task_runner_,
358+ base::BindRepeating (&StarboardRendererClient::OnTimeUpdateFromBridge,
359+ weak_factory_.GetWeakPtr ()),
360+ base::BindRepeating (
361+ &StarboardRendererClient::OnStatisticsUpdateFromBridge,
362+ weak_factory_.GetWeakPtr ()));
363+ DemuxerStream* audio_stream =
364+ media_resource->GetFirstStream (DemuxerStream::AUDIO );
365+ DemuxerStream* video_stream =
366+ media_resource->GetFirstStream (DemuxerStream::VIDEO );
367+ bypass_bridge_->SetStreams (audio_stream, video_stream);
368+ bypass_id_ = g_next_bypass_id.fetch_add (1 );
369+ BypassBridgeRegistry::Register (bypass_id_, bypass_bridge_);
370+ renderer_extension_->InitializeWithBypassBridge (
371+ bypass_id_,
372+ mojo::WrapCallbackWithDefaultInvokeIfNotRun (
373+ base::BindOnce (
374+ &StarboardRendererClient::OnExtensionBypassInitialized,
375+ weak_factory_.GetWeakPtr (), media_resource, client,
376+ std::move (init_cb)),
377+ false ));
378+ return ;
379+ }
380+
381+ MojoRendererWrapper::Initialize (media_resource, client, std::move (init_cb));
382+ }
383+
384+ void StarboardRendererClient::OnTimeUpdateFromBridge (
385+ base::TimeDelta time,
386+ base::TimeDelta max_time,
387+ base::TimeTicks capture_time) {
388+ DCHECK (media_task_runner_->RunsTasksInCurrentSequence ());
389+ if (mojo_renderer ()) {
390+ mojo_renderer ()->OnTimeUpdate (time, max_time, capture_time);
391+ }
392+ }
393+
394+ void StarboardRendererClient::OnStatisticsUpdateFromBridge (
395+ const PipelineStatistics& stats) {
396+ DCHECK (media_task_runner_->RunsTasksInCurrentSequence ());
397+ if (mojo_renderer ()) {
398+ mojo_renderer ()->OnStatisticsUpdate (stats);
399+ }
400+ }
401+
402+ void StarboardRendererClient::OnExtensionBypassInitialized (
403+ MediaResource* media_resource,
404+ RendererClient* client,
405+ PipelineStatusCallback init_cb,
406+ bool success) {
407+ DCHECK (media_task_runner_->RunsTasksInCurrentSequence ());
408+ if (!success) {
409+ if (bypass_bridge_) {
410+ bypass_bridge_->Invalidate ();
411+ BypassBridgeRegistry::Unregister (bypass_id_);
412+ bypass_bridge_ = nullptr ;
413+ }
414+ if (init_cb) {
415+ std::move (init_cb).Run (PIPELINE_ERROR_INITIALIZATION_FAILED );
416+ }
417+ return ;
418+ }
337419 MojoRendererWrapper::Initialize (media_resource, client, std::move (init_cb));
338420}
339421
0 commit comments