aboutsummaryrefslogtreecommitdiff
path: root/cast/standalone_receiver/mirroring_application.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/standalone_receiver/mirroring_application.cc')
-rw-r--r--cast/standalone_receiver/mirroring_application.cc90
1 files changed, 90 insertions, 0 deletions
diff --git a/cast/standalone_receiver/mirroring_application.cc b/cast/standalone_receiver/mirroring_application.cc
new file mode 100644
index 00000000..a04c401a
--- /dev/null
+++ b/cast/standalone_receiver/mirroring_application.cc
@@ -0,0 +1,90 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cast/standalone_receiver/mirroring_application.h"
+
+#include "cast/common/public/message_port.h"
+#include "cast/streaming/environment.h"
+#include "cast/streaming/message_fields.h"
+#include "cast/streaming/receiver_session.h"
+#include "platform/api/task_runner.h"
+#include "util/osp_logging.h"
+
+namespace openscreen {
+namespace cast {
+
+const char kMirroringAppId[] = "0F5096E8";
+const char kMirroringAudioOnlyAppId[] = "85CDB22F";
+
+const char kMirroringDisplayName[] = "Chrome Mirroring";
+const char kRemotingRpcNamespace[] = "urn:x-cast:com.google.cast.remoting";
+
+MirroringApplication::MirroringApplication(TaskRunner* task_runner,
+ const IPAddress& interface_address,
+ ApplicationAgent* agent)
+ : task_runner_(task_runner),
+ interface_address_(interface_address),
+ app_ids_({kMirroringAppId, kMirroringAudioOnlyAppId}),
+ agent_(agent) {
+ OSP_DCHECK(task_runner_);
+ OSP_DCHECK(agent_);
+ agent_->RegisterApplication(this);
+}
+
+MirroringApplication::~MirroringApplication() {
+ agent_->UnregisterApplication(this); // ApplicationAgent may call Stop().
+ OSP_DCHECK(!current_session_);
+}
+
+const std::vector<std::string>& MirroringApplication::GetAppIds() const {
+ return app_ids_;
+}
+
+bool MirroringApplication::Launch(const std::string& app_id,
+ const Json::Value& app_params,
+ MessagePort* message_port) {
+ if ((app_id != kMirroringAppId && app_id != kMirroringAudioOnlyAppId) ||
+ !message_port || current_session_) {
+ return false;
+ }
+
+ wake_lock_ = ScopedWakeLock::Create(task_runner_);
+ environment_ = std::make_unique<Environment>(
+ &Clock::now, task_runner_,
+ IPEndpoint{interface_address_, kDefaultCastStreamingPort});
+ controller_ =
+ std::make_unique<StreamingPlaybackController>(task_runner_, this);
+ current_session_ = std::make_unique<ReceiverSession>(
+ controller_.get(), environment_.get(), message_port,
+ ReceiverSession::Preferences{});
+ return true;
+}
+
+std::string MirroringApplication::GetSessionId() {
+ return current_session_ ? current_session_->session_id() : std::string();
+}
+
+std::string MirroringApplication::GetDisplayName() {
+ return current_session_ ? kMirroringDisplayName : std::string();
+}
+
+std::vector<std::string> MirroringApplication::GetSupportedNamespaces() {
+ return {kCastWebrtcNamespace, kRemotingRpcNamespace};
+}
+
+void MirroringApplication::Stop() {
+ current_session_.reset();
+ controller_.reset();
+ environment_.reset();
+ wake_lock_.reset();
+}
+
+void MirroringApplication::OnPlaybackError(StreamingPlaybackController*,
+ Error error) {
+ OSP_LOG_ERROR << "[MirroringApplication] " << error;
+ agent_->StopApplicationIfRunning(this); // ApplicationAgent calls Stop().
+}
+
+} // namespace cast
+} // namespace openscreen