1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_REMOTING_RECEIVER_H_
6 #define MEDIA_REMOTING_RECEIVER_H_
10 #include "base/functional/callback_forward.h"
11 #include "base/memory/raw_ptr.h"
12 #include "base/memory/scoped_refptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/task/sequenced_task_runner.h"
15 #include "base/task/single_thread_task_runner.h"
16 #include "base/timer/timer.h"
17 #include "media/base/buffering_state.h"
18 #include "media/base/demuxer_stream.h"
19 #include "media/base/renderer.h"
20 #include "media/base/renderer_client.h"
21 #include "media/cast/openscreen/rpc_call_message_handler.h"
22 #include "third_party/openscreen/src/cast/streaming/remoting.pb.h"
23 #include "third_party/openscreen/src/cast/streaming/rpc_messenger.h"
25 namespace openscreen {
29 } // namespace openscreen
32 class SingleThreadTaskRunner;
38 class ReceiverController;
40 // Receiver runs on a remote device, and forwards the information sent from a
41 // CourierRenderer to |renderer_|, which actually renders the media.
43 // Receiver implements media::Renderer to be able to work with
44 // WebMediaPlayerImpl. However, most of the APIs of media::Renderer are dummy
45 // functions, because the media playback of the remoting media is not controlled
46 // by the local pipeline of WMPI. It should be controlled by the remoting sender
47 // via RPC calls. When Receiver receives RPC calls, it will call the
48 // corresponding functions of |renderer_| to control the media playback of
49 // the remoting media.
50 class Receiver final : public Renderer,
51 public RendererClient,
52 public media::cast::RpcRendererCallMessageHandler {
54 Receiver(int rpc_handle,
56 ReceiverController* receiver_controller,
57 const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
58 std::unique_ptr<Renderer> renderer,
59 base::OnceCallback<void(int)> acquire_renderer_done_cb);
62 // Renderer implementation
63 void Initialize(MediaResource* media_resource,
64 RendererClient* client,
65 PipelineStatusCallback init_cb) override;
66 void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override;
67 void SetLatencyHint(absl::optional<base::TimeDelta> latency_hint) override;
68 void Flush(base::OnceClosure flush_cb) override;
69 void StartPlayingFrom(base::TimeDelta time) override;
70 void SetPlaybackRate(double playback_rate) override;
71 void SetVolume(float volume) override;
72 base::TimeDelta GetMediaTime() override;
73 RendererType GetRendererType() override;
75 // RendererClient implementation.
76 void OnError(PipelineStatus status) override;
77 void OnFallback(PipelineStatus status) override;
78 void OnEnded() override;
79 void OnStatisticsUpdate(const PipelineStatistics& stats) override;
80 void OnBufferingStateChange(BufferingState state,
81 BufferingStateChangeReason reason) override;
82 void OnWaiting(WaitingReason reason) override;
83 void OnAudioConfigChange(const AudioDecoderConfig& config) override;
84 void OnVideoConfigChange(const VideoDecoderConfig& config) override;
85 void OnVideoNaturalSizeChange(const gfx::Size& size) override;
86 void OnVideoOpacityChange(bool opaque) override;
87 void OnVideoFrameRateChange(absl::optional<int>) override;
89 // Used to set |remote_handle_| after Receiver is created, because the remote
90 // handle might be received after Receiver is created.
91 void SetRemoteHandle(int remote_handle);
93 base::WeakPtr<Receiver> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
96 // media::cast::RpcCallMessageHandler overrides.
97 void OnRpcInitialize() override;
98 void OnRpcSetPlaybackRate(double playback_rate) override;
99 void OnRpcFlush(uint32_t audio_count, uint32_t video_count) override;
100 void OnRpcStartPlayingFrom(base::TimeDelta time) override;
101 void OnRpcSetVolume(double volume) override;
103 // Send RPC message on |main_task_runner_|.
104 void SendRpcMessageOnMainThread(
105 std::unique_ptr<openscreen::cast::RpcMessage> message);
107 // Callback function when RPC message is received.
108 void OnReceivedRpc(std::unique_ptr<openscreen::cast::RpcMessage> message);
110 void ShouldInitializeRenderer();
111 void OnRendererInitialized(PipelineStatus status);
112 void VerifyAcquireRendererDone();
115 // Periodically send the UpdateTime RPC message to update the media time.
116 void ScheduleMediaTimeUpdates();
117 void SendMediaTimeUpdate();
119 // The callback function to call when |this| is initialized.
120 PipelineStatusCallback init_cb_;
122 // Indicates whether |this| received RPC_R_INITIALIZE message or not.
123 bool rpc_initialize_received_ = false;
125 // Owns by the WebMediaPlayerImpl instance.
126 raw_ptr<MediaResource> demuxer_ = nullptr;
128 // The handle of |this| for listening RPC messages.
129 const int rpc_handle_;
131 // The CourierRenderer handle on sender side. |remote_handle_| could be set
132 // through the ctor or SetRemoteHandle().
135 const raw_ptr<ReceiverController>
136 receiver_controller_; // Outlives this class.
137 const raw_ptr<openscreen::cast::RpcMessenger>
138 rpc_messenger_; // Outlives this class.
140 // Calling SendMessageCallback() of |rpc_messenger_| should be on main thread.
141 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
143 // Media tasks should run on media thread.
144 const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
146 // |renderer_| is the real renderer to render media.
147 std::unique_ptr<Renderer> renderer_;
149 // The callback function to send RPC_ACQUIRE_RENDERER_DONE.
150 base::OnceCallback<void(int)> acquire_renderer_done_cb_;
152 // The timer to periodically update the media time.
153 base::RepeatingTimer time_update_timer_;
155 base::WeakPtrFactory<Receiver> weak_factory_{this};
158 } // namespace remoting
161 #endif // MEDIA_REMOTING_RECEIVER_H_