aboutsummaryrefslogtreecommitdiff
path: root/cast/standalone_receiver/simple_remoting_receiver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/standalone_receiver/simple_remoting_receiver.cc')
-rw-r--r--cast/standalone_receiver/simple_remoting_receiver.cc118
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