// Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_REMOTING_RECEIVER_CONTROLLER_H_ #define MEDIA_REMOTING_RECEIVER_CONTROLLER_H_ #include #include "base/no_destructor.h" #include "media/mojo/mojom/remoting.mojom.h" #include "media/remoting/rpc_broker.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" namespace media { namespace remoting { // ReceiverController is the bridge that owns |rpc_broker_| to allow Receivers // and StreamProvider::MediaStreams to communicate with the sender via RPC // calls. // // It also forwards calls to a |media_remotee_| instance, which will be // implemented the browser process. Currently, the only use case will be on // Chromecast, the Remotee implementation will be implemented in the browser // code on Chromecast. // // NOTE: ReceiverController is a singleton per process. class ReceiverController : mojom::RemotingSink { public: static ReceiverController* GetInstance(); void Initialize(mojo::PendingRemote remotee); // Proxy functions to |media_remotee_|. void OnRendererFlush(uint32_t audio_count, uint32_t video_count); void OnVideoNaturalSizeChange(const gfx::Size& size); void StartDataStreams( mojo::PendingRemote audio_stream, mojo::PendingRemote video_stream); // The reference of |rpc_broker_|. media::remoting::RpcBroker* rpc_broker() { return &rpc_broker_; } private: friend base::NoDestructor; friend class MockReceiverController; friend void ResetForTesting(ReceiverController* controller); ReceiverController(); ~ReceiverController() override; // media::mojom::RemotingSink implementation. void OnMessageFromSource(const std::vector& message) override; // Callback for |rpc_broker_| to send messages. void OnSendRpc(std::unique_ptr> message); RpcBroker rpc_broker_; const scoped_refptr main_task_runner_; mojo::Remote media_remotee_; mojo::Receiver receiver_{this}; }; } // namespace remoting } // namespace media #endif // MEDIA_REMOTING_RECEIVER_CONTROLLER_H_