/* 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=87 H=89 G=87