extcam camera: separate preview and recording

This commit is contained in:
milek7
2019-09-20 20:16:55 +02:00
parent ccb2179d5e
commit 5602448caf
7 changed files with 67 additions and 13 deletions

View File

@@ -27,31 +27,44 @@ ui::cameraview_panel::~cameraview_panel() {
void ui::cameraview_panel::render()
{
if (!is_open) {
if (!is_open && state != RECORDING) {
exit_thread = true;
return;
}
if (exit_thread) {
if (workthread.joinable())
workthread.join();
exit_thread = false;
if (state != IDLE && !Global.extcam_cmd.empty())
workthread = std::thread(&cameraview_panel::workthread_func, this);
}
if (!is_open)
return;
ImGui::SetNextWindowSizeConstraints(ImVec2(200, 200), ImVec2(2500, 2500), cameraview_window_callback);
auto const panelname{(title.empty() ? m_name : title) + "###" + m_name};
if (ImGui::Begin(panelname.c_str())) {
if (ImGui::Begin(panelname.c_str(), &is_open)) {
render_contents();
}
ImGui::End();
}
bool ui::cameraview_panel::set_state(state_e e)
{
if (state != e) {
exit_thread = true;
state = e;
is_open = (state != IDLE);
return true;
}
return false;
}
void ui::cameraview_panel::render_contents()
{
if (exit_thread) {
if (workthread.joinable())
workthread.join();
exit_thread = false;
if (!Global.extcam_cmd.empty())
workthread = std::thread(&cameraview_panel::workthread_func, this);
}
if (!texture) {
texture.emplace();
texture->make_stub();
@@ -89,6 +102,8 @@ void ui::cameraview_panel::render_contents()
void ui::cameraview_panel::workthread_func()
{
std::string cmdline = Global.extcam_cmd;
if (state == RECORDING)
cmdline += " " + Global.extcam_rec;
if (!rec_name.empty()) {
const std::string magic{"{RECORD}"};

View File

@@ -11,12 +11,22 @@ namespace ui
{
class cameraview_panel : public ui_panel
{
public:
enum state_e {
IDLE,
PREVIEW,
RECORDING
};
private:
std::atomic_bool exit_thread = true;
std::thread workthread;
uint8_t* image_ptr = nullptr;
std::mutex mutex;
state_e state = IDLE;
std::optional<opengl_texture> texture;
void workthread_func();
@@ -27,6 +37,7 @@ class cameraview_panel : public ui_panel
void render() override;
void render_contents() override;
bool set_state(state_e e);
std::string rec_name;
};

View File

@@ -46,6 +46,16 @@ void ui::cameraview_panel::render()
ui_panel::render();
}
bool ui::cameraview_panel::set_state(state_e e)
{
if (state != e) {
state = e;
is_open = (state != IDLE);
return true;
}
return false;
}
void ui::cameraview_panel::render_contents()
{
if (exit_thread) {

View File

@@ -7,6 +7,14 @@ namespace ui
{
class cameraview_panel : public ui_panel
{
public:
enum state_e {
IDLE,
PREVIEW,
RECORDING
};
private:
std::atomic_bool exit_thread = true;
std::thread workthread;
@@ -28,5 +36,6 @@ class cameraview_panel : public ui_panel
void render() override;
void render_contents() override;
bool set_state(state_e e);
};
} // namespace ui