From 8ad0509a1c2eb85370f1d416901246c61351b41d Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 29 Aug 2014 10:57:20 +0200 Subject: [PATCH] v4l2: get_nearest_size: Always reinit all struct fields on retry They may have been modified by the ioctl even if it failed. This also makes the S_FMT fallback path try progressive first, making it consistent with the preferred TRY_FMT path. https://bugzilla.gnome.org/show_bug.cgi?id=735660 --- sys/v4l2/gstv4l2object.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 1803133..fce97c1 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -2171,6 +2171,8 @@ gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, r = v4l2_ioctl (fd, VIDIOC_TRY_FMT, &fmt); if (r < 0 && errno == EINVAL) { /* try again with interlaced video */ + memset (&fmt, 0, sizeof (fmt)); + fmt.type = v4l2object->type; fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; fmt.fmt.pix.pixelformat = pixelformat; @@ -2192,16 +2194,22 @@ gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, GST_LOG_OBJECT (v4l2object->element, "Failed to probe size limit with VIDIOC_TRY_FMT, trying VIDIOC_S_FMT"); + memset (&fmt, 0, sizeof (fmt)); + fmt.type = v4l2object->type; fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; + fmt.fmt.pix.pixelformat = pixelformat; + fmt.fmt.pix.field = V4L2_FIELD_NONE; r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); if (r < 0 && errno == EINVAL) { - /* try again with progressive video */ + /* try again with interlaced video */ + memset (&fmt, 0, sizeof (fmt)); + fmt.type = v4l2object->type; fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; fmt.fmt.pix.pixelformat = pixelformat; - fmt.fmt.pix.field = V4L2_FIELD_NONE; + fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); } -- 2.7.4