Hans Verkuil schreef:
On Sunday 04 February 2007 13:43, Michel Verbraak wrote:
I was debugging a small program of mine and found that:

- when I do a poll after opening the device, and not doing a read
first, it would always give me a POLLERR instead of a POLLIN.

Example:

    videofd=open("/dev/video0",  O_RDONLY);

    // Add video device
    poll_item.fd = videofd;
    poll_item.events = POLLIN;
    poll_item.revents = 0;

    // poll infinite
    retvalue = poll(&poll_item, 1, -1);

poll_item.revents is allways POLLERR.

When I do a read(videofd, buffer, 0); directly after the open and
then do the poll I get POLLIN.

I can trace this back to the fact that the bit IVTV_F_S_STREAMING is
only set, in function ivtv_v4l2_read in file ivtv-fileops.c, when at
least one read is done. Even if the request is to read 0 (zero)
bytes.

I do not know if this is by design.
But I would think that it should be possible to first do a poll to
see if data is available to read before I even do any reading. So
probably the IVTV_F_S_STREAMING bit should be set in the function
ivtv_v4l2_open in file ivtv-fileops.c.

This problem is in ivtv 0.10.0RC1 and I would think even in the
earlier versions.

I did not yet spend time to find a fix because I would first like to
know if this is by design or not.

It's by design, but I'm not certain whether it is the right design. Basically just opening the device will not start a capture, it has to be started explicitly, either by a read or by an IVTV_IOC_PLAY ioctl. It is unclear what poll should do if no capture is in progress. Wait indefinitely? Automatically start a capture? Or return an error? I can't find a clear answer in the V4L2 spec.

I'll ask on the video4linux mailinglist, see what the correct policy is.

Thanks,

        Hans

_______________________________________________
ivtv-devel mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-devel
The program I'm writing does not known it is reading from an ivtv device. The file handle could be a device or a file or a socket. I would like to keep it this way because otherwise I have to make two different programs or during startup I have to specify if it is an ivtv device or the other. During startup I only specify te location like /dev/video0 or /movies/somemovie.avi or 192.168.1.1:10000 and the program either opens the device or file or creates a tcp socket.

Regards,

Michel.
_______________________________________________
ivtv-devel mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-devel

Reply via email to