]> Pileus Git - ~andy/linux/blobdiff - drivers/media/video/gspca/mars.c
V4L/DVB (11040): gspca - most jpeg subdrivers: Have the JPEG quality settable.
[~andy/linux] / drivers / media / video / gspca / mars.c
index 6eb813e7b714de3c564120b4737c6625444482e2..75e8d14e4ac74d0e620eff590d8e32d9fe7e0fab 100644 (file)
@@ -37,6 +37,9 @@ struct sd {
        u8 gamma;
        u8 sharpness;
        u8 quality;
+#define QUALITY_MIN 40
+#define QUALITY_MAX 70
+#define QUALITY_DEF 50
 
        u8 *jpeg_hdr;
 };
@@ -178,7 +181,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
        sd->colors = COLOR_DEF;
        sd->gamma = GAMMA_DEF;
        sd->sharpness = SHARPNESS_DEF;
-       sd->quality = 50;
+       sd->quality = QUALITY_DEF;
        gspca_dev->nbalt = 9;           /* use the altsetting 08 */
        return 0;
 }
@@ -445,6 +448,34 @@ static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)
        return 0;
 }
 
+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;
+       if (gspca_dev->streaming)
+               jpeg_set_qual(sd->jpeg_hdr, sd->quality);
+       return 0;
+}
+
+static int sd_get_jcomp(struct gspca_dev *gspca_dev,
+                       struct v4l2_jpegcompression *jcomp)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       memset(jcomp, 0, sizeof *jcomp);
+       jcomp->quality = sd->quality;
+       jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT
+                       | V4L2_JPEG_MARKER_DQT;
+       return 0;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
        .name = MODULE_NAME,
@@ -456,6 +487,8 @@ static const struct sd_desc sd_desc = {
        .stopN = sd_stopN,
        .stop0 = sd_stop0,
        .pkt_scan = sd_pkt_scan,
+       .get_jcomp = sd_get_jcomp,
+       .set_jcomp = sd_set_jcomp,
 };
 
 /* -- module initialisation -- */