Skip to content
Snippets Groups Projects

Feature/219/gui record options

Merged Iiro Rastas requested to merge feature/219/gui-record-options into master
4 files
+ 38
19
Compare changes
  • Side-by-side
  • Inline
Files
4
  • 5a8aa134
    Reimplement 2D video capture · 5a8aa134
    Iiro Rastas authored
    As the previous approach led to low performance, 2D video is now
    captured to an ftl file, which removes the need to encode the video in
    real time. The ftl file can be converted into a video file with ftl2mkv.
@@ -137,7 +137,13 @@ ftl::gui::Camera::Camera(ftl::gui::Screen *screen, ftl::rgbd::Source *src) : scr
sdepth_ = false;
ftime_ = (float)glfwGetTime();
pause_ = false;
videowriter_ = std::nullopt;
recording_ = false;
fileout_ = new std::ofstream();
writer_ = new ftl::codecs::Writer(*fileout_);
recorder_ = std::function([this](ftl::rgbd::Source *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt) {
ftl::codecs::StreamPacket s = spkt;
writer_->write(s, pkt);
});
channel_ = Channel::Left;
@@ -167,7 +173,8 @@ ftl::gui::Camera::Camera(ftl::gui::Screen *screen, ftl::rgbd::Source *src) : scr
}
ftl::gui::Camera::~Camera() {
delete writer_;
delete fileout_;
}
ftl::rgbd::Source *ftl::gui::Camera::source() {
@@ -489,12 +496,6 @@ const GLTexture &ftl::gui::Camera::captureFrame() {
//imageSize = Vector2f(rgb.cols,rgb.rows);
texture1_.update(im1_);
}
if (videowriter_) {
cv::Mat image;
cv::flip(im1_, image, 0);
videowriter_.value().write(image);
}
}
return texture1_;
@@ -511,17 +512,21 @@ void ftl::gui::Camera::snapshot() {
}
void ftl::gui::Camera::toggleVideoRecording() {
if (videowriter_) {
videowriter_.value().release();
videowriter_ = std::nullopt;
if (recording_) {
src_->removeRawCallback(recorder_);
writer_->end();
fileout_->close();
} else {
char timestamp[18];
std::time_t t = std::time(NULL);
std::time_t t=std::time(NULL);
std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));
videowriter_ = std::optional<cv::VideoWriter>(cv::VideoWriter(std::string(timestamp) + ".avi",
cv::VideoWriter::fourcc('M','J','P','G'),
screen_->root()->value("fps", 20),
cv::Size(width(), height())));
fileout_->open(std::string(timestamp) + ".ftl");
writer_->begin();
src_->addRawCallback(recorder_);
src_->inject(Channel::Calibration, src_->parameters(), Channel::Left, src_->getCapabilities());
src_->inject(src_->getPose());
}
}
Loading