Heavystation System Manager wrote:
> Hi all,
>
> I'm learning to use v4l module tring to write an application that captures
> more frames in sequence (like xawtv)... but, i noticed that the ioctl,
> with VIDIOCMCAPTURE as argument, needs too much time for its execution!
> bringing to an excessive time between two different grabbed frames. I
> don't know if it's a problem of my cheap webcam (a Trust SpaceC@M 300 with
> ov511+ chipset) or my early experience of v4l programming (i think my
> early experience, because this webcam works very well with xawtv)...
>
> The function grab() is inspired by a procedure explained in a previous
> mail sent from "Nemosoft Unv." with subject "RE: [V4L] sync: input/output
> error" that i took as example form this experiment...
>
> The function looks like this:
>
> int grab(int video_fd,int w,int h,int format,int nframes)
> {
> int frmbuf,frames = 0;
> struct video_mbuf buffer;
> struct video_mmap map;
> void * grabarea;
>
> if( ioctl(video_fd,VIDIOCGMBUF,&buffer) == -1 ) return (-1);
>
> grabarea = mmap(NULL,buffer.size,PROT_READ,MAP_SHARED,video_fd,0);
>
> if( grabarea == MAP_FAILED ) return (-2);
>
> map.frame = 0;
> map.width = w;
> map.height = h;
> map.format = format;
>
> // MCAPTURE(0)
> if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 ) return (-4);
>
> do
> {
> // SYNC(0)
> frmbuf = 0;
> if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 )
> return (-5);
>
> // MCAPTURE(1)
> map.frame = 1;
> if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 )
> return (-4);
>
> // Do something with frame 0...
> // ...
>
> // SYNC(1)
> frmbuf = 1;
> if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 )
> return (-5);
>
> // MCAPTURE(0)
> map.frame = 0;
> if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 )
> return (-4);
>
> // Do something with frame 1...
> // ...
>
> ++frames;
>
> }while( frames < nframes );
>
> // SYNC(0)
> frmbuf = 0;
> if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 ) return (-5);
>
> munmap(grabarea,buffer.size);
>
> return (0);
> }
>
> What's wrong???
>
> Thanks in advance!!
To get high throughput, you must queue them up as fast as possible:
int grab(int video_fd,int w,int h,int format,int nframes)
{
int frmbuf,frames = 0;
struct video_mbuf buffer;
struct video_mmap map;
void * grabarea;
if( ioctl(video_fd,VIDIOCGMBUF,&buffer) == -1 ) return (-1);
grabarea = mmap(NULL,buffer.size,PROT_READ,MAP_SHARED,video_fd,0);
if( grabarea == MAP_FAILED ) return (-2);
map.frame = 0;
map.width = w;
map.height = h;
map.format = format;
// MCAPTURE(0)
if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 ) return (-4);
// MCAPTURE(1)
map.frame = 1;
if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 ) return (-4);
do
{
// SYNC(0)
frmbuf = 0;
if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 )
return (-5);
// Do something with frame 0...
// ...
// MCAPTURE(0)
map.frame = 0;
if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 )
return (-4);
// SYNC(1)
frmbuf = 1;
if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 )
return (-5);
// Do something with frame 1...
// ...
// MCAPTURE(1)
map.frame = 1;
if( ioctl(video_fd,VIDIOCMCAPTURE,&map) == -1 )
return (-4);
++frames;
}while( frames < nframes );
// SYNC(0)
frmbuf = 0;
if( ioctl(video_fd,VIDIOCSYNC,&frmbuf) == -1 ) return (-5);
munmap(grabarea,buffer.size);
return (0);
}
This way the buffers are queued as far in advance as possible, and you
should have the lowest possible latency.
-justin
_______________________________________________
Video4linux-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/video4linux-list