/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef JPEG_H
#define JPEG_H
1
/*
* Insert a JPEG header at start of frame
*
* This module is used by the gspca subdrivers.
* A special case is done for Conexant webcams.
*
* Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
*/
/*
* generation options
* CONEX_CAM Conexant if present
*/
/* JPEG header */
static const u8 jpeg_head[] = {
0 xff,
0 xd8,
/* jpeg */
/* quantization table quality 50% */
0 xff,
0 xdb,
0 x00,
0 x84,
/* DQT */
0 ,
#define JPEG_QT0_OFFSET
7
0 x10,
0 x0b,
0 x0c,
0 x0e,
0 x0c,
0 x0a,
0 x10,
0 x0e,
0 x0d,
0 x0e,
0 x12,
0 x11,
0 x10,
0 x13,
0 x18,
0 x28,
0 x1a,
0 x18,
0 x16,
0 x16,
0 x18,
0 x31,
0 x23,
0 x25,
0 x1d,
0 x28,
0 x3a,
0 x33,
0 x3d,
0 x3c,
0 x39,
0 x33,
0 x38,
0 x37,
0 x40,
0 x48,
0 x5c,
0 x4e,
0 x40,
0 x44,
0 x57,
0 x45,
0 x37,
0 x38,
0 x50,
0 x6d,
0 x51,
0 x57,
0 x5f,
0 x62,
0 x67,
0 x68,
0 x67,
0 x3e,
0 x4d,
0 x71,
0 x79,
0 x70,
0 x64,
0 x78,
0 x5c,
0 x65,
0 x67,
0 x63,
1 ,
#define JPEG_QT1_OFFSET
72
0 x11,
0 x12,
0 x12,
0 x18,
0 x15,
0 x18,
0 x2f,
0 x1a,
0 x1a,
0 x2f,
0 x63,
0 x42,
0 x38,
0 x42,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
0 x63,
/* huffman table */
0 xff,
0 xc4,
0 x01,
0 xa2,
0 x00,
0 x00,
0 x01,
0 x05,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x01,
0 x02,
0 x03,
0 x04,
0 x05,
0 x06,
0 x07,
0 x08,
0 x09,
0 x0a,
0 x0b,
0 x01,
0 x00,
0 x03,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x01,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x00,
0 x01,
0 x02,
0 x03,
0 x04,
0 x05,
0 x06,
0 x07,
0 x08,
0 x09,
0 x0a,
0 x0b,
0 x10,
0 x00,
0 x02,
0 x01,
0 x03,
0 x03,
0 x02,
0 x04,
0 x03,
0 x05,
0 x05,
0 x04,
0 x04,
0 x00,
0 x00,
0 x01,
0 x7d,
0 x01,
0 x02,
0 x03,
0 x00,
0 x04,
0 x11,
0 x05,
0 x12,
0 x21,
0 x31,
0 x41,
0 x06,
0 x13,
0 x51,
0 x61,
0 x07,
0 x22,
0 x71,
0 x14,
0 x32,
0 x81,
0 x91,
0 xa1,
0 x08,
0 x23,
0 x42,
0 xb1,
0 xc1,
0 x15,
0 x52,
0 xd1,
0 xf0,
0 x24,
0 x33,
0 x62,
0 x72,
0 x82,
0 x09,
0 x0a,
0 x16,
0 x17,
0 x18,
0 x19,
0 x1a,
0 x25,
0 x26,
0 x27,
0 x28,
0 x29,
0 x2a,
0 x34,
0 x35,
0 x36,
0 x37,
0 x38,
0 x39,
0 x3a,
0 x43,
0 x44,
0 x45,
0 x46,
0 x47,
0 x48,
0 x49,
0 x4a,
0 x53,
0 x54,
0 x55,
0 x56,
0 x57,
0 x58,
0 x59,
0 x5a,
0 x63,
0 x64,
0 x65,
0 x66,
0 x67,
0 x68,
0 x69,
0 x6a,
0 x73,
0 x74,
0 x75,
0 x76,
0 x77,
0 x78,
0 x79,
0 x7a,
0 x83,
0 x84,
0 x85,
0 x86,
0 x87,
0 x88,
0 x89,
0 x8a,
0 x92,
0 x93,
0 x94,
0 x95,
0 x96,
0 x97,
0 x98,
0 x99,
0 x9a,
0 xa2,
0 xa3,
0 xa4,
0 xa5,
0 xa6,
0 xa7,
0 xa8,
0 xa9,
0 xaa,
0 xb2,
0 xb3,
0 xb4,
0 xb5,
0 xb6,
0 xb7,
0 xb8,
0 xb9,
0 xba,
0 xc2,
0 xc3,
0 xc4,
0 xc5,
0 xc6,
0 xc7,
0 xc8,
0 xc9,
0 xca,
0 xd2,
0 xd3,
0 xd4,
0 xd5,
0 xd6,
0 xd7,
0 xd8,
0 xd9,
0 xda,
0 xe1,
0 xe2,
0 xe3,
0 xe4,
0 xe5,
0 xe6,
0 xe7,
0 xe8,
0 xe9,
0 xea,
0 xf1,
0 xf2,
0 xf3,
0 xf4,
0 xf5,
0 xf6,
0 xf7,
0 xf8,
0 xf9,
0 xfa,
0 x11,
0 x00,
0 x02,
0 x01,
0 x02,
0 x04,
0 x04,
0 x03,
0 x04,
0 x07,
0 x05,
0 x04,
0 x04,
0 x00,
0 x01,
0 x02,
0 x77,
0 x00,
0 x01,
0 x02,
0 x03,
0 x11,
0 x04,
0 x05,
0 x21,
0 x31,
0 x06,
0 x12,
0 x41,
0 x51,
0 x07,
0 x61,
0 x71,
0 x13,
0 x22,
0 x32,
0 x81,
0 x08,
0 x14,
0 x42,
0 x91,
0 xa1,
0 xb1,
0 xc1,
0 x09,
0 x23,
0 x33,
0 x52,
0 xf0,
0 x15,
0 x62,
0 x72,
0 xd1,
0 x0a,
0 x16,
0 x24,
0 x34,
0 xe1,
0 x25,
0 xf1,
0 x17,
0 x18,
0 x19,
0 x1a,
0 x26,
0 x27,
0 x28,
0 x29,
0 x2a,
0 x35,
0 x36,
0 x37,
0 x38,
0 x39,
0 x3a,
0 x43,
0 x44,
0 x45,
0 x46,
0 x47,
0 x48,
0 x49,
0 x4a,
0 x53,
0 x54,
0 x55,
0 x56,
0 x57,
0 x58,
0 x59,
0 x5a,
0 x63,
0 x64,
0 x65,
0 x66,
0 x67,
0 x68,
0 x69,
0 x6a,
0 x73,
0 x74,
0 x75,
0 x76,
0 x77,
0 x78,
0 x79,
0 x7a,
0 x82,
0 x83,
0 x84,
0 x85,
0 x86,
0 x87,
0 x88,
0 x89,
0 x8a,
0 x92,
0 x93,
0 x94,
0 x95,
0 x96,
0 x97,
0 x98,
0 x99,
0 x9a,
0 xa2,
0 xa3,
0 xa4,
0 xa5,
0 xa6,
0 xa7,
0 xa8,
0 xa9,
0 xaa,
0 xb2,
0 xb3,
0 xb4,
0 xb5,
0 xb6,
0 xb7,
0 xb8,
0 xb9,
0 xba,
0 xc2,
0 xc3,
0 xc4,
0 xc5,
0 xc6,
0 xc7,
0 xc8,
0 xc9,
0 xca,
0 xd2,
0 xd3,
0 xd4,
0 xd5,
0 xd6,
0 xd7,
0 xd8,
0 xd9,
0 xda,
0 xe2,
0 xe3,
0 xe4,
0 xe5,
0 xe6,
0 xe7,
0 xe8,
0 xe9,
0 xea,
0 xf2,
0 xf3,
0 xf4,
0 xf5,
0 xf6,
0 xf7,
0 xf8,
0 xf9,
0 xfa,
#ifdef CONEX_CAM
/* the Conexant frames start with SOF0 */
#define JPEG_HDR_SZ
556
#else
0 xff,
0 xc0,
0 x00,
0 x11,
/* SOF0 (start of frame 0 */
0 x08,
/* data precision */
#define JPEG_HEIGHT_OFFSET
561
0 x01,
0 xe0,
/* height */
0 x02,
0 x80,
/* width */
0 x03,
/* component number */
0 x01,
0 x21,
/* samples Y */
0 x00,
/* quant Y */
0 x02,
0 x11,
0 x01,
/* samples CbCr - quant CbCr */
0 x03,
0 x11,
0 x01,
0 xff,
0 xda,
0 x00,
0 x0c,
/* SOS (start of scan) */
0 x03,
0 x01,
0 x00,
0 x02,
0 x11,
0 x03,
0 x11,
0 x00,
0 x3f,
0 x00
#define JPEG_HDR_SZ
589
#endif
};
/* define the JPEG header */
static void jpeg_define(u8 *jpeg_hdr,
int height,
int width,
int samplesY)
{
memcpy(jpeg_hdr, jpeg_head,
sizeof jpeg_head);
#ifndef CONEX_CAM
jpeg_hdr[JPEG_HEIGHT_OFFSET +
0 ] = height >>
8 ;
jpeg_hdr[JPEG_HEIGHT_OFFSET +
1 ] = height;
jpeg_hdr[JPEG_HEIGHT_OFFSET +
2 ] = width >>
8 ;
jpeg_hdr[JPEG_HEIGHT_OFFSET +
3 ] = width;
jpeg_hdr[JPEG_HEIGHT_OFFSET +
6 ] = samplesY;
#endif
}
/* set the JPEG quality */
static void jpeg_set_qual(u8 *jpeg_hdr,
int quality)
{
int i, sc;
if (quality <=
0 )
sc =
5000 ;
else if (quality <
50 )
sc =
5000 / quality;
else
sc =
200 - quality *
2 ;
for (i =
0 ; i <
64 ; i++) {
jpeg_hdr[JPEG_QT0_OFFSET + i] =
(jpeg_head[JPEG_QT0_OFFSET + i] * sc +
50 ) /
100 ;
jpeg_hdr[JPEG_QT1_OFFSET + i] =
(jpeg_head[JPEG_QT1_OFFSET + i] * sc +
50 ) /
100 ;
}
}
#endif
Messung V0.5 in Prozent C=97 H=94 G=95
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland