57 lines
2.0 KiB
Diff
57 lines
2.0 KiB
Diff
From b3b38ba864ac7eff3cd225ed05c697b67509b263 Mon Sep 17 00:00:00 2001
|
|
From: Hans de Goede <hdegoede@redhat.com>
|
|
Date: Fri, 29 Aug 2014 10:57:20 +0200
|
|
Subject: [PATCH 1/3] 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.
|
|
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
---
|
|
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 3b22b1a..881a52d 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.1.0
|
|
|