1
/* Linux driver for Philips webcam
2
Decompression for chipset version 2 et 3
3
(C) 2004-2006 Luc Saillard (luc@saillard.org)
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.
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.
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.
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
27
#include "pwc-timon.h"
28
#include "pwc-kiara.h"
29
#include "pwc-dec23.h"
30
#include <media/pwc-ioctl.h>
32
#include <linux/string.h>
33
#include <linux/slab.h>
36
* USE_LOOKUP_TABLE_TO_CLAMP
37
* 0: use a C version of this tests: { a<0?0:(a>255?255:a) }
38
* 1: use a faster lookup table for cpu with a big cache (intel)
40
#define USE_LOOKUP_TABLE_TO_CLAMP 1
42
* UNROLL_LOOP_FOR_COPYING_BLOCK
43
* 0: use a loop for a smaller code (but little slower)
44
* 1: when unrolling the loop, gcc produces some faster code (perhaps only
45
* valid for intel processor class). Activating this option, automaticaly
46
* activate USE_LOOKUP_TABLE_TO_CLAMP
48
#define UNROLL_LOOP_FOR_COPY 1
49
#if UNROLL_LOOP_FOR_COPY
50
# undef USE_LOOKUP_TABLE_TO_CLAMP
51
# define USE_LOOKUP_TABLE_TO_CLAMP 1
55
* ENABLE_BAYER_DECODER
56
* 0: bayer decoder is not build (save some space)
57
* 1: bayer decoder is build and can be used
59
#define ENABLE_BAYER_DECODER 0
61
static void build_subblock_pattern(struct pwc_dec23_private *pdec)
63
static const unsigned int initial_values[12] = {
64
-0x526500, -0x221200, 0x221200, 0x526500,
66
-0x6db480, -0x2d5d00, 0x2d5d00, 0x6db480,
70
static const unsigned int values_derivated[12] = {
71
0xa4ca, 0x4424, -0x4424, -0xa4ca,
73
0xdb69, 0x5aba, -0x5aba, -0xdb69,
76
unsigned int temp_values[12];
79
memcpy(temp_values, initial_values, sizeof(initial_values));
80
for (i = 0; i < 256; i++) {
81
for (j = 0; j < 12; j++) {
82
pdec->table_subblock[i][j] = temp_values[j];
83
temp_values[j] += values_derivated[j];
88
static void build_bit_powermask_table(struct pwc_dec23_private *pdec)
91
unsigned int bit, byte, mask, val;
92
unsigned int bitpower = 1;
94
for (bit = 0; bit < 8; bit++) {
96
p = pdec->table_bitpowermask[bit];
97
for (byte = 0; byte < 256; byte++) {
108
static void build_table_color(const unsigned int romtable[16][8],
109
unsigned char p0004[16][1024],
110
unsigned char p8004[16][256])
112
int compression_mode, j, k, bit, pw;
113
unsigned char *p0, *p8;
114
const unsigned int *r;
116
/* We have 16 compressions tables */
117
for (compression_mode = 0; compression_mode < 16; compression_mode++) {
118
p0 = p0004[compression_mode];
119
p8 = p8004[compression_mode];
120
r = romtable[compression_mode];
122
for (j = 0; j < 8; j++, r++, p0 += 128) {
124
for (k = 0; k < 16; k++) {
127
else if (k >= 1 && k < 3)
128
bit = (r[0] >> 15) & 7;
129
else if (k >= 3 && k < 6)
130
bit = (r[0] >> 12) & 7;
131
else if (k >= 6 && k < 10)
132
bit = (r[0] >> 9) & 7;
133
else if (k >= 10 && k < 13)
134
bit = (r[0] >> 6) & 7;
135
else if (k >= 13 && k < 15)
136
bit = (r[0] >> 3) & 7;
146
p0[k + 0x00] = (1 * pw) + 0x80;
147
p0[k + 0x10] = (2 * pw) + 0x80;
148
p0[k + 0x20] = (3 * pw) + 0x80;
149
p0[k + 0x30] = (4 * pw) + 0x80;
150
p0[k + 0x40] = (-1 * pw) + 0x80;
151
p0[k + 0x50] = (-2 * pw) + 0x80;
152
p0[k + 0x60] = (-3 * pw) + 0x80;
153
p0[k + 0x70] = (-4 * pw) + 0x80;
154
} /* end of for (k=0; k<16; k++, p8++) */
155
} /* end of for (j=0; j<8; j++ , table++) */
156
} /* end of foreach compression_mode */
162
static void fill_table_dc00_d800(struct pwc_dec23_private *pdec)
165
#define ONE_HALF (1UL << (SCALEBITS - 1))
167
unsigned int offset1 = ONE_HALF;
168
unsigned int offset2 = 0x0000;
170
for (i=0; i<256; i++) {
171
pdec->table_dc00[i] = offset1 & ~(ONE_HALF);
172
pdec->table_d800[i] = offset2;
180
* To decode the stream:
181
* if look_bits(2) == 0: # op == 2 in the lookup table
184
* elif look_bits(3) == 7: # op == 1 in the lookup table
188
* else: # op == 0 in the lookup table
191
* For speedup processing, we build a lookup table and we takes the first 6 bits.
194
* unsigned char op; // operation to execute
195
* unsigned char bits; // bits use to perform operation
196
* unsigned char offset1; // offset to add to access in the table_0004 % 16
197
* unsigned char offset2; // offset to add to access in the table_0004
200
* How to build this table ?
201
* op == 2 when (i%4)==0
202
* op == 1 when (i%8)==7
206
static const unsigned char hash_table_ops[64*4] = {
207
0x02, 0x00, 0x00, 0x00,
208
0x00, 0x03, 0x01, 0x00,
209
0x00, 0x04, 0x01, 0x10,
210
0x00, 0x06, 0x01, 0x30,
211
0x02, 0x00, 0x00, 0x00,
212
0x00, 0x03, 0x01, 0x40,
213
0x00, 0x05, 0x01, 0x20,
214
0x01, 0x00, 0x00, 0x00,
215
0x02, 0x00, 0x00, 0x00,
216
0x00, 0x03, 0x01, 0x00,
217
0x00, 0x04, 0x01, 0x50,
218
0x00, 0x05, 0x02, 0x00,
219
0x02, 0x00, 0x00, 0x00,
220
0x00, 0x03, 0x01, 0x40,
221
0x00, 0x05, 0x03, 0x00,
222
0x01, 0x00, 0x00, 0x00,
223
0x02, 0x00, 0x00, 0x00,
224
0x00, 0x03, 0x01, 0x00,
225
0x00, 0x04, 0x01, 0x10,
226
0x00, 0x06, 0x02, 0x10,
227
0x02, 0x00, 0x00, 0x00,
228
0x00, 0x03, 0x01, 0x40,
229
0x00, 0x05, 0x01, 0x60,
230
0x01, 0x00, 0x00, 0x00,
231
0x02, 0x00, 0x00, 0x00,
232
0x00, 0x03, 0x01, 0x00,
233
0x00, 0x04, 0x01, 0x50,
234
0x00, 0x05, 0x02, 0x40,
235
0x02, 0x00, 0x00, 0x00,
236
0x00, 0x03, 0x01, 0x40,
237
0x00, 0x05, 0x03, 0x40,
238
0x01, 0x00, 0x00, 0x00,
239
0x02, 0x00, 0x00, 0x00,
240
0x00, 0x03, 0x01, 0x00,
241
0x00, 0x04, 0x01, 0x10,
242
0x00, 0x06, 0x01, 0x70,
243
0x02, 0x00, 0x00, 0x00,
244
0x00, 0x03, 0x01, 0x40,
245
0x00, 0x05, 0x01, 0x20,
246
0x01, 0x00, 0x00, 0x00,
247
0x02, 0x00, 0x00, 0x00,
248
0x00, 0x03, 0x01, 0x00,
249
0x00, 0x04, 0x01, 0x50,
250
0x00, 0x05, 0x02, 0x00,
251
0x02, 0x00, 0x00, 0x00,
252
0x00, 0x03, 0x01, 0x40,
253
0x00, 0x05, 0x03, 0x00,
254
0x01, 0x00, 0x00, 0x00,
255
0x02, 0x00, 0x00, 0x00,
256
0x00, 0x03, 0x01, 0x00,
257
0x00, 0x04, 0x01, 0x10,
258
0x00, 0x06, 0x02, 0x50,
259
0x02, 0x00, 0x00, 0x00,
260
0x00, 0x03, 0x01, 0x40,
261
0x00, 0x05, 0x01, 0x60,
262
0x01, 0x00, 0x00, 0x00,
263
0x02, 0x00, 0x00, 0x00,
264
0x00, 0x03, 0x01, 0x00,
265
0x00, 0x04, 0x01, 0x50,
266
0x00, 0x05, 0x02, 0x40,
267
0x02, 0x00, 0x00, 0x00,
268
0x00, 0x03, 0x01, 0x40,
269
0x00, 0x05, 0x03, 0x40,
270
0x01, 0x00, 0x00, 0x00
276
static const unsigned int MulIdx[16][16] = {
277
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
278
{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,},
279
{0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,},
280
{4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4,},
281
{6, 7, 8, 9, 7, 10, 11, 8, 8, 11, 10, 7, 9, 8, 7, 6,},
282
{4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4,},
283
{1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2,},
284
{0, 3, 3, 0, 1, 2, 2, 1, 2, 1, 1, 2, 3, 0, 0, 3,},
285
{0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0, 0, 1, 2, 3,},
286
{1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2,},
287
{7, 10, 11, 8, 9, 8, 7, 6, 6, 7, 8, 9, 8, 11, 10, 7,},
288
{4, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 5, 5, 4,},
289
{7, 9, 6, 8, 10, 8, 7, 11, 11, 7, 8, 10, 8, 6, 9, 7,},
290
{1, 3, 0, 2, 2, 0, 3, 1, 2, 0, 3, 1, 1, 3, 0, 2,},
291
{1, 2, 2, 1, 3, 0, 0, 3, 0, 3, 3, 0, 2, 1, 1, 2,},
292
{10, 8, 7, 11, 8, 6, 9, 7, 7, 9, 6, 8, 11, 7, 8, 10}
295
#if USE_LOOKUP_TABLE_TO_CLAMP
296
#define MAX_OUTER_CROP_VALUE (512)
297
static unsigned char pwc_crop_table[256 + 2*MAX_OUTER_CROP_VALUE];
298
#define CLAMP(x) (pwc_crop_table[MAX_OUTER_CROP_VALUE+(x)])
300
#define CLAMP(x) ((x)>255?255:((x)<0?0:x))
304
/* If the type or the command change, we rebuild the lookup table */
305
int pwc_dec23_init(struct pwc_device *pwc, int type, unsigned char *cmd)
307
int flags, version, shift, i;
308
struct pwc_dec23_private *pdec;
310
if (pwc->decompress_data == NULL) {
311
pdec = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL);
314
pwc->decompress_data = pdec;
316
pdec = pwc->decompress_data;
318
if (DEVICE_USE_CODEC3(type)) {
319
flags = cmd[2] & 0x18;
321
pdec->nbits = 7; /* More bits, mean more bits to encode the stream, but better quality */
322
else if (flags == 0x10)
327
version = cmd[2] >> 5;
328
build_table_color(KiaraRomTable[version][0], pdec->table_0004_pass1, pdec->table_8004_pass1);
329
build_table_color(KiaraRomTable[version][1], pdec->table_0004_pass2, pdec->table_8004_pass2);
341
version = cmd[2] >> 3;
342
build_table_color(TimonRomTable[version][0], pdec->table_0004_pass1, pdec->table_8004_pass1);
343
build_table_color(TimonRomTable[version][1], pdec->table_0004_pass2, pdec->table_8004_pass2);
346
/* Informations can be coded on a variable number of bits but never less than 8 */
347
shift = 8 - pdec->nbits;
348
pdec->scalebits = SCALEBITS - shift;
349
pdec->nbitsmask = 0xFF >> shift;
351
fill_table_dc00_d800(pdec);
352
build_subblock_pattern(pdec);
353
build_bit_powermask_table(pdec);
355
#if USE_LOOKUP_TABLE_TO_CLAMP
356
/* Build the static table to clamp value [0-255] */
357
for (i=0;i<MAX_OUTER_CROP_VALUE;i++)
358
pwc_crop_table[i] = 0;
359
for (i=0; i<256; i++)
360
pwc_crop_table[MAX_OUTER_CROP_VALUE+i] = i;
361
for (i=0; i<MAX_OUTER_CROP_VALUE; i++)
362
pwc_crop_table[MAX_OUTER_CROP_VALUE+256+i] = 255;
369
* Copy the 4x4 image block to Y plane buffer
371
static void copy_image_block_Y(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
373
#if UNROLL_LOOP_FOR_COPY
374
const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
376
unsigned char *d = dst;
378
*d++ = cm[c[0] >> scalebits];
379
*d++ = cm[c[1] >> scalebits];
380
*d++ = cm[c[2] >> scalebits];
381
*d++ = cm[c[3] >> scalebits];
383
d = dst + bytes_per_line;
384
*d++ = cm[c[4] >> scalebits];
385
*d++ = cm[c[5] >> scalebits];
386
*d++ = cm[c[6] >> scalebits];
387
*d++ = cm[c[7] >> scalebits];
389
d = dst + bytes_per_line*2;
390
*d++ = cm[c[8] >> scalebits];
391
*d++ = cm[c[9] >> scalebits];
392
*d++ = cm[c[10] >> scalebits];
393
*d++ = cm[c[11] >> scalebits];
395
d = dst + bytes_per_line*3;
396
*d++ = cm[c[12] >> scalebits];
397
*d++ = cm[c[13] >> scalebits];
398
*d++ = cm[c[14] >> scalebits];
399
*d++ = cm[c[15] >> scalebits];
403
unsigned char *d = dst;
404
for (i = 0; i < 4; i++, c++)
405
*d++ = CLAMP((*c) >> scalebits);
407
d = dst + bytes_per_line;
408
for (i = 0; i < 4; i++, c++)
409
*d++ = CLAMP((*c) >> scalebits);
411
d = dst + bytes_per_line*2;
412
for (i = 0; i < 4; i++, c++)
413
*d++ = CLAMP((*c) >> scalebits);
415
d = dst + bytes_per_line*3;
416
for (i = 0; i < 4; i++, c++)
417
*d++ = CLAMP((*c) >> scalebits);
422
* Copy the 4x4 image block to a CrCb plane buffer
425
static void copy_image_block_CrCb(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
427
#if UNROLL_LOOP_FOR_COPY
428
/* Unroll all loops */
429
const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
431
unsigned char *d = dst;
433
*d++ = cm[c[0] >> scalebits];
434
*d++ = cm[c[4] >> scalebits];
435
*d++ = cm[c[1] >> scalebits];
436
*d++ = cm[c[5] >> scalebits];
437
*d++ = cm[c[2] >> scalebits];
438
*d++ = cm[c[6] >> scalebits];
439
*d++ = cm[c[3] >> scalebits];
440
*d++ = cm[c[7] >> scalebits];
442
d = dst + bytes_per_line;
443
*d++ = cm[c[12] >> scalebits];
444
*d++ = cm[c[8] >> scalebits];
445
*d++ = cm[c[13] >> scalebits];
446
*d++ = cm[c[9] >> scalebits];
447
*d++ = cm[c[14] >> scalebits];
448
*d++ = cm[c[10] >> scalebits];
449
*d++ = cm[c[15] >> scalebits];
450
*d++ = cm[c[11] >> scalebits];
454
const int *c2 = src + 4;
455
unsigned char *d = dst;
457
for (i = 0; i < 4; i++, c1++, c2++) {
458
*d++ = CLAMP((*c1) >> scalebits);
459
*d++ = CLAMP((*c2) >> scalebits);
462
d = dst + bytes_per_line;
463
for (i = 0; i < 4; i++, c1++, c2++) {
464
*d++ = CLAMP((*c1) >> scalebits);
465
*d++ = CLAMP((*c2) >> scalebits);
470
#if ENABLE_BAYER_DECODER
473
* . G . G . G . G . G . G . G
474
* . . . . . . . . . . . . . .
475
* . G . G . G . G . G . G . G
476
* . . . . . . . . . . . . . .
478
* . . . . . . . . . . . . . .
479
* G . G . G . G . G . G . G .
480
* . . . . . . . . . . . . . .
481
* G . G . G . G . G . G . G .
483
static void copy_image_block_Green(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
485
#if UNROLL_LOOP_FOR_COPY
486
/* Unroll all loops */
487
const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
488
unsigned char *d = dst;
491
d[0] = cm[c[0] >> scalebits];
492
d[2] = cm[c[1] >> scalebits];
493
d[4] = cm[c[2] >> scalebits];
494
d[6] = cm[c[3] >> scalebits];
495
d[8] = cm[c[4] >> scalebits];
496
d[10] = cm[c[5] >> scalebits];
497
d[12] = cm[c[6] >> scalebits];
498
d[14] = cm[c[7] >> scalebits];
500
d = dst + bytes_per_line;
501
d[0] = cm[c[8] >> scalebits];
502
d[2] = cm[c[9] >> scalebits];
503
d[4] = cm[c[10] >> scalebits];
504
d[6] = cm[c[11] >> scalebits];
505
d[8] = cm[c[12] >> scalebits];
506
d[10] = cm[c[13] >> scalebits];
507
d[12] = cm[c[14] >> scalebits];
508
d[14] = cm[c[15] >> scalebits];
515
for (i = 0; i < 8; i++, c++)
516
d[i*2] = CLAMP((*c) >> scalebits);
518
d = dst + bytes_per_line;
519
for (i = 0; i < 8; i++, c++)
520
d[i*2] = CLAMP((*c) >> scalebits);
525
#if ENABLE_BAYER_DECODER
533
static void copy_image_block_RedBlue(const int *src, unsigned char *dst, unsigned int bytes_per_line, unsigned int scalebits)
535
#if UNROLL_LOOP_FOR_COPY
536
/* Unroll all loops */
537
const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
538
unsigned char *d = dst;
541
d[0] = cm[c[0] >> scalebits];
542
d[2] = cm[c[1] >> scalebits];
543
d[4] = cm[c[2] >> scalebits];
544
d[6] = cm[c[3] >> scalebits];
546
d = dst + bytes_per_line;
547
d[1] = cm[c[4] >> scalebits];
548
d[3] = cm[c[5] >> scalebits];
549
d[5] = cm[c[6] >> scalebits];
550
d[7] = cm[c[7] >> scalebits];
552
d = dst + bytes_per_line*2;
553
d[0] = cm[c[8] >> scalebits];
554
d[2] = cm[c[9] >> scalebits];
555
d[4] = cm[c[10] >> scalebits];
556
d[6] = cm[c[11] >> scalebits];
558
d = dst + bytes_per_line*3;
559
d[1] = cm[c[12] >> scalebits];
560
d[3] = cm[c[13] >> scalebits];
561
d[5] = cm[c[14] >> scalebits];
562
d[7] = cm[c[15] >> scalebits];
569
for (i = 0; i < 4; i++, c++)
570
d[i*2] = CLAMP((*c) >> scalebits);
572
d = dst + bytes_per_line;
573
for (i = 0; i < 4; i++, c++)
574
d[i*2+1] = CLAMP((*c) >> scalebits);
576
d = dst + bytes_per_line*2;
577
for (i = 0; i < 4; i++, c++)
578
d[i*2] = CLAMP((*c) >> scalebits);
580
d = dst + bytes_per_line*3;
581
for (i = 0; i < 4; i++, c++)
582
d[i*2+1] = CLAMP((*c) >> scalebits);
588
* To manage the stream, we keep bits in a 32 bits register.
589
* fill_nbits(n): fill the reservoir with at least n bits
590
* skip_bits(n): discard n bits from the reservoir
591
* get_bits(n): fill the reservoir, returns the first n bits and discard the
592
* bits from the reservoir.
593
* __get_nbits(n): faster version of get_bits(n), but asumes that the reservoir
594
* contains at least n bits. bits returned is discarded.
596
#define fill_nbits(pdec, nbits_wanted) do { \
597
while (pdec->nbits_in_reservoir<(nbits_wanted)) \
599
pdec->reservoir |= (*(pdec->stream)++) << (pdec->nbits_in_reservoir); \
600
pdec->nbits_in_reservoir += 8; \
604
#define skip_nbits(pdec, nbits_to_skip) do { \
605
pdec->reservoir >>= (nbits_to_skip); \
606
pdec->nbits_in_reservoir -= (nbits_to_skip); \
609
#define get_nbits(pdec, nbits_wanted, result) do { \
610
fill_nbits(pdec, nbits_wanted); \
611
result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
612
skip_nbits(pdec, nbits_wanted); \
615
#define __get_nbits(pdec, nbits_wanted, result) do { \
616
result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
617
skip_nbits(pdec, nbits_wanted); \
620
#define look_nbits(pdec, nbits_wanted) \
621
((pdec->reservoir) & ((1U<<(nbits_wanted))-1))
624
* Decode a 4x4 pixel block
626
static void decode_block(struct pwc_dec23_private *pdec,
627
const unsigned char *ptable0004,
628
const unsigned char *ptable8004)
630
unsigned int primary_color;
631
unsigned int channel_v, offset1, op;
634
fill_nbits(pdec, 16);
635
__get_nbits(pdec, pdec->nbits, primary_color);
637
if (look_nbits(pdec,2) == 0) {
639
/* Very simple, the color is the same for all pixels of the square */
640
for (i = 0; i < 16; i++)
641
pdec->temp_colors[i] = pdec->table_dc00[primary_color];
646
/* This block is encoded with small pattern */
647
for (i = 0; i < 16; i++)
648
pdec->temp_colors[i] = pdec->table_d800[primary_color];
650
__get_nbits(pdec, 3, channel_v);
651
channel_v = ((channel_v & 1) << 2) | (channel_v & 2) | ((channel_v & 4) >> 2);
653
ptable0004 += (channel_v * 128);
654
ptable8004 += (channel_v * 32);
659
unsigned int htable_idx, rows = 0;
660
const unsigned int *block;
663
* xx == 00 :=> end of the block def, remove the two bits from the stream
665
* yxx == any other value
668
fill_nbits(pdec, 16);
669
htable_idx = look_nbits(pdec, 6);
670
op = hash_table_ops[htable_idx * 4];
675
} else if (op == 1) {
676
/* 15bits [ xxxx xxxx yyyy 111 ]
677
* yyy => offset in the table8004
678
* xxx => offset in the tabled004 (tree)
680
unsigned int mask, shift;
681
unsigned int nbits, col1;
685
/* offset1 += yyyy */
686
__get_nbits(pdec, 4, yyyy);
689
nbits = ptable8004[offset1 * 2];
691
/* col1 = xxxx xxxx */
692
__get_nbits(pdec, nbits+1, col1);
695
mask = pdec->table_bitpowermask[nbits][col1];
696
shift = ptable8004[offset1 * 2 + 1];
697
rows = ((mask << shift) + 0x80) & 0xFF;
699
block = pdec->table_subblock[rows];
700
for (i = 0; i < 16; i++)
701
pdec->temp_colors[i] += block[MulIdx[offset1][i]];
705
* offset1 is coded on 3 bits
709
offset1 += hash_table_ops [htable_idx * 4 + 2];
712
rows = ptable0004[offset1 + hash_table_ops [htable_idx * 4 + 3]];
713
block = pdec->table_subblock[rows];
714
for (i = 0; i < 16; i++)
715
pdec->temp_colors[i] += block[MulIdx[offset1][i]];
717
shift = hash_table_ops[htable_idx * 4 + 1];
718
skip_nbits(pdec, shift);
725
static void DecompressBand23(struct pwc_dec23_private *pdec,
726
const unsigned char *rawyuv,
727
unsigned char *planar_y,
728
unsigned char *planar_u,
729
unsigned char *planar_v,
730
unsigned int compressed_image_width,
731
unsigned int real_image_width)
733
int compression_index, nblocks;
734
const unsigned char *ptable0004;
735
const unsigned char *ptable8004;
738
pdec->nbits_in_reservoir = 0;
739
pdec->stream = rawyuv + 1; /* The first byte of the stream is skipped */
741
get_nbits(pdec, 4, compression_index);
743
/* pass 1: uncompress Y component */
744
nblocks = compressed_image_width / 4;
746
ptable0004 = pdec->table_0004_pass1[compression_index];
747
ptable8004 = pdec->table_8004_pass1[compression_index];
749
/* Each block decode a square of 4x4 */
751
decode_block(pdec, ptable0004, ptable8004);
752
copy_image_block_Y(pdec->temp_colors, planar_y, real_image_width, pdec->scalebits);
757
/* pass 2: uncompress UV component */
758
nblocks = compressed_image_width / 8;
760
ptable0004 = pdec->table_0004_pass2[compression_index];
761
ptable8004 = pdec->table_8004_pass2[compression_index];
763
/* Each block decode a square of 4x4 */
765
decode_block(pdec, ptable0004, ptable8004);
766
copy_image_block_CrCb(pdec->temp_colors, planar_u, real_image_width/2, pdec->scalebits);
768
decode_block(pdec, ptable0004, ptable8004);
769
copy_image_block_CrCb(pdec->temp_colors, planar_v, real_image_width/2, pdec->scalebits);
778
#if ENABLE_BAYER_DECODER
780
* Size need to be a multiple of 8 in width
782
* Return a block of four line encoded like this:
784
* G R G R G R G R G R G R G R G R
785
* B G B G B G B G B G B G B G B G
786
* G R G R G R G R G R G R G R G R
787
* B G B G B G B G B G B G B G B G
790
static void DecompressBandBayer(struct pwc_dec23_private *pdec,
791
const unsigned char *rawyuv,
792
unsigned char *rgbbayer,
793
unsigned int compressed_image_width,
794
unsigned int real_image_width)
796
int compression_index, nblocks;
797
const unsigned char *ptable0004;
798
const unsigned char *ptable8004;
802
pdec->nbits_in_reservoir = 0;
803
pdec->stream = rawyuv + 1; /* The first byte of the stream is skipped */
805
get_nbits(pdec, 4, compression_index);
807
/* pass 1: uncompress RB component */
808
nblocks = compressed_image_width / 4;
810
ptable0004 = pdec->table_0004_pass1[compression_index];
811
ptable8004 = pdec->table_8004_pass1[compression_index];
814
/* Each block decode a square of 4x4 */
816
decode_block(pdec, ptable0004, ptable8004);
817
copy_image_block_RedBlue(pdec->temp_colors, rgbbayer, real_image_width, pdec->scalebits);
822
/* pass 2: uncompress G component */
823
nblocks = compressed_image_width / 8;
825
ptable0004 = pdec->table_0004_pass2[compression_index];
826
ptable8004 = pdec->table_8004_pass2[compression_index];
828
/* Each block decode a square of 4x4 */
830
decode_block(pdec, ptable0004, ptable8004);
831
copy_image_block_Green(pdec->temp_colors, rgbbayer+1, real_image_width, pdec->scalebits);
833
decode_block(pdec, ptable0004, ptable8004);
834
copy_image_block_Green(pdec->temp_colors, rgbbayer+real_image_width, real_image_width, pdec->scalebits);
845
* Uncompress a pwc23 buffer.
847
* pwc.view: size of the image wanted
848
* pwc.image: size of the image returned by the camera
849
* pwc.offset: (x,y) to displayer image in the view
853
* flags: PWCX_FLAG_PLANAR or PWCX_FLAG_BAYER
855
void pwc_dec23_decompress(const struct pwc_device *pwc,
860
int bandlines_left, stride, bytes_per_block;
862
bandlines_left = pwc->image.y / 4;
863
bytes_per_block = pwc->view.x * 4;
865
if (flags & PWCX_FLAG_BAYER) {
866
#if ENABLE_BAYER_DECODER
867
/* RGB Bayer format */
868
unsigned char *rgbout;
870
stride = pwc->view.x * pwc->offset.y;
871
rgbout = dst + stride + pwc->offset.x;
874
while (bandlines_left--) {
876
DecompressBandBayer(pwc->decompress_data,
879
pwc->image.x, pwc->view.x);
881
src += pwc->vbandlength;
882
rgbout += bytes_per_block;
886
memset(dst, 0, pwc->view.x * pwc->view.y);
890
/* YUV420P image format */
891
unsigned char *pout_planar_y;
892
unsigned char *pout_planar_u;
893
unsigned char *pout_planar_v;
894
unsigned int plane_size;
896
plane_size = pwc->view.x * pwc->view.y;
898
/* offset in Y plane */
899
stride = pwc->view.x * pwc->offset.y;
900
pout_planar_y = dst + stride + pwc->offset.x;
902
/* offsets in U/V planes */
903
stride = (pwc->view.x * pwc->offset.y) / 4 + pwc->offset.x / 2;
904
pout_planar_u = dst + plane_size + stride;
905
pout_planar_v = dst + plane_size + plane_size / 4 + stride;
907
while (bandlines_left--) {
909
DecompressBand23(pwc->decompress_data,
911
pout_planar_y, pout_planar_u, pout_planar_v,
912
pwc->image.x, pwc->view.x);
913
src += pwc->vbandlength;
914
pout_planar_y += bytes_per_block;
915
pout_planar_u += pwc->view.x;
916
pout_planar_v += pwc->view.x;