One more patch for the v4l stuff. Removes the silly looking double counter
code and makes grabbing queue up all the available buffers. I think the
code at least looks better.
--
Ville Syrj�l�
[EMAIL PROTECTED]
http://www.sci.fi/~syrjala/
Index: DirectFB/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c
===================================================================
RCS file:
/cvs/directfb/DirectFB/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c,v
retrieving revision 1.35
diff -u -d -r1.35 idirectfbvideoprovider_v4l.c
--- DirectFB/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c 5 Jul
2002 16:08:02 -0000 1.35
+++ DirectFB/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c 8 Jul
+2002 16:00:09 -0000
@@ -452,25 +452,24 @@
CoreSurface *surface = data->destination;
__u8 *src, *dst;
int dst_pitch, src_pitch, h;
- int capframe = 0, syncframe = -1;
+ int frame = 0;
src_pitch = DFB_BYTES_PER_LINE( surface->format, surface->width );
- while (1) {
- if (++syncframe == data->vmbuf.frames)
- syncframe = 0;
- if (++capframe == data->vmbuf.frames)
- capframe = 0;
-
- data->vmmap.frame = capframe;
+ while (frame < data->vmbuf.frames) {
+ data->vmmap.frame = frame;
ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap );
+ frame++;
+ }
- ioctl( data->fd, VIDIOCSYNC, &syncframe );
+ frame = 0;
+ while (1) {
+ ioctl( data->fd, VIDIOCSYNC, &frame );
pthread_testcancel();
h = surface->height;
- src = (__u8 *) data->buffer + data->vmbuf.offsets[syncframe];
+ src = (__u8 *) data->buffer + data->vmbuf.offsets[frame];
dfb_surface_soft_lock( surface, DSLF_WRITE, (void**)&dst, &dst_pitch, 0 );
while (h--) {
dfb_memcpy( dst, src, src_pitch );
@@ -502,8 +501,14 @@
}
dfb_surface_unlock( surface, 0 );
+ data->vmmap.frame = frame;
+ ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap );
+
if (data->callback)
data->callback(data->ctx);
+
+ if (++frame == data->vmbuf.frames)
+ frame = 0;
}
return NULL;