Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Unified Diff: extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc

Issue 1698473004: [chrome.displaySource] Use WDS for Wi-Fi Display implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments from Alex Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc
index f6d1104fd7ddf10170690c1efd65126fec35d275..4c267d3268c24bfc96f6296e0c89eb1969b22cd4 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc
@@ -8,9 +8,23 @@
#include "base/timer/timer.h"
#include "content/public/common/service_registry.h"
#include "content/public/renderer/render_frame.h"
+#include "extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.h"
+#include "third_party/wds/src/libwds/public/logging.h"
+#include "third_party/wds/src/libwds/public/media_manager.h"
namespace {
const char kErrorInternal[] = "An internal error has occurred";
+const char kErrorTimeout[] = "Sink became unresponsive";
+
+static void LogWDSError(const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ char buffer[256];
+ vsnprintf(buffer, 256, format, args);
+ va_end(args);
+ LOG(ERROR) << "[WDS] " << buffer;
asargent_no_longer_on_chrome 2016/02/25 22:09:39 nit: the general policy is not to leave in logging
+}
+
} // namespace
namespace extensions {
@@ -21,17 +35,20 @@ WiFiDisplaySession::WiFiDisplaySession(
const DisplaySourceSessionParams& params)
: binding_(this),
params_(params),
+ cseq_(0),
+ timer_id_(0),
weak_factory_(this) {
DCHECK(params_.render_frame);
+ wds::LogSystem::set_error_func(&LogWDSError);
params.render_frame->GetServiceRegistry()->ConnectToRemoteService(
mojo::GetProxy(&service_));
service_.set_connection_error_handler(base::Bind(
- &WiFiDisplaySession::OnConnectionError,
+ &WiFiDisplaySession::OnIPCConnectionError,
weak_factory_.GetWeakPtr()));
service_->SetClient(binding_.CreateInterfacePtrAndBind());
binding_.set_connection_error_handler(base::Bind(
- &WiFiDisplaySession::OnConnectionError,
+ &WiFiDisplaySession::OnIPCConnectionError,
weak_factory_.GetWeakPtr()));
}
@@ -66,12 +83,17 @@ void WiFiDisplaySession::Terminate() {
void WiFiDisplaySession::OnEstablished(const mojo::String& ip_address) {
DCHECK(state_ != DisplaySourceSession::Established);
ip_address_ = ip_address;
+ media_manager_.reset(new WiFiDisplayMediaManager());
+ wfd_source_.reset(wds::Source::Create(this, media_manager_.get(), this));
+ wfd_source_->Start();
state_ = DisplaySourceSession::Established;
}
void WiFiDisplaySession::OnTerminated() {
DCHECK(state_ != DisplaySourceSession::Idle);
state_ = DisplaySourceSession::Idle;
+ media_manager_.reset();
+ wfd_source_.reset();
if (!terminated_callback_.is_null())
terminated_callback_.Run(params_.sink_id);
}
@@ -87,9 +109,63 @@ void WiFiDisplaySession::OnError(int32_t type,
void WiFiDisplaySession::OnMessage(const mojo::String& data) {
DCHECK(state_ == DisplaySourceSession::Established);
+ DCHECK(wfd_source_);
+ wfd_source_->RTSPDataReceived(data);
+}
+
+std::string WiFiDisplaySession::GetLocalIPAddress() const {
+ return ip_address_;
+}
+
+int WiFiDisplaySession::GetNextCSeq(int* initial_peer_cseq) const {
+ return ++cseq_;
+}
+
+void WiFiDisplaySession::SendRTSPData(const std::string& message) {
+ service_->SendMessage(message);
+}
+
+unsigned WiFiDisplaySession::CreateTimer(int seconds) {
+ scoped_ptr<base::Timer> timer(new base::Timer(true, true));
+ auto insert_ret = timers_.insert(
+ std::pair<unsigned, scoped_ptr<base::Timer>>(
+ ++timer_id_, std::move(timer)));
+ DCHECK(insert_ret.second);
+ timer->Start(FROM_HERE,
+ base::TimeDelta::FromSeconds(seconds),
+ base::Bind(&wds::Source::OnTimerEvent,
+ base::Unretained(wfd_source_.get()),
+ timer_id_));
+ return timer_id_;
+}
+
+void WiFiDisplaySession::ReleaseTimer(unsigned timer_id) {
+ auto it = timers_.find(timer_id);
+ if (it != timers_.end())
+ timers_.erase(it);
+}
+
+void WiFiDisplaySession::ErrorOccurred(wds::ErrorType error) {
+ if (!error_callback_.is_null()) {
+ if (error == wds::TimeoutError) {
+ error_callback_.Run(params_.sink_id,
+ api::display_source::ERROR_TYPE_TIMEOUT_ERROR,
+ kErrorTimeout);
+ } else {
+ error_callback_.Run(params_.sink_id,
+ api::display_source::ERROR_TYPE_UNKNOWN_ERROR,
+ kErrorInternal);
+ }
+ }
+
+ Terminate();
+}
+
+void WiFiDisplaySession::SessionCompleted() {
+ Terminate();
}
-void WiFiDisplaySession::OnConnectionError() {
+void WiFiDisplaySession::OnIPCConnectionError() {
if (!error_callback_.is_null()) {
error_callback_.Run(params_.sink_id,
api::display_source::ERROR_TYPE_UNKNOWN_ERROR,

Powered by Google App Engine
This is Rietveld 408576698