diff options
Diffstat (limited to 'tools/gui/control.c')
-rw-r--r-- | tools/gui/control.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/tools/gui/control.c b/tools/gui/control.c index 877473e..f74e0f1 100644 --- a/tools/gui/control.c +++ b/tools/gui/control.c @@ -91,7 +91,8 @@ convert_grayscale_to_rgb (ThreadData *data, gpointer buffer) gint offset = y * stride * data->width; for (gint x = 0; x < data->display_width; x++, offset += stride) { - guchar val = (guchar) ((input[offset] - min) * factor); + gdouble dval = (input[offset] - min) * factor; + guchar val = (guchar) CLAMP(dval, 0.0, 255.0); output[i++] = val; output[i++] = val; @@ -106,7 +107,8 @@ convert_grayscale_to_rgb (ThreadData *data, gpointer buffer) gint offset = y * stride * data->width; for (gint x = 0; x < data->display_width; x++, offset += stride) { - guchar val = (guchar) ((input[offset] - min) * factor); + gdouble dval = (input[offset] - min) * factor; + guchar val = (guchar) CLAMP(dval, 0.0, 255.0); output[i++] = val; output[i++] = val; @@ -138,24 +140,38 @@ update_pixbuf_dimensions (ThreadData *data) gtk_image_set_from_pixbuf (GTK_IMAGE (data->image), data->pixbuf); } +static void +print_and_free_error (GError **error) +{ + g_printerr ("%s\n", (*error)->message); + g_error_free (*error); + *error = NULL; +} + static gpointer preview_frames (void *args) { ThreadData *data = (ThreadData *) args; gint counter = 0; + GError *error = NULL;; while (data->state == RUNNING) { gpointer buffer; buffer = ring_buffer_get_current_pointer (data->buffer); - uca_camera_grab (data->camera, &buffer, NULL); - convert_grayscale_to_rgb (data, buffer); + uca_camera_grab (data->camera, &buffer, &error); - gdk_threads_enter (); - update_pixbuf (data); - gdk_threads_leave (); + if (error == NULL) { + convert_grayscale_to_rgb (data, buffer); + + gdk_threads_enter (); + update_pixbuf (data); + gdk_threads_leave (); - counter++; + counter++; + } + else + print_and_free_error (&error); } return NULL; } @@ -166,6 +182,7 @@ record_frames (gpointer args) ThreadData *data; gpointer buffer; guint n_frames = 0; + GError *error = NULL; data = (ThreadData *) args; ring_buffer_reset (data->buffer); @@ -173,8 +190,13 @@ record_frames (gpointer args) while (data->state == RECORDING) { buffer = ring_buffer_get_current_pointer (data->buffer); uca_camera_grab (data->camera, &buffer, NULL); - ring_buffer_proceed (data->buffer); - n_frames++; + + if (error == NULL) { + ring_buffer_proceed (data->buffer); + n_frames++; + } + else + print_and_free_error (&error); } n_frames = ring_buffer_get_num_blocks (data->buffer); |