diff options
Diffstat (limited to 'cast/standalone_receiver/simple_remoting_receiver.cc')
-rw-r--r-- | cast/standalone_receiver/simple_remoting_receiver.cc | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/cast/standalone_receiver/simple_remoting_receiver.cc b/cast/standalone_receiver/simple_remoting_receiver.cc new file mode 100644 index 00000000..c22f3271 --- /dev/null +++ b/cast/standalone_receiver/simple_remoting_receiver.cc @@ -0,0 +1,118 @@ +// 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. + +#include "cast/standalone_receiver/simple_remoting_receiver.h" + +#include <utility> + +#include "cast/streaming/message_fields.h" +#include "cast/streaming/remoting.pb.h" + +namespace openscreen { +namespace cast { + +namespace { + +VideoCodec ParseProtoCodec(VideoDecoderConfig::Codec value) { + switch (value) { + case VideoDecoderConfig_Codec_kCodecHEVC: + return VideoCodec::kHevc; + + case VideoDecoderConfig_Codec_kCodecH264: + return VideoCodec::kH264; + + case VideoDecoderConfig_Codec_kCodecVP8: + return VideoCodec::kVp8; + + case VideoDecoderConfig_Codec_kCodecVP9: + return VideoCodec::kVp9; + + case VideoDecoderConfig_Codec_kCodecAV1: + return VideoCodec::kAv1; + + default: + return VideoCodec::kNotSpecified; + } +} + +AudioCodec ParseProtoCodec(AudioDecoderConfig::Codec value) { + switch (value) { + case AudioDecoderConfig_Codec_kCodecAAC: + return AudioCodec::kAac; + + case AudioDecoderConfig_Codec_kCodecOpus: + return AudioCodec::kOpus; + + default: + return AudioCodec::kNotSpecified; + } +} + +} // namespace + +SimpleRemotingReceiver::SimpleRemotingReceiver(RpcMessenger* messenger) + : messenger_(messenger) { + messenger_->RegisterMessageReceiverCallback( + RpcMessenger::kFirstHandle, [this](std::unique_ptr<RpcMessage> message) { + this->OnInitializeCallbackMessage(std::move(message)); + }); +} + +SimpleRemotingReceiver::~SimpleRemotingReceiver() { + messenger_->UnregisterMessageReceiverCallback(RpcMessenger::kFirstHandle); +} + +void SimpleRemotingReceiver::SendInitializeMessage( + SimpleRemotingReceiver::InitializeCallback initialize_cb) { + initialize_cb_ = std::move(initialize_cb); + + OSP_DVLOG + << "Indicating to the sender we are ready for remoting initialization."; + openscreen::cast::RpcMessage rpc; + rpc.set_handle(RpcMessenger::kAcquireRendererHandle); + rpc.set_proc(openscreen::cast::RpcMessage::RPC_DS_INITIALIZE); + + // The initialize message contains the handle to be used for sending the + // initialization callback message. + rpc.set_integer_value(RpcMessenger::kFirstHandle); + messenger_->SendMessageToRemote(rpc); +} + +void SimpleRemotingReceiver::SendPlaybackRateMessage(double playback_rate) { + openscreen::cast::RpcMessage rpc; + rpc.set_handle(RpcMessenger::kAcquireRendererHandle); + rpc.set_proc(openscreen::cast::RpcMessage::RPC_R_SETPLAYBACKRATE); + rpc.set_double_value(playback_rate); + messenger_->SendMessageToRemote(rpc); +} + +void SimpleRemotingReceiver::OnInitializeCallbackMessage( + std::unique_ptr<RpcMessage> message) { + OSP_DCHECK(message->proc() == RpcMessage::RPC_DS_INITIALIZE_CALLBACK); + if (!initialize_cb_) { + OSP_DLOG_INFO << "Received an initialization callback message but no " + "callback was set."; + return; + } + + const DemuxerStreamInitializeCallback& callback_message = + message->demuxerstream_initializecb_rpc(); + const auto audio_codec = + callback_message.has_audio_decoder_config() + ? ParseProtoCodec(callback_message.audio_decoder_config().codec()) + : AudioCodec::kNotSpecified; + const auto video_codec = + callback_message.has_video_decoder_config() + ? ParseProtoCodec(callback_message.video_decoder_config().codec()) + : VideoCodec::kNotSpecified; + + OSP_DLOG_INFO << "Initializing remoting with audio codec " + << CodecToString(audio_codec) << " and video codec " + << CodecToString(video_codec); + initialize_cb_(audio_codec, video_codec); + initialize_cb_ = nullptr; +} + +} // namespace cast +} // namespace openscreen |