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