xref: /aosp_15_r20/external/openscreen/cast/standalone_receiver/simple_remoting_receiver.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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)17 VideoCodec 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)39 AudioCodec 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)54 SimpleRemotingReceiver::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()62 SimpleRemotingReceiver::~SimpleRemotingReceiver() {
63   messenger_->UnregisterMessageReceiverCallback(RpcMessenger::kFirstHandle);
64 }
65 
SendInitializeMessage(SimpleRemotingReceiver::InitializeCallback initialize_cb)66 void 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)82 void 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)90 void 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