Management of recorders by id in user interface.

This commit is contained in:
brunoherbelin
2020-10-14 22:37:53 +02:00
parent 3a34da9322
commit 3a41e59f00
5 changed files with 59 additions and 10 deletions

View File

@@ -6,6 +6,8 @@
#include <gst/gst.h>
#include "GlmToolkit.h"
class FrameBuffer;
/**
* @brief The FrameGrabber class defines the base class for all recorders
@@ -15,14 +17,27 @@ class FrameBuffer;
*/
class FrameGrabber
{
uint64_t id_;
public:
FrameGrabber(): finished_(false), pbo_index_(0), pbo_next_index_(0), size_(0)
{
id_ = GlmToolkit::uniqueId();
pbo_[0] = pbo_[1] = 0;
}
virtual ~FrameGrabber() {}
inline uint64_t id() const { return id_; }
struct hasId: public std::unary_function<FrameGrabber*, bool>
{
inline bool operator()(const FrameGrabber* elem) const {
return (elem && elem->id() == _id);
}
hasId(uint64_t id) : _id(id) { }
private:
uint64_t _id;
};
virtual void addFrame(FrameBuffer *frame_buffer, float dt) = 0;
virtual void stop() { }
virtual std::string info() { return ""; }
@@ -31,6 +46,7 @@ public:
inline bool finished() const { return finished_; }
protected:
// thread-safe testing termination
std::atomic<bool> finished_;

View File

@@ -297,6 +297,7 @@ int Session::index(SourceList::iterator it) const
void Session::addFrameGrabber(FrameGrabber *rec)
{
if (rec != nullptr)
grabbers_.push_back(rec);
}
@@ -309,6 +310,18 @@ FrameGrabber *Session::frontFrameGrabber()
return grabbers_.front();
}
FrameGrabber *Session::getFrameGrabber(uint64_t id)
{
if (!grabbers_.empty())
{
std::list<FrameGrabber *>::iterator iter = std::find_if(grabbers_.begin(), grabbers_.end(), FrameGrabber::hasId(id));
if (iter != grabbers_.end())
return (*iter);
}
return nullptr;
}
void Session::stopAllFrameGrabbers()
{
std::list<FrameGrabber *>::iterator iter;

View File

@@ -61,6 +61,7 @@ public:
// Recorders
void addFrameGrabber(FrameGrabber *rec);
FrameGrabber *frontFrameGrabber();
FrameGrabber *getFrameGrabber(uint64_t id);
void stopAllFrameGrabbers();
void clearAllFrameGrabbers();
void transferFrameGrabber(Session *dest);

View File

@@ -151,12 +151,18 @@ static std::string FolderDialog(const std::string &path)
UserInterface::UserInterface()
{
ctrl_modifier_active = false;
alt_modifier_active = false;
shift_modifier_active = false;
show_vimix_config = false;
show_imgui_about = false;
show_gst_about = false;
show_opengl_about = false;
currentTextEdit = "";
screenshot_step = 0;
video_recorder_ = 0;
video_streamer_ = 0;
}
bool UserInterface::Init()
@@ -294,11 +300,16 @@ void UserInterface::handleKeyboard()
}
else if (ImGui::IsKeyPressed( GLFW_KEY_R )) {
// toggle recording
FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber();
if (rec)
FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_);
if (rec) {
rec->stop();
else
Mixer::manager().session()->addFrameGrabber(new VideoRecorder);
video_recorder_ = 0;
}
else {
FrameGrabber *fg = new VideoRecorder;
video_recorder_ = fg->id();
Mixer::manager().session()->addFrameGrabber(fg);
}
}
else if (ImGui::IsKeyPressed( GLFW_KEY_Z )) {
if (shift_modifier_active)
@@ -773,10 +784,11 @@ void UserInterface::Render()
if (Settings::application.widget.stats)
ImGuiToolkit::ShowStats(&Settings::application.widget.stats, &Settings::application.widget.stats_corner);
// TODO: better management of main_video_recorder
FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber();
// management of video_recorder
FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_);
if (rec && rec->duration() > Settings::application.record.timeout ){
rec->stop();
video_recorder_ = 0;
}
// all IMGUI Rendering
@@ -1089,7 +1101,7 @@ void UserInterface::RenderPreview()
}
FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber();
FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_);
// return from thread for folder openning
if ( !recordFolderFileDialogs.empty() ) {
@@ -1128,12 +1140,15 @@ void UserInterface::RenderPreview()
if (rec) {
if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) {
rec->stop();
video_recorder_ = 0;
}
}
// start recording
else {
if ( ImGui::MenuItem( ICON_FA_CIRCLE " Record", CTRL_MOD "R") ) {
Mixer::manager().session()->addFrameGrabber(new VideoRecorder);
FrameGrabber *fg = new VideoRecorder;
video_recorder_ = fg->id();
Mixer::manager().session()->addFrameGrabber(fg);
}
// select profile
ImGui::SetNextItemWidth(300);

View File

@@ -115,6 +115,10 @@ class UserInterface
bool show_opengl_about;
unsigned int screenshot_step;
// frame grabbers
uint64_t video_recorder_;
uint64_t video_streamer_;
// Private Constructor
UserInterface();
UserInterface(UserInterface const& copy); // Not Implemented