1 // Copyright 2021 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "cast/standalone_receiver/simple_remoting_receiver.h" 6 7 #include <utility> 8 9 #include "cast/streaming/message_fields.h" 10 #include "cast/streaming/remoting.pb.h" 11 12 namespace openscreen { 13 namespace cast { 14 15 namespace { 16 ParseProtoCodec(VideoDecoderConfig::Codec value)17VideoCodec ParseProtoCodec(VideoDecoderConfig::Codec value) { 18 switch (value) { 19 case VideoDecoderConfig_Codec_kCodecHEVC: 20 return VideoCodec::kHevc; 21 22 case VideoDecoderConfig_Codec_kCodecH264: 23 return VideoCodec::kH264; 24 25 case VideoDecoderConfig_Codec_kCodecVP8: 26 return VideoCodec::kVp8; 27 28 case VideoDecoderConfig_Codec_kCodecVP9: 29 return VideoCodec::kVp9; 30 31 case VideoDecoderConfig_Codec_kCodecAV1: 32 return VideoCodec::kAv1; 33 34 default: 35 return VideoCodec::kNotSpecified; 36 } 37 } 38 ParseProtoCodec(AudioDecoderConfig::Codec value)39AudioCodec ParseProtoCodec(AudioDecoderConfig::Codec value) { 40 switch (value) { 41 case AudioDecoderConfig_Codec_kCodecAAC: 42 return AudioCodec::kAac; 43 44 case AudioDecoderConfig_Codec_kCodecOpus: 45 return AudioCodec::kOpus; 46 47 default: 48 return AudioCodec::kNotSpecified; 49 } 50 } 51 52 } // namespace 53 SimpleRemotingReceiver(RpcMessenger * messenger)54SimpleRemotingReceiver::SimpleRemotingReceiver(RpcMessenger* messenger) 55 : messenger_(messenger) { 56 messenger_->RegisterMessageReceiverCallback( 57 RpcMessenger::kFirstHandle, [this](std::unique_ptr<RpcMessage> message) { 58 this->OnInitializeCallbackMessage(std::move(message)); 59 }); 60 } 61 ~SimpleRemotingReceiver()62SimpleRemotingReceiver::~SimpleRemotingReceiver() { 63 messenger_->UnregisterMessageReceiverCallback(RpcMessenger::kFirstHandle); 64 } 65 SendInitializeMessage(SimpleRemotingReceiver::InitializeCallback initialize_cb)66void SimpleRemotingReceiver::SendInitializeMessage( 67 SimpleRemotingReceiver::InitializeCallback initialize_cb) { 68 initialize_cb_ = std::move(initialize_cb); 69 70 OSP_DVLOG 71 << "Indicating to the sender we are ready for remoting initialization."; 72 openscreen::cast::RpcMessage rpc; 73 rpc.set_handle(RpcMessenger::kAcquireRendererHandle); 74 rpc.set_proc(openscreen::cast::RpcMessage::RPC_DS_INITIALIZE); 75 76 // The initialize message contains the handle to be used for sending the 77 // initialization callback message. 78 rpc.set_integer_value(RpcMessenger::kFirstHandle); 79 messenger_->SendMessageToRemote(rpc); 80 } 81 SendPlaybackRateMessage(double playback_rate)82void SimpleRemotingReceiver::SendPlaybackRateMessage(double playback_rate) { 83 openscreen::cast::RpcMessage rpc; 84 rpc.set_handle(RpcMessenger::kAcquireRendererHandle); 85 rpc.set_proc(openscreen::cast::RpcMessage::RPC_R_SETPLAYBACKRATE); 86 rpc.set_double_value(playback_rate); 87 messenger_->SendMessageToRemote(rpc); 88 } 89 OnInitializeCallbackMessage(std::unique_ptr<RpcMessage> message)90void SimpleRemotingReceiver::OnInitializeCallbackMessage( 91 std::unique_ptr<RpcMessage> message) { 92 OSP_DCHECK(message->proc() == RpcMessage::RPC_DS_INITIALIZE_CALLBACK); 93 if (!initialize_cb_) { 94 OSP_DLOG_INFO << "Received an initialization callback message but no " 95 "callback was set."; 96 return; 97 } 98 99 const DemuxerStreamInitializeCallback& callback_message = 100 message->demuxerstream_initializecb_rpc(); 101 const auto audio_codec = 102 callback_message.has_audio_decoder_config() 103 ? ParseProtoCodec(callback_message.audio_decoder_config().codec()) 104 : AudioCodec::kNotSpecified; 105 const auto video_codec = 106 callback_message.has_video_decoder_config() 107 ? ParseProtoCodec(callback_message.video_decoder_config().codec()) 108 : VideoCodec::kNotSpecified; 109 110 OSP_DLOG_INFO << "Initializing remoting with audio codec " 111 << CodecToString(audio_codec) << " and video codec " 112 << CodecToString(video_codec); 113 initialize_cb_(audio_codec, video_codec); 114 initialize_cb_ = nullptr; 115 } 116 117 } // namespace cast 118 } // namespace openscreen 119