diff options
Diffstat (limited to 'cast/standalone_sender/remoting_sender.h')
-rw-r--r-- | cast/standalone_sender/remoting_sender.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/cast/standalone_sender/remoting_sender.h b/cast/standalone_sender/remoting_sender.h new file mode 100644 index 00000000..7d09dc69 --- /dev/null +++ b/cast/standalone_sender/remoting_sender.h @@ -0,0 +1,75 @@ +// Copyright 2021 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 CAST_STANDALONE_SENDER_REMOTING_SENDER_H_ +#define CAST_STANDALONE_SENDER_REMOTING_SENDER_H_ + +#include <memory> + +#include "cast/streaming/constants.h" +#include "cast/streaming/rpc_messenger.h" + +namespace openscreen { +namespace cast { + +// This class behaves like a pared-down version of Chrome's StreamProvider (see +// https://source.chromium.org/chromium/chromium/src/+/main:media/remoting/stream_provider.h +// ). Instead of fully managing a media::DemuxerStream however, it just provides +// an RPC initialization routine that notifies the standalone receiver's +// SimpleRemotingReceiver instance (if configured) that initialization has been +// complete and what codecs were selected. +// +// Due to the sheer complexity of remoting, we don't have a fully functional +// implementation of remoting in the standalone_* components, instead Chrome is +// the reference implementation and we have these simple classes to exercise +// the public APIs. +class RemotingSender { + public: + // The remoting sender expects a valid client to handle received messages. + class Client { + public: + virtual ~Client(); + + // Executed when we receive the initialize message from the receiver. + virtual void OnReady() = 0; + + // Executed when we receive a playback rate message from the receiver. + virtual void OnPlaybackRateChange(double rate) = 0; + }; + + RemotingSender(RpcMessenger* messenger, + AudioCodec audio_codec, + VideoCodec video_codec, + Client* client); + ~RemotingSender(); + + private: + // Helper for parsing any received RPC messages. + void OnMessage(const RpcMessage& message); + void OnInitializeMessage(const RpcMessage& message); + void OnPlaybackRateMessage(const RpcMessage& message); + + // The messenger is the only caller of OnInitializeMessage, so there are no + // lifetime concerns. However, if this class outlives |messenger_|, it will + // no longer receive initialization messages. + RpcMessenger* messenger_; + + // Unlike in Chrome, here we should know the video and audio codecs before any + // of the remoting code gets set up, and for simplicity's sake we can only + // populate the AudioDecoderConfig and VideoDecoderConfig objects with the + // codecs and use the rest of the fields as-is from the OFFER/ANSWER exchange. + const AudioCodec audio_codec_; + const VideoCodec video_codec_; + + Client* client_; + + // The initialization message from the receiver contains the handle the + // callback should go to. + RpcMessenger::Handle receiver_handle_ = RpcMessenger::kInvalidHandle; +}; + +} // namespace cast +} // namespace openscreen + +#endif // CAST_STANDALONE_SENDER_REMOTING_SENDER_H_ |