diff options
author | Andre Wolokita <andre.wolokita@analog.com> | 2014-08-18 09:09:22 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-08-18 09:20:00 +0200 |
commit | 44e95a017c8fa0c3d019cc91c716ba876f931fe7 (patch) | |
tree | 28c2be0125b36c89dbe4880b040eca75f447a24a /libavdevice | |
parent | fb2de3c4d1372965f5bf4aa9037b9b629852dbe3 (diff) | |
download | ffmpeg-44e95a017c8fa0c3d019cc91c716ba876f931fe7.tar.gz |
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>
Diffstat (limited to 'libavdevice')
-rw-r--r-- | libavdevice/v4l2.c | 2 |
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; } |