Web lists-archives.com

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
Unsubscribe mailto:video4linux-list-request@xxxxxxxxxx?subject=unsubscribe