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;

Reply via email to