From 44e95a017c8fa0c3d019cc91c716ba876f931fe7 Mon Sep 17 00:00:00 2001 From: Andre Wolokita Date: Mon, 18 Aug 2014 09:09:22 +0200 Subject: [PATCH] lavd/v4l2: do not fail when VIDIOC_ENUMSTD returns ENODATA As of September 14 2012, v4l_enumstd() will return ENODATA when a device's std field is set to 0. That is, the device does not have a standard format. In order to properly handle this case, v4l2_set_parameters should catch the ENODATA code and break instead of failing. Below is the v4l2-core commit describing this change. >>commit a5338190efc7cfa8c99a6856342a77d21c9a05cf >>Author: Hans Verkuil >>Date: Fri Sep 14 06:45:43 2012 -0300 >> >> [media] v4l2-core: tvnorms may be 0 for a given input, handle that case >> >> Currently the core code looks at tvnorms to see whether ENUMSTD >> or G_PARM should be enabled. This is not a good check for drivers >> that support the STD API on one input and the DV Timings API on another. >> In that case tvnorms may be 0. >> Instead check whether s_std is present (for ENUMSTD) or whether g_std or >> current_norm is present for g_parm. >> Also, in the enumstd core function return ENODATA if tvnorms is 0, >> because in that case the current input does not support the STD API >> and ENUMSTD should return ENODATA for that. >> >> Signed-off-by: Hans Verkuil >> Reviewed-by: Sakari Ailus >> Signed-off-by: Mauro Carvalho Chehab --- libavdevice/v4l2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index d9ff1a47e2..e1a4d23343 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -688,7 +688,7 @@ static int v4l2_set_parameters(AVFormatContext *s1) standard.index = i; if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) { ret = AVERROR(errno); - if (ret == AVERROR(EINVAL)) { + if (ret == AVERROR(EINVAL) || ret == AVERROR(ENODATA)) { tpf = &streamparm.parm.capture.timeperframe; break; }