From 8451b16e88b25405d9877243b253a369fd953243 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 13 Jan 2018 07:46:12 +0100 Subject: tracker/pt: workaround unexplained leak Somehow, using unique_ptr causes a leak at destruct time. The stored pointer isn't freed. It works perfectly fine with shared_ptr. It seems I'm doing things correctly with a move constructor for unique_ptr in the Tracker_PT class, as well as the pointer initialization ctor in `module.cpp'. Who the hell knows what's happening behind the scenes. --- tracker-pt/camera.cpp | 4 +++- tracker-pt/camera.h | 2 +- tracker-pt/ftnoir_tracker_pt.cpp | 12 +++++------- tracker-pt/ftnoir_tracker_pt.h | 15 ++++++++------- tracker-pt/module.cpp | 22 +++++++++++++--------- tracker-pt/pt-api.cpp | 1 + tracker-pt/pt-api.hpp | 10 ++++++---- 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/tracker-pt/camera.cpp b/tracker-pt/camera.cpp index 20acf27a..ba4583da 100644 --- a/tracker-pt/camera.cpp +++ b/tracker-pt/camera.cpp @@ -18,7 +18,9 @@ using namespace pt_module; -Camera::Camera(const QString& module_name) : dt_mean(0), fov(0), s(module_name) {} +Camera::Camera(const QString& module_name) : s { module_name } +{ +} QString Camera::get_desired_name() const { diff --git a/tracker-pt/camera.h b/tracker-pt/camera.h index 35e887ad..030861c7 100644 --- a/tracker-pt/camera.h +++ b/tracker-pt/camera.h @@ -46,7 +46,7 @@ struct Camera final : pt_camera private: warn_result_unused bool _get_frame(cv::Mat& Frame); - double dt_mean, fov; + double dt_mean = 0, fov = 30; Timer t; diff --git a/tracker-pt/ftnoir_tracker_pt.cpp b/tracker-pt/ftnoir_tracker_pt.cpp index bded07d3..467334de 100644 --- a/tracker-pt/ftnoir_tracker_pt.cpp +++ b/tracker-pt/ftnoir_tracker_pt.cpp @@ -13,7 +13,6 @@ #include "pt-api.hpp" #include -#include #include @@ -27,11 +26,11 @@ using namespace types; static constexpr inline int preview_width = 320, preview_height = 240; Tracker_PT::Tracker_PT(const pt_runtime_traits& traits) : - s(traits.get_module_name()), - point_extractor(std::move(traits.make_point_extractor())), - camera(std::move(traits.make_camera())), - frame(std::move(traits.make_frame())), - preview_frame(std::move(traits.make_preview(preview_width, preview_height))) + s { traits.get_module_name() }, + point_extractor { traits.make_point_extractor() }, + camera { traits.make_camera() }, + frame { traits.make_frame() }, + preview_frame { traits.make_preview(preview_width, preview_height) } { cv::setBreakOnError(true); @@ -139,7 +138,6 @@ void Tracker_PT::set_fov(int value) module_status Tracker_PT::start_tracker(QFrame* video_frame) { //video_frame->setAttribute(Qt::WA_NativeWindow); - preview_size = video_frame->size(); video_widget = std::make_unique(video_frame); layout = std::make_unique(video_frame); diff --git a/tracker-pt/ftnoir_tracker_pt.h b/tracker-pt/ftnoir_tracker_pt.h index deddeea8..c9c15bc7 100644 --- a/tracker-pt/ftnoir_tracker_pt.h +++ b/tracker-pt/ftnoir_tracker_pt.h @@ -59,20 +59,21 @@ private: QMutex camera_mtx; QMutex data_mtx; - std::unique_ptr point_extractor; - std::unique_ptr camera; + template + using pointer = typename pt_runtime_traits::pointer; + PointTracker point_tracker; pt_settings s; - std::unique_ptr video_widget; std::unique_ptr layout; - std::vector points; - std::unique_ptr frame; - std::unique_ptr preview_frame; - QSize preview_size; + pointer point_extractor; + pointer camera; + pointer video_widget; + pointer frame; + pointer preview_frame; std::atomic point_count = 0; std::atomic ever_success = false; diff --git a/tracker-pt/module.cpp b/tracker-pt/module.cpp index d977aa16..c73b771e 100644 --- a/tracker-pt/module.cpp +++ b/tracker-pt/module.cpp @@ -16,14 +16,14 @@ using namespace pt_module; struct pt_module_traits final : pt_runtime_traits { - std::unique_ptr make_camera() const override + pointer make_camera() const override { - return std::unique_ptr(new Camera(module_name)); + return pointer(new Camera(module_name)); } - std::unique_ptr make_point_extractor() const override + pointer make_point_extractor() const override { - return std::unique_ptr(new PointExtractor(module_name)); + return pointer(new PointExtractor(module_name)); } QString get_module_name() const override @@ -31,14 +31,14 @@ struct pt_module_traits final : pt_runtime_traits return module_name; } - std::unique_ptr make_frame() const override + pointer make_frame() const override { - return std::unique_ptr(new Frame); + return pointer(new Frame); } - std::unique_ptr make_preview(int w, int h) const override + pointer make_preview(int w, int h) const override { - return std::unique_ptr(new Preview(w, h)); + return pointer(new Preview(w, h)); } }; @@ -51,7 +51,7 @@ struct tracker_pt : Tracker_PT struct dialog_pt : TrackerDialog_PT { - dialog_pt() : TrackerDialog_PT(module_name) {} + dialog_pt(); }; class metadata_pt : public Metadata @@ -64,4 +64,8 @@ class metadata_pt : public Metadata using namespace pt_module; + + +dialog_pt::dialog_pt() : TrackerDialog_PT(module_name) {} + OPENTRACK_DECLARE_TRACKER(tracker_pt, dialog_pt, metadata_pt) diff --git a/tracker-pt/pt-api.cpp b/tracker-pt/pt-api.cpp index 0a6c8e2b..f64b1d81 100644 --- a/tracker-pt/pt-api.cpp +++ b/tracker-pt/pt-api.cpp @@ -69,6 +69,7 @@ std::tuple pt_pixel_pos_mixin::to_pixel_pos(double x, double y, std::tuple pt_pixel_pos_mixin::to_screen_pos(double px, double py, int w, int h) { + px *= w/(w-1.), py *= h/(h-1.); return std::make_tuple((px - w/2.)/w, -(py - h/2.)/w); } diff --git a/tracker-pt/pt-api.hpp b/tracker-pt/pt-api.hpp index 833a640e..0156fdd7 100644 --- a/tracker-pt/pt-api.hpp +++ b/tracker-pt/pt-api.hpp @@ -148,12 +148,14 @@ struct OTR_PT_EXPORT pt_settings final : options::opts struct OTR_PT_EXPORT pt_runtime_traits { + template using pointer = std::shared_ptr; + pt_runtime_traits(); virtual ~pt_runtime_traits(); - virtual std::unique_ptr make_camera() const = 0; - virtual std::unique_ptr make_point_extractor() const = 0; - virtual std::unique_ptr make_frame() const = 0; - virtual std::unique_ptr make_preview(int w, int h) const = 0; + virtual pointer make_camera() const = 0; + virtual pointer make_point_extractor() const = 0; + virtual pointer make_frame() const = 0; + virtual pointer make_preview(int w, int h) const = 0; virtual QString get_module_name() const = 0; }; -- cgit v1.2.3