All of lore.kernel.org
 help / color / mirror / Atom feed
* PATCH: gspca-uniform-pixfmt-report.patch
@ 2008-07-04  7:35 Hans de Goede
  0 siblings, 0 replies; only message in thread
From: Hans de Goede @ 2008-07-04  7:35 UTC (permalink / raw)
  To: Jean-Francois Moine; +Cc: video4linux-list

[-- Attachment #1: Type: text/plain, Size: 611 bytes --]

Hi all,

This patch fixes 3 inconsistencies between the pixfmt's returned by set_fmt
(through try_fmt / and try_fmt) and get_fmt.

* set_fmt (try_fmt) didn't set the pixformat field member
* get_fmt didn't take compression into account when setting sizeimage
* set_fmt (try_fmt) did take compression into account when setting sizeimage,
   but didn't add 600 to sizeimage for the jpeg header, as frame_alloc does

The later 2 are fixed by moving all buffer size calculations to
gspca_get_buff_size and using that everywhere for consistency.

Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>

Regards,

Hans


[-- Attachment #2: gspca-uniform-pixfmt-report.patch --]
[-- Type: text/plain, Size: 3302 bytes --]

This patch fixes 3 inconsistencies between the pixfmt's returned by set_fmt
(through try_fmt / and try_fmt) and get_fmt.

* set_fmt (try_fmt) didn't set the pixformat field member
* get_fmt didn't take compression into account when setting sizeimage
* set_fmt (try_fmt) did take compression into account when setting sizeimage,
  but didn't add 600 to sizeimage for the jpeg header, as frame_alloc does

The later 2 are fixed by moving all buffer size calculations to
gspca_get_buff_size and using that everywhere for consistency.

Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>

diff -r feeaaa9d3ed3 linux/drivers/media/video/gspca/gspca.c
--- a/linux/drivers/media/video/gspca/gspca.c	Thu Jul 03 13:20:58 2008 +0200
+++ b/linux/drivers/media/video/gspca/gspca.c	Fri Jul 04 09:28:31 2008 +0200
@@ -397,14 +397,20 @@
 	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 @@
 	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 @@
 	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_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 @@
 	}
 	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 */
 }
 

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-07-04  7:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-04  7:35 PATCH: gspca-uniform-pixfmt-report.patch Hans de Goede

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.