summaryrefslogtreecommitdiff
path: root/chromium/media/remoting/receiver.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/remoting/receiver.h')
-rw-r--r--chromium/media/remoting/receiver.h119
1 files changed, 87 insertions, 32 deletions
diff --git a/chromium/media/remoting/receiver.h b/chromium/media/remoting/receiver.h
index 38d5f18f91b..8f0ac1154b2 100644
--- a/chromium/media/remoting/receiver.h
+++ b/chromium/media/remoting/receiver.h
@@ -5,30 +5,61 @@
#ifndef MEDIA_REMOTING_RECEIVER_H_
#define MEDIA_REMOTING_RECEIVER_H_
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
+#include "base/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/remoting/media_remoting_rpc.pb.h"
#include "media/remoting/rpc_broker.h"
-namespace media {
-class Renderer;
-class DecoderBuffer;
-} // namespace media
+namespace base {
+class SingleThreadTaskRunner;
+} // namespace base
namespace media {
namespace remoting {
+class ReceiverController;
class RpcBroker;
-class StreamProvider;
-// Media remoting receiver. Media streams are rendered by |renderer|.
-// |rpc_broker| outlives this class.
-class Receiver final : public RendererClient {
+// Receiver runs on a remote device, and forwards the information sent from a
+// CourierRenderer to |renderer_|, which actually renders the media.
+//
+// Receiver implements media::Renderer to be able to work with
+// WebMediaPlayerImpl. However, most of the APIs of media::Renderer are dummy
+// functions, because the media playback of the remoting media is not controlled
+// by the local pipeline of WMPI. It should be controlled by the remoting sender
+// via RPC calls. When Receiver receives RPC calls, it will call the
+// corresponding functions of |renderer_| to control the media playback of
+// the remoting media.
+class Receiver final : public Renderer, public RendererClient {
public:
- Receiver(std::unique_ptr<Renderer> renderer, RpcBroker* rpc_broker);
- ~Receiver();
+ Receiver(int rpc_handle,
+ int remote_handle,
+ ReceiverController* receiver_controller,
+ const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+ std::unique_ptr<Renderer> renderer,
+ base::OnceCallback<void(int)> acquire_renderer_done_cb);
+ ~Receiver() override;
+
+ // Renderer implementation
+ void Initialize(MediaResource* media_resource,
+ RendererClient* client,
+ PipelineStatusCallback init_cb) override;
+ void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override;
+ void SetLatencyHint(base::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;
// RendererClient implementation.
void OnError(PipelineStatus status) override;
@@ -43,46 +74,70 @@ class Receiver final : public RendererClient {
void OnVideoOpacityChange(bool opaque) override;
void OnVideoFrameRateChange(base::Optional<int>) override;
- void OnReceivedRpc(std::unique_ptr<pb::RpcMessage> message);
- void OnReceivedBuffer(DemuxerStream::Type type,
- scoped_refptr<DecoderBuffer> buffer);
+ // Used to set |remote_handle_| after Receiver is created, because the remote
+ // handle might be received after Receiver is created.
+ void SetRemoteHandle(int remote_handle);
+
+ base::WeakPtr<Receiver> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
private:
+ // Send RPC message on |main_task_runner_|.
+ void SendRpcMessageOnMainThread(std::unique_ptr<pb::RpcMessage> message);
+
+ // Callback function when RPC message is received.
+ void OnReceivedRpc(std::unique_ptr<pb::RpcMessage> message);
+
// RPC message handlers.
- void AcquireRenderer(std::unique_ptr<pb::RpcMessage> message);
- void Initialize(std::unique_ptr<pb::RpcMessage> message);
- void SetPlaybackRate(std::unique_ptr<pb::RpcMessage> message);
- void FlushUntil(std::unique_ptr<pb::RpcMessage> message);
- void StartPlayingFrom(std::unique_ptr<pb::RpcMessage> message);
- void SetVolume(std::unique_ptr<pb::RpcMessage> message);
-
- // Initialization callbacks.
- void OnStreamInitialized();
- void OnRendererInitialized(PipelineStatus status);
+ void RpcInitialize(std::unique_ptr<pb::RpcMessage> message);
+ void RpcSetPlaybackRate(std::unique_ptr<pb::RpcMessage> message);
+ void RpcFlushUntil(std::unique_ptr<pb::RpcMessage> message);
+ void RpcStartPlayingFrom(std::unique_ptr<pb::RpcMessage> message);
+ void RpcSetVolume(std::unique_ptr<pb::RpcMessage> message);
+ void ShouldInitializeRenderer();
+ void OnRendererInitialized(PipelineStatus status);
+ void VerifyAcquireRendererDone();
void OnFlushDone();
// Periodically send the UpdateTime RPC message to update the media time.
void ScheduleMediaTimeUpdates();
void SendMediaTimeUpdate();
- const std::unique_ptr<Renderer> renderer_;
- RpcBroker* const rpc_broker_; // Outlives this class.
+ // The callback function to call when |this| is initialized.
+ PipelineStatusCallback init_cb_;
+
+ // Indicates whether |this| received RPC_R_INITIALIZE message or not.
+ bool rpc_initialize_received_ = false;
+
+ // Owns by the WebMediaPlayerImpl instance.
+ MediaResource* demuxer_ = nullptr;
+
+ // The handle of |this| for listening RPC messages.
+ const int rpc_handle_;
- // The CourierRenderer handle on sender side. Set when AcauireRenderer() is
- // called.
- int remote_handle_ = RpcBroker::kInvalidHandle;
+ // The CourierRenderer handle on sender side. |remote_handle_| could be set
+ // through the ctor or SetRemoteHandle().
+ int remote_handle_;
- int rpc_handle_ = RpcBroker::kInvalidHandle;
+ ReceiverController* const receiver_controller_; // Outlives this class.
+ RpcBroker* const rpc_broker_; // Outlives this class.
- std::unique_ptr<StreamProvider> stream_provider_;
+ // Calling SendMessageCallback() of |rpc_broker_| should be on main thread.
+ const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+
+ // Media tasks should run on media thread.
+ const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+
+ // |renderer_| is the real renderer to render media.
+ std::unique_ptr<Renderer> renderer_;
+
+ // The callback function to send RPC_ACQUIRE_RENDERER_DONE.
+ base::OnceCallback<void(int)> acquire_renderer_done_cb_;
// The timer to periodically update the media time.
base::RepeatingTimer time_update_timer_;
base::WeakPtrFactory<Receiver> weak_factory_{this};
-
- DISALLOW_COPY_AND_ASSIGN(Receiver);
};
} // namespace remoting