summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Wolokita <andre.wolokita@analog.com>2014-08-18 09:09:22 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-08-18 09:20:00 +0200
commit44e95a017c8fa0c3d019cc91c716ba876f931fe7 (patch)
tree28c2be0125b36c89dbe4880b040eca75f447a24a
parentfb2de3c4d1372965f5bf4aa9037b9b629852dbe3 (diff)
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 <hans.verkuil@cisco.com> >>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 <hans.verkuil@cisco.com> >> Reviewed-by: Sakari Ailus <sakari.ailus@iki.fi> >> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--libavdevice/v4l2.c2
1 files changed, 1 insertions, 1 deletions
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;
}