From c1be058fc9b3fde9ef6dc514562919c2622f7e7f Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nicolas.pope@utu.fi> Date: Sat, 7 Nov 2020 15:12:53 +0200 Subject: [PATCH] SDK memory fixes and pipelines --- SDK/C++/CMakeLists.txt | 3 + SDK/C++/private/feed_impl.cpp | 69 ++++++++- SDK/C++/private/feed_impl.hpp | 33 ++++- SDK/C++/private/frame_impl.cpp | 20 +++ SDK/C++/private/frame_impl.hpp | 4 +- SDK/C++/private/image_impl.cpp | 9 ++ SDK/C++/private/image_impl.hpp | 2 +- SDK/C++/private/observer_impl.cpp | 7 +- SDK/C++/private/observer_impl.hpp | 2 +- SDK/C++/private/operator_impl.cpp | 22 +++ SDK/C++/private/operator_impl.hpp | 26 ++++ SDK/C++/private/pipeline_impl.cpp | 58 ++++++++ SDK/C++/private/pipeline_impl.hpp | 29 ++++ SDK/C++/private/property_impl.cpp | 135 ++++++++++++++++++ SDK/C++/private/property_impl.hpp | 51 +++++++ SDK/C++/private/room_impl.cpp | 5 + SDK/C++/private/room_impl.hpp | 2 + SDK/C++/private/system.cpp | 17 ++- SDK/C++/private/system_impl.hpp | 6 +- SDK/C++/public/CMakeLists.txt | 5 + SDK/C++/public/include/voltu/feed.hpp | 32 ++++- SDK/C++/public/include/voltu/observer.hpp | 4 + SDK/C++/public/include/voltu/operator.hpp | 30 ++++ SDK/C++/public/include/voltu/pipeline.hpp | 25 ++++ SDK/C++/public/include/voltu/room.hpp | 2 + SDK/C++/public/include/voltu/system.hpp | 27 +++- SDK/C++/public/include/voltu/types/errors.hpp | 8 ++ SDK/C++/public/include/voltu/types/frame.hpp | 4 + SDK/C++/public/include/voltu/types/image.hpp | 5 +- .../public/include/voltu/types/property.hpp | 3 + SDK/C++/public/include/voltu/voltu.hpp | 2 +- .../public/samples/fusion_evaluator/main.cpp | 67 +++++++++ SDK/C++/public/voltu_cv.cpp | 16 ++- .../codecs/include/ftl/codecs/packet.hpp | 8 +- .../common/cpp/include/ftl/configurable.hpp | 19 +++ components/common/cpp/src/configurable.cpp | 34 +++++ .../include/ftl/operators/antialiasing.hpp | 2 + .../include/ftl/operators/clipping.hpp | 2 + .../include/ftl/operators/colours.hpp | 2 + .../operators/include/ftl/operators/depth.hpp | 2 + .../include/ftl/operators/detectandtrack.hpp | 4 + .../include/ftl/operators/disparity.hpp | 12 ++ .../include/ftl/operators/filling.hpp | 4 + .../include/ftl/operators/fusion.hpp | 2 + .../include/ftl/operators/gt_analysis.hpp | 2 + .../operators/include/ftl/operators/mask.hpp | 8 ++ .../operators/include/ftl/operators/mvmls.hpp | 2 + .../include/ftl/operators/normals.hpp | 6 + .../include/ftl/operators/operator.hpp | 3 +- .../include/ftl/operators/opticalflow.hpp | 2 + .../operators/include/ftl/operators/poser.hpp | 2 + .../include/ftl/operators/segmentation.hpp | 4 + .../include/ftl/operators/smoothing.hpp | 12 ++ .../include/ftl/operators/weighting.hpp | 6 + .../src/analysis/evaluation/gt_analysis.cpp | 5 + components/streams/src/filestream.cpp | 3 +- 56 files changed, 841 insertions(+), 35 deletions(-) create mode 100644 SDK/C++/private/operator_impl.cpp create mode 100644 SDK/C++/private/operator_impl.hpp create mode 100644 SDK/C++/private/pipeline_impl.cpp create mode 100644 SDK/C++/private/pipeline_impl.hpp create mode 100644 SDK/C++/private/property_impl.cpp create mode 100644 SDK/C++/private/property_impl.hpp create mode 100644 SDK/C++/public/include/voltu/operator.hpp create mode 100644 SDK/C++/public/include/voltu/pipeline.hpp create mode 100644 SDK/C++/public/samples/fusion_evaluator/main.cpp diff --git a/SDK/C++/CMakeLists.txt b/SDK/C++/CMakeLists.txt index 8bec8ee83..b64eae3d9 100644 --- a/SDK/C++/CMakeLists.txt +++ b/SDK/C++/CMakeLists.txt @@ -6,6 +6,9 @@ add_library(voltu SHARED private/image_impl.cpp private/observer_impl.cpp private/pointcloud_impl.cpp + private/pipeline_impl.cpp + private/operator_impl.cpp + private/property_impl.cpp ) target_include_directories(voltu diff --git a/SDK/C++/private/feed_impl.cpp b/SDK/C++/private/feed_impl.cpp index 001b2974f..edbb1d884 100644 --- a/SDK/C++/private/feed_impl.cpp +++ b/SDK/C++/private/feed_impl.cpp @@ -1,25 +1,82 @@ #include "feed_impl.hpp" +#include <voltu/types/errors.hpp> -using voltu::internal::FeedImpl; +using voltu::internal::InputFeedImpl; +using voltu::internal::OutputFeedImpl; -FeedImpl::FeedImpl(ftl::stream::Feed* feed, uint32_t fsid) +// ==== Input ================================================================== + +InputFeedImpl::InputFeedImpl(ftl::stream::Feed* feed, uint32_t fsid) : feed_(feed) { fsids_.insert(fsid); } -FeedImpl::~FeedImpl() +InputFeedImpl::~InputFeedImpl() { - remove(); + //remove(); } -std::string FeedImpl::getURI() +std::string InputFeedImpl::getURI() { return feed_->getURI(*fsids_.begin()); } -void FeedImpl::remove() +void InputFeedImpl::remove() +{ + throw voltu::exceptions::NotImplemented(); +} + +void InputFeedImpl::submit(const voltu::FramePtr &frame) +{ + throw voltu::exceptions::ReadOnly(); +} + +voltu::FeedType InputFeedImpl::type() +{ + throw voltu::exceptions::NotImplemented(); +} + +voltu::PropertyPtr InputFeedImpl::property(voltu::FeedProperty) +{ + throw voltu::exceptions::NotImplemented(); +} + +// ==== Output ================================================================= + +OutputFeedImpl::OutputFeedImpl(ftl::stream::Feed* feed, const std::string &uri) + : feed_(feed), uri_(uri) +{ + +} + +OutputFeedImpl::~OutputFeedImpl() +{ + //remove(); +} + +std::string OutputFeedImpl::getURI() +{ + return uri_; +} + +void OutputFeedImpl::remove() { + throw voltu::exceptions::NotImplemented(); +} + +void OutputFeedImpl::submit(const voltu::FramePtr &frame) +{ + throw voltu::exceptions::NotImplemented(); +} +voltu::FeedType OutputFeedImpl::type() +{ + throw voltu::exceptions::NotImplemented(); +} + +voltu::PropertyPtr OutputFeedImpl::property(voltu::FeedProperty) +{ + throw voltu::exceptions::NotImplemented(); } diff --git a/SDK/C++/private/feed_impl.hpp b/SDK/C++/private/feed_impl.hpp index 6eae89a31..ba0ab72d7 100644 --- a/SDK/C++/private/feed_impl.hpp +++ b/SDK/C++/private/feed_impl.hpp @@ -9,20 +9,47 @@ namespace voltu namespace internal { -class FeedImpl : public voltu::Feed +class InputFeedImpl : public voltu::Feed { public: - FeedImpl(ftl::stream::Feed*, uint32_t fsid); - ~FeedImpl(); + InputFeedImpl(ftl::stream::Feed*, uint32_t fsid); + ~InputFeedImpl() override; std::string getURI() override; void remove() override; + void submit(const voltu::FramePtr &frame) override; + + voltu::FeedType type() override; + + voltu::PropertyPtr property(voltu::FeedProperty) override; + private: ftl::stream::Feed *feed_; std::unordered_set<uint32_t> fsids_; }; +class OutputFeedImpl : public voltu::Feed +{ +public: + OutputFeedImpl(ftl::stream::Feed*, const std::string &uri); + ~OutputFeedImpl() override; + + std::string getURI() override; + + void remove() override; + + void submit(const voltu::FramePtr &frame) override; + + voltu::FeedType type() override; + + voltu::PropertyPtr property(voltu::FeedProperty) override; + +private: + ftl::stream::Feed *feed_; + std::string uri_; +}; + } } diff --git a/SDK/C++/private/frame_impl.cpp b/SDK/C++/private/frame_impl.cpp index a6057f093..0b0779b6a 100644 --- a/SDK/C++/private/frame_impl.cpp +++ b/SDK/C++/private/frame_impl.cpp @@ -24,6 +24,7 @@ std::list<voltu::ImagePtr> FrameImpl::getImageSet(voltu::Channel c) { case voltu::Channel::kColour : channel = ftl::codecs::Channel::Colour; break; case voltu::Channel::kDepth : channel = ftl::codecs::Channel::Depth; break; + case voltu::Channel::kNormals : channel = ftl::codecs::Channel::Normals; break; default: throw voltu::exceptions::BadImageChannel(); } @@ -49,6 +50,25 @@ voltu::PointCloudPtr FrameImpl::getPointCloud(voltu::PointCloudFormat cloudfmt, return nullptr; } +std::vector<std::string> FrameImpl::getMessages() +{ + std::vector<std::string> msgs; + + for (const auto &fs : framesets_) + { + for (const auto &f : fs->frames) + { + if (f.hasChannel(ftl::codecs::Channel::Messages)) + { + const auto &m = f.get<std::vector<std::string>>(ftl::codecs::Channel::Messages); + msgs.insert(msgs.end(), m.begin(), m.end()); + } + } + } + + return msgs; +} + void FrameImpl::pushFrameSet(const std::shared_ptr<ftl::data::FrameSet> &fs) { framesets_.push_back(fs); diff --git a/SDK/C++/private/frame_impl.hpp b/SDK/C++/private/frame_impl.hpp index ee6aec4a7..1b6074a8a 100644 --- a/SDK/C++/private/frame_impl.hpp +++ b/SDK/C++/private/frame_impl.hpp @@ -14,12 +14,14 @@ class FrameImpl : public voltu::Frame { public: FrameImpl(); - ~FrameImpl(); + ~FrameImpl() override; std::list<voltu::ImagePtr> getImageSet(voltu::Channel) override; voltu::PointCloudPtr getPointCloud(voltu::PointCloudFormat cloudfmt, voltu::PointFormat pointfmt) override; + std::vector<std::string> getMessages() override; + int64_t getTimestamp() override; void pushFrameSet(const std::shared_ptr<ftl::data::FrameSet> &fs); diff --git a/SDK/C++/private/image_impl.cpp b/SDK/C++/private/image_impl.cpp index f8bf63a27..76dea9a22 100644 --- a/SDK/C++/private/image_impl.cpp +++ b/SDK/C++/private/image_impl.cpp @@ -30,6 +30,10 @@ voltu::ImageData ImageImpl::getHost() { r.format = voltu::ImageFormat::kFloat32; } + else if (m.type() == CV_16FC4) + { + r.format = voltu::ImageFormat::kFloat16_4; + } return r; } @@ -51,6 +55,10 @@ voltu::ImageData ImageImpl::getDevice() { r.format = voltu::ImageFormat::kFloat32; } + else if (m.type() == CV_16FC4) + { + r.format = voltu::ImageFormat::kFloat16_4; + } return r; } @@ -66,6 +74,7 @@ voltu::Channel ImageImpl::getChannel() { case ftl::codecs::Channel::Colour : return voltu::Channel::kColour; case ftl::codecs::Channel::Depth : return voltu::Channel::kDepth; + case ftl::codecs::Channel::Normals : return voltu::Channel::kNormals; default: return voltu::Channel::kInvalid; } } diff --git a/SDK/C++/private/image_impl.hpp b/SDK/C++/private/image_impl.hpp index 189a1c19f..ac9a33c46 100644 --- a/SDK/C++/private/image_impl.hpp +++ b/SDK/C++/private/image_impl.hpp @@ -12,7 +12,7 @@ class ImageImpl : public voltu::Image { public: ImageImpl(const ftl::rgbd::Frame&, ftl::codecs::Channel c); - ~ImageImpl(); + ~ImageImpl() override; voltu::ImageData getHost() override; diff --git a/SDK/C++/private/observer_impl.cpp b/SDK/C++/private/observer_impl.cpp index 325d24cf3..abdd38f8f 100644 --- a/SDK/C++/private/observer_impl.cpp +++ b/SDK/C++/private/observer_impl.cpp @@ -9,9 +9,10 @@ using voltu::internal::ObserverImpl; using ftl::rgbd::Capability; ObserverImpl::ObserverImpl(ftl::Configurable *base) + : id_(254) // FIXME: Allocate this { pool_ = new ftl::data::Pool(2,5); - rend_ = ftl::create<ftl::render::CUDARender>(base, "camN"); + rend_ = ftl::create<ftl::render::CUDARender>(base, "camN"); // FIXME: Generate name properly intrinsics_.fx = 700.0f; intrinsics_.fy = 700.0f; @@ -28,7 +29,9 @@ ObserverImpl::ObserverImpl(ftl::Configurable *base) ObserverImpl::~ObserverImpl() { - + frameset_.reset(); + delete rend_; + delete pool_; } void ObserverImpl::setResolution(uint32_t w, uint32_t h) diff --git a/SDK/C++/private/observer_impl.hpp b/SDK/C++/private/observer_impl.hpp index 817e2babd..dfccf7e59 100644 --- a/SDK/C++/private/observer_impl.hpp +++ b/SDK/C++/private/observer_impl.hpp @@ -17,7 +17,7 @@ class ObserverImpl : public voltu::Observer public: explicit ObserverImpl(ftl::Configurable *base); - ~ObserverImpl(); + ~ObserverImpl() override; void setResolution(uint32_t w, uint32_t h) override; diff --git a/SDK/C++/private/operator_impl.cpp b/SDK/C++/private/operator_impl.cpp new file mode 100644 index 000000000..41f376c20 --- /dev/null +++ b/SDK/C++/private/operator_impl.cpp @@ -0,0 +1,22 @@ +#include "operator_impl.hpp" +#include "property_impl.hpp" +#include <voltu/types/errors.hpp> + +using voltu::internal::OperatorImpl; + +OperatorImpl::OperatorImpl(ftl::Configurable *cfg) + : cfg_(cfg) +{ + +} + +OperatorImpl::~OperatorImpl() +{ + +} + +voltu::PropertyPtr OperatorImpl::property(const std::string &name) +{ + if (!cfg_->has(name)) throw voltu::exceptions::BadPropertyName(); + return std::make_shared<voltu::internal::CfgPropertyImpl>(cfg_, name); +} diff --git a/SDK/C++/private/operator_impl.hpp b/SDK/C++/private/operator_impl.hpp new file mode 100644 index 000000000..cfe5d26ab --- /dev/null +++ b/SDK/C++/private/operator_impl.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include <voltu/operator.hpp> +#include <ftl/configurable.hpp> + +#include <string> + +namespace voltu +{ +namespace internal +{ + +class OperatorImpl : public voltu::Operator +{ +public: + OperatorImpl(ftl::Configurable*); + ~OperatorImpl() override; + + voltu::PropertyPtr property(const std::string &name) override; + +private: + ftl::Configurable *cfg_; +}; + +} +} \ No newline at end of file diff --git a/SDK/C++/private/pipeline_impl.cpp b/SDK/C++/private/pipeline_impl.cpp new file mode 100644 index 000000000..ea58b1858 --- /dev/null +++ b/SDK/C++/private/pipeline_impl.cpp @@ -0,0 +1,58 @@ +#include "pipeline_impl.hpp" +#include "frame_impl.hpp" +#include "operator_impl.hpp" +#include <voltu/types/errors.hpp> + +#include <ftl/operators/fusion.hpp> +#include <ftl/operators/gt_analysis.hpp> + +using voltu::internal::PipelineImpl; + +PipelineImpl::PipelineImpl(ftl::Configurable *root) +{ + graph_ = ftl::create<ftl::operators::Graph>(root, "pipe1"); +} + +PipelineImpl::~PipelineImpl() +{ + delete graph_; +} + +void PipelineImpl::submit(const voltu::FramePtr &frame) +{ + auto *fimp = dynamic_cast<voltu::internal::FrameImpl*>(frame.get()); + if (!fimp) + { + throw voltu::exceptions::InvalidFrameObject(); + } + + const auto &sets = fimp->getInternalFrameSets(); + + if (sets.size() > 1) throw voltu::exceptions::IncompatibleOperation(); + + for (const auto &fs : sets) + { + ready_ = false; + graph_->queue(fs, [this]() + { + ready_ = true; + }); + } +} + +bool PipelineImpl::waitCompletion(int timeout) +{ + int count = timeout / 5; + while (!ready_ && --count >= 0) std::this_thread::sleep_for(std::chrono::milliseconds(5)); + return ready_; +} + +voltu::OperatorPtr PipelineImpl::appendOperator(voltu::OperatorId id) +{ + switch (id) + { + case voltu::OperatorId::kFusion : return std::make_shared<voltu::internal::OperatorImpl>(graph_->append<ftl::operators::Fusion>("fusion")); + case voltu::OperatorId::kGTEvaluator : return std::make_shared<voltu::internal::OperatorImpl>(graph_->append<ftl::operators::GTAnalysis>("gtanal")); + default: throw voltu::exceptions::NotImplemented(); + } +} \ No newline at end of file diff --git a/SDK/C++/private/pipeline_impl.hpp b/SDK/C++/private/pipeline_impl.hpp new file mode 100644 index 000000000..98fe41c90 --- /dev/null +++ b/SDK/C++/private/pipeline_impl.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include <voltu/pipeline.hpp> +#include <ftl/operators/operator.hpp> + +namespace voltu +{ +namespace internal +{ + +class PipelineImpl : public voltu::Pipeline +{ +public: + PipelineImpl(ftl::Configurable *root); + ~PipelineImpl() override; + + void submit(const voltu::FramePtr &frame) override; + + bool waitCompletion(int timeout) override; + + voltu::OperatorPtr appendOperator(voltu::OperatorId id) override; + +private: + ftl::operators::Graph *graph_; + bool ready_ = false; +}; + +} +} \ No newline at end of file diff --git a/SDK/C++/private/property_impl.cpp b/SDK/C++/private/property_impl.cpp new file mode 100644 index 000000000..bb3cd8dcd --- /dev/null +++ b/SDK/C++/private/property_impl.cpp @@ -0,0 +1,135 @@ +#include "property_impl.hpp" +#include <voltu/types/errors.hpp> + +using voltu::internal::CfgPropertyImpl; +//using voltu::internal::FloatCfgProperty; + +CfgPropertyImpl::CfgPropertyImpl(ftl::Configurable *cfg, const std::string &name) + : cfg_(cfg), name_(name) +{ + +} + +CfgPropertyImpl::~CfgPropertyImpl() +{ + +} + +void CfgPropertyImpl::setInt(int value) +{ + if (cfg_->is<int>(name_)) + { + cfg_->set(name_, value); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +void CfgPropertyImpl::setFloat(float value) +{ + if (cfg_->is<float>(name_)) + { + cfg_->set(name_, value); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +void CfgPropertyImpl::setString(const std::string &value) +{ + if (cfg_->is<std::string>(name_)) + { + cfg_->set(name_, value); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +void CfgPropertyImpl::setBool(bool value) +{ + if (cfg_->is<bool>(name_)) + { + cfg_->set(name_, value); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +int CfgPropertyImpl::getInt() +{ + if (cfg_->is<int>(name_)) + { + return *cfg_->get<int>(name_); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +float CfgPropertyImpl::getFloat() +{ + if (cfg_->is<float>(name_)) + { + return *cfg_->get<float>(name_); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +std::string CfgPropertyImpl::getString() +{ + if (cfg_->is<std::string>(name_)) + { + return *cfg_->get<std::string>(name_); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +bool CfgPropertyImpl::getBool() +{ + if (cfg_->is<bool>(name_)) + { + return *cfg_->get<bool>(name_); + } + else + { + throw voltu::exceptions::BadPropertyType(); + } +} + +// ==== Float ==== + +/*FloatCfgProperty::FloatCfgProperty(ftl::Configurable *cfg, const std::string &name) + : CfgPropertyImpl(cfg, name) +{ + +} + +FloatCfgProperty::~FloatCfgProperty() +{ + +} + +void FloatCfgProperty::setFloat(float) +{ + +} + +float FloatCfgProperty::getFloat() +{ + +}*/ diff --git a/SDK/C++/private/property_impl.hpp b/SDK/C++/private/property_impl.hpp new file mode 100644 index 000000000..2adf96de3 --- /dev/null +++ b/SDK/C++/private/property_impl.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include <ftl/configurable.hpp> +#include <voltu/types/property.hpp> +#include <string> + +namespace voltu +{ +namespace internal +{ + +class CfgPropertyImpl : public voltu::Property +{ +public: + CfgPropertyImpl(ftl::Configurable *cfg, const std::string &name); + virtual ~CfgPropertyImpl() override; + + virtual void setInt(int) override; + + virtual void setFloat(float) override; + + virtual void setString(const std::string &) override; + + virtual void setBool(bool) override; + + virtual int getInt() override; + + virtual float getFloat() override; + + virtual std::string getString() override; + + virtual bool getBool() override; + +private: + ftl::Configurable *cfg_; + std::string name_; +}; + +/*class FloatCfgProperty : public CfgPropertyImpl +{ +public: + FloatCfgProperty(ftl::Configurable *cfg, const std::string &name); + ~FloatCfgProperty() override; + + void setFloat(float) override; + + float getFloat() override; +};*/ + +} +} diff --git a/SDK/C++/private/room_impl.cpp b/SDK/C++/private/room_impl.cpp index 9df583c86..76ab1b92b 100644 --- a/SDK/C++/private/room_impl.cpp +++ b/SDK/C++/private/room_impl.cpp @@ -11,6 +11,11 @@ RoomImpl::RoomImpl(ftl::stream::Feed* feed) } +RoomImpl::~RoomImpl() +{ + if (filter_) filter_->remove(); +} + bool RoomImpl::waitNextFrame(int64_t timeout) { if (!filter_) diff --git a/SDK/C++/private/room_impl.hpp b/SDK/C++/private/room_impl.hpp index 6c57dfcbb..be8516a63 100644 --- a/SDK/C++/private/room_impl.hpp +++ b/SDK/C++/private/room_impl.hpp @@ -13,6 +13,8 @@ class RoomImpl : public voltu::Room { public: explicit RoomImpl(ftl::stream::Feed*); + + ~RoomImpl() override; bool waitNextFrame(int64_t) override; diff --git a/SDK/C++/private/system.cpp b/SDK/C++/private/system.cpp index dd18eef25..b93a4bdc6 100644 --- a/SDK/C++/private/system.cpp +++ b/SDK/C++/private/system.cpp @@ -2,6 +2,7 @@ #include "feed_impl.hpp" #include "room_impl.hpp" #include "observer_impl.hpp" +#include "pipeline_impl.hpp" #include <voltu/voltu.hpp> #include <voltu/types/errors.hpp> #include <ftl/timer.hpp> @@ -44,7 +45,11 @@ SystemImpl::SystemImpl() SystemImpl::~SystemImpl() { ftl::timer::stop(true); + net_->shutdown(); ftl::pool.stop(true); + delete feed_; + delete net_; + delete root_; } voltu::Version SystemImpl::getVersion() const @@ -61,7 +66,7 @@ voltu::FeedPtr SystemImpl::open(const std::string& uri) try { uint32_t fsid = feed_->add(uri); - return std::make_shared<voltu::internal::FeedImpl>(feed_, fsid); + return std::make_shared<voltu::internal::InputFeedImpl>(feed_, fsid); } catch(const std::exception &e) { @@ -88,3 +93,13 @@ voltu::ObserverPtr SystemImpl::createObserver() { return std::make_shared<voltu::internal::ObserverImpl>(root_); } + +voltu::FeedPtr SystemImpl::createFeed(const std::string &uri) +{ + return std::make_shared<voltu::internal::OutputFeedImpl>(feed_, uri); +} + +voltu::PipelinePtr SystemImpl::createPipeline() +{ + return std::make_shared<voltu::internal::PipelineImpl>(root_); +} diff --git a/SDK/C++/private/system_impl.hpp b/SDK/C++/private/system_impl.hpp index f11f48891..dfc2fae09 100644 --- a/SDK/C++/private/system_impl.hpp +++ b/SDK/C++/private/system_impl.hpp @@ -14,7 +14,7 @@ class SystemImpl : public voltu::System { public: SystemImpl(); - ~SystemImpl(); + ~SystemImpl() override; voltu::Version getVersion() const override; @@ -28,6 +28,10 @@ public: voltu::RoomPtr getRoom(voltu::RoomId) override; + voltu::FeedPtr createFeed(const std::string &uri) override; + + voltu::PipelinePtr createPipeline() override; + private: ftl::Configurable* root_; ftl::stream::Feed* feed_; diff --git a/SDK/C++/public/CMakeLists.txt b/SDK/C++/public/CMakeLists.txt index ae8c7da08..a0eb7eaf5 100644 --- a/SDK/C++/public/CMakeLists.txt +++ b/SDK/C++/public/CMakeLists.txt @@ -62,6 +62,11 @@ add_executable(voltu_basic_virtual_cam ) target_link_libraries(voltu_basic_virtual_cam voltu_sdk) +add_executable(voltu_fusion_evaluator + samples/fusion_evaluator/main.cpp +) +target_link_libraries(voltu_fusion_evaluator voltu_sdk) + if (WITH_PYTHON) add_subdirectory(ext/pybind11) add_subdirectory(python) diff --git a/SDK/C++/public/include/voltu/feed.hpp b/SDK/C++/public/include/voltu/feed.hpp index 7a5830196..0a19d3017 100644 --- a/SDK/C++/public/include/voltu/feed.hpp +++ b/SDK/C++/public/include/voltu/feed.hpp @@ -1,6 +1,8 @@ #pragma once #include "defines.hpp" +#include <voltu/types/frame.hpp> +#include <voltu/types/property.hpp> #include <memory> #include <string> @@ -11,22 +13,40 @@ namespace voltu enum class FeedType { kInvalid = 0, - kMonoCamera = 1, - kStereoCamera = 2, - kDepthCamera = 3, + kDevice = 1, + kFile = 2, + kStream = 3, kVirtual = 4, - kScreen = 5, - kRoom = 6, - kRooms = 7 + kMultiple = 5 +}; + +enum class FeedProperty +{ + kInvalid = 0, + kColourCodec = 2001, + kDepthCodec = 2002, + kFPSLimit = 2003, + kColourBitrate = 2004, + kDepthBitrate = 2005, + kFileLooping = 2006, + kFileSpeed = 2007 }; class Feed { public: + virtual ~Feed() = default; + PY_API virtual std::string getURI() = 0; PY_API virtual void remove() = 0; + PY_API virtual void submit(const voltu::FramePtr &frame) = 0; + + PY_API virtual voltu::FeedType type() = 0; + + PY_API virtual voltu::PropertyPtr property(voltu::FeedProperty) = 0; + // Get rooms }; diff --git a/SDK/C++/public/include/voltu/observer.hpp b/SDK/C++/public/include/voltu/observer.hpp index 03323b079..f42ffaf9a 100644 --- a/SDK/C++/public/include/voltu/observer.hpp +++ b/SDK/C++/public/include/voltu/observer.hpp @@ -25,6 +25,8 @@ enum class ObserverProperty class Observer { public: + virtual ~Observer() = default; + PY_API virtual void setResolution(uint32_t w, uint32_t h) = 0; PY_API virtual void setFocalLength(uint32_t f) = 0; @@ -40,6 +42,8 @@ public: PY_API PY_RV_LIFETIME_PARENT virtual voltu::FramePtr getFrame() = 0; PY_API virtual voltu::PropertyPtr property(voltu::ObserverProperty) = 0; + + //PY_API virtual voltu::PropertyPtr property(const std::string &name) = 0; }; typedef std::shared_ptr<Observer> ObserverPtr; diff --git a/SDK/C++/public/include/voltu/operator.hpp b/SDK/C++/public/include/voltu/operator.hpp new file mode 100644 index 000000000..a7f4ce996 --- /dev/null +++ b/SDK/C++/public/include/voltu/operator.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include <voltu/types/property.hpp> +#include <memory> + +namespace voltu +{ + +enum class OperatorId +{ + kInvalid = 0, + kDepth = 1, + kGTEvaluator = 2, + kFusion = 3, + kClipping = 4, + kAruco = 5, + kPixelAnalysis = 6 +}; + +class Operator +{ +public: + virtual ~Operator() = default; + + PY_API virtual voltu::PropertyPtr property(const std::string &name) = 0; +}; + +typedef std::shared_ptr<Operator> OperatorPtr; + +} \ No newline at end of file diff --git a/SDK/C++/public/include/voltu/pipeline.hpp b/SDK/C++/public/include/voltu/pipeline.hpp new file mode 100644 index 000000000..c9894f063 --- /dev/null +++ b/SDK/C++/public/include/voltu/pipeline.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include <voltu/defines.hpp> +#include <voltu/types/frame.hpp> +#include <voltu/operator.hpp> +#include <memory> + +namespace voltu +{ + +class Pipeline +{ +public: + virtual ~Pipeline() = default; + + PY_API virtual void submit(const voltu::FramePtr &frame) = 0; + + PY_API virtual bool waitCompletion(int timeout) = 0; + + PY_API virtual voltu::OperatorPtr appendOperator(voltu::OperatorId id) = 0; +}; + +typedef std::shared_ptr<Pipeline> PipelinePtr; + +} diff --git a/SDK/C++/public/include/voltu/room.hpp b/SDK/C++/public/include/voltu/room.hpp index da0977622..4971439b8 100644 --- a/SDK/C++/public/include/voltu/room.hpp +++ b/SDK/C++/public/include/voltu/room.hpp @@ -19,6 +19,8 @@ typedef unsigned int RoomId; class Room { public: + virtual ~Room() = default; + PY_API virtual bool waitNextFrame(int64_t) = 0; PY_API inline bool hasNextFrame() { return waitNextFrame(0); }; diff --git a/SDK/C++/public/include/voltu/system.hpp b/SDK/C++/public/include/voltu/system.hpp index cf927eeba..0f35bc88c 100644 --- a/SDK/C++/public/include/voltu/system.hpp +++ b/SDK/C++/public/include/voltu/system.hpp @@ -4,6 +4,7 @@ #include <voltu/room.hpp> #include <voltu/observer.hpp> #include <voltu/feed.hpp> +#include <voltu/pipeline.hpp> #include <list> namespace voltu @@ -11,25 +12,41 @@ namespace voltu struct Version { - int major; - int minor; - int patch; + int major; // API Incompatible change + int minor; // Possible binary incompatible, extensions + int patch; // Internal only fixes. }; +/** + * Singleton Voltu system instance. Provides access to the key components such + * as opening streams or files and creating virtual cameras. + */ class System { public: + virtual ~System() = default; + + /** Get the semantic version information. */ virtual voltu::Version getVersion() const = 0; + /** Make a virtual room or composite room. */ PY_API virtual voltu::RoomPtr createRoom() = 0; + /** Create a virtual observer. This renderers virtual camera views. */ PY_API virtual voltu::ObserverPtr createObserver() = 0; - PY_API virtual voltu::FeedPtr open(const std::string&) = 0; + /** Open a file, device or network stream using a URI. */ + PY_API virtual voltu::FeedPtr open(const std::string &uri) = 0; PY_API virtual std::list<voltu::RoomId> listRooms() = 0; - PY_API virtual voltu::RoomPtr getRoom(voltu::RoomId) = 0; + PY_API virtual voltu::RoomPtr getRoom(voltu::RoomId room) = 0; + + /** Make a file or streaming feed, to which you can send frames. */ + PY_API virtual voltu::FeedPtr createFeed(const std::string &uri) = 0; + + /** Make an empty operator pipeline for frame processing. */ + PY_API virtual voltu::PipelinePtr createPipeline() = 0; }; } diff --git a/SDK/C++/public/include/voltu/types/errors.hpp b/SDK/C++/public/include/voltu/types/errors.hpp index 942642801..bbb8be620 100644 --- a/SDK/C++/public/include/voltu/types/errors.hpp +++ b/SDK/C++/public/include/voltu/types/errors.hpp @@ -31,7 +31,15 @@ VOLTU_EXCEPTION(BadSourceURI, Exception, "Bad source URI"); VOLTU_EXCEPTION(InvalidFrameObject, Exception, "Invalid Frame object"); VOLTU_EXCEPTION(InternalRenderError, Exception, "Internal renderer error"); VOLTU_EXCEPTION(InvalidProperty, Exception, "Unknown property enum"); +VOLTU_EXCEPTION(PropertyUnavailable, Exception, "Property currently not available"); +VOLTU_EXCEPTION(BadPropertyName, Exception, "Not a valid property name"); +VOLTU_EXCEPTION(BadPropertyType, Exception, "Incorrect property data type"); +VOLTU_EXCEPTION(BadPropertyValue, Exception, "Property value out of allowed range"); VOLTU_EXCEPTION(BadParameterValue, Exception, "Method parameter is not valid"); +VOLTU_EXCEPTION(NotImplemented, Exception, "Functionality not implemented"); +VOLTU_EXCEPTION(ReadOnly, Exception, "Read only, write not allowed"); +VOLTU_EXCEPTION(WriteOnly, Exception, "Write only, read not allowed"); +VOLTU_EXCEPTION(IncompatibleOperation, Exception, "The input data and operator are incompatible"); } } diff --git a/SDK/C++/public/include/voltu/types/frame.hpp b/SDK/C++/public/include/voltu/types/frame.hpp index adbd84c26..eebc557ea 100644 --- a/SDK/C++/public/include/voltu/types/frame.hpp +++ b/SDK/C++/public/include/voltu/types/frame.hpp @@ -14,10 +14,14 @@ namespace voltu class Frame { public: + virtual ~Frame() = default; + PY_API PY_RV_LIFETIME_PARENT virtual std::list<voltu::ImagePtr> getImageSet(voltu::Channel channel) = 0; PY_API PY_RV_LIFETIME_PARENT virtual voltu::PointCloudPtr getPointCloud(voltu::PointCloudFormat cloudfmt, voltu::PointFormat pointfmt) = 0; + PY_API virtual std::vector<std::string> getMessages() = 0; + PY_API virtual int64_t getTimestamp() = 0; }; diff --git a/SDK/C++/public/include/voltu/types/image.hpp b/SDK/C++/public/include/voltu/types/image.hpp index 76d5ec5f0..406c81df8 100644 --- a/SDK/C++/public/include/voltu/types/image.hpp +++ b/SDK/C++/public/include/voltu/types/image.hpp @@ -15,7 +15,8 @@ enum class ImageFormat { kInvalid = 0, kFloat32 = 1, - kBGRA8 = 2 + kBGRA8 = 2, + kFloat16_4 = 3 }; PY_NO_SHARED_PTR struct ImageData @@ -30,6 +31,8 @@ PY_NO_SHARED_PTR struct ImageData class Image { public: + virtual ~Image() = default; + PY_API PY_RV_LIFETIME_PARENT virtual ImageData getHost() = 0; virtual ImageData getDevice() = 0; diff --git a/SDK/C++/public/include/voltu/types/property.hpp b/SDK/C++/public/include/voltu/types/property.hpp index 2fa3c43b4..2a5fbe53c 100644 --- a/SDK/C++/public/include/voltu/types/property.hpp +++ b/SDK/C++/public/include/voltu/types/property.hpp @@ -2,6 +2,7 @@ #include "../defines.hpp" #include <memory> +#include <string> namespace voltu { @@ -9,6 +10,8 @@ namespace voltu class Property { public: + virtual ~Property() = default; + PY_API virtual void setInt(int) = 0; PY_API virtual void setFloat(float) = 0; diff --git a/SDK/C++/public/include/voltu/voltu.hpp b/SDK/C++/public/include/voltu/voltu.hpp index acb2836f4..17f251ed5 100644 --- a/SDK/C++/public/include/voltu/voltu.hpp +++ b/SDK/C++/public/include/voltu/voltu.hpp @@ -2,7 +2,7 @@ // Bump these for each release #define VOLTU_VERSION_MAJOR 0 // For API incompatible changes -#define VOLTU_VERSION_MINOR 1 // For binary compatibility and extensions +#define VOLTU_VERSION_MINOR 2 // For binary compatibility and extensions #define VOLTU_VERSION_PATCH 0 // Binary compatible internal fixes #define VOLTU_VERSION ((VOLTU_VERSION_MAJOR*10000) + (VOLTU_VERSION_MINOR*100) + VOLTU_VERSION_PATCH) diff --git a/SDK/C++/public/samples/fusion_evaluator/main.cpp b/SDK/C++/public/samples/fusion_evaluator/main.cpp new file mode 100644 index 000000000..908d0925e --- /dev/null +++ b/SDK/C++/public/samples/fusion_evaluator/main.cpp @@ -0,0 +1,67 @@ +#include <voltu/voltu.hpp> +#include <voltu/opencv.hpp> +#include <iostream> +#include <thread> +#include <chrono> + +#include <opencv2/highgui.hpp> + +using std::cout; +using std::endl; +using std::string; + +int main(int argc, char **argv) +{ + if (argc != 2) return -1; + + auto vtu = voltu::instance(); + + if (!vtu->open(argv[1])) + { + cout << "Could not open source" << endl; + return -1; + } + + while (vtu->listRooms().size() == 0) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + + auto room = vtu->getRoom(vtu->listRooms().front()); + if (!room) + { + cout << "Could not get room" << endl; + return -1; + } + + auto frame = room->getFrame(); + + auto pipe = vtu->createPipeline(); + auto op1 = pipe->appendOperator(voltu::OperatorId::kFusion); + auto op2 = pipe->appendOperator(voltu::OperatorId::kGTEvaluator); + + op2->property("show_colour")->setBool(true); + + pipe->submit(frame); + pipe->waitCompletion(1000); + + auto imgset = frame->getImageSet(voltu::Channel::kColour); + + for (auto img : imgset) + { + cv::Mat m; + voltu::cv::visualise(img, m); + cv::imshow(string("Image-") + img->getName(), m); + break; + } + + std::vector<std::string> msgs = frame->getMessages(); + for (const auto &s : msgs) + { + cout << s << endl; + } + + cv::waitKey(-1); + + return 0; +} diff --git a/SDK/C++/public/voltu_cv.cpp b/SDK/C++/public/voltu_cv.cpp index 3b77155b6..0fae30711 100644 --- a/SDK/C++/public/voltu_cv.cpp +++ b/SDK/C++/public/voltu_cv.cpp @@ -1,4 +1,5 @@ #include <voltu/opencv.hpp> +#include <voltu/types/errors.hpp> #include <opencv2/imgproc.hpp> @@ -14,6 +15,10 @@ void voltu::cv::convert(voltu::ImagePtr img, ::cv::Mat &mat) { mat = ::cv::Mat(data.height, data.width, CV_32FC1, data.data); } + else if (data.format == voltu::ImageFormat::kFloat16_4) + { + mat = ::cv::Mat(data.height, data.width, CV_16FC4, data.data); + } else { mat = ::cv::Mat(); @@ -22,7 +27,7 @@ void voltu::cv::convert(voltu::ImagePtr img, ::cv::Mat &mat) void voltu::cv::convert(voltu::ImagePtr img, ::cv::cuda::GpuMat &mat) { - + throw voltu::exceptions::NotImplemented(); } void voltu::cv::visualise(voltu::ImagePtr img, ::cv::Mat &mat) @@ -47,4 +52,13 @@ void voltu::cv::visualise(voltu::ImagePtr img, ::cv::Mat &mat) ::cv::applyColorMap(tmp, mat, ::cv::COLORMAP_INFERNO); //#endif } + else if (data.format == voltu::ImageFormat::kFloat16_4) + { + ::cv::Mat tmp; + voltu::cv::convert(img, tmp); + tmp.convertTo(tmp, CV_32FC4); + tmp += 1.0f; + tmp *= 127.0f; + tmp.convertTo(mat, CV_8UC4); + } } diff --git a/components/codecs/include/ftl/codecs/packet.hpp b/components/codecs/include/ftl/codecs/packet.hpp index 1b37d88b4..8f2359d5b 100644 --- a/components/codecs/include/ftl/codecs/packet.hpp +++ b/components/codecs/include/ftl/codecs/packet.hpp @@ -13,12 +13,14 @@ namespace codecs { static constexpr uint8_t kAllFrames = 255; static constexpr uint8_t kAllFramesets = 255; +static constexpr uint8_t kCurrentFTLVersion = 5; + /** * First bytes of our file format. */ struct Header { const char magic[4] = {'F','T','L','F'}; - uint8_t version = 5; + uint8_t version = kCurrentFTLVersion; }; /** @@ -56,7 +58,7 @@ static constexpr unsigned int kStreamCap_NewConnection = 0x04; /** V4 packets have no stream flags field */ struct StreamPacketV4 { - int version; // FTL version, Not encoded into stream + int version=4; // FTL version, Not encoded into stream int64_t timestamp; uint8_t streamID; // Source number [or v4 frameset id] @@ -81,7 +83,7 @@ struct StreamPacketV4 { * or included before a frame packet structure. */ struct StreamPacket { - int version; // FTL version, Not encoded into stream + int version = kCurrentFTLVersion; // FTL version, Not encoded into stream int64_t timestamp; uint8_t streamID; // Source number [or v4 frameset id] diff --git a/components/common/cpp/include/ftl/configurable.hpp b/components/common/cpp/include/ftl/configurable.hpp index b2a66943d..3d2a115e6 100644 --- a/components/common/cpp/include/ftl/configurable.hpp +++ b/components/common/cpp/include/ftl/configurable.hpp @@ -67,6 +67,11 @@ class Configurable { std::string getID() { return *get<std::string>("$id"); } + template <typename T> + inline bool is(const std::string &name) { return false; } + + bool has(const std::string &name) const; + /** * Get a configuration property, but return a default if not found. */ @@ -191,6 +196,20 @@ extern template void ftl::Configurable::set<std::string>(const std::string &name extern template void ftl::Configurable::set<std::vector<std::string>>(const std::string &name, std::vector<std::string> value); extern template void ftl::Configurable::set<nlohmann::json>(const std::string &name, nlohmann::json value); +template <> bool ftl::Configurable::is<float>(const std::string &name); +template <> bool ftl::Configurable::is<int>(const std::string &name); +template <> bool ftl::Configurable::is<unsigned int>(const std::string &name); +template <> bool ftl::Configurable::is<std::string>(const std::string &name); +template <> bool ftl::Configurable::is<bool>(const std::string &name); +template <> bool ftl::Configurable::is<double>(const std::string &name); + +extern template bool ftl::Configurable::is<float>(const std::string &name); +extern template bool ftl::Configurable::is<int>(const std::string &name); +extern template bool ftl::Configurable::is<unsigned int>(const std::string &name); +extern template bool ftl::Configurable::is<std::string>(const std::string &name); +extern template bool ftl::Configurable::is<bool>(const std::string &name); +extern template bool ftl::Configurable::is<double>(const std::string &name); + template <typename T, typename... ARGS> T *ftl::Configurable::create(const std::string &name, ARGS ...args) { return ftl::config::create<T>(this, name, args...); diff --git a/components/common/cpp/src/configurable.cpp b/components/common/cpp/src/configurable.cpp index 1f377fc51..c5f6d9d86 100644 --- a/components/common/cpp/src/configurable.cpp +++ b/components/common/cpp/src/configurable.cpp @@ -121,6 +121,40 @@ template void ftl::Configurable::set<std::string>(const std::string &name, std:: template void ftl::Configurable::set<std::vector<std::string>>(const std::string &name, std::vector<std::string> value); template void ftl::Configurable::set<nlohmann::json>(const std::string &name, nlohmann::json value); +template <> +bool ftl::Configurable::is<float>(const std::string &name) { + return getConfig()[name].is_number_float(); +} + +template <> +bool ftl::Configurable::is<int>(const std::string &name) { + return getConfig()[name].is_number_integer(); +} + +template <> +bool ftl::Configurable::is<unsigned int>(const std::string &name) { + return getConfig()[name].is_number_unsigned(); +} + +template <> +bool ftl::Configurable::is<std::string>(const std::string &name) { + return getConfig()[name].is_string(); +} + +template <> +bool ftl::Configurable::is<bool>(const std::string &name) { + return getConfig()[name].is_boolean(); +} + +template <> +bool ftl::Configurable::is<double>(const std::string &name) { + return getConfig()[name].is_number_float(); +} + +bool ftl::Configurable::has(const std::string &name) const { + return (config_) ? config_->contains(name) : false; +} + void Configurable::required(const char *f, const std::vector<std::tuple<std::string, std::string, std::string>> &r) { bool diderror = false; for (auto i : r) { diff --git a/components/operators/include/ftl/operators/antialiasing.hpp b/components/operators/include/ftl/operators/antialiasing.hpp index 5548c0857..9c249f3d8 100644 --- a/components/operators/include/ftl/operators/antialiasing.hpp +++ b/components/operators/include/ftl/operators/antialiasing.hpp @@ -19,6 +19,8 @@ class FXAA : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/include/ftl/operators/clipping.hpp b/components/operators/include/ftl/operators/clipping.hpp index 25d8b76ff..a45ba760a 100644 --- a/components/operators/include/ftl/operators/clipping.hpp +++ b/components/operators/include/ftl/operators/clipping.hpp @@ -19,6 +19,8 @@ class ClipScene : public ftl::operators::Operator { bool apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/include/ftl/operators/colours.hpp b/components/operators/include/ftl/operators/colours.hpp index a54539a67..d6745d17c 100644 --- a/components/operators/include/ftl/operators/colours.hpp +++ b/components/operators/include/ftl/operators/colours.hpp @@ -15,6 +15,8 @@ class ColourChannels : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: cv::cuda::GpuMat temp_; cv::cuda::GpuMat rbuf_; diff --git a/components/operators/include/ftl/operators/depth.hpp b/components/operators/include/ftl/operators/depth.hpp index 14f46b12d..38596dcc0 100644 --- a/components/operators/include/ftl/operators/depth.hpp +++ b/components/operators/include/ftl/operators/depth.hpp @@ -18,6 +18,8 @@ class DepthBilateralFilter : public::ftl::operators::Operator { inline ftl::operators::Operator::Type type() const override { return ftl::operators::Operator::Type::OneToOne; } bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: cv::cuda::GpuMat disp_int_; cv::cuda::GpuMat disp_int_result_; diff --git a/components/operators/include/ftl/operators/detectandtrack.hpp b/components/operators/include/ftl/operators/detectandtrack.hpp index 0d8b063d3..2341d2d40 100644 --- a/components/operators/include/ftl/operators/detectandtrack.hpp +++ b/components/operators/include/ftl/operators/detectandtrack.hpp @@ -48,6 +48,8 @@ class DetectAndTrack : public ftl::operators::Operator { void wait(cudaStream_t) override; + static void configuration(ftl::Configurable*) {} + protected: bool init(); @@ -126,6 +128,8 @@ class ArUco : public ftl::operators::Operator { ftl::codecs::Channel channel_in_; ftl::codecs::Channel channel_out_; + static void configuration(ftl::Configurable*) {} + private: bool estimate_pose_; float marker_size_; diff --git a/components/operators/include/ftl/operators/disparity.hpp b/components/operators/include/ftl/operators/disparity.hpp index 17993f24c..2e4365d8c 100644 --- a/components/operators/include/ftl/operators/disparity.hpp +++ b/components/operators/include/ftl/operators/disparity.hpp @@ -29,6 +29,8 @@ public: bool isMemoryHeavy() const override { return true; } + static void configuration(ftl::Configurable*) {} + private: bool init(); @@ -54,6 +56,8 @@ class FixstarsSGM : public ftl::operators::Operator { bool isMemoryHeavy() const override { return true; } + static void configuration(ftl::Configurable*) {} + private: bool init(); bool updateParameters(); @@ -99,6 +103,8 @@ class DisparityBilateralFilter : public::ftl::operators::Operator { inline Operator::Type type() const override { return Operator::Type::OneToOne; } bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: cv::Ptr<cv::cuda::DisparityBilateralFilter> filter_; cv::cuda::GpuMat disp_int_; @@ -121,6 +127,8 @@ class DisparityToDepth : public ftl::operators::Operator { ~DisparityToDepth() {}; inline Operator::Type type() const override { return Operator::Type::OneToOne; } bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + + static void configuration(ftl::Configurable*) {} }; /** @@ -138,6 +146,8 @@ class DepthChannel : public ftl::operators::Operator { bool apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) override; bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::operators::Graph *pipe_; std::vector<cv::cuda::GpuMat> rbuf_; @@ -160,6 +170,8 @@ class OpticalFlowTemporalSmoothing : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: void _init(ftl::Configurable* cfg); bool init(); diff --git a/components/operators/include/ftl/operators/filling.hpp b/components/operators/include/ftl/operators/filling.hpp index ed2b3f39a..c26b9ef80 100644 --- a/components/operators/include/ftl/operators/filling.hpp +++ b/components/operators/include/ftl/operators/filling.hpp @@ -19,6 +19,8 @@ class ScanFieldFill : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; class CrossSupportFill : public ftl::operators::Operator { @@ -30,6 +32,8 @@ class CrossSupportFill : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/include/ftl/operators/fusion.hpp b/components/operators/include/ftl/operators/fusion.hpp index ed0e5f9cd..d1e72ecfe 100644 --- a/components/operators/include/ftl/operators/fusion.hpp +++ b/components/operators/include/ftl/operators/fusion.hpp @@ -17,6 +17,8 @@ class Fusion : public ftl::operators::Operator { bool apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::cuda::MLSMultiIntensity mls_; std::vector<cv::cuda::GpuMat> weights_; diff --git a/components/operators/include/ftl/operators/gt_analysis.hpp b/components/operators/include/ftl/operators/gt_analysis.hpp index cea34c9db..efe0b64e6 100644 --- a/components/operators/include/ftl/operators/gt_analysis.hpp +++ b/components/operators/include/ftl/operators/gt_analysis.hpp @@ -21,6 +21,8 @@ class GTAnalysis : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*); + private: ftl::cuda::GTAnalysisData *output_; }; diff --git a/components/operators/include/ftl/operators/mask.hpp b/components/operators/include/ftl/operators/mask.hpp index 7d877d657..863e085c2 100644 --- a/components/operators/include/ftl/operators/mask.hpp +++ b/components/operators/include/ftl/operators/mask.hpp @@ -21,6 +21,8 @@ class DiscontinuityMask : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -35,6 +37,8 @@ class BorderMask : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -49,6 +53,8 @@ class DisplayMask : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -63,6 +69,8 @@ class CullDiscontinuity : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/include/ftl/operators/mvmls.hpp b/components/operators/include/ftl/operators/mvmls.hpp index 0c0d6f4af..56aafac1f 100644 --- a/components/operators/include/ftl/operators/mvmls.hpp +++ b/components/operators/include/ftl/operators/mvmls.hpp @@ -15,6 +15,8 @@ class MultiViewMLS : public ftl::operators::Operator { bool apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: std::vector<ftl::cuda::TextureObject<float4>*> centroid_horiz_; std::vector<ftl::cuda::TextureObject<float4>*> centroid_vert_; diff --git a/components/operators/include/ftl/operators/normals.hpp b/components/operators/include/ftl/operators/normals.hpp index c4d1a0190..398b006c7 100644 --- a/components/operators/include/ftl/operators/normals.hpp +++ b/components/operators/include/ftl/operators/normals.hpp @@ -19,6 +19,8 @@ class Normals : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -36,6 +38,8 @@ class NormalDot : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -51,6 +55,8 @@ class SmoothNormals : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::cuda::TextureObject<half4> temp_; diff --git a/components/operators/include/ftl/operators/operator.hpp b/components/operators/include/ftl/operators/operator.hpp index 3f77b6900..938f5e781 100644 --- a/components/operators/include/ftl/operators/operator.hpp +++ b/components/operators/include/ftl/operators/operator.hpp @@ -81,7 +81,7 @@ struct ConstructionHelperBase { template <typename T> struct ConstructionHelper : public ConstructionHelperBase { - explicit ConstructionHelper(ftl::Configurable *cfg) : ConstructionHelperBase(cfg) {} + explicit ConstructionHelper(ftl::Configurable *cfg) : ConstructionHelperBase(cfg) { T::configuration(cfg); } ~ConstructionHelper() {} ftl::operators::Operator *make(Graph *g) override { return new T(g, config); @@ -92,6 +92,7 @@ template <typename T, typename... ARGS> struct ConstructionHelper2 : public ConstructionHelperBase { explicit ConstructionHelper2(ftl::Configurable *cfg, ARGS... args) : ConstructionHelperBase(cfg) { arguments_ = std::make_tuple(args...); + T::configuration(cfg); } ~ConstructionHelper2() {} ftl::operators::Operator *make(Graph *g) override { diff --git a/components/operators/include/ftl/operators/opticalflow.hpp b/components/operators/include/ftl/operators/opticalflow.hpp index 21d8bbb20..cea1e7ba4 100644 --- a/components/operators/include/ftl/operators/opticalflow.hpp +++ b/components/operators/include/ftl/operators/opticalflow.hpp @@ -20,6 +20,8 @@ class NVOpticalFlow : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + protected: bool init(); diff --git a/components/operators/include/ftl/operators/poser.hpp b/components/operators/include/ftl/operators/poser.hpp index 8d762f8ba..2a6a4d6eb 100644 --- a/components/operators/include/ftl/operators/poser.hpp +++ b/components/operators/include/ftl/operators/poser.hpp @@ -24,6 +24,8 @@ class Poser : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + static bool get(const std::string &name, Eigen::Matrix4d &pose); static bool get(const std::string &name, ftl::codecs::Shape3D &shape); static std::list<ftl::codecs::Shape3D*> getAll(int32_t fsid); diff --git a/components/operators/include/ftl/operators/segmentation.hpp b/components/operators/include/ftl/operators/segmentation.hpp index ec2f9e9a6..0c3a4fff7 100644 --- a/components/operators/include/ftl/operators/segmentation.hpp +++ b/components/operators/include/ftl/operators/segmentation.hpp @@ -18,6 +18,8 @@ class CrossSupport : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; /** @@ -32,6 +34,8 @@ class VisCrossSupport : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/include/ftl/operators/smoothing.hpp b/components/operators/include/ftl/operators/smoothing.hpp index db231cdd7..d035d399a 100644 --- a/components/operators/include/ftl/operators/smoothing.hpp +++ b/components/operators/include/ftl/operators/smoothing.hpp @@ -21,6 +21,8 @@ class HFSmoother : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: cv::cuda::GpuMat temp_; //ftl::rgbd::Frame frames_[4]; @@ -42,6 +44,8 @@ class SmoothChannel : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::cuda::TextureObject<uchar4> temp_[6]; }; @@ -60,6 +64,8 @@ class SimpleMLS : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::data::Frame temp_; }; @@ -77,6 +83,8 @@ class ColourMLS : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::data::Frame temp_; }; @@ -120,6 +128,8 @@ class AggreMLS : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::cuda::TextureObject<float4> centroid_horiz_; ftl::cuda::TextureObject<float4> centroid_vert_; @@ -144,6 +154,8 @@ class AdaptiveMLS : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + private: ftl::data::Frame temp_; }; diff --git a/components/operators/include/ftl/operators/weighting.hpp b/components/operators/include/ftl/operators/weighting.hpp index 8256a08cb..d829de145 100644 --- a/components/operators/include/ftl/operators/weighting.hpp +++ b/components/operators/include/ftl/operators/weighting.hpp @@ -29,6 +29,8 @@ class PixelWeights : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; class CullWeight : public ftl::operators::Operator { @@ -40,6 +42,8 @@ class CullWeight : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; class DegradeWeight : public ftl::operators::Operator { @@ -51,6 +55,8 @@ class DegradeWeight : public ftl::operators::Operator { bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override; + static void configuration(ftl::Configurable*) {} + }; } diff --git a/components/operators/src/analysis/evaluation/gt_analysis.cpp b/components/operators/src/analysis/evaluation/gt_analysis.cpp index d7f94d399..c9559084e 100644 --- a/components/operators/src/analysis/evaluation/gt_analysis.cpp +++ b/components/operators/src/analysis/evaluation/gt_analysis.cpp @@ -9,6 +9,11 @@ GTAnalysis::GTAnalysis(ftl::operators::Graph *g, ftl::Configurable *cfg) : ftl:: cudaMalloc(&output_, sizeof(ftl::cuda::GTAnalysisData)); } +void GTAnalysis::configuration(ftl::Configurable *cfg) { + cfg->value("use_disparity", true); + cfg->value("show_colour", false); +} + GTAnalysis::~GTAnalysis() { cudaFree(output_); } diff --git a/components/streams/src/filestream.cpp b/components/streams/src/filestream.cpp index 96159a544..cddf769b5 100644 --- a/components/streams/src/filestream.cpp +++ b/components/streams/src/filestream.cpp @@ -174,6 +174,7 @@ bool File::readPacket(std::tuple<ftl::codecs::StreamPacket,ftl::codecs::Packet> auto &spkt = std::get<0>(data); auto &spktv4 = std::get<0>(datav4); + spkt.version = 4; spkt.streamID = spktv4.streamID; spkt.channel = spktv4.channel; spkt.frame_number = spktv4.frame_number; @@ -213,7 +214,7 @@ void File::_patchPackets(ftl::codecs::StreamPacket &spkt, ftl::codecs::Packet &p if (codec == ftl::codecs::codec_t::HEVC) pkt.codec = ftl::codecs::codec_t::HEVC_LOSSLESS; } - spkt.version = 5; + spkt.version = ftl::codecs::kCurrentFTLVersion; // Fix for flags corruption if (pkt.data.size() == 0) { -- GitLab