linux/drivers/media/usb/gspca/jpeg.h
<<
>>
Prefs
   1#ifndef JPEG_H
   2#define JPEG_H 1
   3/*
   4 * Insert a JPEG header at start of frame
   5 *
   6 * This module is used by the gspca subdrivers.
   7 * A special case is done for Conexant webcams.
   8 *
   9 * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19 * GNU General Public License for more details.
  20 *
  21 */
  22
  23/*
  24 * generation options
  25 *      CONEX_CAM       Conexant if present
  26 */
  27
  28/* JPEG header */
  29static const u8 jpeg_head[] = {
  30        0xff, 0xd8,                     /* jpeg */
  31
  32/* quantization table quality 50% */
  33        0xff, 0xdb, 0x00, 0x84,         /* DQT */
  340,
  35#define JPEG_QT0_OFFSET 7
  36        0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
  37        0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
  38        0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
  39        0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
  40        0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
  41        0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
  42        0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
  43        0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
  441,
  45#define JPEG_QT1_OFFSET 72
  46        0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
  47        0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
  48        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  49        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  50        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  51        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  52        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  53        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  54
  55/* huffman table */
  56        0xff, 0xc4, 0x01, 0xa2,
  57        0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
  58        0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59        0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  60        0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
  61        0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  62        0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  63        0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  64        0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03,
  65        0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
  66        0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
  67        0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,
  68        0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
  69        0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
  70        0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82,
  71        0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
  72        0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
  73        0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46,
  74        0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
  75        0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
  76        0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
  77        0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86,
  78        0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
  79        0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
  80        0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,
  81        0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
  82        0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
  83        0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
  84        0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
  85        0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
  86        0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
  87        0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
  88        0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
  89        0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
  90        0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
  91        0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
  92        0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62,
  93        0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
  94        0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28,
  95        0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
  96        0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
  97        0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
  98        0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
  99        0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
 100        0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
 101        0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
 102        0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
 103        0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
 104        0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
 105        0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
 106        0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
 107        0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
 108        0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
 109#ifdef CONEX_CAM
 110/* the Conexant frames start with SOF0 */
 111#define JPEG_HDR_SZ 556
 112#else
 113        0xff, 0xc0, 0x00, 0x11,         /* SOF0 (start of frame 0 */
 114        0x08,                           /* data precision */
 115#define JPEG_HEIGHT_OFFSET 561
 116        0x01, 0xe0,                     /* height */
 117        0x02, 0x80,                     /* width */
 118        0x03,                           /* component number */
 119                0x01,
 120                        0x21,           /* samples Y */
 121                        0x00,           /* quant Y */
 122                0x02, 0x11, 0x01,       /* samples CbCr - quant CbCr */
 123                0x03, 0x11, 0x01,
 124
 125        0xff, 0xda, 0x00, 0x0c,         /* SOS (start of scan) */
 126        0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
 127#define JPEG_HDR_SZ 589
 128#endif
 129};
 130
 131/* define the JPEG header */
 132static void jpeg_define(u8 *jpeg_hdr,
 133                        int height,
 134                        int width,
 135                        int samplesY)
 136{
 137        memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
 138#ifndef CONEX_CAM
 139        jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
 140        jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height;
 141        jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
 142        jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width;
 143        jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
 144#endif
 145}
 146
 147/* set the JPEG quality */
 148static void jpeg_set_qual(u8 *jpeg_hdr,
 149                          int quality)
 150{
 151        int i, sc;
 152
 153        if (quality <= 0)
 154                sc = 5000;
 155        else if (quality < 50)
 156                sc = 5000 / quality;
 157        else
 158                sc = 200 - quality * 2;
 159        for (i = 0; i < 64; i++) {
 160                jpeg_hdr[JPEG_QT0_OFFSET + i] =
 161                        (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
 162                jpeg_hdr[JPEG_QT1_OFFSET + i] =
 163                        (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
 164        }
 165}
 166#endif
 167