diff --git a/.gitignore b/.gitignore index 1bbf319..a6e30ac 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ config.h *.oo simpleskycam *~ +U2SM200C-AST_Cfg_A.bin +U2SM200C-AST_Cfg_SAVE.bin + diff --git a/ChangeLog b/ChangeLog index a7db038..dae77c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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: - fixed: grabbing frame from SVBONY cam is not blocking other threads. - fixed: converting input pixelformat correctly. Finshed implementing diff --git a/convert.cc b/convert.cc index e6d2472..7429676 100644 --- a/convert.cc +++ b/convert.cc @@ -8,8 +8,9 @@ uint32_t convert_pixelformats [] = { V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_YUYV, V4L2_PIX_FMT_RGB32, - V4L2_PIX_FMT_RGB24, V4L2_PIX_FMT_BGR32, + V4L2_PIX_FMT_RGB24, + V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_UYVY, 0 }; diff --git a/video.cc b/video.cc index d6504e6..b07af35 100644 --- a/video.cc +++ b/video.cc @@ -35,6 +35,10 @@ extern detect_movement detectedpos_data; extern Configuration config; +void videoctrl_grid_delete (); +void videoctrl_grid_build (); + + /* * stop video recording */ @@ -52,6 +56,9 @@ void video_stoprecord() { videodev_thread = NULL; delete videodev; + + videoctrl_grid_delete(); + 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++) { 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 (!gtk_widget_has_focus(scale)) - 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)) - gtk_entry_set_text(GTK_ENTRY(entry), std::to_string(value).c_str()); + if ((scale = gtk_grid_get_child_at(GTK_GRID(grid), 1, i)) != NULL) { + if (!gtk_widget_has_focus(scale)) + gtk_range_set_value(GTK_RANGE(scale), value); + } + if ((entry = gtk_grid_get_child_at(GTK_GRID(grid), 2, i)) != NULL) { + 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 * 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 list; std::list::iterator iter; 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 *cbfmtentry = gtk_bin_get_child(GTK_BIN(cbfmt)); GtkWidget *grid = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vidctrl-grid")); - GtkWidget *gridchild = NULL; int i, w, h; std::string format; std::string resolution; @@ -396,12 +420,7 @@ void video_refreshctrls () { if (videodev == NULL) return; videodev->GetCtrlList(&list); - - // - // clear grid - while ((gridchild = gtk_grid_get_child_at(GTK_GRID(grid), 0, 0)) != NULL) { - gtk_grid_remove_row (GTK_GRID(grid), 0); - } + videoctrl_grid_delete(); // // add elements @@ -415,14 +434,20 @@ void video_refreshctrls () { // // label GtkWidget *label = gtk_label_new(iter->c_str()); + GtkWidget *scale = NULL; // // scale/range - GtkWidget *scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, 1); - gtk_range_set_value(GTK_RANGE(scale),value); - gtk_widget_set_hexpand (scale,true); - 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); + if (min < max) { + scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, 1); + gtk_range_set_value(GTK_RANGE(scale),value); + gtk_widget_set_hexpand (scale,true); + 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 @@ -437,10 +462,11 @@ void video_refreshctrls () { 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), 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_widget_show (label); - gtk_widget_show (scale); + if (scale) gtk_widget_show (scale); gtk_widget_show (entry); } @@ -477,7 +503,7 @@ gboolean cb_thread_video (gpointer data) { if (cbdata != NULL) { vf = &cbdata->vf; if (cbdata->running == 1) { - video_refreshctrls(); + videoctrl_grid_build(); cbdata->running = 2; } 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 // - list ctrls = videodev->GetCtrlsMinMaxValue(); + std::list ctrls = videodev->GetCtrlsMinMaxValue(); config.SetPresetButton(presetbtn.idx, &ctrls); // @@ -665,8 +691,8 @@ void cb_video_pre_click (GtkWidget *widget, gpointer data) { // callup settings // int i, retry = 5, again = 1; - list ctrls = config.GetPresetButton(presetbtn.idx); - list::iterator iter; + std::list ctrls = config.GetPresetButton(presetbtn.idx); + std::list::iterator iter; presetbtn.idx = -1; for (retry = 5; retry > 0 && again; retry--) { diff --git a/videodev.cc b/videodev.cc index bff70d6..984130e 100644 --- a/videodev.cc +++ b/videodev.cc @@ -29,7 +29,6 @@ #include "videodev.h" - VideoDev::VideoDev() { printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); conf_device = "";