Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 #ifndef JPEG_H
0003 #define JPEG_H 1
0004 /*
0005  * Insert a JPEG header at start of frame
0006  *
0007  * This module is used by the gspca subdrivers.
0008  * A special case is done for Conexant webcams.
0009  *
0010  * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
0011  */
0012 
0013 /*
0014  * generation options
0015  *  CONEX_CAM   Conexant if present
0016  */
0017 
0018 /* JPEG header */
0019 static const u8 jpeg_head[] = {
0020     0xff, 0xd8,         /* jpeg */
0021 
0022 /* quantization table quality 50% */
0023     0xff, 0xdb, 0x00, 0x84,     /* DQT */
0024 0,
0025 #define JPEG_QT0_OFFSET 7
0026     0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
0027     0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
0028     0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
0029     0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
0030     0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
0031     0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
0032     0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
0033     0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
0034 1,
0035 #define JPEG_QT1_OFFSET 72
0036     0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
0037     0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
0038     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0039     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0040     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0041     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0042     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0043     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0044 
0045 /* huffman table */
0046     0xff, 0xc4, 0x01, 0xa2,
0047     0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
0048     0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0049     0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0050     0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
0051     0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0052     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0053     0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0054     0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03,
0055     0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
0056     0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
0057     0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,
0058     0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
0059     0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
0060     0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82,
0061     0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
0062     0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
0063     0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46,
0064     0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
0065     0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
0066     0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
0067     0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86,
0068     0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
0069     0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
0070     0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,
0071     0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
0072     0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
0073     0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
0074     0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0075     0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
0076     0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
0077     0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
0078     0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
0079     0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
0080     0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
0081     0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
0082     0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62,
0083     0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
0084     0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28,
0085     0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
0086     0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
0087     0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
0088     0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
0089     0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
0090     0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0091     0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0092     0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0093     0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
0094     0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
0095     0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
0096     0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
0097     0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
0098     0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
0099 #ifdef CONEX_CAM
0100 /* the Conexant frames start with SOF0 */
0101 #define JPEG_HDR_SZ 556
0102 #else
0103     0xff, 0xc0, 0x00, 0x11,     /* SOF0 (start of frame 0 */
0104     0x08,               /* data precision */
0105 #define JPEG_HEIGHT_OFFSET 561
0106     0x01, 0xe0,         /* height */
0107     0x02, 0x80,         /* width */
0108     0x03,               /* component number */
0109         0x01,
0110             0x21,       /* samples Y */
0111             0x00,       /* quant Y */
0112         0x02, 0x11, 0x01,   /* samples CbCr - quant CbCr */
0113         0x03, 0x11, 0x01,
0114 
0115     0xff, 0xda, 0x00, 0x0c,     /* SOS (start of scan) */
0116     0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
0117 #define JPEG_HDR_SZ 589
0118 #endif
0119 };
0120 
0121 /* define the JPEG header */
0122 static void jpeg_define(u8 *jpeg_hdr,
0123             int height,
0124             int width,
0125             int samplesY)
0126 {
0127     memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
0128 #ifndef CONEX_CAM
0129     jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
0130     jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height;
0131     jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
0132     jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width;
0133     jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
0134 #endif
0135 }
0136 
0137 /* set the JPEG quality */
0138 static void jpeg_set_qual(u8 *jpeg_hdr,
0139               int quality)
0140 {
0141     int i, sc;
0142 
0143     if (quality <= 0)
0144         sc = 5000;
0145     else if (quality < 50)
0146         sc = 5000 / quality;
0147     else
0148         sc = 200 - quality * 2;
0149     for (i = 0; i < 64; i++) {
0150         jpeg_hdr[JPEG_QT0_OFFSET + i] =
0151             (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
0152         jpeg_hdr[JPEG_QT1_OFFSET + i] =
0153             (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
0154     }
0155 }
0156 #endif