Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* Linux driver for Philips webcam
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)    Decompression for chipset version 2 et 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)    (C) 2004-2006  Luc Saillard (luc@saillard.org)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)    NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)    driver and thus may have bugs that are not present in the original version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)    Please send bug reports and support requests to <luc@saillard.org>.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)    The decompression routines have been implemented by reverse-engineering the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)    Nemosoft binary pwcx module. Caveat emptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include "pwc-timon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include "pwc-kiara.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include "pwc-dec23.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * USE_LOOKUP_TABLE_TO_CLAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *   0: use a C version of this tests:  {  a<0?0:(a>255?255:a) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  *   1: use a faster lookup table for cpu with a big cache (intel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define USE_LOOKUP_TABLE_TO_CLAMP	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * UNROLL_LOOP_FOR_COPYING_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *   0: use a loop for a smaller code (but little slower)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *   1: when unrolling the loop, gcc produces some faster code (perhaps only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *   valid for intel processor class). Activating this option, automatically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *   activate USE_LOOKUP_TABLE_TO_CLAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define UNROLL_LOOP_FOR_COPY		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #if UNROLL_LOOP_FOR_COPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) # undef USE_LOOKUP_TABLE_TO_CLAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) # define USE_LOOKUP_TABLE_TO_CLAMP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) static void build_subblock_pattern(struct pwc_dec23_private *pdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	static const unsigned int initial_values[12] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		-0x526500, -0x221200, 0x221200, 0x526500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 			   -0x3de200, 0x3de200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		-0x6db480, -0x2d5d00, 0x2d5d00, 0x6db480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 			   -0x12c200, 0x12c200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	static const unsigned int values_derivated[12] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		0xa4ca, 0x4424, -0x4424, -0xa4ca,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 			0x7bc4, -0x7bc4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		0xdb69, 0x5aba, -0x5aba, -0xdb69,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 			0x2584, -0x2584
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	unsigned int temp_values[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	memcpy(temp_values, initial_values, sizeof(initial_values));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	for (i = 0; i < 256; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		for (j = 0; j < 12; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 			pdec->table_subblock[i][j] = temp_values[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 			temp_values[j] += values_derivated[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) static void build_bit_powermask_table(struct pwc_dec23_private *pdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	unsigned char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	unsigned int bit, byte, mask, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	unsigned int bitpower = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	for (bit = 0; bit < 8; bit++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		mask = bitpower - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		p = pdec->table_bitpowermask[bit];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		for (byte = 0; byte < 256; byte++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			val = (byte & mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 			if (byte & bitpower)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 				val = -val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 			*p++ = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		bitpower<<=1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) static void build_table_color(const unsigned int romtable[16][8],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			      unsigned char p0004[16][1024],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			      unsigned char p8004[16][256])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	int compression_mode, j, k, bit, pw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	unsigned char *p0, *p8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	const unsigned int *r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	/* We have 16 compressions tables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	for (compression_mode = 0; compression_mode < 16; compression_mode++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		p0 = p0004[compression_mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		p8 = p8004[compression_mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		r  = romtable[compression_mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		for (j = 0; j < 8; j++, r++, p0 += 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 			for (k = 0; k < 16; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 				if (k == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 					bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 				else if (k >= 1 && k < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 					bit = (r[0] >> 15) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 				else if (k >= 3 && k < 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 					bit = (r[0] >> 12) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 				else if (k >= 6 && k < 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 					bit = (r[0] >> 9) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 				else if (k >= 10 && k < 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 					bit = (r[0] >> 6) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 				else if (k >= 13 && k < 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 					bit = (r[0] >> 3) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 					bit = (r[0]) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 				if (k == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 					*p8++ = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 					*p8++ = j - bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 				*p8++ = bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 				pw = 1 << bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 				p0[k + 0x00] = (1 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 				p0[k + 0x10] = (2 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 				p0[k + 0x20] = (3 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 				p0[k + 0x30] = (4 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 				p0[k + 0x40] = (-1 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 				p0[k + 0x50] = (-2 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 				p0[k + 0x60] = (-3 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 				p0[k + 0x70] = (-4 * pw) + 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 			}	/* end of for (k=0; k<16; k++, p8++) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		}	/* end of for (j=0; j<8; j++ , table++) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	} /* end of foreach compression_mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static void fill_table_dc00_d800(struct pwc_dec23_private *pdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SCALEBITS 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define ONE_HALF  (1UL << (SCALEBITS - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	unsigned int offset1 = ONE_HALF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	unsigned int offset2 = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	for (i=0; i<256; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		pdec->table_dc00[i] = offset1 & ~(ONE_HALF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		pdec->table_d800[i] = offset2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 		offset1 += 0x7bc4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		offset2 += 0x7bc4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  * To decode the stream:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  *   if look_bits(2) == 0:	# op == 2 in the lookup table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  *      skip_bits(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  *      end of the stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)  *   elif look_bits(3) == 7:	# op == 1 in the lookup table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  *      skip_bits(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  *      yyyy = get_bits(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  *      xxxx = get_bits(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  *   else:			# op == 0 in the lookup table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  *      skip_bits(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)  * For speedup processing, we build a lookup table and we takes the first 6 bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)  * struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)  *   unsigned char op;	    // operation to execute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)  *   unsigned char bits;    // bits use to perform operation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)  *   unsigned char offset1; // offset to add to access in the table_0004 % 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)  *   unsigned char offset2; // offset to add to access in the table_0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)  * }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)  * How to build this table ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)  *   op == 2 when (i%4)==0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)  *   op == 1 when (i%8)==7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)  *   op == 0 otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static const unsigned char hash_table_ops[64*4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	0x00, 0x04, 0x01, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	0x00, 0x06, 0x01, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	0x00, 0x05, 0x01, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	0x00, 0x04, 0x01, 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	0x00, 0x05, 0x02, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	0x00, 0x05, 0x03, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	0x00, 0x04, 0x01, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	0x00, 0x06, 0x02, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	0x00, 0x05, 0x01, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	0x00, 0x04, 0x01, 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	0x00, 0x05, 0x02, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	0x00, 0x05, 0x03, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	0x00, 0x04, 0x01, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	0x00, 0x06, 0x01, 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	0x00, 0x05, 0x01, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	0x00, 0x04, 0x01, 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	0x00, 0x05, 0x02, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	0x00, 0x05, 0x03, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	0x00, 0x04, 0x01, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	0x00, 0x06, 0x02, 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	0x00, 0x05, 0x01, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	0x01, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	0x00, 0x03, 0x01, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	0x00, 0x04, 0x01, 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	0x00, 0x05, 0x02, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	0x02, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	0x00, 0x03, 0x01, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	0x00, 0x05, 0x03, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	0x01, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) static const unsigned int MulIdx[16][16] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	{0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	{4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	{6, 7, 8, 9, 7, 10, 11, 8, 8, 11, 10, 7, 9, 8, 7, 6,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	{4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	{1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	{0, 3, 3, 0, 1, 2, 2, 1, 2, 1, 1, 2, 3, 0, 0, 3,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	{0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0, 0, 1, 2, 3,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	{1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	{7, 10, 11, 8, 9, 8, 7, 6, 6, 7, 8, 9, 8, 11, 10, 7,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	{4, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 5, 5, 4,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	{7, 9, 6, 8, 10, 8, 7, 11, 11, 7, 8, 10, 8, 6, 9, 7,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	{1, 3, 0, 2, 2, 0, 3, 1, 2, 0, 3, 1, 1, 3, 0, 2,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	{1, 2, 2, 1, 3, 0, 0, 3, 0, 3, 3, 0, 2, 1, 1, 2,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	{10, 8, 7, 11, 8, 6, 9, 7, 7, 9, 6, 8, 11, 7, 8, 10}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #if USE_LOOKUP_TABLE_TO_CLAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define MAX_OUTER_CROP_VALUE	(512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static unsigned char pwc_crop_table[256 + 2*MAX_OUTER_CROP_VALUE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define CLAMP(x) (pwc_crop_table[MAX_OUTER_CROP_VALUE+(x)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define CLAMP(x) ((x)>255?255:((x)<0?0:x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /* If the type or the command change, we rebuild the lookup table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) void pwc_dec23_init(struct pwc_device *pdev, const unsigned char *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	int flags, version, shift, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	struct pwc_dec23_private *pdec = &pdev->dec23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	mutex_init(&pdec->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	if (pdec->last_cmd_valid && pdec->last_cmd == cmd[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	if (DEVICE_USE_CODEC3(pdev->type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		flags = cmd[2] & 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		if (flags == 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 			pdec->nbits = 7;	/* More bits, mean more bits to encode the stream, but better quality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		else if (flags == 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 			pdec->nbits = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 			pdec->nbits = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		version = cmd[2] >> 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		build_table_color(KiaraRomTable[version][0], pdec->table_0004_pass1, pdec->table_8004_pass1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		build_table_color(KiaraRomTable[version][1], pdec->table_0004_pass2, pdec->table_8004_pass2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 		flags = cmd[2] & 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 		if (flags == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 			pdec->nbits = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		else if (flags == 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 			pdec->nbits = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 			pdec->nbits = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		version = cmd[2] >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		build_table_color(TimonRomTable[version][0], pdec->table_0004_pass1, pdec->table_8004_pass1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 		build_table_color(TimonRomTable[version][1], pdec->table_0004_pass2, pdec->table_8004_pass2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	/* Information can be coded on a variable number of bits but never less than 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	shift = 8 - pdec->nbits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	pdec->scalebits = SCALEBITS - shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	pdec->nbitsmask = 0xFF >> shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	fill_table_dc00_d800(pdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	build_subblock_pattern(pdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	build_bit_powermask_table(pdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #if USE_LOOKUP_TABLE_TO_CLAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	/* Build the static table to clamp value [0-255] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	for (i=0;i<MAX_OUTER_CROP_VALUE;i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 		pwc_crop_table[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	for (i=0; i<256; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 		pwc_crop_table[MAX_OUTER_CROP_VALUE+i] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	for (i=0; i<MAX_OUTER_CROP_VALUE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 		pwc_crop_table[MAX_OUTER_CROP_VALUE+256+i] = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	pdec->last_cmd = cmd[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	pdec->last_cmd_valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)  * Copy the 4x4 image block to Y plane buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) static void copy_image_block_Y(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #if UNROLL_LOOP_FOR_COPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	const int *c = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	unsigned char *d = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	*d++ = cm[c[0] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	*d++ = cm[c[1] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	*d++ = cm[c[2] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	*d++ = cm[c[3] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	d = dst + bytes_per_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	*d++ = cm[c[4] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	*d++ = cm[c[5] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	*d++ = cm[c[6] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	*d++ = cm[c[7] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	d = dst + bytes_per_line*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	*d++ = cm[c[8] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	*d++ = cm[c[9] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	*d++ = cm[c[10] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	*d++ = cm[c[11] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	d = dst + bytes_per_line*3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	*d++ = cm[c[12] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	*d++ = cm[c[13] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	*d++ = cm[c[14] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	*d++ = cm[c[15] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	const int *c = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	unsigned char *d = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	for (i = 0; i < 4; i++, c++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		*d++ = CLAMP((*c) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	d = dst + bytes_per_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	for (i = 0; i < 4; i++, c++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		*d++ = CLAMP((*c) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	d = dst + bytes_per_line*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	for (i = 0; i < 4; i++, c++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		*d++ = CLAMP((*c) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	d = dst + bytes_per_line*3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	for (i = 0; i < 4; i++, c++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		*d++ = CLAMP((*c) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)  * Copy the 4x4 image block to a CrCb plane buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static void copy_image_block_CrCb(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #if UNROLL_LOOP_FOR_COPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	/* Unroll all loops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	const int *c = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	unsigned char *d = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	*d++ = cm[c[0] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	*d++ = cm[c[4] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	*d++ = cm[c[1] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	*d++ = cm[c[5] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	*d++ = cm[c[2] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	*d++ = cm[c[6] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	*d++ = cm[c[3] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	*d++ = cm[c[7] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	d = dst + bytes_per_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	*d++ = cm[c[12] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	*d++ = cm[c[8] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	*d++ = cm[c[13] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	*d++ = cm[c[9] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	*d++ = cm[c[14] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	*d++ = cm[c[10] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	*d++ = cm[c[15] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	*d++ = cm[c[11] >> scalebits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	const int *c1 = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	const int *c2 = src + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	unsigned char *d = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	for (i = 0; i < 4; i++, c1++, c2++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 		*d++ = CLAMP((*c1) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		*d++ = CLAMP((*c2) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	c1 = src + 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	d = dst + bytes_per_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	for (i = 0; i < 4; i++, c1++, c2++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 		*d++ = CLAMP((*c1) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		*d++ = CLAMP((*c2) >> scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)  * To manage the stream, we keep bits in a 32 bits register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)  * fill_nbits(n): fill the reservoir with at least n bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)  * skip_bits(n): discard n bits from the reservoir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)  * get_bits(n): fill the reservoir, returns the first n bits and discard the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)  *              bits from the reservoir.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)  * __get_nbits(n): faster version of get_bits(n), but asumes that the reservoir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)  *                 contains at least n bits. bits returned is discarded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) #define fill_nbits(pdec, nbits_wanted) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)    while (pdec->nbits_in_reservoir<(nbits_wanted)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)     { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)       pdec->reservoir |= (*(pdec->stream)++) << (pdec->nbits_in_reservoir); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)       pdec->nbits_in_reservoir += 8; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)     } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }  while(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) #define skip_nbits(pdec, nbits_to_skip) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)    pdec->reservoir >>= (nbits_to_skip); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)    pdec->nbits_in_reservoir -= (nbits_to_skip); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }  while(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #define get_nbits(pdec, nbits_wanted, result) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)    fill_nbits(pdec, nbits_wanted); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)    result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)    skip_nbits(pdec, nbits_wanted); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }  while(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) #define __get_nbits(pdec, nbits_wanted, result) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)    result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)    skip_nbits(pdec, nbits_wanted); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }  while(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #define look_nbits(pdec, nbits_wanted) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)    ((pdec->reservoir) & ((1U<<(nbits_wanted))-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)  * Decode a 4x4 pixel block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) static void decode_block(struct pwc_dec23_private *pdec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 			 const unsigned char *ptable0004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 			 const unsigned char *ptable8004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	unsigned int primary_color;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	unsigned int channel_v, offset1, op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	fill_nbits(pdec, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	__get_nbits(pdec, pdec->nbits, primary_color);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	if (look_nbits(pdec,2) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 		skip_nbits(pdec, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		/* Very simple, the color is the same for all pixels of the square */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 		for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 			pdec->temp_colors[i] = pdec->table_dc00[primary_color];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 	/* This block is encoded with small pattern */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 		pdec->temp_colors[i] = pdec->table_d800[primary_color];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	__get_nbits(pdec, 3, channel_v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	channel_v = ((channel_v & 1) << 2) | (channel_v & 2) | ((channel_v & 4) >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	ptable0004 += (channel_v * 128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 	ptable8004 += (channel_v * 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	offset1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 		unsigned int htable_idx, rows = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 		const unsigned int *block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 		/* [  zzzz y x x ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 		 *     xx == 00 :=> end of the block def, remove the two bits from the stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 		 *    yxx == 111
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 		 *    yxx == any other value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 		 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 		fill_nbits(pdec, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 		htable_idx = look_nbits(pdec, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 		op = hash_table_ops[htable_idx * 4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 		if (op == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 			skip_nbits(pdec, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 		} else if (op == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 			/* 15bits [ xxxx xxxx yyyy 111 ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 			 * yyy => offset in the table8004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 			 * xxx => offset in the tabled004 (tree)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 			unsigned int mask, shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 			unsigned int nbits, col1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 			unsigned int yyyy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 			skip_nbits(pdec, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 			/* offset1 += yyyy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 			__get_nbits(pdec, 4, yyyy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 			offset1 += 1 + yyyy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 			offset1 &= 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 			nbits = ptable8004[offset1 * 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 			/* col1 = xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 			__get_nbits(pdec, nbits+1, col1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 			/* Bit mask table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 			mask = pdec->table_bitpowermask[nbits][col1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 			shift = ptable8004[offset1 * 2 + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 			rows = ((mask << shift) + 0x80) & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 			block = pdec->table_subblock[rows];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 			for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 				pdec->temp_colors[i] += block[MulIdx[offset1][i]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 			/* op == 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 			 * offset1 is coded on 3 bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 			unsigned int shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 			offset1 += hash_table_ops [htable_idx * 4 + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 			offset1 &= 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 			rows = ptable0004[offset1 + hash_table_ops [htable_idx * 4 + 3]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 			block = pdec->table_subblock[rows];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 			for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 				pdec->temp_colors[i] += block[MulIdx[offset1][i]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 			shift = hash_table_ops[htable_idx * 4 + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 			skip_nbits(pdec, shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	} while (op != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) static void DecompressBand23(struct pwc_dec23_private *pdec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 			     const unsigned char *rawyuv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 			     unsigned char *planar_y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 			     unsigned char *planar_u,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 			     unsigned char *planar_v,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 			     unsigned int   compressed_image_width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 			     unsigned int   real_image_width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 	int compression_index, nblocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 	const unsigned char *ptable0004;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 	const unsigned char *ptable8004;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 	pdec->reservoir = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 	pdec->nbits_in_reservoir = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 	pdec->stream = rawyuv + 1;	/* The first byte of the stream is skipped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 	get_nbits(pdec, 4, compression_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	/* pass 1: uncompress Y component */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 	nblocks = compressed_image_width / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 	ptable0004 = pdec->table_0004_pass1[compression_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 	ptable8004 = pdec->table_8004_pass1[compression_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 	/* Each block decode a square of 4x4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 	while (nblocks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 		decode_block(pdec, ptable0004, ptable8004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 		copy_image_block_Y(pdec->temp_colors, planar_y, real_image_width, pdec->scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 		planar_y += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 		nblocks--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 	/* pass 2: uncompress UV component */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 	nblocks = compressed_image_width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 	ptable0004 = pdec->table_0004_pass2[compression_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 	ptable8004 = pdec->table_8004_pass2[compression_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 	/* Each block decode a square of 4x4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 	while (nblocks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 		decode_block(pdec, ptable0004, ptable8004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 		copy_image_block_CrCb(pdec->temp_colors, planar_u, real_image_width/2, pdec->scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 		decode_block(pdec, ptable0004, ptable8004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 		copy_image_block_CrCb(pdec->temp_colors, planar_v, real_image_width/2, pdec->scalebits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		planar_v += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 		planar_u += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 		nblocks -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)  * Uncompress a pwc23 buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)  * @pdev: pointer to pwc device's internal struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)  * @src: raw data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)  * @dst: image output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) void pwc_dec23_decompress(struct pwc_device *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 			  const void *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 			  void *dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 	int bandlines_left, bytes_per_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 	struct pwc_dec23_private *pdec = &pdev->dec23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 	/* YUV420P image format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 	unsigned char *pout_planar_y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 	unsigned char *pout_planar_u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 	unsigned char *pout_planar_v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 	unsigned int   plane_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 	mutex_lock(&pdec->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 	bandlines_left = pdev->height / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 	bytes_per_block = pdev->width * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 	plane_size = pdev->height * pdev->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 	pout_planar_y = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 	pout_planar_u = dst + plane_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 	pout_planar_v = dst + plane_size + plane_size / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 	while (bandlines_left--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 		DecompressBand23(pdec, src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 				 pout_planar_y, pout_planar_u, pout_planar_v,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 				 pdev->width, pdev->width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 		src += pdev->vbandlength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 		pout_planar_y += bytes_per_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 		pout_planar_u += pdev->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 		pout_planar_v += pdev->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	mutex_unlock(&pdec->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }