[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>
This commit is contained in:
Hans Verkuil 2013-02-15 05:53:45 -03:00 committed by Mauro Carvalho Chehab
parent 192f1e78cb
commit 7041dec7a9
1 changed files with 17 additions and 7 deletions

View File

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