diff options
-rw-r--r-- | src/callbacks.c | 35 | ||||
-rw-r--r-- | src/v4l.c | 16 | ||||
-rw-r--r-- | src/v4l.h | 1 |
3 files changed, 36 insertions, 16 deletions
diff --git a/src/callbacks.c b/src/callbacks.c index 0b193c8..3db9ba5 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -364,29 +364,32 @@ void on_change_size_activate (GtkWidget * widget, cam * cam) { gchar const *name; gchar *title; + int width, height; name = gtk_widget_get_name (widget); - printf("name = %s\n",name); + if (strcmp (name, "small") == 0) { - cam->width = cam->min_width; - cam->height = cam->min_height; - if (cam->debug) { - printf ("\nsmall\n"); - } + width = cam->min_width; + height = cam->min_height; } else if (strcmp (name, "medium") == 0) { - cam->width = cam->max_width / 2; - cam->height = cam->max_height / 2; - if (cam->debug) { - printf ("\nmed\n"); - } + width = cam->max_width / 2; + height = cam->max_height / 2; } else { - cam->width = cam->max_width; - cam->height = cam->max_height; - if (cam->debug) { - printf ("\nlarge\n"); - } + width = cam->max_width; + height = cam->max_height; } + try_set_win_info(cam, &width, &height); + + /* Nothing to do, so just return */ + if (width == cam->width && height == cam->height) + return; + + cam->width = width; + cam->height = height; + + printf("name = %s\n",name); + if (cam->read == FALSE) stop_streaming(cam); set_win_info (cam); @@ -258,6 +258,22 @@ void get_win_info(cam * cam) } } +void try_set_win_info(cam * cam, int *x, int *y) +{ + gchar *msg; + struct v4l2_format fmt; + + memset(&fmt, 0, sizeof(fmt)); + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + fmt.fmt.pix.pixelformat = cam->pixformat; + fmt.fmt.pix.width = *x; + fmt.fmt.pix.height = *y; + if (!v4l2_ioctl(cam->dev, VIDIOC_TRY_FMT, &fmt)) { + *x = fmt.fmt.pix.width; + *y = fmt.fmt.pix.height; + } +} + void set_win_info(cam * cam) { gchar *msg; @@ -86,6 +86,7 @@ typedef struct camera { } cam; void camera_cap (cam *); +void try_set_win_info(cam * cam, int *x, int *y); void set_win_info (cam * cam); void get_pic_info (cam *); void get_win_info (cam *); |