PATCH: gspca-uniform-pixfmt-report.patch
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.
Regards,
Hans
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.
linux/drivers/media/video/gspca/gspca.c +15 -14
@@ -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 */ }
--
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list