blob: bc8423e9c05bb474a585f38f78b564c7e73a0c84 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_STARBOARD_MEDIA_RENDERER_STARBOARD_RENDERER_H_
#define CHROMECAST_STARBOARD_MEDIA_RENDERER_STARBOARD_RENDERER_H_
#include <memory>
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "chromecast/starboard/media/media/starboard_api_wrapper.h"
#include "chromecast/starboard/media/renderer/geometry_change_handler.h"
#include "chromecast/starboard/media/renderer/starboard_player_manager.h"
#include "media/base/pipeline_status.h"
#include "media/base/renderer.h"
#include "media/base/renderer_client.h"
namespace chromecast {
namespace metrics {
class CastMetricsHelper;
} // namespace metrics
namespace media {
class VideoGeometrySetterService;
// A renderer implementation that calls into an SbPlayer for decoding and
// rendering.
//
// All public functions of this class must be called on a single sequence
// (media_task_runner, passed into the constructor).
class StarboardRenderer : public ::media::Renderer {
public:
StarboardRenderer(
std::unique_ptr<StarboardApiWrapper> starboard,
scoped_refptr<base::SequencedTaskRunner> media_task_runner,
const base::UnguessableToken& overlay_plane_id,
bool enable_buffering,
VideoGeometrySetterService* geometry_setter_service,
chromecast::metrics::CastMetricsHelper* cast_metrics_helper);
// Disallow copy and assign.
StarboardRenderer(const StarboardRenderer&) = delete;
StarboardRenderer& operator=(const StarboardRenderer&) = delete;
~StarboardRenderer() override;
// Renderer implementation:
void Initialize(::media::MediaResource* media_resource,
::media::RendererClient* client,
::media::PipelineStatusCallback init_cb) override;
void SetCdm(::media::CdmContext* cdm_context,
CdmAttachedCB cdm_attached_cb) override;
void SetLatencyHint(std::optional<base::TimeDelta> latency_hint) override;
void Flush(base::OnceClosure flush_cb) override;
void StartPlayingFrom(base::TimeDelta time) override;
void SetPlaybackRate(double playback_rate) override;
void SetVolume(float volume) override;
base::TimeDelta GetMediaTime() override;
::media::RendererType GetRendererType() override;
// If cast needs to support track changes in the future,
// OnSelectedVideoTracksChanged and OnEnabledAudioTracksChanged should be
// overridden here.
private:
// Creates the underlying SbPlayer object and runs init_cb.
void InitializeInternal(::media::PipelineStatusCallback init_cb);
std::unique_ptr<StarboardApiWrapper> starboard_;
scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
raw_ptr<::media::RendererClient> client_ = nullptr;
std::unique_ptr<StarboardPlayerManager> player_manager_;
// This must be destructed before starboard_.
GeometryChangeHandler geometry_change_handler_;
raw_ptr<chromecast::metrics::CastMetricsHelper> cast_metrics_helper_ =
nullptr;
bool enable_buffering_ = true;
// Whether a Cast.Platform.Ended message has already been reported for this
// play. Used to avoid double reporting the Cast.Platform.Ended metric.
bool end_reported_ = false;
// This is set if a volume change is made before SbPlayer is created.
std::optional<float> pending_volume_;
// This should be destructed first, to invalidate any references to this.
base::WeakPtrFactory<StarboardRenderer> weak_factory_{this};
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_STARBOARD_MEDIA_RENDERER_STARBOARD_RENDERER_H_