fixing gtk warnings, adding BGR24 pixelformat and clear control grid on video stop

test16bit
Steffen Pohle 3 years ago
parent 77c99d1e29
commit dda54345ce

3
.gitignore vendored

@ -6,3 +6,6 @@ config.h
*.oo *.oo
simpleskycam simpleskycam
*~ *~
U2SM200C-AST_Cfg_A.bin
U2SM200C-AST_Cfg_SAVE.bin

@ -1,3 +1,9 @@
2022-11-07:
- fixed: clear control grid after stoping a recording
- fixed: serval gtk warnings fixed. Checked if scale has a valid
min/max setting.
- adding: nother 24bit pixel format BGR24
2022-11-03: 2022-11-03:
- fixed: grabbing frame from SVBONY cam is not blocking other threads. - fixed: grabbing frame from SVBONY cam is not blocking other threads.
- fixed: converting input pixelformat correctly. Finshed implementing - fixed: converting input pixelformat correctly. Finshed implementing

@ -8,8 +8,9 @@ uint32_t convert_pixelformats [] = {
V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_MJPEG,
V4L2_PIX_FMT_YUYV, V4L2_PIX_FMT_YUYV,
V4L2_PIX_FMT_RGB32, V4L2_PIX_FMT_RGB32,
V4L2_PIX_FMT_RGB24,
V4L2_PIX_FMT_BGR32, V4L2_PIX_FMT_BGR32,
V4L2_PIX_FMT_RGB24,
V4L2_PIX_FMT_BGR24,
V4L2_PIX_FMT_UYVY, V4L2_PIX_FMT_UYVY,
0 0
}; };

