xref: /aosp_15_r20/external/openscreen/cast/standalone_receiver/mirroring_application.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1 // Copyright 2020 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/mirroring_application.h"
6 
7 #include <utility>
8 
9 #include "cast/common/public/message_port.h"
10 #include "cast/streaming/constants.h"
11 #include "cast/streaming/environment.h"
12 #include "cast/streaming/message_fields.h"
13 #include "cast/streaming/receiver_session.h"
14 #include "platform/api/task_runner.h"
15 #include "util/osp_logging.h"
16 
17 namespace openscreen {
18 namespace cast {
19 
20 const char kMirroringDisplayName[] = "Chrome Mirroring";
21 const char kRemotingRpcNamespace[] = "urn:x-cast:com.google.cast.remoting";
22 
MirroringApplication(TaskRunner * task_runner,const IPAddress & interface_address,ApplicationAgent * agent)23 MirroringApplication::MirroringApplication(TaskRunner* task_runner,
24                                            const IPAddress& interface_address,
25                                            ApplicationAgent* agent)
26     : task_runner_(task_runner),
27       interface_address_(interface_address),
28       app_ids_({kMirroringAppId, kMirroringAudioOnlyAppId}),
29       agent_(agent) {
30   OSP_DCHECK(task_runner_);
31   OSP_DCHECK(agent_);
32   agent_->RegisterApplication(this);
33 }
34 
~MirroringApplication()35 MirroringApplication::~MirroringApplication() {
36   agent_->UnregisterApplication(this);  // ApplicationAgent may call Stop().
37   OSP_DCHECK(!current_session_);
38 }
39 
GetAppIds() const40 const std::vector<std::string>& MirroringApplication::GetAppIds() const {
41   return app_ids_;
42 }
43 
Launch(const std::string & app_id,const Json::Value & app_params,MessagePort * message_port)44 bool MirroringApplication::Launch(const std::string& app_id,
45                                   const Json::Value& app_params,
46                                   MessagePort* message_port) {
47   if ((app_id != kMirroringAppId && app_id != kMirroringAudioOnlyAppId) ||
48       !message_port || current_session_) {
49     return false;
50   }
51 
52   wake_lock_ = ScopedWakeLock::Create(task_runner_);
53   environment_ = std::make_unique<Environment>(
54       &Clock::now, task_runner_,
55       IPEndpoint{interface_address_, kDefaultCastStreamingPort});
56   controller_ =
57       std::make_unique<StreamingPlaybackController>(task_runner_, this);
58 
59   ReceiverSession::Preferences preferences;
60   preferences.video_codecs.insert(preferences.video_codecs.end(),
61                                   {VideoCodec::kVp9, VideoCodec::kAv1});
62   preferences.remoting =
63       std::make_unique<ReceiverSession::RemotingPreferences>();
64   current_session_ =
65       std::make_unique<ReceiverSession>(controller_.get(), environment_.get(),
66                                         message_port, std::move(preferences));
67   return true;
68 }
69 
GetSessionId()70 std::string MirroringApplication::GetSessionId() {
71   return current_session_ ? current_session_->session_id() : std::string();
72 }
73 
GetDisplayName()74 std::string MirroringApplication::GetDisplayName() {
75   return current_session_ ? kMirroringDisplayName : std::string();
76 }
77 
GetSupportedNamespaces()78 std::vector<std::string> MirroringApplication::GetSupportedNamespaces() {
79   return {kCastWebrtcNamespace, kRemotingRpcNamespace};
80 }
81 
Stop()82 void MirroringApplication::Stop() {
83   current_session_.reset();
84   controller_.reset();
85   environment_.reset();
86   wake_lock_.reset();
87 }
88 
OnPlaybackError(StreamingPlaybackController *,Error error)89 void MirroringApplication::OnPlaybackError(StreamingPlaybackController*,
90                                            Error error) {
91   OSP_LOG_ERROR << "[MirroringApplication] " << error;
92   agent_->StopApplicationIfRunning(this);  // ApplicationAgent calls Stop().
93 }
94 
95 }  // namespace cast
96 }  // namespace openscreen
97