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