Update contrib.
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
25 #include <liboil/liboil.h>
26 #include <liboil/liboildebug.h>
28 #include "jpeg_huffman.h"
29 #include "jpeg_debug.h"
31 /* misc helper function definitions */
33 static char *sprintbits (char *str, unsigned int bits, int n);
40 huffman_table_dump (HuffmanTable * table)
48 OIL_DEBUG ("dumping huffman table %p", table);
49 for (i = 0; i < table->len; i++) {
50 entry = table->entries + i;
51 n_bits = entry->n_bits;
52 code = entry->symbol >> (16 - n_bits);
53 sprintbits (str, code, n_bits);
54 OIL_DEBUG ("%s --> %d", str, entry->value);
61 huffman_table_init (HuffmanTable *table)
63 memset (table, 0, sizeof(HuffmanTable));
67 huffman_table_add (HuffmanTable * table, uint32_t code, int n_bits, int value)
69 HuffmanEntry *entry = table->entries + table->len;
72 entry->symbol = code << (16 - n_bits);
73 entry->mask = 0xffff ^ (0xffff >> n_bits);
74 entry->n_bits = n_bits;
80 huffman_table_decode_jpeg (HuffmanTable * tab, JpegBits * bits)
87 code = peekbits (bits, 16);
88 for (i = 0; i < tab->len; i++) {
89 entry = tab->entries + i;
90 if ((code & entry->mask) == entry->symbol) {
91 code = getbits (bits, entry->n_bits);
92 sprintbits (str, code, entry->n_bits);
93 OIL_DEBUG ("%s --> %d", str, entry->value);
97 printf ("huffman sync lost");
103 huffman_table_decode_macroblock (short *block, HuffmanTable * dc_tab,
104 HuffmanTable * ac_tab, JpegBits * bits)
110 memset (block, 0, sizeof (short) * 64);
112 s = huffman_table_decode_jpeg (dc_tab, bits);
115 x = getbits (bits, s);
116 if ((x >> (s - 1)) == 0) {
119 OIL_DEBUG ("s=%d (block[0]=%d)", s, x);
122 for (k = 1; k < 64; k++) {
123 rs = huffman_table_decode_jpeg (ac_tab, bits);
125 OIL_DEBUG ("huffman error");
128 if (bits->ptr > bits->end) {
129 OIL_DEBUG ("overrun");
136 OIL_DEBUG ("r=%d s=%d (skip 16)", r, s);
139 OIL_DEBUG ("r=%d s=%d (eob)", r, s);
145 printf ("macroblock overrun");
148 x = getbits (bits, s);
149 sprintbits (str, x, s);
150 if ((x >> (s - 1)) == 0) {
154 OIL_DEBUG ("r=%d s=%d (%s -> block[%d]=%d)", r, s, str, k, x);
161 huffman_table_decode (HuffmanTable * dc_tab, HuffmanTable * ac_tab,
167 while (bits->ptr < bits->end) {
168 ret = huffman_table_decode_macroblock (zz, dc_tab, ac_tab, bits);
176 /* misc helper functins */
179 sprintbits (char *str, unsigned int bits, int n)
182 int bit = 1 << (n - 1);
184 for (i = 0; i < n; i++) {
185 str[i] = (bits & bit) ? '1' : '0';