ChangeSet 1.893.2.17, 2002/12/26 18:53:28-08:00, [EMAIL PROTECTED]

[PATCH] 2.4.20 usbvideo fixes from 2.5  2/5

This patch fixes the use of USBVIDEO_NUMFRAMES. A few places in the code
assumed it was 2.


diff -Nru a/drivers/usb/usbvideo.c b/drivers/usb/usbvideo.c
--- a/drivers/usb/usbvideo.c    Mon Jan  6 11:30:34 2003
+++ b/drivers/usb/usbvideo.c    Mon Jan  6 11:30:34 2003
@@ -1167,7 +1167,7 @@
        if (!CAMERA_IS_OPERATIONAL(uvd))
                return -EFAULT;
 
-       if (size > (((2 * uvd->max_frame_size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
+       if (size > (((USBVIDEO_NUMFRAMES * uvd->max_frame_size) + PAGE_SIZE - 1) & 
+~(PAGE_SIZE - 1)))
                return -EINVAL;
 
        pos = (unsigned long) uvd->fbuf;
@@ -1446,12 +1446,13 @@
                case VIDIOCGMBUF:
                {
                        struct video_mbuf vm;
+                       int i;
 
                        memset(&vm, 0, sizeof(vm));
-                       vm.size = uvd->max_frame_size * 2;
-                       vm.frames = 2;
-                       vm.offsets[0] = 0;
-                       vm.offsets[1] = uvd->max_frame_size;
+                       vm.size = uvd->max_frame_size * USBVIDEO_NUMFRAMES;
+                       vm.frames = USBVIDEO_NUMFRAMES;
+                       for(i = 0; i < USBVIDEO_NUMFRAMES; i++)
+                               vm.offsets[i] = i * uvd->max_frame_size;
 
                        if (copy_to_user((void *)arg, (void *)&vm, sizeof(vm)))
                                return -EFAULT;
@@ -1501,8 +1502,8 @@
                                }
                                return -EINVAL;
                        }
-                       if ((vm.frame != 0) && (vm.frame != 1)) {
-                               err("VIDIOCMCAPTURE: vm.frame=%d. !E [0,1]", vm.frame);
+                       if ((vm.frame < 0) && (vm.frame >= USBVIDEO_NUMFRAMES)) {
+                               err("VIDIOCMCAPTURE: vm.frame=%d. !E [0-%d]", 
+vm.frame, USBVIDEO_NUMFRAMES-1);
                                return -EINVAL;
                        }
                        if (uvd->frame[vm.frame].frameState == FrameState_Grabbing) {
@@ -1600,7 +1601,7 @@
 long usbvideo_v4l_read(struct video_device *dev, char *buf, unsigned long count, int 
noblock)
 {
        struct uvd *uvd = (struct uvd *) dev;
-       int frmx = -1;
+       int frmx = -1, i;
        struct usbvideo_frame *frame;
 
        if (!CAMERA_IS_OPERATIONAL(uvd) || (buf == NULL))
@@ -1612,14 +1613,13 @@
        down(&uvd->lock);       
 
        /* See if a frame is completed, then use it. */
-       if ((uvd->frame[0].frameState == FrameState_Done) ||
-           (uvd->frame[0].frameState == FrameState_Done_Hold) ||
-           (uvd->frame[0].frameState == FrameState_Error)) {
-               frmx = 0;
-       } else if ((uvd->frame[1].frameState >= FrameState_Done) ||
-                  (uvd->frame[1].frameState == FrameState_Done_Hold) ||
-                  (uvd->frame[1].frameState >= FrameState_Done)) {
-               frmx = 1;
+       for(i = 0; i < USBVIDEO_NUMFRAMES; i++) {
+               if ((uvd->frame[i].frameState == FrameState_Done) ||
+                   (uvd->frame[i].frameState == FrameState_Done_Hold) ||
+                   (uvd->frame[i].frameState == FrameState_Error)) {
+                       frmx = i;
+                       break;
+               }
        }
 
        /* FIXME: If we don't start a frame here then who ever does? */
@@ -1634,10 +1634,12 @@
         * We will need to wait until it becomes cooked, of course.
         */
        if (frmx == -1) {
-               if (uvd->frame[0].frameState == FrameState_Grabbing)
-                       frmx = 0;
-               else if (uvd->frame[1].frameState == FrameState_Grabbing)
-                       frmx = 1;
+               for(i = 0; i < USBVIDEO_NUMFRAMES; i++) {
+                       if (uvd->frame[i].frameState == FrameState_Grabbing) {
+                               frmx = i;
+                               break;
+                       }
+               }
        }
 
        /*
@@ -1741,7 +1743,7 @@
 
                /* Mark it as available to be used again. */
                uvd->frame[frmx].frameState = FrameState_Unused;
-               if (usbvideo_NewFrame(uvd, frmx ? 0 : 1)) {
+               if (usbvideo_NewFrame(uvd, (frmx + 1) % USBVIDEO_NUMFRAMES)) {
                        err("%s: usbvideo_NewFrame failed.", __FUNCTION__);
                }
        }
@@ -1976,7 +1978,7 @@
                uvd->settingsAdjusted = 1;
        }
 
-       n = (framenum - 1 + USBVIDEO_NUMFRAMES) % USBVIDEO_NUMFRAMES;
+       n = (framenum + 1) % USBVIDEO_NUMFRAMES;
        if (uvd->frame[n].frameState == FrameState_Ready)
                framenum = n;
 
@@ -2008,7 +2010,8 @@
         */
        if (!(uvd->flags & FLAGS_SEPARATE_FRAMES)) {
                /* This copies previous frame into this one to mask losses */
-               memmove(frame->data, uvd->frame[1-framenum].data, uvd->max_frame_size);
+               int prev = (framenum - 1 + USBVIDEO_NUMFRAMES) % USBVIDEO_NUMFRAMES;
+               memmove(frame->data, uvd->frame[prev].data, uvd->max_frame_size);
        } else {
                if (uvd->flags & FLAGS_CLEAN_FRAMES) {
                        /* This provides a "clean" frame but slows things down */


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to