The patch number 8845 was added via Mauro Carvalho Chehab <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Dean Anderson  <[EMAIL PROTECTED]>
s2255drv: adds JPEG compression quality control


adds VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP ioctls for
controlling JPEG compression quality.

Signed-off-by: Dean Anderson <[EMAIL PROTECTED]>
Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>


---

 linux/drivers/media/video/s2255drv.c |   35 ++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff -r 52842072f628 -r 45cc017bd761 linux/drivers/media/video/s2255drv.c
--- a/linux/drivers/media/video/s2255drv.c      Thu Aug 28 01:04:30 2008 +0300
+++ b/linux/drivers/media/video/s2255drv.c      Fri Aug 29 11:33:19 2008 -0700
@@ -59,6 +59,8 @@
 
 
 
+/* default JPEG quality */
+#define S2255_DEF_JPEG_QUAL     50
 /* vendor request in */
 #define S2255_VR_IN            0
 /* vendor request out */
@@ -243,6 +245,8 @@ struct s2255_dev {
        struct s2255_pipeinfo   pipes[MAX_PIPE_BUFFERS];
        struct s2255_bufferi            buffer[MAX_CHANNELS];
        struct s2255_mode       mode[MAX_CHANNELS];
+       /* jpeg compression */
+       struct v4l2_jpegcompression jc[MAX_CHANNELS];
        const struct s2255_fmt  *cur_fmt[MAX_CHANNELS];
        int                     cur_frame[MAX_CHANNELS];
        int                     last_frame[MAX_CHANNELS];
@@ -1036,7 +1040,8 @@ static int vidioc_s_fmt_vid_cap(struct f
                fh->mode.color = COLOR_Y8;
                break;
        case V4L2_PIX_FMT_JPEG:
-               fh->mode.color = COLOR_JPG | (50 << 8);
+               fh->mode.color = COLOR_JPG |
+                       (fh->dev->jc[fh->channel].quality << 8);
                break;
        case V4L2_PIX_FMT_YUV422P:
                fh->mode.color = COLOR_YUVPL;
@@ -1209,6 +1214,10 @@ static int s2255_set_mode(struct s2255_d
                dev->mode[chn].scale);
        dprintk(2, "mode contrast %x\n", mode->contrast);
 
+       /* if JPEG, set the quality */
+       if ((mode->color & MASK_COLOR) == COLOR_JPG)
+               mode->color = (dev->jc[chn].quality << 8) | COLOR_JPG;
+
        /* save the mode */
        dev->mode[chn] = *mode;
        dev->req_image_size[chn] = get_transfer_size(mode);
@@ -1472,6 +1481,27 @@ static int vidioc_s_ctrl(struct file *fi
        return -EINVAL;
 }
 
+static int vidioc_g_jpegcomp(struct file *file, void *priv,
+                        struct v4l2_jpegcompression *jc)
+{
+       struct s2255_fh *fh = priv;
+       struct s2255_dev *dev = fh->dev;
+       *jc = dev->jc[fh->channel];
+       dprintk(2, "getting jpegcompression, quality %d\n", jc->quality);
+       return 0;
+}
+
+static int vidioc_s_jpegcomp(struct file *file, void *priv,
+                        struct v4l2_jpegcompression *jc)
+{
+       struct s2255_fh *fh = priv;
+       struct s2255_dev *dev = fh->dev;
+       if (jc->quality < 0 || jc->quality > 100)
+               return -EINVAL;
+       dev->jc[fh->channel].quality = jc->quality;
+       dprintk(2, "setting jpeg quality %d\n", jc->quality);
+       return 0;
+}
 static int s2255_open(struct inode *inode, struct file *file)
 {
        int minor = iminor(inode);
@@ -1762,6 +1792,8 @@ static const struct v4l2_ioctl_ops s2255
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        .vidiocgmbuf = vidioc_cgmbuf,
 #endif
+       .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
+       .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
 };
 
 static struct video_device template = {
@@ -2148,6 +2180,7 @@ static int s2255_board_init(struct s2255
        for (j = 0; j < MAX_CHANNELS; j++) {
                dev->b_acquire[j] = 0;
                dev->mode[j] = mode_def;
+               dev->jc[j].quality = S2255_DEF_JPEG_QUAL;
                dev->cur_fmt[j] = &formats[0];
                dev->mode[j].restart = 1;
                dev->req_image_size[j] = get_transfer_size(&mode_def);


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/45cc017bd76156d1707e2061b363f30078138dd0

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to