⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gspcadecoder.c

📁 linux下摄像头驱动 采用中星微301芯片
💻 C
📖 第 1 页 / 共 5 页
字号:
/*******************************************************************************#	 	spcadecoder: Generic decoder for various input stream yyuv	## yuyv yuvy jpeg411 jpeg422 bayer rggb with gamma correct			## and various output palette rgb16 rgb24 rgb32 yuv420p				## various output size with crop feature						## 		Copyright (C) 2003 2004 2005 Michel Xhaard			## 		mxhaard@magic.fr						## 		Sonix Decompressor by Bertrik.Sikken. (C) 2004			## 		Pixart Decompressor by Bertrik.Sikken. Thomas Kaiser (C) 2005	## 		Spca561decoder (C) 2005 Andrzej Szombierski [qq@kuku.eu.org]	## This program is free software; you can redistribute it and/or modify		## it under the terms of the GNU General Public License as published by		## the Free Software Foundation; either version 2 of the License, or		## (at your option) any later version.						##										## This program is distributed in the hope that it will be useful,		## but WITHOUT ANY WARRANTY; without even the implied warranty of		## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the			## GNU General Public License for more details.					##										## You should have received a copy of the GNU General Public License		## along with this program; if not, write to the Free Software			## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA	#********************************************************************************/#ifndef __KERNEL__#include <stdio.h>#include <stdlib.h>#include <string.h>#else				/* __KERNEL__ */#include <linux/string.h>#endif				/* __KERNEL__ */#include "gspcadecoder.h"#include "../utils/spcagamma.h"#define ISHIFT 11#define IFIX(a) ((long)((a) * (1 << ISHIFT) + .5))#define IMULT(a, b) (((a) * (b)) >> ISHIFT)#define ITOINT(a) ((a) >> ISHIFT)/* special markers */#define M_BADHUFF	-1#define ERR_NO_SOI 1#define ERR_NOT_8BIT 2#define ERR_HEIGHT_MISMATCH 3#define ERR_WIDTH_MISMATCH 4#define ERR_BAD_WIDTH_OR_HEIGHT 5#define ERR_TOO_MANY_COMPPS 6#define ERR_ILLEGAL_HV 7#define ERR_QUANT_TABLE_SELECTOR 8#define ERR_NOT_YCBCR_221111 9#define ERR_UNKNOWN_CID_IN_SCAN 10#define ERR_NOT_SEQUENTIAL_DCT 11#define ERR_WRONG_MARKER 12#define ERR_NO_EOI 13#define ERR_BAD_TABLES 14#define ERR_DEPTH_MISMATCH 15#define ERR_CORRUPTFRAME 16#define JPEGHEADER_LENGTH 589const unsigned char JPEGHeader[JPEGHEADER_LENGTH] = {    0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x06, 0x04, 0x05, 0x06,    0x05, 0x04, 0x06, 0x06, 0x05,    0x06, 0x07, 0x07, 0x06, 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09,    0x0a, 0x14, 0x0e, 0x0f, 0x0c,    0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14, 0x16, 0x16, 0x1a, 0x1d,    0x25, 0x1f, 0x1a, 0x1b, 0x23,    0x1c, 0x16, 0x16, 0x20, 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a,    0x29, 0x19, 0x1f, 0x2d, 0x30,    0x2d, 0x28, 0x30, 0x25, 0x28, 0x29, 0x28, 0x01, 0x07, 0x07, 0x07,    0x0a, 0x08, 0x0a, 0x13, 0x0a,    0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28,    0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0xc4, 0x01,    0xa2, 0x00, 0x00, 0x01, 0x05,    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x01, 0x02,    0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00,    0x03, 0x01, 0x01, 0x01, 0x01,    0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x01, 0x02, 0x03, 0x04, 0x05,    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03,    0x03, 0x02, 0x04, 0x03, 0x05,    0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00,    0x04, 0x11, 0x05, 0x12, 0x21,    0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32,    0x81, 0x91, 0xa1, 0x08, 0x23,    0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72,    0x82, 0x09, 0x0a, 0x16, 0x17,    0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35,    0x36, 0x37, 0x38, 0x39, 0x3a,    0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55,    0x56, 0x57, 0x58, 0x59, 0x5a,    0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75,    0x76, 0x77, 0x78, 0x79, 0x7a,    0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,    0x95, 0x96, 0x97, 0x98, 0x99,    0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2,    0xb3, 0xb4, 0xb5, 0xb6, 0xb7,    0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,    0xca, 0xd2, 0xd3, 0xd4, 0xd5,    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,    0xe7, 0xe8, 0xe9, 0xea, 0xf1,    0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00,    0x02, 0x01, 0x02, 0x04, 0x04,    0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00,    0x01, 0x02, 0x03, 0x11, 0x04,    0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13,    0x22, 0x32, 0x81, 0x08, 0x14,    0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15,    0x62, 0x72, 0xd1, 0x0a, 0x16,    0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27,    0x28, 0x29, 0x2a, 0x35, 0x36,    0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,    0x4a, 0x53, 0x54, 0x55, 0x56,    0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,    0x6a, 0x73, 0x74, 0x75, 0x76,    0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,    0x89, 0x8a, 0x92, 0x93, 0x94,    0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,    0xa7, 0xa8, 0xa9, 0xaa, 0xb2,    0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4,    0xc5, 0xc6, 0xc7, 0xc8, 0xc9,    0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2,    0xe3, 0xe4, 0xe5, 0xe6, 0xe7,    0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,    0xfa, 0xff, 0xc0, 0x00, 0x11,    0x08, 0x01, 0xe0, 0x02, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11,    0x01, 0x03, 0x11, 0x01, 0xff,    0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00,    0x3f, 0x00};#define GSMART_JPG_HUFFMAN_TABLE_LENGTH 0x1A0const unsigned char GsmartJPEGHuffmanTable[GSMART_JPG_HUFFMAN_TABLE_LENGTH]    = {    0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,    0x0A, 0x0B, 0x01, 0x00, 0x03,    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x01,    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10,    0x00, 0x02, 0x01, 0x03, 0x03,    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D,    0x01, 0x02, 0x03, 0x00, 0x04,    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,    0x22, 0x71, 0x14, 0x32, 0x81,    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,    0x24, 0x33, 0x62, 0x72, 0x82,    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28,    0x29, 0x2A, 0x34, 0x35, 0x36,    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,    0x4A, 0x53, 0x54, 0x55, 0x56,    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,    0x6A, 0x73, 0x74, 0x75, 0x76,    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,    0x8A, 0x92, 0x93, 0x94, 0x95,    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,    0xA8, 0xA9, 0xAA, 0xB2, 0xB3,    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,    0xC6, 0xC7, 0xC8, 0xC9, 0xCA,    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,    0xE3, 0xE4, 0xE5, 0xE6, 0xE7,    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,    0xF9, 0xFA, 0x11, 0x00, 0x02,    0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00,    0x01, 0x02, 0x77, 0x00, 0x01,    0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,    0x07, 0x61, 0x71, 0x13, 0x22,    0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23,    0x33, 0x52, 0xF0, 0x15, 0x62,    0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18,    0x19, 0x1A, 0x26, 0x27, 0x28,    0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45,    0x46, 0x47, 0x48, 0x49, 0x4A,    0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65,    0x66, 0x67, 0x68, 0x69, 0x6A,    0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,    0x85, 0x86, 0x87, 0x88, 0x89,    0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2,    0xA3, 0xA4, 0xA5, 0xA6, 0xA7,    0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,    0xBA, 0xC2, 0xC3, 0xC4, 0xC5,    0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,    0xD8, 0xD9, 0xDA, 0xE2, 0xE3,    0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5,    0xF6, 0xF7, 0xF8, 0xF9, 0xFA};const unsigned char GsmartJPEGScanTable[6] = {    0x01, 0x00,    0x02, 0x11,    0x03, 0x11};const unsigned char GsmartQTable[][64] = {    //index0,Q40    {     20, 14, 15, 18, 15, 13, 20, 18, 16, 18, 23, 21, 20, 24, 30, 50,     33, 30, 28, 28, 30, 61, 44, 46, 36, 50, 73, 64, 76, 75, 71, 64,     70, 69, 80, 90, 115, 98, 80, 85, 109, 86, 69, 70, 100, 136, 101,     109,     119, 123, 129, 130, 129, 78, 96, 141, 151, 140, 125, 150, 115,     126, 129, 124},    {     21, 23, 23, 30, 26, 30, 59, 33, 33, 59, 124, 83, 70, 83, 124, 124,     124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,     124, 124, 124,     124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,     124, 124, 124,     124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,     124, 124, 124},    //index1,Q50    {     16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40,     26, 24, 22, 22, 24, 49, 35, 37, 29, 40, 58, 51, 61, 60, 57, 51,     56, 55, 64, 72, 92, 78, 64, 68, 87, 69, 55, 56, 80, 109, 81, 87,     95, 98, 103, 104, 103, 62, 77, 113, 121, 112, 100, 120, 92, 101,     103, 99},    {     17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99,     99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,     99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,     99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99},    //index2,Q60    {     13, 9, 10, 11, 10, 8, 13, 11, 10, 11, 14, 14, 13, 15, 19, 32,     21, 19, 18, 18, 19, 39, 28, 30, 23, 32, 46, 41, 49, 48, 46, 41,     45, 44, 51, 58, 74, 62, 51, 54, 70, 55, 44, 45, 64, 87, 65, 70,     76, 78, 82, 83, 82, 50, 62, 90, 97, 90, 80, 96, 74, 81, 82, 79},    {     14, 14, 14, 19, 17, 19, 38, 21, 21, 38, 79, 53, 45, 53, 79, 79,     79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,     79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,     79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79},    //index3,Q70    {     10, 7, 7, 8, 7, 6, 10, 8, 8, 8, 11, 10, 10, 11, 14, 24,     16, 14, 13, 13, 14, 29, 21, 22, 17, 24, 35, 31, 37, 36, 34, 31,     34, 33, 38, 43, 55, 47, 38, 41, 52, 41, 33, 34, 48, 65, 49, 52,     57, 59, 62, 62, 62, 37, 46, 68, 73, 67, 60, 72, 55, 61, 62, 59},    {     10, 11, 11, 14, 13, 14, 28, 16, 16, 28, 59, 40, 34, 40, 59, 59,     59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,     59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,     59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59},    //index4,Q80    {     6, 4, 5, 6, 5, 4, 6, 6, 5, 6, 7, 7, 6, 8, 10, 16,     10, 10, 9, 9, 10, 20, 14, 15, 12, 16, 23, 20, 24, 24, 23, 20,     22, 22, 26, 29, 37, 31, 26, 27, 35, 28, 22, 22, 32, 44, 32, 35,     38, 39, 41, 42, 41, 25, 31, 45, 48, 45, 40, 48, 37, 40, 41, 40},    {     7, 7, 7, 10, 8, 10, 19, 10, 10, 19, 40, 26, 22, 26, 40, 40,     40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,     40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,     40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40},    //index5Q85    {     5, 3, 4, 4, 4, 3, 5, 4, 4, 4, 5, 5, 5, 6, 7, 12,     8, 7, 7, 7, 7, 15, 11, 11, 9, 12, 17, 15, 18, 18, 17, 15,     17, 17, 19, 22, 28, 23, 19, 20, 26, 21, 17, 17, 24, 33, 24, 26,     29, 29, 31, 31, 31, 19, 23, 34, 36, 34, 30, 36, 28, 30, 31, 30},    {     5, 5, 5, 7, 6, 7, 14, 8, 8, 14, 30, 20, 17, 20, 30, 30,     30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,     30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,     30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},/* Qindex= 86 */{ 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x07, 0x0B, 0x07, 0x07, 0x06, 0x06, 0x07, 0x0E, 0x0A, 0x0A, 0x08, 0x0B, 0x10, 0x0E, 0x11, 0x11, 0x10, 0x0E, 0x10, 0x0F, 0x12, 0x14, 0x1A, 0x16, 0x12, 0x13, 0x18, 0x13, 0x0F, 0x10, 0x16, 0x1F, 0x17, 0x18, 0x1B, 0x1B, 0x1D, 0x1D, 0x1D, 0x11, 0x16, 0x20, 0x22, 0x1F, 0x1C, 0x22, 0x1A, 0x1C, 0x1D, 0x1C, },{0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0D, 0x07, 0x07, 0x0D, 0x1C, 0x12, 0x10, 0x12, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,  },    /* Qindex= 88 */{ 0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x0A, 0x06, 0x06, 0x05, 0x05, 0x06, 0x0C, 0x08, 0x09, 0x07, 0x0A, 0x0E, 0x0C, 0x0F, 0x0E, 0x0E, 0x0C, 0x0D, 0x0D, 0x0F, 0x11, 0x16, 0x13, 0x0F, 0x10, 0x15, 0x11, 0x0D, 0x0D, 0x13, 0x1A, 0x13, 0x15, 0x17, 0x18, 0x19, 0x19, 0x19, 0x0F, 0x12, 0x1B, 0x1D, 0x1B, 0x18, 0x1D, 0x16, 0x18, 0x19, 0x18, },{0x04, 0x04, 0x04, 0x06, 0x05, 0x06, 0x0B, 0x06, 0x06, 0x0B, 0x18, 0x10, 0x0D, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  }};static int jpeg_decode411(struct spca50x_frame *myframe, int force_rgb);static int jpeg_decode422(struct spca50x_frame *myframe, int force_rgb);static int yuv_decode(struct spca50x_frame *myframe, int force_rgb);static int bayer_decode(struct spca50x_frame *myframe, int force_rgb);static int make_jpeg(struct spca50x_frame *myframe);static int make_jpeg_conexant(struct spca50x_frame *myframe);static int yvyu_translate(struct spca50x_frame *myframe, int force_rgb);#define CLIP(color) (unsigned char)(((color)>0xFF)?0xff:(((color)<0)?0:(color)))/****************************************************************//**************      Sonix  huffman decoder      ****************//****************************************************************/static inline unsigned char getByte(unsigned char *inp,				    unsigned int bitpos){    unsigned char *addr;    addr = inp + (bitpos >> 3);    return (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));}void init_sonix_decoder(struct usb_spca50x *spca50x){    int i;    int is_abs, val, len;    struct code_table_t *table = spca50x->maindecode.table;    for (i = 0; i < 256; i++) {	is_abs = 0;	val = 0;	len = 0;	if ((i & 0x80) == 0) {	    /* code 0 */	    val = 0;	    len = 1;	} else if ((i & 0xE0) == 0x80) {	    /* code 100 */	    val = +4;	    len = 3;	} else if ((i & 0xE0) == 0xA0) {	    /* code 101 */	    val = -4;	    len = 3;	} else if ((i & 0xF0) == 0xD0) {	    /* code 1101 */	    val = +11;	    len = 4;	} else if ((i & 0xF0) == 0xF0) {	    /* code 1111 */	    val = -11;	    len = 4;	} else if ((i & 0xF8) == 0xC8) {	    /* code 11001 */	    val = +20;	    len = 5;	} else if ((i & 0xFC) == 0xC0) {	    /* code 110000 */	    val = -20;	    len = 6;	} else if ((i & 0xFC) == 0xC4) {	    /* code 110001xx: unknown */	    val = -1;	    len = 8;	} else if ((i & 0xF0) == 0xE0) {	    /* code 1110xxxx */	    is_abs = 1;	    val = (i & 0x0F) << 4;	    len = 8;	}	table[i].is_abs = is_abs;	table[i].val = val;	table[i].len = len;    }}static void sonix_decompress(struct spca50x_frame *myframe){    int width = myframe->hdrwidth;    int height = myframe->hdrheight;    unsigned char *inp = myframe->data;    unsigned char *outp = myframe->tmpbuffer;    struct code_table_t *table = myframe->decoder->table;    int row, col;    int val;    int bitpos;    unsigned char code;    bitpos = 0;    for (row = 0; row < height; row++) {	col = 0;	/* first two pixels in first two rows are stored as raw 8-bit */	if (row < 2) {	    code = getByte(inp, bitpos);	    bitpos += 8;	    *outp++ = code;	    code = getByte(inp, bitpos);	    bitpos += 8;	    *outp++ = code;	    col += 2;	}	while (col < width) {	    /* get bitcode from bitstream */	    code = getByte(inp, bitpos);	    /* update bit position */	    bitpos += table[code].len;	    /* calculate pixel value */	    val = table[code].val;	    /* unknowcode output nothing BS update 23:10:2005 */	    if (val == -1)		continue;	    if (!table[code].is_abs) {		/* value is relative to top and left pixel */		if (col < 2) {		    /* left column: relative to top pixel */		    val += outp[-2 * width];		} else if (row < 2) {		    /* top row: relative to left pixel */		    val += outp[-2];		} else {		    /* main area: average of left pixel and top pixel */		    val += (outp[-2] + outp[-2 * width]) / 2;		    //val += (outp[-2] + outp[-2*width] - outp[-2*width -2]);		}	    }	    /* store pixel */	    *outp++ = CLIP(val);	    col++;	}    }}void init_pixart_decoder(struct usb_spca50x *spca50x){    int i;    int is_abs, val, len;    struct code_table_t *table = spca50x->maindecode.table;    for (i = 0; i < 256; i++) {	is_abs = 0;	val = 0;	len = 0;	if ((i & 0xC0) == 0) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -