1
#include "sonix_compress.h"
3
#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
14
static code_table_t table[256];
15
static int init_done = 0;
18
int sonix_unknown = 0;
23
pre-calculates a locally stored table for efficient huffman-decoding.
25
Each entry at index x in the table represents the codeword
26
present at the MSB of byte x.
29
void sonix_decompress_init(void)
32
int is_abs, val, len, unk;
34
for (i = 0; i < 256; i++) {
39
if ((i & 0x80) == 0) {
44
else if ((i & 0xE0) == 0x80) {
49
else if ((i & 0xE0) == 0xA0) {
54
else if ((i & 0xF0) == 0xD0) {
59
else if ((i & 0xF0) == 0xF0) {
64
else if ((i & 0xF8) == 0xC8) {
69
else if ((i & 0xFC) == 0xC0) {
74
else if ((i & 0xFC) == 0xC4) {
75
/* code 110001xx: unknown */
80
else if ((i & 0xF0) == 0xE0) {
83
val = (i & 0x0F) << 4;
86
table[i].is_abs = is_abs;
100
decompresses an image encoded by a SN9C101 camera controller chip.
104
inp pointer to compressed frame (with header already stripped)
105
OUT outp pointer to decompressed frame
107
Returns 0 if the operation was successful.
108
Returns <0 if operation failed.
111
int sonix_decompress(int width, int height, unsigned char *inp, unsigned char *outp)
120
/* do sonix_decompress_init first! */
125
for (row = 0; row < height; row++) {
129
/* first two pixels in first two rows are stored as raw 8-bit */
131
addr = inp + (bitpos >> 3);
132
code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
136
addr = inp + (bitpos >> 3);
137
code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
144
while (col < width) {
145
/* get bitcode from bitstream */
146
addr = inp + (bitpos >> 3);
147
code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
149
/* update bit position */
150
bitpos += table[code].len;
152
/* update code statistics */
153
sonix_unknown += table[code].unk;
155
/* calculate pixel value */
156
val = table[code].val;
157
if (!table[code].is_abs) {
158
/* value is relative to top and left pixel */
160
/* left column: relative to top pixel */
161
val += outp[-2*width];
164
/* top row: relative to left pixel */
168
/* main area: average of left pixel and top pixel */
169
val += (outp[-2] + outp[-2*width]) / 2;
174
*outp++ = CLAMP(val);