summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-08-29 10:57:20 +0200
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2014-08-29 16:14:56 -0400
commit8ad0509a1c2eb85370f1d416901246c61351b41d (patch)
tree8ca225031c552cbcc6e325e7952bc41a000ddd4c
parentf5df8af59e73c44d732b1f0bee6f78836e4cd321 (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.c12
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);
}