76 lines
2.8 KiB
C++
76 lines
2.8 KiB
C++
// 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_
|