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