blob: 660081dcb8521f629b0ee7228908e066899f8180 [file] [log] [blame]
Thomas Gleixnerfd9871f2019-05-19 15:51:54 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -03002#ifndef JPEG_H
3#define JPEG_H 1
4/*
5 * Insert a JPEG header at start of frame
6 *
7 * This module is used by the gspca subdrivers.
8 * A special case is done for Conexant webcams.
9 *
10 * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
Jean-Francois Moine63eb9542008-04-12 09:58:09 -030011 */
12
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030013/*
14 * generation options
15 * CONEX_CAM Conexant if present
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030016 */
17
Jean-Francois Moine71cb2762009-03-03 05:33:41 -030018/* JPEG header */
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030019static const u8 jpeg_head[] = {
Jean-Francois Moine63eb9542008-04-12 09:58:09 -030020 0xff, 0xd8, /* jpeg */
Jean-Francois Moine71cb2762009-03-03 05:33:41 -030021
22/* quantization table quality 50% */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -030023 0xff, 0xdb, 0x00, 0x84, /* DQT */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300240,
Jean-Francois Moine71cb2762009-03-03 05:33:41 -030025#define JPEG_QT0_OFFSET 7
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030026 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
27 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
28 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
29 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
30 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
31 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
32 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
33 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300341,
Jean-Francois Moine71cb2762009-03-03 05:33:41 -030035#define JPEG_QT1_OFFSET 72
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030036 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
37 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
38 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
39 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
40 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
41 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
42 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
43 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
Jean-Francois Moine63eb9542008-04-12 09:58:09 -030044
Jean-Francois Moine36e819d2009-01-07 16:49:57 -030045/* huffman table */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -030046 0xff, 0xc4, 0x01, 0xa2,
47 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
48 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
50 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
51 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
52 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
53 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
54 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03,
55 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
56 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
57 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,
58 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
59 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
60 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82,
61 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
62 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
63 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46,
64 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
65 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
66 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
67 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86,
68 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
69 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
70 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,
71 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
72 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
73 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
74 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
75 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
76 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
77 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
78 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
79 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
80 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
81 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
82 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62,
83 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
84 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28,
85 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
86 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
87 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
88 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
89 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
90 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
91 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
92 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
93 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
94 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
95 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
96 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
97 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
98 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
99#ifdef CONEX_CAM
100/* the Conexant frames start with SOF0 */
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300101#define JPEG_HDR_SZ 556
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300102#else
103 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */
104 0x08, /* data precision */
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300105#define JPEG_HEIGHT_OFFSET 561
106 0x01, 0xe0, /* height */
107 0x02, 0x80, /* width */
108 0x03, /* component number */
109 0x01,
110 0x21, /* samples Y */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300111 0x00, /* quant Y */
112 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */
113 0x03, 0x11, 0x01,
114
Jean-Francois Moined43fa322008-06-12 10:58:58 -0300115 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300116 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300117#define JPEG_HDR_SZ 589
118#endif
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300119};
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300120
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300121/* define the JPEG header */
122static void jpeg_define(u8 *jpeg_hdr,
123 int height,
124 int width,
125 int samplesY)
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300126{
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300127 memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300128#ifndef CONEX_CAM
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300129 jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
Jean-François Moineded5e902011-01-13 05:27:37 -0300130 jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height;
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300131 jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
Jean-François Moineded5e902011-01-13 05:27:37 -0300132 jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width;
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300133 jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300134#endif
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300135}
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300136
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300137/* set the JPEG quality */
138static void jpeg_set_qual(u8 *jpeg_hdr,
139 int quality)
140{
141 int i, sc;
142
Mauro Carvalho Chehab32654fb2014-04-07 10:52:43 -0300143 if (quality <= 0)
144 sc = 5000;
145 else if (quality < 50)
Jean-Francois Moine71cb2762009-03-03 05:33:41 -0300146 sc = 5000 / quality;
147 else
148 sc = 200 - quality * 2;
149 for (i = 0; i < 64; i++) {
150 jpeg_hdr[JPEG_QT0_OFFSET + i] =
151 (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
152 jpeg_hdr[JPEG_QT1_OFFSET + i] =
153 (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
154 }
Jean-Francois Moine63eb9542008-04-12 09:58:09 -0300155}
156#endif