@ -35,6 +35,10 @@ extern detect_movement detectedpos_data;
extern Configuration config; extern Configuration config;
void videoctrl_grid_delete ();
void videoctrl_grid_build ();
/* /*
* stop video recording * stop video recording
*/ */
@ -52,6 +56,9 @@ void video_stoprecord() {
videodev_thread = NULL; videodev_thread = NULL;
delete videodev; delete videodev;
videoctrl_grid_delete();
videodev = NULL; videodev = NULL;
} }
@ -92,12 +99,14 @@ gboolean videoctrl_update(gpointer data) {
for (i = 0; (label = gtk_grid_get_child_at(GTK_GRID(grid), 0, i)) != NULL; i++) { for (i = 0; (label = gtk_grid_get_child_at(GTK_GRID(grid), 0, i)) != NULL; i++) {
if (videodev->GetCtrlMinMaxValue(gtk_label_get_text(GTK_LABEL(label)), &min, &max, &value) == VDEV_STATUS_OK) { if (videodev->GetCtrlMinMaxValue(gtk_label_get_text(GTK_LABEL(label)), &min, &max, &value) == VDEV_STATUS_OK) {
scale = gtk_grid_get_child_at(GTK_GRID(grid), 1, i); if ((scale = gtk_grid_get_child_at(GTK_GRID(grid), 1, i)) != NULL) {
if (!gtk_widget_has_focus(scale)) if (!gtk_widget_has_focus(scale))
gtk_range_set_value(GTK_RANGE(scale), value); gtk_range_set_value(GTK_RANGE(scale), value);
entry = gtk_grid_get_child_at(GTK_GRID(grid), 2, i); }
if (!gtk_widget_has_focus(entry)) if ((entry = gtk_grid_get_child_at(GTK_GRID(grid), 2, i)) != NULL) {
gtk_entry_set_text(GTK_ENTRY(entry), std::to_string(value).c_str()); if (!gtk_widget_has_focus(entry))
gtk_entry_set_text(GTK_ENTRY(entry), std::to_string(value).c_str());
}
} }
} }
@ -375,12 +384,28 @@ void cb_video_btnrec (GtkWidget *widget, gpointer data) {
}; };
/*
* clear all elements in the controls grid
*/
void videoctrl_grid_delete () {
GtkWidget *grid = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vidctrl-grid"));
GtkWidget *gridchild = NULL;
//
// clear grid
while ((gridchild = gtk_grid_get_child_at(GTK_GRID(grid), 0, 0)) != NULL) {
gtk_grid_remove_row (GTK_GRID(grid), 0);
}
};
/* /*
* after the video is started and we get the first callback from the VideoDev thread * after the video is started and we get the first callback from the VideoDev thread
* we will call this function to read all ctrls and creade the grid table. * we will call this function to read all ctrls and creade the grid table.
* function gezts called if: threaddata.runnin == 1 * function gets called if: threaddata.runnin == 1
*/ */
void video_refreshctrls () { void videoctrl_grid_build () {
std::list<std::string> list; std::list<std::string> list;
std::list<std::string>::iterator iter; std::list<std::string>::iterator iter;
GtkWidget *cbres = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores")); GtkWidget *cbres = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores"));
@ -388,7 +413,6 @@ void video_refreshctrls () {
GtkWidget *cbfmt = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videofmt")); GtkWidget *cbfmt = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videofmt"));
GtkWidget *cbfmtentry = gtk_bin_get_child(GTK_BIN(cbfmt)); GtkWidget *cbfmtentry = gtk_bin_get_child(GTK_BIN(cbfmt));
GtkWidget *grid = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vidctrl-grid")); GtkWidget *grid = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vidctrl-grid"));
GtkWidget *gridchild = NULL;
int i, w, h; int i, w, h;
std::string format; std::string format;
std::string resolution; std::string resolution;
@ -396,12 +420,7 @@ void video_refreshctrls () {
if (videodev == NULL) return; if (videodev == NULL) return;
videodev->GetCtrlList(&list); videodev->GetCtrlList(&list);
videoctrl_grid_delete();
//
// clear grid
while ((gridchild = gtk_grid_get_child_at(GTK_GRID(grid), 0, 0)) != NULL) {
gtk_grid_remove_row (GTK_GRID(grid), 0);
}
// //
// add elements // add elements
@ -415,14 +434,20 @@ void video_refreshctrls () {
// //
// label // label
GtkWidget *label = gtk_label_new(iter->c_str()); GtkWidget *label = gtk_label_new(iter->c_str());
GtkWidget *scale = NULL;
// //
// scale/range // scale/range
GtkWidget *scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, 1); if (min < max) {
gtk_range_set_value(GTK_RANGE(scale),value); scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, 1);
gtk_widget_set_hexpand (scale,true); gtk_range_set_value(GTK_RANGE(scale),value);
gtk_scale_set_draw_value(GTK_SCALE(scale), false); gtk_widget_set_hexpand (scale,true);
g_signal_connect (GTK_RANGE(scale), "value-changed", G_CALLBACK(cb_vidctrl_scale_change), (void*)(long int)i); gtk_scale_set_draw_value(GTK_SCALE(scale), false);
g_signal_connect (GTK_RANGE(scale), "value-changed", G_CALLBACK(cb_vidctrl_scale_change), (void*)(long int)i);
}
else {
printf ("%s:%d control %s check not valid min[%d] < max[%d]\n", __FILE__, __LINE__, iter->c_str(), min, max);
}
// //
// entry field // entry field
@ -437,10 +462,11 @@ void video_refreshctrls () {
gtk_grid_insert_column(GTK_GRID(grid), 0); gtk_grid_insert_column(GTK_GRID(grid), 0);
} }
gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1); gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
gtk_grid_attach(GTK_GRID(grid), scale, 1, i, 1, 1);
if (scale) gtk_grid_attach(GTK_GRID(grid), scale, 1, i, 1, 1);
gtk_grid_attach(GTK_GRID(grid), entry, 2, i, 1, 1); gtk_grid_attach(GTK_GRID(grid), entry, 2, i, 1, 1);
gtk_widget_show (label); gtk_widget_show (label);
gtk_widget_show (scale); if (scale) gtk_widget_show (scale);
gtk_widget_show (entry); gtk_widget_show (entry);
} }
@ -477,7 +503,7 @@ gboolean cb_thread_video (gpointer data) {
if (cbdata != NULL) { if (cbdata != NULL) {
vf = &cbdata->vf; vf = &cbdata->vf;
if (cbdata->running == 1) { if (cbdata->running == 1) {
video_refreshctrls(); videoctrl_grid_build();
cbdata->running = 2; cbdata->running = 2;
} }
if (vf->w <= 0 || vf->h <= 0 || vf->data == NULL) vf = NULL; if (vf->w <= 0 || vf->h <= 0 || vf->data == NULL) vf = NULL;
@ -647,7 +673,7 @@ void cb_video_pre_click (GtkWidget *widget, gpointer data) {
// //
// save the settings // save the settings
// //
list<VideoDevCtrl> ctrls = videodev->GetCtrlsMinMaxValue(); std::list<VideoDevCtrl> ctrls = videodev->GetCtrlsMinMaxValue();
config.SetPresetButton(presetbtn.idx, &ctrls); config.SetPresetButton(presetbtn.idx, &ctrls);
// //
@ -665,8 +691,8 @@ void cb_video_pre_click (GtkWidget *widget, gpointer data) {
// callup settings // callup settings
// //
int i, retry = 5, again = 1; int i, retry = 5, again = 1;
list<VideoDevCtrl> ctrls = config.GetPresetButton(presetbtn.idx); std::list<VideoDevCtrl> ctrls = config.GetPresetButton(presetbtn.idx);
list<VideoDevCtrl>::iterator iter; std::list<VideoDevCtrl>::iterator iter;
presetbtn.idx = -1; presetbtn.idx = -1;
for (retry = 5; retry > 0 && again; retry--) { for (retry = 5; retry > 0 && again; retry--) {

@ -29,7 +29,6 @@
#include "videodev.h" #include "videodev.h"
VideoDev::VideoDev() { VideoDev::VideoDev() {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
conf_device = ""; conf_device = "";

Loading…
Cancel
Save