diff --git a/src/common/subsystems.hpp b/src/common/subsystems.hpp index ea40faad4..103d78d3f 100644 --- a/src/common/subsystems.hpp +++ b/src/common/subsystems.hpp @@ -367,17 +367,23 @@ public: ~Window() { //don't delete form_. it is autmatically cleaned up by screen_ - delete screen_; - delete writer_; - delete capture_; - delete nvgContext_; - delete clvaContext_; - delete clglContext_; + if(screen_) + delete screen_; + if(writer_) + delete writer_; + if(capture_) + delete capture_; + if(nvgContext_) + delete nvgContext_; + if(clvaContext_) + delete clvaContext_; + if(clglContext_) + delete clglContext_; glfwDestroyWindow(getGLFWWindow()); glfwTerminate(); } - cv::Ptr form() { + nanogui::FormHelper* form() { return form_; } @@ -421,6 +427,10 @@ public: }); } + void makeGLFWContextCurrent() { + glfwMakeContextCurrent(getGLFWWindow()); + } + cv::VideoWriter& makeVAWriter(const string& outputFilename, const int fourcc, const float fps, const cv::Size& frameSize, const int vaDeviceIndex) { writer_ = new cv::VideoWriter(outputFilename, cv::CAP_FFMPEG, cv::VideoWriter::fourcc('V', 'P', '9', '0'), fps, frameSize, { cv::VIDEOWRITER_PROP_HW_DEVICE, vaDeviceIndex, @@ -526,22 +536,22 @@ public: offscreen_ = o; } - nanogui::Window& makeWindow(int x, int y, const string& title) { - return *form()->add_window(nanogui::Vector2i(x, y), title); + nanogui::Window* makeWindow(int x, int y, const string& title) { + return form()->add_window(nanogui::Vector2i(x, y), title); } - nanogui::Label& makeGroup(const string& label) { - return *form()->add_group(label); + nanogui::Label* makeGroup(const string& label) { + return form()->add_group(label); } - nanogui::detail::FormWidget& makeFormVariable(const string &name, bool &v, const string &tooltip = "") { + nanogui::detail::FormWidget* makeFormVariable(const string &name, bool &v, const string &tooltip = "") { auto var = form()->add_variable(name, v); if (!tooltip.empty()) var->set_tooltip(tooltip); - return *var; + return var; } - template nanogui::detail::FormWidget& makeFormVariable(const string &name, T &v, const T &min, const T &max, bool spinnable = true, const string &unit = "", const string tooltip = "") { + template nanogui::detail::FormWidget* makeFormVariable(const string &name, T &v, const T &min, const T &max, bool spinnable = true, const string &unit = "", const string tooltip = "") { auto var = form()->add_variable(name, v); var->set_spinnable(spinnable); var->set_min_value(min); @@ -550,7 +560,7 @@ public: var->set_units(unit); if (!tooltip.empty()) var->set_tooltip(tooltip); - return *var; + return var; } void setUseOpenCL(bool u) { diff --git a/src/optflow/optflow-demo.cpp b/src/optflow/optflow-demo.cpp index bddd31b7b..7168d45d1 100644 --- a/src/optflow/optflow-demo.cpp +++ b/src/optflow/optflow-demo.cpp @@ -13,6 +13,7 @@ using std::cerr; using std::endl; using std::vector; using std::string; +using namespace std::literals::chrono_literals; /** Application parameters **/ @@ -182,7 +183,7 @@ void composite_layers(const cv::UMat background, const cv::UMat foreground, cons } void setup_gui(cv::Ptr window) { - auto subWin = window->makeWindow(6, 45, "Settings"); + window->makeWindow(6, 45, "Settings"); auto useOpenCL = window->makeFormVariable("Use OpenCL", use_opencl, "Enable or disable OpenCL acceleration"); @@ -201,7 +202,7 @@ void setup_gui(cv::Ptr window) { window->makeGroup("Effect"); window->makeFormVariable("Max. Stroke Size", max_stroke, 1, 100, true, "px", "The theoretical maximum size of the drawing stroke which is scaled by the area of the convex hull of tracked points and therefor is usually much smaller"); auto glowKernel = window->makeFormVariable("Glow Kernel Size", glow_kernel_size, 1, 63, true, "", "Intensity of glow defined by kernel size"); - glowKernel.set_callback([](const int& k) { + glowKernel->set_callback([](const int& k) { glow_kernel_size = std::max(int(k % 2 == 0 ? k + 1 : k), 1); }); auto color = window->form()->add_variable("Color", effect_color); @@ -243,6 +244,7 @@ int main(int argc, char **argv) { } float fps = capture.get(cv::CAP_PROP_FPS); + window->makeVAWriter(OUTPUT_FILENAME, cv::VideoWriter::fourcc('V', 'P', '9', '0'), fps, window->getSize(), VA_HW_DEVICE_INDEX); //BGRA