xref: /aosp_15_r20/external/openscreen/cast/standalone_sender/remoting_sender.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2021 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "cast/standalone_sender/remoting_sender.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <utility>
8*3f982cf4SFabien Sanglard 
9*3f982cf4SFabien Sanglard #include "cast/streaming/message_fields.h"
10*3f982cf4SFabien Sanglard 
11*3f982cf4SFabien Sanglard namespace openscreen {
12*3f982cf4SFabien Sanglard namespace cast {
13*3f982cf4SFabien Sanglard 
14*3f982cf4SFabien Sanglard namespace {
15*3f982cf4SFabien Sanglard 
ToProtoCodec(VideoCodec value)16*3f982cf4SFabien Sanglard VideoDecoderConfig::Codec ToProtoCodec(VideoCodec value) {
17*3f982cf4SFabien Sanglard   switch (value) {
18*3f982cf4SFabien Sanglard     case VideoCodec::kHevc:
19*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kCodecHEVC;
20*3f982cf4SFabien Sanglard     case VideoCodec::kH264:
21*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kCodecH264;
22*3f982cf4SFabien Sanglard     case VideoCodec::kVp8:
23*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kCodecVP8;
24*3f982cf4SFabien Sanglard     case VideoCodec::kVp9:
25*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kCodecVP9;
26*3f982cf4SFabien Sanglard     case VideoCodec::kAv1:
27*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kCodecAV1;
28*3f982cf4SFabien Sanglard     default:
29*3f982cf4SFabien Sanglard       return VideoDecoderConfig_Codec_kUnknownVideoCodec;
30*3f982cf4SFabien Sanglard   }
31*3f982cf4SFabien Sanglard }
32*3f982cf4SFabien Sanglard 
ToProtoCodec(AudioCodec value)33*3f982cf4SFabien Sanglard AudioDecoderConfig::Codec ToProtoCodec(AudioCodec value) {
34*3f982cf4SFabien Sanglard   switch (value) {
35*3f982cf4SFabien Sanglard     case AudioCodec::kAac:
36*3f982cf4SFabien Sanglard       return AudioDecoderConfig_Codec_kCodecAAC;
37*3f982cf4SFabien Sanglard     case AudioCodec::kOpus:
38*3f982cf4SFabien Sanglard       return AudioDecoderConfig_Codec_kCodecOpus;
39*3f982cf4SFabien Sanglard     default:
40*3f982cf4SFabien Sanglard       return AudioDecoderConfig_Codec_kUnknownAudioCodec;
41*3f982cf4SFabien Sanglard   }
42*3f982cf4SFabien Sanglard }
43*3f982cf4SFabien Sanglard 
44*3f982cf4SFabien Sanglard }  // namespace
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard RemotingSender::Client::~Client() = default;
47*3f982cf4SFabien Sanglard 
RemotingSender(RpcMessenger * messenger,AudioCodec audio_codec,VideoCodec video_codec,Client * client)48*3f982cf4SFabien Sanglard RemotingSender::RemotingSender(RpcMessenger* messenger,
49*3f982cf4SFabien Sanglard                                AudioCodec audio_codec,
50*3f982cf4SFabien Sanglard                                VideoCodec video_codec,
51*3f982cf4SFabien Sanglard                                Client* client)
52*3f982cf4SFabien Sanglard     : messenger_(messenger),
53*3f982cf4SFabien Sanglard       audio_codec_(audio_codec),
54*3f982cf4SFabien Sanglard       video_codec_(video_codec),
55*3f982cf4SFabien Sanglard       client_(client) {
56*3f982cf4SFabien Sanglard   OSP_DCHECK(client_);
57*3f982cf4SFabien Sanglard   messenger_->RegisterMessageReceiverCallback(
58*3f982cf4SFabien Sanglard       RpcMessenger::kAcquireRendererHandle,
59*3f982cf4SFabien Sanglard       [this](std::unique_ptr<RpcMessage> message) {
60*3f982cf4SFabien Sanglard         OSP_DCHECK(message);
61*3f982cf4SFabien Sanglard         this->OnMessage(*message);
62*3f982cf4SFabien Sanglard       });
63*3f982cf4SFabien Sanglard }
64*3f982cf4SFabien Sanglard 
~RemotingSender()65*3f982cf4SFabien Sanglard RemotingSender::~RemotingSender() {
66*3f982cf4SFabien Sanglard   messenger_->UnregisterMessageReceiverCallback(
67*3f982cf4SFabien Sanglard       RpcMessenger::kAcquireRendererHandle);
68*3f982cf4SFabien Sanglard }
69*3f982cf4SFabien Sanglard 
OnMessage(const RpcMessage & message)70*3f982cf4SFabien Sanglard void RemotingSender::OnMessage(const RpcMessage& message) {
71*3f982cf4SFabien Sanglard   if (!message.has_proc()) {
72*3f982cf4SFabien Sanglard     return;
73*3f982cf4SFabien Sanglard   }
74*3f982cf4SFabien Sanglard   if (message.proc() == RpcMessage_RpcProc_RPC_DS_INITIALIZE) {
75*3f982cf4SFabien Sanglard     OSP_VLOG << "Received initialize message";
76*3f982cf4SFabien Sanglard     OnInitializeMessage(message);
77*3f982cf4SFabien Sanglard   } else if (message.proc() == RpcMessage_RpcProc_RPC_R_SETPLAYBACKRATE) {
78*3f982cf4SFabien Sanglard     OSP_VLOG << "Received playback rate message: " << message.double_value();
79*3f982cf4SFabien Sanglard     OnPlaybackRateMessage(message);
80*3f982cf4SFabien Sanglard   }
81*3f982cf4SFabien Sanglard }
82*3f982cf4SFabien Sanglard 
OnInitializeMessage(const RpcMessage & message)83*3f982cf4SFabien Sanglard void RemotingSender::OnInitializeMessage(const RpcMessage& message) {
84*3f982cf4SFabien Sanglard   receiver_handle_ = message.integer_value();
85*3f982cf4SFabien Sanglard 
86*3f982cf4SFabien Sanglard   RpcMessage callback_message;
87*3f982cf4SFabien Sanglard   callback_message.set_handle(receiver_handle_);
88*3f982cf4SFabien Sanglard   callback_message.set_proc(RpcMessage::RPC_DS_INITIALIZE_CALLBACK);
89*3f982cf4SFabien Sanglard 
90*3f982cf4SFabien Sanglard   auto* callback_body =
91*3f982cf4SFabien Sanglard       callback_message.mutable_demuxerstream_initializecb_rpc();
92*3f982cf4SFabien Sanglard 
93*3f982cf4SFabien Sanglard   // In Chrome, separate calls are used for the audio and video configs, but
94*3f982cf4SFabien Sanglard   // for simplicity's sake we combine them here.
95*3f982cf4SFabien Sanglard   callback_body->mutable_audio_decoder_config()->set_codec(
96*3f982cf4SFabien Sanglard       ToProtoCodec(audio_codec_));
97*3f982cf4SFabien Sanglard   callback_body->mutable_video_decoder_config()->set_codec(
98*3f982cf4SFabien Sanglard       ToProtoCodec(video_codec_));
99*3f982cf4SFabien Sanglard 
100*3f982cf4SFabien Sanglard   OSP_DLOG_INFO << "Initializing receiver handle " << receiver_handle_
101*3f982cf4SFabien Sanglard                 << " with audio codec " << CodecToString(audio_codec_)
102*3f982cf4SFabien Sanglard                 << " and video codec " << CodecToString(video_codec_);
103*3f982cf4SFabien Sanglard   messenger_->SendMessageToRemote(callback_message);
104*3f982cf4SFabien Sanglard 
105*3f982cf4SFabien Sanglard   client_->OnReady();
106*3f982cf4SFabien Sanglard }
107*3f982cf4SFabien Sanglard 
OnPlaybackRateMessage(const RpcMessage & message)108*3f982cf4SFabien Sanglard void RemotingSender::OnPlaybackRateMessage(const RpcMessage& message) {
109*3f982cf4SFabien Sanglard   client_->OnPlaybackRateChange(message.double_value());
110*3f982cf4SFabien Sanglard }
111*3f982cf4SFabien Sanglard 
112*3f982cf4SFabien Sanglard }  // namespace cast
113*3f982cf4SFabien Sanglard }  // namespace openscreen
114