Ticket #1560 (closed defect: fixed)
v4l2 device won't open after opening/closing it 16 times
| Reported by: | tmatth | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avdevice |
| Version: | git-master | Keywords: | v4l2 |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | yes | |
| Analyzed by developer: | no |
Description (last modified by Cigaes) (diff)
Summary of the bug:
In the attached case, I open and close a v4l2 device (/dev/video0) 17 times. On the 17th time, it fails to open with the following errors:
libv4l2: error attempting to open more then 16 video devices [video4linux2,v4l2 @ 0x1f6a5c0] ioctl(VIDIOC_QUERYCAP): Bad file descriptor Could not open input "/dev/video0"
How to reproduce:
Build and run the attached test case with a v4l2 device connected.
I'm using the ffmpeg git master branch:
ffmpeg version N-42636-ga8d8e86 Copyright (c) 2000-2012 the FFmpeg developers built on Jul 19 2012 17:32:59 with gcc 4.7.0 (GCC) 20120507 (Red Hat 4.7.0-5) configuration: --prefix=/opt/ --enable-bzlib --enable-gnutls --enable-libv4l2 --enable-libx264 --enable-x11grab --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --enable-pic
Attachments
Change History
Changed 10 months ago by tmatth
-
attachment
v4l2_testcase.c
added
comment:1 Changed 10 months ago by tmatth
I've also realized that this bug is only present when the --enable-libv4l2 option is given to configure.
comment:2 Changed 10 months ago by Cigaes
- Description modified (diff)
- Reproduced by developer set
Same thing on one of my boxes. libavdevice compiled without libv4l2 works.
Try removing the paragraph under #ifdef CONFIG_LIBV4L2 in device_open() in libavdevice/v4l2.c and see if it fixes things.
comment:3 Changed 10 months ago by tmatth
Yup that did it, I'm not sure how the code should be adjusted though, should we only be calling v4l2_fd_open if fd is < 0? If so, I've attached a patch.
comment:4 Changed 10 months ago by tmatth
Earlier patch was no good, I've replaced it with this patch which just fixes the error handling. The code currently in master is off, fd would never be < 0 since the function would have already returned.
The original problem still stands. From the documentation it seems that v4l2_fd_open takes an already open file descriptor and tries to make it open for further use by libv4l2, but I can't see why it's not being closed properly.
comment:5 follow-up: ↓ 6 Changed 10 months ago by Cigaes
Your patch would clearly be right by itself, but the whole paragraph is just redundant:
http://git.linuxtv.org/v4l-utils.git/blob/HEAD:/lib/libv4l2/libv4l2.c#l578
v4l2_open already calls v4l2_fd_open, calling a second time only uses an additional slot in libv4l2 structures that will never be deallocated.
I sent a patch to the devel mailing list.
comment:6 in reply to: ↑ 5 Changed 10 months ago by tmatth
Replying to Cigaes:
Your patch would clearly be right by itself, but the whole paragraph is just redundant:
http://git.linuxtv.org/v4l-utils.git/blob/HEAD:/lib/libv4l2/libv4l2.c#l578
v4l2_open already calls v4l2_fd_open, calling a second time only uses an additional slot in libv4l2 structures that will never be deallocated.
I sent a patch to the devel mailing list.
Well spotted, it wasn't until I went through with gdb that I noticed v4l2_fd_open was getting called twice. Thanks for sending the patch.



compile with "cc v4l2_testcase.c -o v4l2_testcase pkg-config --cflags --libs libavdevice libavformat"