]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/usb/gspca/jpeg.h
Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112...
[mirror_ubuntu-artful-kernel.git] / drivers / media / usb / gspca / jpeg.h
CommitLineData
63eb9546
JFM
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 *
63eb9546
JFM
21 */
22
36e819db
JFM
23/*
24 * generation options
25 * CONEX_CAM Conexant if present
36e819db
JFM
26 */
27
71cb2764 28/* JPEG header */
36e819db 29static const u8 jpeg_head[] = {
63eb9546 30 0xff, 0xd8, /* jpeg */
71cb2764
JFM
31
32/* quantization table quality 50% */
63eb9546 33 0xff, 0xdb, 0x00, 0x84, /* DQT */
63eb9546 340,
71cb2764 35#define JPEG_QT0_OFFSET 7
36e819db
JFM
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,
63eb9546 441,
71cb2764 45#define JPEG_QT1_OFFSET 72
36e819db
JFM
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,
63eb9546 54
36e819db 55/* huffman table */
63eb9546
JFM
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 */
71cb2764 111#define JPEG_HDR_SZ 556
63eb9546
JFM
112#else
113 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */
114 0x08, /* data precision */
71cb2764
JFM
115#define JPEG_HEIGHT_OFFSET 561
116 0x01, 0xe0, /* height */
117 0x02, 0x80, /* width */
118 0x03, /* component number */
119 0x01,
120 0x21, /* samples Y */
63eb9546
JFM
121 0x00, /* quant Y */
122 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */
123 0x03, 0x11, 0x01,
124
d43fa32f 125 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */
63eb9546 126 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
71cb2764 127#define JPEG_HDR_SZ 589
63eb9546 128#endif
71cb2764 129};
63eb9546 130
71cb2764
JFM
131/* define the JPEG header */
132static void jpeg_define(u8 *jpeg_hdr,
133 int height,
134 int width,
135 int samplesY)
63eb9546 136{
71cb2764 137 memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
63eb9546 138#ifndef CONEX_CAM
71cb2764 139 jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
ded5e903 140 jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height;
71cb2764 141 jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
ded5e903 142 jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width;
71cb2764 143 jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
63eb9546 144#endif
71cb2764 145}
63eb9546 146
71cb2764
JFM
147/* set the JPEG quality */
148static void jpeg_set_qual(u8 *jpeg_hdr,
149 int quality)
150{
151 int i, sc;
152
32654fba
MCC
153 if (quality <= 0)
154 sc = 5000;
155 else if (quality < 50)
71cb2764
JFM
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 }
63eb9546
JFM
165}
166#endif