BTTV driver strange behavior
I'm using a sensoray 311 card and the bttv driver to do video capture. This is
the dmesg output :
bttv: driver version 0.9.17 loaded
bttv: using 8 buffers with 2080k (520 pages) each for capture
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 17) at 0000:01:06.0, irq: 18, latency: 64, mmio: 0xdeaff000
bttv0: detected: Sensoray 311 [card=73], PCI subsystem ID is 6000:0311
bttv0: using: Sensoray 311 [card=73,autodetected]
bttv0: gpio: en=00000000, out=00000000 in=007fffff [init]
bttv0: tuner absent
bttv0: registered device video0
bttv0: registered device vbi0
bttv0: PLL: 28636363 => 35468950 ..<6>hdd: max request size: 128KiB
And have been experiencing some problems with the bttv driver. The first
problem we came across was occasional slower framerates when the S-VIDEO cable
was unplugged and plugged in again (they usually go away when you do that
So upon investigating this, I discovered that apparently we were a frame
behind (there was more then one buffer to dequeue) and that the select call
doesn't immediately return when this happens. So we would only dequeue one
buffer, and then select would wait for quite a while (more then 100 ms), before
returning again. After that the second buffer was dequeued and the next select
call would only take a few ms but again only one of the two available would be
read and then you would get the long delay again. And this significantly
reduced the framerate.
To solve this, I decided that after a buffer was dequeued, I would check all of
our buffers with VIDIOC_QUERYBUF and dequeue them if the V4L2_BUF_FLAG_DONE was
set (and enqueue them again, so the driver could reuse them). This however
lead a very weird bug, the next time select returned on the bttv device and we
did a VIDIOC_DQBUF it blocked forever. The process was stuck, and the only
thing I could do was kill it.
I managed to solve this by opening the device with O_NONBLOCK. This solution
works, the VIDIOC_DQBUF call would return an error instead of blocking
forever, and we could get on with capturing video.
This leaves me with two questions :
- Why does the select call on bttv driver not immediately return when there is
another buffer ready to be dequeued ?
- Why does VIDIOC_DQBUF block forever when select returns and indicates that
there is something to be dequeued ?
video4linux-list mailing list