diff --git a/components/net/cpp/include/ftl/net/peer.hpp b/components/net/cpp/include/ftl/net/peer.hpp index 6ac41b2f7477fde4014f49a7e05ba06ba5724844..91f3f2f06ebc5991e429ea743bb51ca0e5cc64b0 100644 --- a/components/net/cpp/include/ftl/net/peer.hpp +++ b/components/net/cpp/include/ftl/net/peer.hpp @@ -193,6 +193,8 @@ class Peer { bool isWaiting() const { return is_waiting_; } void rawClose() { _badClose(false); } + + inline void noReconnect() { can_reconnect_ = false; } public: static const int kMaxMessage = 10*1024*1024; // 10Mb currently diff --git a/components/streams/include/ftl/streams/renderer.hpp b/components/streams/include/ftl/streams/renderer.hpp index bb19a042d79d4f75ea66821cc1cb6ba289666cc3..441e65fe6e2019f147abf563a570ddce10f0419d 100644 --- a/components/streams/include/ftl/streams/renderer.hpp +++ b/components/streams/include/ftl/streams/renderer.hpp @@ -28,6 +28,7 @@ class Source : public ftl::Configurable, public ftl::data::DiscreteSource { ftl::data::FrameSetPtr input_; std::unique_ptr<ftl::render::CUDARender> renderer_; ftl::Configurable *intrinsics_; + uint32_t my_id_; }; } diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index b11a56a67d7ae6c3854c3b960bcd139a861ae8eb..1b080f0e62957e987351392e833b7f781b625a6d 100644 --- a/components/streams/src/feed.cpp +++ b/components/streams/src/feed.cpp @@ -358,7 +358,7 @@ void Feed::autoConnect() { auto &known_hosts = getConfig()["known_hosts"]; for (auto &h : known_hosts.items()) { - net_->connect(h.key()); + net_->connect(h.key())->noReconnect(); } }); } diff --git a/components/streams/src/renderer.cpp b/components/streams/src/renderer.cpp index a9f80db5e27f7210be196a4aa6a230c610de284e..48de45b316d5c03fcc7483d30e4e009f968835d1 100644 --- a/components/streams/src/renderer.cpp +++ b/components/streams/src/renderer.cpp @@ -10,7 +10,7 @@ using ftl::rgbd::Capability; Source::Source(nlohmann::json &config, ftl::stream::Feed *feed) -: ftl::Configurable(config), feed_(feed) { +: ftl::Configurable(config), feed_(feed), my_id_(0) { restore("device:render", { "renderer", "source", @@ -33,6 +33,14 @@ Source::Source(nlohmann::json &config, ftl::stream::Feed *feed) std::atomic_store(&input_, fs); return true; }); + } else { + filter_ = feed_->filter({Channel::Colour, Channel::Depth}); + + filter_->on([this](const ftl::data::FrameSetPtr &fs) { + if (fs->frameset() == my_id_) return true; // Never render self + std::atomic_store(&input_, fs); + return true; + }); } on("source", [this](const ftl::config::Event &e) { @@ -62,6 +70,8 @@ bool Source::capture(int64_t ts) { bool Source::retrieve(ftl::data::Frame &frame_out) { auto input = std::atomic_load(&input_); + my_id_ = frame_out.frameset(); + if (input) { ftl::rgbd::Frame &rgbdframe = frame_out.cast<ftl::rgbd::Frame>();