diff --git a/applications/gui/src/media_panel.cpp b/applications/gui/src/media_panel.cpp index 83bad8511a287e35454ef61050e01f6a2c4d39b3..2e0f5fae21e2bb0f45492b0885ff68afe747adba 100644 --- a/applications/gui/src/media_panel.cpp +++ b/applications/gui/src/media_panel.cpp @@ -17,6 +17,7 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), using namespace nanogui; paused_ = false; + writer_ = nullptr; setLayout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 5, 10)); @@ -54,8 +55,24 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), button = new Button(this, "", ENTYPO_ICON_CONTROLLER_RECORD); button->setFlags(Button::ToggleButton); button->setChangeCallback([this,button](bool state) { - if (state) button->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f)); - else button->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); + if (state){ + auto *cam = screen_->activeCamera(); + + button->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f)); + char timestamp[18]; + std::time_t t=std::time(NULL); + std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t)); + writer_ = new ftl::rgbd::SnapshotStreamWriter(std::string(timestamp) + ".tar.gz", 1000 / 25); + writer_->addSource(cam->source()); + writer_->start(); + } else { + button->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); + if (writer_) { + writer_->stop(); + delete writer_; + writer_ = nullptr; + } + } //if (state) ... start //else ... stop }); @@ -92,12 +109,10 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), auto writer = ftl::rgbd::SnapshotWriter(std::string(timestamp) + ".tar.gz"); cv::Mat rgb, depth; cam->source()->getFrames(rgb, depth); - if (!writer.addCameraRGBD( + if (!writer.addCameraParams("0", cam->source()->getPose(), cam->source()->parameters()) || !writer.addCameraRGBD( "0", // TODO rgb, - depth, - cam->source()->getPose(), - cam->source()->parameters() + depth )) { LOG(ERROR) << "Snapshot failed"; } diff --git a/applications/gui/src/media_panel.hpp b/applications/gui/src/media_panel.hpp index 0f17bd340ab0b5b7e8881ff98ccd95021233f77d..c65c48770fe4523e5c4847ca63a50a60f0af918d 100644 --- a/applications/gui/src/media_panel.hpp +++ b/applications/gui/src/media_panel.hpp @@ -4,6 +4,11 @@ #include <nanogui/window.h> namespace ftl { + +namespace rgbd { +class SnapshotStreamWriter; +} + namespace gui { class Screen; @@ -16,6 +21,7 @@ class MediaPanel : public nanogui::Window { private: ftl::gui::Screen *screen_; bool paused_; + ftl::rgbd::SnapshotStreamWriter *writer_; }; } diff --git a/applications/gui/src/src_window.cpp b/applications/gui/src/src_window.cpp index 010ef23922b937f03c481337ab60b4288d8e813c..1242855738c87bae915d00bb48e8b788744f71a4 100644 --- a/applications/gui/src/src_window.cpp +++ b/applications/gui/src/src_window.cpp @@ -102,7 +102,7 @@ SourceWindow::SourceWindow(ftl::gui::Screen *screen) this->src_->parameters() )) { LOG(ERROR) << "Snapshot failed"; - }*/ + } } catch(std::runtime_error) { LOG(ERROR) << "Snapshot failed (file error)"; diff --git a/components/rgbd-sources/src/snapshot.cpp b/components/rgbd-sources/src/snapshot.cpp index b45ea4f93d7097c57ea5e06eb1c8c9b9530a61b8..b4ea2aac40dce7613237d8111799c9e49d46562c 100644 --- a/components/rgbd-sources/src/snapshot.cpp +++ b/components/rgbd-sources/src/snapshot.cpp @@ -143,7 +143,11 @@ bool SnapshotWriter::addCameraRGBD(const string &name, const Mat &rgb, const Mat } SnapshotStreamWriter::SnapshotStreamWriter(const string &filename, int delay) : - writer_(filename), delay_(delay) {} + run_(false), finished_(false), writer_(filename), delay_(delay) {} + +SnapshotStreamWriter::~SnapshotStreamWriter() { + +} void SnapshotStreamWriter::addSource(ftl::rgbd::Source *src) { writer_.addCameraParams(std::to_string(sources_.size()), src->getPose(), src->parameters()); @@ -151,7 +155,7 @@ void SnapshotStreamWriter::addSource(ftl::rgbd::Source *src) { } void SnapshotStreamWriter::run() { - vector<Mat> rgb;(sources_.size()); + vector<Mat> rgb(sources_.size()); vector<Mat> depth(sources_.size()); while(run_) { @@ -164,7 +168,7 @@ void SnapshotStreamWriter::run() { } for(size_t i = 0; i < sources_.size(); ++i) { - writer_.addCameraRGBD(ms + "-" + std::to_string(i), rgb[i], depth[i]); + writer_.addCameraRGBD(std::to_string(ms) + "-" + std::to_string(i), rgb[i], depth[i]); } std::this_thread::sleep_for(std::chrono::microseconds(delay_)); @@ -182,8 +186,9 @@ void SnapshotStreamWriter::start() { void SnapshotStreamWriter::stop() { + bool wasrunning = run_; run_ = false; - thread_.join(); + if (wasrunning) thread_.join(); }