From patchwork Sat Jan 14 19:35:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sylwester Nawrocki X-Patchwork-Id: 9510 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1Rm9O2-0008O7-HO for patchwork@linuxtv.org; Sat, 14 Jan 2012 20:35:34 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-3) with esmtp for id 1Rm9O2-00044b-D5; Sat, 14 Jan 2012 20:35:34 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756542Ab2ANTfb (ORCPT ); Sat, 14 Jan 2012 14:35:31 -0500 Received: from mail-ey0-f174.google.com ([209.85.215.174]:54330 "EHLO mail-ey0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756529Ab2ANTf3 (ORCPT ); Sat, 14 Jan 2012 14:35:29 -0500 Received: by mail-ey0-f174.google.com with SMTP id l12so562456eaa.19 for ; Sat, 14 Jan 2012 11:35:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=JK2drgrpz9Yqqbt21+1B0w1LuO0hGPSJa8m/Jyf/nUE=; b=gGbIDTVG1O5o9nHVbhSOwHpKV0tykE4kbm+hZxUOCzBqcviq424JO/3YYwzNlFO9SM LZKvz8KKWvsRBF7RQ54uHrhSiMPnaAyWY0xLQiZkxqkMg8/TFfurj1EccBw/sakgwv/F AHw/hhuiBg37/I7gq7Rw37FJ/6xsAN68EsSAQ= Received: by 10.213.7.138 with SMTP id d10mr941949ebd.78.1326569729229; Sat, 14 Jan 2012 11:35:29 -0800 (PST) Received: from localhost.localdomain (84-dzi-26.acn.waw.pl. [85.222.29.84]) by mx.google.com with ESMTPS id t1sm47871771eeb.3.2012.01.14.11.35.26 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 14 Jan 2012 11:35:28 -0800 (PST) From: Sylwester Nawrocki To: linux-media@vger.kernel.org Cc: Jean-Francois Moine , Hans Verkuil , Sylwester Nawrocki Subject: [PATCH/RFC v3 3/3] gspca: zc3xx: Add V4L2_CID_JPEG_COMPRESSION_QUALITY control support Date: Sat, 14 Jan 2012 20:35:05 +0100 Message-Id: <1326569705-20261-4-git-send-email-sylvester.nawrocki@gmail.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1326569705-20261-1-git-send-email-sylvester.nawrocki@gmail.com> References: <20120114192414.05ad2e83@tele> <1326569705-20261-1-git-send-email-sylvester.nawrocki@gmail.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.1.14.185715 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' FORGED_FROM_GMAIL 0.1, MULTIPLE_RCPTS 0.1, BODY_SIZE_4000_4999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __FRAUD_BODY_WEBMAIL 0, __FRAUD_WEBMAIL 0, __FRAUD_WEBMAIL_FROM 0, __FROM_GMAIL 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __LINES_OF_YELLING 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __PHISH_SPEAR_STRUCTURE_1 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' The JPEG compression quality control is currently done by means of the VIDIOC_S/G_JPEGCOMP ioctls. As the quality field of struct v4l2_jpgecomp is being deprecated, we add the V4L2_CID_JPEG_COMPRESSION_QUALITY control, so after the deprecation period VIDIOC_S/G_JPEGCOMP ioctl handlers can be removed, leaving the control the only user interface for compression quality configuration. Cc: Jean-Francois Moine Signed-off-by: Sylwester Nawrocki --- drivers/media/video/gspca/zc3xx.c | 45 ++++++++++++++++++++++++------------ 1 files changed, 30 insertions(+), 15 deletions(-) -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index f22e02f..b6a18c8 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c @@ -46,6 +46,7 @@ enum e_ctrl { AUTOGAIN, LIGHTFREQ, SHARPNESS, + QUALITY, NCTRLS /* number of controls */ }; @@ -57,11 +58,6 @@ struct sd { struct gspca_ctrl ctrls[NCTRLS]; - u8 quality; /* image quality */ -#define QUALITY_MIN 50 -#define QUALITY_MAX 80 -#define QUALITY_DEF 70 - u8 bridge; u8 sensor; /* Type of image sensor chip */ u16 chip_revision; @@ -101,6 +97,12 @@ static void setexposure(struct gspca_dev *gspca_dev); static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val); static void setlightfreq(struct gspca_dev *gspca_dev); static void setsharpness(struct gspca_dev *gspca_dev); +static void set_quality(struct gspca_dev *gspca_dev); + +/* JPEG image quality */ +#define QUALITY_MIN 50 +#define QUALITY_MAX 80 +#define QUALITY_DEF 70 static const struct ctrl sd_ctrls[NCTRLS] = { [BRIGHTNESS] = { @@ -188,6 +190,18 @@ static const struct ctrl sd_ctrls[NCTRLS] = { }, .set_control = setsharpness }, +[QUALITY] = { + { + .id = V4L2_CID_JPEG_COMPRESSION_QUALITY, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Compression Quality", + .minimum = QUALITY_MIN, + .maximum = QUALITY_MAX, + .step = 1, + .default_value = QUALITY_DEF, + }, + .set_control = set_quality + }, }; static const struct v4l2_pix_format vga_mode[] = { @@ -6411,7 +6425,6 @@ static int sd_config(struct gspca_dev *gspca_dev, sd->sensor = id->driver_info; gspca_dev->cam.ctrls = sd->ctrls; - sd->quality = QUALITY_DEF; return 0; } @@ -6685,7 +6698,7 @@ static int sd_start(struct gspca_dev *gspca_dev) /* create the JPEG header */ jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width, 0x21); /* JPEG 422 */ - jpeg_set_qual(sd->jpeg_hdr, sd->quality); + jpeg_set_qual(sd->jpeg_hdr, sd->ctrls[QUALITY].val); mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; switch (sd->sensor) { @@ -6893,19 +6906,21 @@ static int sd_querymenu(struct gspca_dev *gspca_dev, return -EINVAL; } +static void set_quality(struct gspca_dev *gspca_dev) +{ + struct sd *sd = (struct sd *) gspca_dev; + jpeg_set_qual(sd->jpeg_hdr, sd->ctrls[QUALITY].val); +} + static int sd_set_jcomp(struct gspca_dev *gspca_dev, struct v4l2_jpegcompression *jcomp) { struct sd *sd = (struct sd *) gspca_dev; - if (jcomp->quality < QUALITY_MIN) - sd->quality = QUALITY_MIN; - else if (jcomp->quality > QUALITY_MAX) - sd->quality = QUALITY_MAX; - else - sd->quality = jcomp->quality; + sd->ctrls[QUALITY].val = clamp_t(u8, jcomp->quality, + QUALITY_MIN, QUALITY_MAX); if (gspca_dev->streaming) - jpeg_set_qual(sd->jpeg_hdr, sd->quality); + set_quality(gspca_dev); return gspca_dev->usb_err; } @@ -6915,7 +6930,7 @@ static int sd_get_jcomp(struct gspca_dev *gspca_dev, struct sd *sd = (struct sd *) gspca_dev; memset(jcomp, 0, sizeof *jcomp); - jcomp->quality = sd->quality; + jcomp->quality = sd->ctrls[QUALITY].val; jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT | V4L2_JPEG_MARKER_DQT; return 0;