From 60af0c369511fd7188dd706f3fe126deafe9aa70 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nicolas.pope@utu.fi> Date: Wed, 4 Mar 2020 19:59:07 +0200 Subject: [PATCH] Fixes for clock adjustment mistakes --- applications/gui/src/src_window.cpp | 2 + .../streams/include/ftl/streams/netstream.hpp | 1 + components/streams/src/netstream.cpp | 44 ++++++++++--------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/applications/gui/src/src_window.cpp b/applications/gui/src/src_window.cpp index 88700d146..23e774f64 100644 --- a/applications/gui/src/src_window.cpp +++ b/applications/gui/src/src_window.cpp @@ -215,6 +215,8 @@ bool SourceWindow::_processFrameset(ftl::rgbd::FrameSet &fs, bool fromstream) { if (!fs.frames[i].isGPU(Channel::Colour)) fs.frames[i].upload(Channels<0>(Channel::Colour), pre_pipelines_[fs.id]->getStream()); } + fs.mask &= pre_pipelines_[fs.id]->value("frame_mask", 0xFFFF); + { FTL_Profile("Prepipe",0.020); pre_pipelines_[fs.id]->apply(fs, fs, 0); diff --git a/components/streams/include/ftl/streams/netstream.hpp b/components/streams/include/ftl/streams/netstream.hpp index 0db001319..89330c34f 100644 --- a/components/streams/include/ftl/streams/netstream.hpp +++ b/components/streams/include/ftl/streams/netstream.hpp @@ -76,6 +76,7 @@ class Net : public Stream { ftl::UUID peer_; int64_t last_frame_; int64_t frame_no_; + int64_t last_ping_; std::string uri_; bool host_; int tally_; diff --git a/components/streams/src/netstream.cpp b/components/streams/src/netstream.cpp index 030bc0dfe..496948990 100644 --- a/components/streams/src/netstream.cpp +++ b/components/streams/src/netstream.cpp @@ -22,7 +22,7 @@ float Net::sample_count__ = 0.0f; int64_t Net::last_msg__ = 0; MUTEX Net::msg_mtx__; -Net::Net(nlohmann::json &config, ftl::net::Universe *net) : Stream(config), active_(false), net_(net), clock_adjust_(0) { +Net::Net(nlohmann::json &config, ftl::net::Universe *net) : Stream(config), active_(false), net_(net), clock_adjust_(0), last_ping_(0) { // TODO: Install "find_stream" binding if not installed... if (!net_->isBound("find_stream")) { net_->bind("find_stream", [this](const std::string &uri) -> optional<ftl::UUID> { @@ -292,7 +292,7 @@ bool Net::_sendRequest(Channel c, uint8_t frameset, uint8_t frames, uint8_t coun clock_adjust_ = ftl::timer::get_time() - mastertime + (latency/2); //if (clock_adjust_ > 0) { - // LOG(INFO) << "Clock adjustment: " << clock_adjust_; + //LOG(INFO) << "LATENCY: " << latency; //} }); } catch (...) { @@ -357,25 +357,29 @@ bool Net::_processRequest(ftl::net::Peer &p, const ftl::codecs::Packet &pkt) { // Sync clocks! if (ftl::timer::isClockSlave() && p.id() == time_peer_) { auto start = std::chrono::high_resolution_clock::now(); + int64_t now = ftl::timer::get_time(); + if (last_ping_ < now-500) { + last_ping_ = now; - try { - net_->asyncCall<int64_t>(time_peer_, "__ping__", [this, start](const int64_t &mastertime) { - auto elapsed = std::chrono::high_resolution_clock::now() - start; - int64_t latency = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - auto clock_adjust = mastertime - (ftl::timer::get_time() + (latency/2)); - - if (clock_adjust > 0) { - LOG(INFO) << "Clock adjustment: " << clock_adjust; - //LOG(INFO) << "Latency: " << (latency / 2); - //LOG(INFO) << "Local: " << std::chrono::time_point_cast<std::chrono::milliseconds>(start).time_since_epoch().count() << ", master: " << mastertime; - ftl::timer::setClockAdjustment(clock_adjust); - } - }); - } catch (...) { - LOG(ERROR) << "Ping failed"; - // Reset time peer and remove timer - time_peer_ = ftl::UUID(0); - return false; + try { + net_->asyncCall<int64_t>(time_peer_, "__ping__", [this, start](const int64_t &mastertime) { + auto elapsed = std::chrono::high_resolution_clock::now() - start; + int64_t latency = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); + auto clock_adjust = mastertime - (ftl::timer::get_time() + (latency/2)); + + if (clock_adjust != 0) { + LOG(INFO) << "Clock adjustment: " << clock_adjust << ", latency=" << latency/2; + //LOG(INFO) << "Latency: " << (latency / 2); + //LOG(INFO) << "Local: " << std::chrono::time_point_cast<std::chrono::milliseconds>(start).time_since_epoch().count() << ", master: " << mastertime; + ftl::timer::setClockAdjustment(clock_adjust); + } + }); + } catch (...) { + LOG(ERROR) << "Ping failed"; + // Reset time peer and remove timer + time_peer_ = ftl::UUID(0); + return false; + } } } -- GitLab