The patch number 8196 was added via Jean-Francois Moine <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Hans de Goede  <[EMAIL PROTECTED]>
gspca: Correct sizeimage in vidioc_s/try/g_fmt_cap


Signed-off-by: Hans de Goede <[EMAIL PROTECTED]>
Signed-off-by: Jean-Francois Moine <[EMAIL PROTECTED]>


---

 linux/drivers/media/video/gspca/gspca.c |   33 ++++++++++++------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff -r ad75df3f3242 -r facbd35d017f linux/drivers/media/video/gspca/gspca.c
--- a/linux/drivers/media/video/gspca/gspca.c   Fri Jul 04 13:16:16 2008 +0200
+++ b/linux/drivers/media/video/gspca/gspca.c   Fri Jul 04 19:55:18 2008 +0200
@@ -43,8 +43,8 @@ MODULE_DESCRIPTION("GSPCA USB Camera Dri
 MODULE_DESCRIPTION("GSPCA USB Camera Driver");
 MODULE_LICENSE("GPL");
 
-#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 1, 2)
-static const char version[] = "2.1.2";
+#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 1, 4)
+static const char version[] = "2.1.4";
 
 static int video_nr = -1;
 
@@ -397,14 +397,20 @@ static __u32 get_v4l2_depth(__u32 pixfmt
        return 24;
 }
 
-static int gspca_get_buff_size(struct gspca_dev *gspca_dev)
+static int gspca_get_buff_size(struct gspca_dev *gspca_dev, int mode)
 {
        unsigned int size;
 
-       size = gspca_dev->width * gspca_dev->height
-                               * get_v4l2_depth(gspca_dev->pixfmt) / 8;
+       size =  gspca_dev->cam.cam_mode[mode].width *
+               gspca_dev->cam.cam_mode[mode].height *
+               get_v4l2_depth(gspca_dev->cam.cam_mode[mode].pixfmt) / 8;
        if (!size)
                return -ENOMEM;
+
+       /* if compressed (JPEG), reduce the buffer size */
+       if (gspca_is_compressed(gspca_dev->cam.cam_mode[mode].pixfmt))
+               size = (size * comp_fac) / 100 + 600; /* (+ JPEG header sz) */
+
        return size;
 }
 
@@ -415,15 +421,12 @@ static int frame_alloc(struct gspca_dev 
        unsigned int frsz;
        int i;
 
-       frsz = gspca_get_buff_size(gspca_dev);
+       frsz = gspca_get_buff_size(gspca_dev, gspca_dev->curr_mode);
        if (frsz < 0)
                return frsz;
        PDEBUG(D_STREAM, "frame alloc frsz: %d", frsz);
        if (count > GSPCA_MAX_FRAMES)
                count = GSPCA_MAX_FRAMES;
-       /* if compressed (JPEG), reduce the buffer size */
-       if (gspca_is_compressed(gspca_dev->pixfmt))
-               frsz = (frsz * comp_fac) / 100 + 600; /* (+ JPEG header sz) */
        frsz = PAGE_ALIGN(frsz);
        PDEBUG(D_STREAM, "new fr_sz: %d", frsz);
        gspca_dev->frsz = frsz;
@@ -802,8 +805,8 @@ static int vidioc_g_fmt_vid_cap(struct f
        fmt->fmt.pix.field = V4L2_FIELD_NONE;
        fmt->fmt.pix.bytesperline = get_v4l2_depth(fmt->fmt.pix.pixelformat)
                                        * fmt->fmt.pix.width / 8;
-       fmt->fmt.pix.sizeimage = fmt->fmt.pix.bytesperline
-                                       * fmt->fmt.pix.height;
+       fmt->fmt.pix.sizeimage = gspca_get_buff_size(gspca_dev,
+                                                       gspca_dev->curr_mode);
 /* (should be in the subdriver) */
        fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
        fmt->fmt.pix.priv = 0;
@@ -813,7 +816,7 @@ static int try_fmt_vid_cap(struct gspca_
 static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
                        struct v4l2_format *fmt)
 {
-       int w, h, mode, mode2, frsz;
+       int w, h, mode, mode2;
 
        if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
                return -EINVAL;
@@ -855,12 +858,10 @@ static int try_fmt_vid_cap(struct gspca_
        }
        fmt->fmt.pix.width = gspca_dev->cam.cam_mode[mode].width;
        fmt->fmt.pix.height = gspca_dev->cam.cam_mode[mode].height;
+       fmt->fmt.pix.field = V4L2_FIELD_NONE;
        fmt->fmt.pix.bytesperline = get_v4l2_depth(fmt->fmt.pix.pixelformat)
                                        * fmt->fmt.pix.width / 8;
-       frsz = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height;
-       if (gspca_is_compressed(fmt->fmt.pix.pixelformat))
-               frsz = (frsz * comp_fac) / 100;
-       fmt->fmt.pix.sizeimage = frsz;
+       fmt->fmt.pix.sizeimage = gspca_get_buff_size(gspca_dev, mode);
        return mode;                    /* used when s_fmt */
 }
 


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/facbd35d017fc5cdb0697d96363dcd66916c6e58

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to