diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-08-29 10:57:20 +0200 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2014-08-29 16:14:56 -0400 |
commit | 8ad0509a1c2eb85370f1d416901246c61351b41d (patch) | |
tree | 8ca225031c552cbcc6e325e7952bc41a000ddd4c | |
parent | f5df8af59e73c44d732b1f0bee6f78836e4cd321 (diff) |
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
-rw-r--r-- | sys/v4l2/gstv4l2object.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 180313323..fce97c125 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); } |