diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2013-02-15 03:53:45 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-05 13:34:47 -0500 |
commit | 7041dec7a93039d1386ad0f5070dc2318d66a18d (patch) | |
tree | b306986f4373030eed95a48ce1f5fd00c63c8be0 /drivers/media/usb/s2255 | |
parent | 192f1e78cb9cbc1a2cee866f5e03a52857e648b6 (diff) |
[media] s2255: add V4L2_CID_JPEG_COMPRESSION_QUALITY
The use of the V4L2_CID_JPEG_COMPRESSION_QUALITY control is recommended over
the G/S_JPEGCOMP ioctls.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/usb/s2255')
-rw-r--r-- | drivers/media/usb/s2255/s2255drv.c | 24 |
1 files changed, 17 insertions, 7 deletions
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; | |||
219 | struct s2255_channel { | 219 | struct s2255_channel { |
220 | struct video_device vdev; | 220 | struct video_device vdev; |
221 | struct v4l2_ctrl_handler hdl; | 221 | struct v4l2_ctrl_handler hdl; |
222 | struct v4l2_ctrl *jpegqual_ctrl; | ||
222 | int resources; | 223 | int resources; |
223 | struct s2255_dmaqueue vidq; | 224 | struct s2255_dmaqueue vidq; |
224 | struct s2255_bufferi buffer; | 225 | struct s2255_bufferi buffer; |
225 | struct s2255_mode mode; | 226 | struct s2255_mode mode; |
226 | /* jpeg compression */ | 227 | /* jpeg compression */ |
227 | struct v4l2_jpegcompression jc; | 228 | unsigned jpegqual; |
228 | /* capture parameters (for high quality mode full size) */ | 229 | /* capture parameters (for high quality mode full size) */ |
229 | struct v4l2_captureparm cap_parm; | 230 | struct v4l2_captureparm cap_parm; |
230 | int cur_frame; | 231 | int cur_frame; |
@@ -1015,7 +1016,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, | |||
1015 | case V4L2_PIX_FMT_MJPEG: | 1016 | case V4L2_PIX_FMT_MJPEG: |
1016 | mode.color &= ~MASK_COLOR; | 1017 | mode.color &= ~MASK_COLOR; |
1017 | mode.color |= COLOR_JPG; | 1018 | mode.color |= COLOR_JPG; |
1018 | mode.color |= (channel->jc.quality << 8); | 1019 | mode.color |= (channel->jpegqual << 8); |
1019 | break; | 1020 | break; |
1020 | case V4L2_PIX_FMT_YUV422P: | 1021 | case V4L2_PIX_FMT_YUV422P: |
1021 | mode.color &= ~MASK_COLOR; | 1022 | mode.color &= ~MASK_COLOR; |
@@ -1185,7 +1186,7 @@ static int s2255_set_mode(struct s2255_channel *channel, | |||
1185 | mode->color &= ~MASK_COLOR; | 1186 | mode->color &= ~MASK_COLOR; |
1186 | mode->color |= COLOR_JPG; | 1187 | mode->color |= COLOR_JPG; |
1187 | mode->color &= ~MASK_JPG_QUALITY; | 1188 | mode->color &= ~MASK_JPG_QUALITY; |
1188 | mode->color |= (channel->jc.quality << 8); | 1189 | mode->color |= (channel->jpegqual << 8); |
1189 | } | 1190 | } |
1190 | /* save the mode */ | 1191 | /* save the mode */ |
1191 | channel->mode = *mode; | 1192 | channel->mode = *mode; |
@@ -1434,6 +1435,9 @@ static int s2255_s_ctrl(struct v4l2_ctrl *ctrl) | |||
1434 | mode.color &= ~MASK_INPUT_TYPE; | 1435 | mode.color &= ~MASK_INPUT_TYPE; |
1435 | mode.color |= !ctrl->val << 16; | 1436 | mode.color |= !ctrl->val << 16; |
1436 | break; | 1437 | break; |
1438 | case V4L2_CID_JPEG_COMPRESSION_QUALITY: | ||
1439 | channel->jpegqual = ctrl->val; | ||
1440 | return 0; | ||
1437 | default: | 1441 | default: |
1438 | return -EINVAL; | 1442 | return -EINVAL; |
1439 | } | 1443 | } |
@@ -1451,7 +1455,9 @@ static int vidioc_g_jpegcomp(struct file *file, void *priv, | |||
1451 | { | 1455 | { |
1452 | struct s2255_fh *fh = priv; | 1456 | struct s2255_fh *fh = priv; |
1453 | struct s2255_channel *channel = fh->channel; | 1457 | struct s2255_channel *channel = fh->channel; |
1454 | *jc = channel->jc; | 1458 | |
1459 | memset(jc, 0, sizeof(*jc)); | ||
1460 | jc->quality = channel->jpegqual; | ||
1455 | dprintk(2, "%s: quality %d\n", __func__, jc->quality); | 1461 | dprintk(2, "%s: quality %d\n", __func__, jc->quality); |
1456 | return 0; | 1462 | return 0; |
1457 | } | 1463 | } |
@@ -1463,7 +1469,7 @@ static int vidioc_s_jpegcomp(struct file *file, void *priv, | |||
1463 | struct s2255_channel *channel = fh->channel; | 1469 | struct s2255_channel *channel = fh->channel; |
1464 | if (jc->quality < 0 || jc->quality > 100) | 1470 | if (jc->quality < 0 || jc->quality > 100) |
1465 | return -EINVAL; | 1471 | return -EINVAL; |
1466 | channel->jc.quality = jc->quality; | 1472 | v4l2_ctrl_s_ctrl(channel->jpegqual_ctrl, jc->quality); |
1467 | dprintk(2, "%s: quality %d\n", __func__, jc->quality); | 1473 | dprintk(2, "%s: quality %d\n", __func__, jc->quality); |
1468 | return 0; | 1474 | return 0; |
1469 | } | 1475 | } |
@@ -1864,7 +1870,7 @@ static int s2255_probe_v4l(struct s2255_dev *dev) | |||
1864 | channel = &dev->channel[i]; | 1870 | channel = &dev->channel[i]; |
1865 | INIT_LIST_HEAD(&channel->vidq.active); | 1871 | INIT_LIST_HEAD(&channel->vidq.active); |
1866 | 1872 | ||
1867 | v4l2_ctrl_handler_init(&channel->hdl, 5); | 1873 | v4l2_ctrl_handler_init(&channel->hdl, 6); |
1868 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, | 1874 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, |
1869 | V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT); | 1875 | V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT); |
1870 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, | 1876 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, |
@@ -1873,6 +1879,10 @@ static int s2255_probe_v4l(struct s2255_dev *dev) | |||
1873 | V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION); | 1879 | V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION); |
1874 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, | 1880 | v4l2_ctrl_new_std(&channel->hdl, &s2255_ctrl_ops, |
1875 | V4L2_CID_HUE, 0, 255, 1, DEF_HUE); | 1881 | V4L2_CID_HUE, 0, 255, 1, DEF_HUE); |
1882 | channel->jpegqual_ctrl = v4l2_ctrl_new_std(&channel->hdl, | ||
1883 | &s2255_ctrl_ops, | ||
1884 | V4L2_CID_JPEG_COMPRESSION_QUALITY, | ||
1885 | 0, 100, 1, S2255_DEF_JPEG_QUAL); | ||
1876 | if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER && | 1886 | if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER && |
1877 | (dev->pid != 0x2257 || channel->idx <= 1)) | 1887 | (dev->pid != 0x2257 || channel->idx <= 1)) |
1878 | v4l2_ctrl_new_custom(&channel->hdl, &color_filter_ctrl, NULL); | 1888 | v4l2_ctrl_new_custom(&channel->hdl, &color_filter_ctrl, NULL); |
@@ -2238,7 +2248,7 @@ static int s2255_board_init(struct s2255_dev *dev) | |||
2238 | channel->mode = mode_def; | 2248 | channel->mode = mode_def; |
2239 | if (dev->pid == 0x2257 && j > 1) | 2249 | if (dev->pid == 0x2257 && j > 1) |
2240 | channel->mode.color |= (1 << 16); | 2250 | channel->mode.color |= (1 << 16); |
2241 | channel->jc.quality = S2255_DEF_JPEG_QUAL; | 2251 | channel->jpegqual = S2255_DEF_JPEG_QUAL; |
2242 | channel->width = LINE_SZ_4CIFS_NTSC; | 2252 | channel->width = LINE_SZ_4CIFS_NTSC; |
2243 | channel->height = NUM_LINES_4CIFS_NTSC * 2; | 2253 | channel->height = NUM_LINES_4CIFS_NTSC * 2; |
2244 | channel->fmt = &formats[0]; | 2254 | channel->fmt = &formats[0]; |