mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
Preliminary implementation of recording 'save & continue'
This commit is contained in:
@@ -60,9 +60,22 @@ void FrameGrabbing::add(FrameGrabber *rec)
|
|||||||
grabbers_.push_back(rec);
|
grabbers_.push_back(rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrameGrabbing::chain(FrameGrabber *rec, FrameGrabber *next_rec)
|
||||||
|
{
|
||||||
|
if (rec != nullptr && next_rec != nullptr)
|
||||||
|
{
|
||||||
|
// add grabber if not yet
|
||||||
|
if ( std::find(grabbers_.begin(), grabbers_.end(), rec) == grabbers_.end() )
|
||||||
|
grabbers_.push_back(rec);
|
||||||
|
|
||||||
|
grabbers_chain_[next_rec] = rec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FrameGrabbing::verify(FrameGrabber **rec)
|
void FrameGrabbing::verify(FrameGrabber **rec)
|
||||||
{
|
{
|
||||||
if ( std::find(grabbers_.begin(), grabbers_.end(), *rec) == grabbers_.end() )
|
if ( std::find(grabbers_.begin(), grabbers_.end(), *rec) == grabbers_.end() &&
|
||||||
|
grabbers_chain_.find(*rec) == grabbers_chain_.end() )
|
||||||
*rec = nullptr;
|
*rec = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,6 +227,7 @@ void FrameGrabbing::grabFrame(FrameBuffer *frame_buffer)
|
|||||||
FrameGrabber *rec = *iter;
|
FrameGrabber *rec = *iter;
|
||||||
rec->addFrame(buffer, caps_);
|
rec->addFrame(buffer, caps_);
|
||||||
|
|
||||||
|
// remove finished recorders
|
||||||
if (rec->finished()) {
|
if (rec->finished()) {
|
||||||
iter = grabbers_.erase(iter);
|
iter = grabbers_.erase(iter);
|
||||||
delete rec;
|
delete rec;
|
||||||
@@ -222,6 +236,25 @@ void FrameGrabbing::grabFrame(FrameBuffer *frame_buffer)
|
|||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// manage the list of chainned recorder
|
||||||
|
std::map<FrameGrabber *, FrameGrabber *>::iterator chain = grabbers_chain_.begin();
|
||||||
|
while (chain != grabbers_chain_.end()) {
|
||||||
|
// update frame grabber of chain list
|
||||||
|
chain->first->addFrame(buffer, caps_);
|
||||||
|
// if the chained recorder is now active
|
||||||
|
if (chain->first->active_ && chain->first->accept_buffer_){
|
||||||
|
// add it to main grabbers,
|
||||||
|
grabbers_.push_back(chain->first);
|
||||||
|
// stop the replaced grabber
|
||||||
|
chain->second->stop();
|
||||||
|
// loop in chain list: done with this chain
|
||||||
|
chain = grabbers_chain_.erase(chain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
// loop in chain list
|
||||||
|
++chain;
|
||||||
|
}
|
||||||
|
|
||||||
// unref / free the frame
|
// unref / free the frame
|
||||||
gst_buffer_unref(buffer);
|
gst_buffer_unref(buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
@@ -111,6 +112,7 @@ public:
|
|||||||
inline uint height() const { return height_; }
|
inline uint height() const { return height_; }
|
||||||
|
|
||||||
void add(FrameGrabber *rec);
|
void add(FrameGrabber *rec);
|
||||||
|
void chain(FrameGrabber *rec, FrameGrabber *new_rec);
|
||||||
void verify(FrameGrabber **rec);
|
void verify(FrameGrabber **rec);
|
||||||
FrameGrabber *front();
|
FrameGrabber *front();
|
||||||
FrameGrabber *get(uint64_t id);
|
FrameGrabber *get(uint64_t id);
|
||||||
@@ -124,6 +126,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::list<FrameGrabber *> grabbers_;
|
std::list<FrameGrabber *> grabbers_;
|
||||||
|
std::map<FrameGrabber *, FrameGrabber *> grabbers_chain_;
|
||||||
guint pbo_[2];
|
guint pbo_[2];
|
||||||
guint pbo_index_;
|
guint pbo_index_;
|
||||||
guint pbo_next_index_;
|
guint pbo_next_index_;
|
||||||
|
|||||||
@@ -326,8 +326,15 @@ void UserInterface::handleKeyboard()
|
|||||||
else {
|
else {
|
||||||
// toggle recording
|
// toggle recording
|
||||||
if (video_recorder_) {
|
if (video_recorder_) {
|
||||||
video_recorder_->stop();
|
// allow 'save & continue' for Ctrl+Alt+R if no timeout for recording
|
||||||
// video_recorder_ = nullptr;
|
if (alt_modifier_active && Settings::application.record.timeout == RECORD_MAX_TIMEOUT) {
|
||||||
|
VideoRecorder *rec = new VideoRecorder;
|
||||||
|
FrameGrabbing::manager().chain(video_recorder_, rec);
|
||||||
|
video_recorder_ = rec;
|
||||||
|
}
|
||||||
|
// normal case: Ctrl+R stop recording
|
||||||
|
else
|
||||||
|
video_recorder_->stop();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_video_recorders.emplace_back( std::async(std::launch::async, delayTrigger, new VideoRecorder,
|
_video_recorders.emplace_back( std::async(std::launch::async, delayTrigger, new VideoRecorder,
|
||||||
@@ -1334,6 +1341,14 @@ void UserInterface::RenderPreview()
|
|||||||
if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) {
|
if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) {
|
||||||
video_recorder_->stop();
|
video_recorder_->stop();
|
||||||
}
|
}
|
||||||
|
// offer the 'save & continue' recording for undefined duration
|
||||||
|
if (Settings::application.record.timeout == RECORD_MAX_TIMEOUT) {
|
||||||
|
if ( ImGui::MenuItem( ICON_FA_ARROW_ALT_CIRCLE_DOWN " Save & continue", CTRL_MOD "Alt+R") ) {
|
||||||
|
VideoRecorder *rec = new VideoRecorder;
|
||||||
|
FrameGrabbing::manager().chain(video_recorder_, rec);
|
||||||
|
video_recorder_ = rec;
|
||||||
|
}
|
||||||
|
}
|
||||||
ImGui::PopStyleColor(1);
|
ImGui::PopStyleColor(1);
|
||||||
}
|
}
|
||||||
// start recording
|
// start recording
|
||||||
|
|||||||
Reference in New Issue
Block a user