diff --git a/drivers/media/usb/s2255/s2255drv.c b/drivers/media/usb/s2255/s2255drv.c index 2dcb29b647f0..42c3afe215b2 100644 --- a/drivers/media/usb/s2255/s2255drv.c +++ b/drivers/media/usb/s2255/s2255drv.c @@ -219,12 +219,13 @@ struct s2255_dev; struct s2255_channel { struct video_device vdev; struct v4l2_ctrl_handler hdl; + struct v4l2_ctrl *jpegqual_ctrl; int resources; struct s2255_dmaqueue vidq; struct s2255_bufferi buffer; struct s2255_mode mode; /* jpeg compression */ - struct v4l2_jpegcompression jc; + unsigned jpegqual; /* capture parameters (for high quality mode full size) */ struct v4l2_captureparm cap_parm; int cur_frame; @@ -1015,7 +1016,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, case V4L2_PIX_FMT_MJPEG: mode.color &= ~MASK_COLOR; mode.color |= COLOR_JPG; - mode.color |= (channel->jc.quality << 8); + mode.color |= (channel->jpegqual << 8); break; case V4L2_PIX_FMT_YUV422P: mode.color &= ~MASK_COLOR; @@ -1185,7 +1186,7 @@ static int s2255_set_mode(struct s2255_channel *channel, mode->color &= ~MASK_COLOR; mode->color |= COLOR_JPG; mode->color &= ~MASK_JPG_QUALITY; - mode->color |= (channel->jc.quality << 8); + mode->color |= (channel->jpegqual << 8); } /* save the mode */ channel->mode = *mode; @@ -1434,6 +1435,9 @@ static int s2255_s_ctrl(struct v4l2_ctrl *ctrl) mode.color &= ~MASK_INPUT_TYPE; mode.color |= !ctrl->val << 16; break; + case V4L2_CID_JPEG_COMPRESSION_QUALITY: + channel->jpegqual = ctrl->val; + return 0; default: return -EINVAL; } @@ -1451,7 +1455,9 @@ static int vidioc_g_jpegcomp(struct file *file, void *priv, { struct s2255_fh *fh = priv; struct s2255_channel *channel = fh->channel; - *jc = channel->jc; + + memset(jc, 0, sizeof(*jc)); + jc->quality = channel->jpegqual; dprintk(2, "%s: quality %d\n", __func__, jc->quality); return 0; } @@ -1463,7 +1469,7 @@ static int vidioc_s_jpegcomp(struct file *file, void *priv, struct s2255_channel *channel = fh->channel; if (jc->quality < 0 || jc->quality > 100) return -EINVAL; - channel->jc.quality = jc->quality; + v4l2_ctrl_s_ctrl(channel->jpegqual_ctrl, jc->quality); dprintk(2, "%s: quality %d\n", __func__, jc->quality); return 0; } @@ -1864,7 +1870,7 @@ static int s2255_probe_v4l(struct s2255_dev *dev) channel = &dev->channel[i]; INIT_LIST_HEAD(&channel->vidq.active); - v4l2_ctrl_handler_init(&channel->hdl, 5); + v4l2_ctrl_handler_init(&channel->hdl, 6); v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT); v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, @@ -1873,6 +1879,10 @@ static int s2255_probe_v4l(struct s2255_dev *dev) V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION); v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, V4L2_CID_HUE, 0, 255, 1, DEF_HUE); + channel->jpegqual_ctrl = v4l2_ctrl_new_std(&channel->hdl, + &s2255_ctrl_ops, + V4L2_CID_JPEG_COMPRESSION_QUALITY, + 0, 100, 1, S2255_DEF_JPEG_QUAL); if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER && (dev->pid != 0x2257 || channel->idx <= 1)) v4l2_ctrl_new_custom(&channel->hdl, &color_filter_ctrl, NULL); @@ -2238,7 +2248,7 @@ static int s2255_board_init(struct s2255_dev *dev) channel->mode = mode_def; if (dev->pid == 0x2257 && j > 1) channel->mode.color |= (1 << 16); - channel->jc.quality = S2255_DEF_JPEG_QUAL; + channel->jpegqual = S2255_DEF_JPEG_QUAL; channel->width = LINE_SZ_4CIFS_NTSC; channel->height = NUM_LINES_4CIFS_NTSC * 2; channel->fmt = &formats[0];