On Friday 22 July 2011 22:06:59 Devin Heitmueller wrote: > On Fri, Jul 22, 2011 at 4:00 PM, Ondrej Zary <linux@xxxxxxxxxxxxxxxxxxxx> wrote: > > Scaling causes bad artifacts (horizontal lines) with compression at least > > with Nogatech MicroCam so disable it (for this HW). > > > > This also fixes messed up image with some programs (Cheese with 160x120, > > Adobe Flash). HW seems to support only image widths that are multiple of 64 > > but the driver does not account that in vidioc_try_fmt_vid_cap(). Cheese > > calls try_fmt with 160x120, succeeds and then assumes that it really gets > > data in that resolution - but it gets 128x120 instead. Don't know if this > > affects other usbvision devices, it would be great if someone could test it. > > > > Signed-off-by: Ondrej Zary <linux@xxxxxxxxxxxxxxxxxxxx> > > > > diff -urp linux-2.6.39-rc2-/drivers/media/video/usbvision//usbvision-video.c linux-2.6.39-rc2/drivers/media/video/usbvision/usbvision-video.c > > --- linux-2.6.39-rc2-/drivers/media/video/usbvision//usbvision-video.c 2011-07-16 16:42:35.000000000 +0200 > > +++ linux-2.6.39-rc2/drivers/media/video/usbvision/usbvision-video.c 2011-07-16 16:36:43.000000000 +0200 > > @@ -924,6 +924,11 @@ static int vidioc_try_fmt_vid_cap(struct > > RESTRICT_TO_RANGE(vf->fmt.pix.width, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH); > > RESTRICT_TO_RANGE(vf->fmt.pix.height, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT); > > > > + if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) { > > + vf->fmt.pix.width = MAX_FRAME_WIDTH; > > + vf->fmt.pix.height = MAX_FRAME_HEIGHT; > > + } > > + > > vf->fmt.pix.bytesperline = vf->fmt.pix.width* > > usbvision->palette.bytes_per_pixel; > > vf->fmt.pix.sizeimage = vf->fmt.pix.bytesperline*vf->fmt.pix.height; > > @@ -952,6 +957,11 @@ static int vidioc_s_fmt_vid_cap(struct f > > > > usbvision->cur_frame = NULL; > > > > + if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) { > > + vf->fmt.pix.width = MAX_FRAME_WIDTH; > > + vf->fmt.pix.height = MAX_FRAME_HEIGHT; > > + } > > + > > /* by now we are committed to the new data... */ > > usbvision_set_output(usbvision, vf->fmt.pix.width, vf->fmt.pix.height); > > > > > > -- > > Ondrej Zary > > Hello Ondrej, > > Drivers are permitted to return a different resolution than what the > application provided in the S_FMT call. It is the responsibility of > the application to look at the struct after the ioctl() call and if > the values are not what it expects to then accommodate the change. > > In other words, this sounds like a bug in Cheese. Seems that this bug is widespread - the same problem appears also in guvcview and adobe flash. I think that the driver is broken too - it should return corrected resolution in TRY_FMT. > Devin > -- Ondrej Zary -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html