#ifndef MEDIA_REMOTING_RECEIVER_H_
#define MEDIA_REMOTING_RECEIVER_H_
#include <memory>
#include "base/functional/callback_forward.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/task/single_thread_task_runner.h"
#include "base/timer/timer.h"
#include "media/base/buffering_state.h"
#include "media/base/demuxer_stream.h"
#include "media/base/renderer.h"
#include "media/base/renderer_client.h"
#include "media/cast/openscreen/rpc_call_message_handler.h"
#include "third_party/openscreen/src/cast/streaming/public/rpc_messenger.h"
#include "third_party/openscreen/src/cast/streaming/remoting.pb.h"
namespace openscreen {
namespace cast {
class RpcMessenger;
}
}
namespace base {
class SingleThreadTaskRunner;
}
namespace media {
namespace remoting {
class ReceiverController;
class Receiver final : public Renderer,
public RendererClient,
public media::cast::RpcRendererCallMessageHandler {
public:
Receiver(int rpc_handle,
int remote_handle,
ReceiverController* receiver_controller,
const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
std::unique_ptr<Renderer> renderer,
base::OnceCallback<void(int)> acquire_renderer_done_cb);
~Receiver() override;
void Initialize(MediaResource* media_resource,
RendererClient* client,
#if BUILDFLAG(ARKWEB_VIDEO_ASSISTANT)
RequestSurfaceCB request_surface_cb,
VideoDecoderChangedCB decoder_changed_cb,
#endif
PipelineStatusCallback init_cb) override;
void SetCdm(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;
RendererType GetRendererType() override;
void OnError(PipelineStatus status) override;
void OnFallback(PipelineStatus status) override;
void OnEnded() override;
void OnStatisticsUpdate(const PipelineStatistics& stats) override;
void OnBufferingStateChange(BufferingState state,
BufferingStateChangeReason reason) override;
void OnWaiting(WaitingReason reason) override;
void OnAudioConfigChange(const AudioDecoderConfig& config) override;
void OnVideoConfigChange(const VideoDecoderConfig& config) override;
void OnVideoNaturalSizeChange(const gfx::Size& size) override;
void OnVideoOpacityChange(bool opaque) override;
void OnVideoFrameRateChange(std::optional<int>) override;
void SetRemoteHandle(int remote_handle);
base::WeakPtr<Receiver> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
private:
void OnRpcInitialize() override;
void OnRpcSetPlaybackRate(double playback_rate) override;
void OnRpcFlush(uint32_t audio_count, uint32_t video_count) override;
void OnRpcStartPlayingFrom(base::TimeDelta time) override;
void OnRpcSetVolume(double volume) override;
void SendRpcMessageOnMainThread(
std::unique_ptr<openscreen::cast::RpcMessage> message);
void OnReceivedRpc(std::unique_ptr<openscreen::cast::RpcMessage> message);
void ShouldInitializeRenderer();
void OnRendererInitialized(PipelineStatus status);
void VerifyAcquireRendererDone();
void OnFlushDone();
void ScheduleMediaTimeUpdates();
void SendMediaTimeUpdate();
PipelineStatusCallback init_cb_;
bool rpc_initialize_received_ = false;
raw_ptr<MediaResource> demuxer_ = nullptr;
const int rpc_handle_;
int remote_handle_;
const raw_ptr<ReceiverController>
receiver_controller_;
const raw_ptr<openscreen::cast::RpcMessenger>
rpc_messenger_;
const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
std::unique_ptr<Renderer> renderer_;
base::OnceCallback<void(int)> acquire_renderer_done_cb_;
base::RepeatingTimer time_update_timer_;
base::WeakPtrFactory<Receiver> weak_factory_{this};
};
}
}
#endif