Adding debian version 4.03+dfsg-7.
[syslinux-debian/hramrach.git] / com32 / lib / jpeg / tinyjpeg.c
blob3c6070f445d1887504360b47e4a849a31e494616
1 /*
2 * Small jpeg decoder library
4 * Copyright (c) 2006, Luc Saillard <luc@saillard.org>
5 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * - Neither the name of the author nor the names of its contributors may be
17 * used to endorse or promote products derived from this software without
18 * specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <stdint.h>
38 #include <errno.h>
40 #include "tinyjpeg.h"
41 #include "tinyjpeg-internal.h"
43 /* Global variable to return the last error found while deconding */
44 static char error_string[256];
46 static const unsigned char zigzag[64] =
48 0, 1, 5, 6, 14, 15, 27, 28,
49 2, 4, 7, 13, 16, 26, 29, 42,
50 3, 8, 12, 17, 25, 30, 41, 43,
51 9, 11, 18, 24, 31, 40, 44, 53,
52 10, 19, 23, 32, 39, 45, 52, 54,
53 20, 22, 33, 38, 46, 51, 55, 60,
54 21, 34, 37, 47, 50, 56, 59, 61,
55 35, 36, 48, 49, 57, 58, 62, 63
58 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
59 /* IMPORTANT: these are only valid for 8-bit data precision! */
60 static const unsigned char bits_dc_luminance[17] =
62 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
64 static const unsigned char val_dc_luminance[] =
66 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
69 static const unsigned char bits_dc_chrominance[17] =
71 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
73 static const unsigned char val_dc_chrominance[] =
75 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
78 static const unsigned char bits_ac_luminance[17] =
80 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
82 static const unsigned char val_ac_luminance[] =
84 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
85 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
86 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
87 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
88 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
89 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
90 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
91 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
92 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
93 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
94 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
95 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
96 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
97 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
98 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
99 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
100 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
101 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
102 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
103 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
104 0xf9, 0xfa
107 static const unsigned char bits_ac_chrominance[17] =
109 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
112 static const unsigned char val_ac_chrominance[] =
114 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
115 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
116 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
117 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
118 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
119 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
120 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
121 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
122 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
123 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
124 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
125 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
126 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
127 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
128 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
129 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
130 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
131 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
132 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
133 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
134 0xf9, 0xfa
139 * 4 functions to manage the stream
141 * fill_nbits: put at least nbits in the reservoir of bits.
142 * But convert any 0xff,0x00 into 0xff
143 * get_nbits: read nbits from the stream, and put it in result,
144 * bits is removed from the stream and the reservoir is filled
145 * automaticaly. The result is signed according to the number of
146 * bits.
147 * look_nbits: read nbits from the stream without marking as read.
148 * skip_nbits: read nbits from the stream but do not return the result.
150 * stream: current pointer in the jpeg data (read bytes per bytes)
151 * nbits_in_reservoir: number of bits filled into the reservoir
152 * reservoir: register that contains bits information. Only nbits_in_reservoir
153 * is valid.
154 * nbits_in_reservoir
155 * <-- 17 bits -->
156 * Ex: 0000 0000 1010 0000 1111 0000 <== reservoir
158 * bit 1
159 * To get two bits from this example
160 * result = (reservoir >> 15) & 3
163 #define fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \
164 while (nbits_in_reservoir<nbits_wanted) \
166 unsigned char c; \
167 if (stream >= priv->stream_end) \
168 longjmp(priv->jump_state, -EIO); \
169 c = *stream++; \
170 reservoir <<= 8; \
171 if (c == 0xff && *stream == 0x00) \
172 stream++; \
173 reservoir |= c; \
174 nbits_in_reservoir+=8; \
176 } while(0);
178 /* Signed version !!!! */
179 #define get_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \
180 fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \
181 result = ((reservoir)>>(nbits_in_reservoir-(nbits_wanted))); \
182 nbits_in_reservoir -= (nbits_wanted); \
183 reservoir &= ((1U<<nbits_in_reservoir)-1); \
184 if ((unsigned int)result < (1UL<<((nbits_wanted)-1))) \
185 result += (0xFFFFFFFFUL<<(nbits_wanted))+1; \
186 } while(0);
188 #define look_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \
189 fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \
190 result = ((reservoir)>>(nbits_in_reservoir-(nbits_wanted))); \
191 } while(0);
193 /* To speed up the decoding, we assume that the reservoir have enough bit
194 * slow version:
195 * #define skip_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \
196 * fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \
197 * nbits_in_reservoir -= (nbits_wanted); \
198 * reservoir &= ((1U<<nbits_in_reservoir)-1); \
199 * } while(0);
201 #define skip_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \
202 nbits_in_reservoir -= (nbits_wanted); \
203 reservoir &= ((1U<<nbits_in_reservoir)-1); \
204 } while(0);
207 #define be16_to_cpu(x) (((x)[0]<<8)|(x)[1])
209 static void resync(struct jdec_private *priv);
212 * Get the next (valid) huffman code in the stream.
214 * To speedup the procedure, we look HUFFMAN_HASH_NBITS bits and the code is
215 * lower than HUFFMAN_HASH_NBITS we have automaticaly the length of the code
216 * and the value by using two lookup table.
217 * Else if the value is not found, just search (linear) into an array for each
218 * bits is the code is present.
220 * If the code is not present for any reason, -1 is return.
222 static int get_next_huffman_code(struct jdec_private *priv, struct huffman_table *huffman_table)
224 int value, hcode;
225 unsigned int extra_nbits, nbits;
226 uint16_t *slowtable;
228 look_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, HUFFMAN_HASH_NBITS, hcode);
229 value = huffman_table->lookup[hcode];
230 if (__likely(value >= 0))
232 unsigned int code_size = huffman_table->code_size[value];
233 skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, code_size);
234 return value;
237 /* Decode more bits each time ... */
238 for (extra_nbits=0; extra_nbits<16-HUFFMAN_HASH_NBITS; extra_nbits++)
240 nbits = HUFFMAN_HASH_NBITS + 1 + extra_nbits;
242 look_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, nbits, hcode);
243 slowtable = huffman_table->slowtable[extra_nbits];
244 /* Search if the code is in this array */
245 while (slowtable[0]) {
246 if (slowtable[0] == hcode) {
247 skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, nbits);
248 return slowtable[1];
250 slowtable+=2;
253 return 0;
261 * Decode a single block that contains the DCT coefficients.
262 * The table coefficients is already dezigzaged at the end of the operation.
265 void tinyjpeg_process_Huffman_data_unit(struct jdec_private *priv, int component)
267 unsigned char j;
268 unsigned int huff_code;
269 unsigned char size_val, count_0;
271 struct component *c = &priv->component_infos[component];
272 short int DCT[64];
275 /* Initialize the DCT coef table */
276 memset(DCT, 0, sizeof(DCT));
278 /* DC coefficient decoding */
279 huff_code = get_next_huffman_code(priv, c->DC_table);
280 //trace("+ %x\n", huff_code);
281 if (huff_code) {
282 get_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, huff_code, DCT[0]);
283 DCT[0] += c->previous_DC;
284 c->previous_DC = DCT[0];
285 } else {
286 DCT[0] = c->previous_DC;
289 /* AC coefficient decoding */
290 j = 1;
291 while (j<64)
293 huff_code = get_next_huffman_code(priv, c->AC_table);
294 //trace("- %x\n", huff_code);
296 size_val = huff_code & 0xF;
297 count_0 = huff_code >> 4;
299 if (size_val == 0)
300 { /* RLE */
301 if (count_0 == 0)
302 break; /* EOB found, go out */
303 else if (count_0 == 0xF)
304 j += 16; /* skip 16 zeros */
306 else
308 j += count_0; /* skip count_0 zeroes */
309 if (__unlikely(j >= 64))
311 snprintf(error_string, sizeof(error_string), "Bad huffman data (buffer overflow)");
312 break;
314 get_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, size_val, DCT[j]);
315 j++;
319 for (j = 0; j < 64; j++)
320 c->DCT[j] = DCT[zigzag[j]];
324 * Takes two array of bits, and build the huffman table for size, and code
326 * lookup will return the symbol if the code is less or equal than HUFFMAN_HASH_NBITS.
327 * code_size will be used to known how many bits this symbol is encoded.
328 * slowtable will be used when the first lookup didn't give the result.
330 static void build_huffman_table(const unsigned char *bits, const unsigned char *vals, struct huffman_table *table)
332 unsigned int i, j, code, code_size, val, nbits;
333 unsigned char huffsize[HUFFMAN_BITS_SIZE+1], *hz;
334 unsigned int huffcode[HUFFMAN_BITS_SIZE+1], *hc;
335 int next_free_entry;
338 * Build a temp array
339 * huffsize[X] => numbers of bits to write vals[X]
341 hz = huffsize;
342 for (i=1; i<=16; i++)
344 for (j=1; j<=bits[i]; j++)
345 *hz++ = i;
347 *hz = 0;
349 memset(table->lookup, 0xff, sizeof(table->lookup));
350 for (i=0; i<(16-HUFFMAN_HASH_NBITS); i++)
351 table->slowtable[i][0] = 0;
353 /* Build a temp array
354 * huffcode[X] => code used to write vals[X]
356 code = 0;
357 hc = huffcode;
358 hz = huffsize;
359 nbits = *hz;
360 while (*hz)
362 while (*hz == nbits)
364 *hc++ = code++;
365 hz++;
367 code <<= 1;
368 nbits++;
372 * Build the lookup table, and the slowtable if needed.
374 next_free_entry = -1;
375 for (i=0; huffsize[i]; i++)
377 val = vals[i];
378 code = huffcode[i];
379 code_size = huffsize[i];
381 trace("val=%2.2x code=%8.8x codesize=%2.2d\n", val, code, code_size);
383 table->code_size[val] = code_size;
384 if (code_size <= HUFFMAN_HASH_NBITS)
387 * Good: val can be put in the lookup table, so fill all value of this
388 * column with value val
390 int repeat = 1UL<<(HUFFMAN_HASH_NBITS - code_size);
391 code <<= HUFFMAN_HASH_NBITS - code_size;
392 while ( repeat-- )
393 table->lookup[code++] = val;
396 else
398 /* Perhaps sorting the array will be an optimization */
399 uint16_t *slowtable = table->slowtable[code_size-HUFFMAN_HASH_NBITS-1];
400 while(slowtable[0])
401 slowtable+=2;
402 slowtable[0] = code;
403 slowtable[1] = val;
404 slowtable[2] = 0;
405 /* TODO: NEED TO CHECK FOR AN OVERFLOW OF THE TABLE */
411 static void build_default_huffman_tables(struct jdec_private *priv)
413 if ( (priv->flags & TINYJPEG_FLAGS_MJPEG_TABLE)
414 && priv->default_huffman_table_initialized)
415 return;
417 build_huffman_table(bits_dc_luminance, val_dc_luminance, &priv->HTDC[0]);
418 build_huffman_table(bits_ac_luminance, val_ac_luminance, &priv->HTAC[0]);
420 build_huffman_table(bits_dc_chrominance, val_dc_chrominance, &priv->HTDC[1]);
421 build_huffman_table(bits_ac_chrominance, val_ac_chrominance, &priv->HTAC[1]);
423 priv->default_huffman_table_initialized = 1;
428 /*******************************************************************************
430 * Colorspace conversion routine
433 * Note:
434 * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
435 * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
436 * The conversion equations to be implemented are therefore
437 * R = Y + 1.40200 * Cr
438 * G = Y - 0.34414 * Cb - 0.71414 * Cr
439 * B = Y + 1.77200 * Cb
441 ******************************************************************************/
443 static void print_SOF(const unsigned char *stream)
445 int width, height, nr_components, precision;
446 #if DEBUG
447 const char *nr_components_to_string[] = {
448 "????",
449 "Grayscale",
450 "????",
451 "YCbCr",
452 "CYMK"
454 #endif
456 precision = stream[2];
457 height = be16_to_cpu(stream+3);
458 width = be16_to_cpu(stream+5);
459 nr_components = stream[7];
461 trace("> SOF marker\n");
462 trace("Size:%dx%d nr_components:%d (%s) precision:%d\n",
463 width, height,
464 nr_components, nr_components_to_string[nr_components],
465 precision);
468 /*******************************************************************************
470 * JPEG/JFIF Parsing functions
472 * Note: only a small subset of the jpeg file format is supported. No markers,
473 * nor progressive stream is supported.
475 ******************************************************************************/
477 static void build_quantization_table(float *qtable, const unsigned char *ref_table)
479 /* Taken from libjpeg. Copyright Independent JPEG Group's LLM idct.
480 * For float AA&N IDCT method, divisors are equal to quantization
481 * coefficients scaled by scalefactor[row]*scalefactor[col], where
482 * scalefactor[0] = 1
483 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
484 * We apply a further scale factor of 8.
485 * What's actually stored is 1/divisor so that the inner loop can
486 * use a multiplication rather than a division.
488 int i, j;
489 static const double aanscalefactor[8] = {
490 1.0, 1.387039845, 1.306562965, 1.175875602,
491 1.0, 0.785694958, 0.541196100, 0.275899379
493 const unsigned char *zz = zigzag;
495 for (i=0; i<8; i++) {
496 for (j=0; j<8; j++) {
497 *qtable++ = ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j];
503 static int parse_DQT(struct jdec_private *priv, const unsigned char *stream)
505 int qi;
506 float *table;
507 const unsigned char *dqt_block_end;
509 trace("> DQT marker\n");
510 dqt_block_end = stream + be16_to_cpu(stream);
511 stream += 2; /* Skip length */
513 while (stream < dqt_block_end)
515 qi = *stream++;
516 #if SANITY_CHECK
517 if (qi>>4)
518 error("16 bits quantization table is not supported\n");
519 if (qi>4)
520 error("No more 4 quantization table is supported (got %d)\n", qi);
521 #endif
522 table = priv->Q_tables[qi];
523 build_quantization_table(table, stream);
524 stream += 64;
526 trace("< DQT marker\n");
527 return 0;
530 static int parse_SOF(struct jdec_private *priv, const unsigned char *stream)
532 int i, width, height, nr_components, cid, sampling_factor;
533 int Q_table;
534 struct component *c;
536 trace("> SOF marker\n");
537 print_SOF(stream);
539 height = be16_to_cpu(stream+3);
540 width = be16_to_cpu(stream+5);
541 nr_components = stream[7];
542 #if SANITY_CHECK
543 if (stream[2] != 8)
544 error("Precision other than 8 is not supported\n");
545 if (width>JPEG_MAX_WIDTH || height>JPEG_MAX_HEIGHT)
546 error("Width and Height (%dx%d) seems suspicious\n", width, height);
547 if (nr_components != 3)
548 error("We only support YUV images\n");
549 #endif
550 stream += 8;
551 for (i=0; i<nr_components; i++) {
552 cid = *stream++;
553 sampling_factor = *stream++;
554 Q_table = *stream++;
555 c = &priv->component_infos[i];
556 #if SANITY_CHECK
557 c->cid = cid;
558 if (Q_table >= COMPONENTS)
559 error("Bad Quantization table index (got %d, max allowed %d)\n", Q_table, COMPONENTS-1);
560 #endif
561 c->Vfactor = sampling_factor&0xf;
562 c->Hfactor = sampling_factor>>4;
563 c->Q_table = priv->Q_tables[Q_table];
564 trace("Component:%d factor:%dx%d Quantization table:%d\n",
565 cid, c->Hfactor, c->Hfactor, Q_table );
568 priv->width = width;
569 priv->height = height;
571 trace("< SOF marker\n");
573 return 0;
576 static int parse_SOS(struct jdec_private *priv, const unsigned char *stream)
578 unsigned int i, cid, table;
579 unsigned int nr_components = stream[2];
581 trace("> SOS marker\n");
583 #if SANITY_CHECK
584 if (nr_components != 3)
585 error("We only support YCbCr image\n");
586 #endif
588 stream += 3;
589 for (i=0;i<nr_components;i++) {
590 cid = *stream++;
591 table = *stream++;
592 #if SANITY_CHECK
593 if ((table&0xf)>=4)
594 error("We do not support more than 2 AC Huffman table\n");
595 if ((table>>4)>=4)
596 error("We do not support more than 2 DC Huffman table\n");
597 if (cid != priv->component_infos[i].cid)
598 error("SOS cid order (%d:%d) isn't compatible with the SOF marker (%d:%d)\n",
599 i, cid, i, priv->component_infos[i].cid);
600 trace("ComponentId:%d tableAC:%d tableDC:%d\n", cid, table&0xf, table>>4);
601 #endif
602 priv->component_infos[i].AC_table = &priv->HTAC[table&0xf];
603 priv->component_infos[i].DC_table = &priv->HTDC[table>>4];
605 priv->stream = stream+3;
606 trace("< SOS marker\n");
607 return 0;
610 static int parse_DHT(struct jdec_private *priv, const unsigned char *stream)
612 unsigned int count, i;
613 unsigned char huff_bits[17];
614 int length, index;
616 length = be16_to_cpu(stream) - 2;
617 stream += 2; /* Skip length */
619 trace("> DHT marker (length=%d)\n", length);
621 while (length>0) {
622 index = *stream++;
624 /* We need to calculate the number of bytes 'vals' will takes */
625 huff_bits[0] = 0;
626 count = 0;
627 for (i=1; i<17; i++) {
628 huff_bits[i] = *stream++;
629 count += huff_bits[i];
631 #if SANITY_CHECK
632 if (count >= HUFFMAN_BITS_SIZE)
633 error("No more than %d bytes is allowed to describe a huffman table", HUFFMAN_BITS_SIZE);
634 if ( (index &0xf) >= HUFFMAN_TABLES)
635 error("No more than %d Huffman tables is supported (got %d)\n", HUFFMAN_TABLES, index&0xf);
636 trace("Huffman table %s[%d] length=%d\n", (index&0xf0)?"AC":"DC", index&0xf, count);
637 #endif
639 if (index & 0xf0 )
640 build_huffman_table(huff_bits, stream, &priv->HTAC[index&0xf]);
641 else
642 build_huffman_table(huff_bits, stream, &priv->HTDC[index&0xf]);
644 length -= 1;
645 length -= 16;
646 length -= count;
647 stream += count;
649 trace("< DHT marker\n");
650 return 0;
653 static int parse_DRI(struct jdec_private *priv, const unsigned char *stream)
655 unsigned int length;
657 trace("> DRI marker\n");
659 length = be16_to_cpu(stream);
661 #if SANITY_CHECK
662 if (length != 4)
663 error("Length of DRI marker need to be 4\n");
664 #endif
666 priv->restart_interval = be16_to_cpu(stream+2);
668 #if DEBUG
669 trace("Restart interval = %d\n", priv->restart_interval);
670 #endif
672 trace("< DRI marker\n");
674 return 0;
679 static void resync(struct jdec_private *priv)
681 int i;
683 /* Init DC coefficients */
684 for (i=0; i<COMPONENTS; i++)
685 priv->component_infos[i].previous_DC = 0;
687 priv->reservoir = 0;
688 priv->nbits_in_reservoir = 0;
689 if (priv->restart_interval > 0)
690 priv->restarts_to_go = priv->restart_interval;
691 else
692 priv->restarts_to_go = -1;
695 static int find_next_rst_marker(struct jdec_private *priv)
697 int rst_marker_found = 0;
698 int marker;
699 const unsigned char *stream = priv->stream;
701 /* Parse marker */
702 while (!rst_marker_found)
704 while (*stream++ != 0xff)
706 if (stream >= priv->stream_end)
707 error("EOF while search for a RST marker.");
709 /* Skip any padding ff byte (this is normal) */
710 while (*stream == 0xff)
711 stream++;
713 marker = *stream++;
714 if ((RST+priv->last_rst_marker_seen) == marker)
715 rst_marker_found = 1;
716 else if (marker >= RST && marker <= RST7)
717 error("Wrong Reset marker found, abording");
718 else if (marker == EOI)
719 return 0;
721 trace("RST Marker %d found at offset %d\n", priv->last_rst_marker_seen, stream - priv->stream_begin);
723 priv->stream = stream;
724 priv->last_rst_marker_seen++;
725 priv->last_rst_marker_seen &= 7;
727 return 0;
730 static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream)
732 int chuck_len;
733 int marker;
734 int sos_marker_found = 0;
735 int dht_marker_found = 0;
736 const unsigned char *next_chunck;
738 /* Parse marker */
739 while (!sos_marker_found)
741 if (*stream++ != 0xff)
742 goto bogus_jpeg_format;
743 /* Skip any padding ff byte (this is normal) */
744 while (*stream == 0xff)
745 stream++;
747 marker = *stream++;
748 chuck_len = be16_to_cpu(stream);
749 next_chunck = stream + chuck_len;
750 switch (marker)
752 case SOF:
753 if (parse_SOF(priv, stream) < 0)
754 return -1;
755 break;
756 case DQT:
757 if (parse_DQT(priv, stream) < 0)
758 return -1;
759 break;
760 case SOS:
761 if (parse_SOS(priv, stream) < 0)
762 return -1;
763 sos_marker_found = 1;
764 break;
765 case DHT:
766 if (parse_DHT(priv, stream) < 0)
767 return -1;
768 dht_marker_found = 1;
769 break;
770 case DRI:
771 if (parse_DRI(priv, stream) < 0)
772 return -1;
773 break;
774 default:
775 trace("> Unknown marker %2.2x\n", marker);
776 break;
779 stream = next_chunck;
782 if (!dht_marker_found) {
783 trace("No Huffman table loaded, using the default one\n");
784 build_default_huffman_tables(priv);
787 #ifdef SANITY_CHECK
788 if ( (priv->component_infos[cY].Hfactor < priv->component_infos[cCb].Hfactor)
789 || (priv->component_infos[cY].Hfactor < priv->component_infos[cCr].Hfactor))
790 error("Horizontal sampling factor for Y should be greater than horitontal sampling factor for Cb or Cr\n");
791 if ( (priv->component_infos[cY].Vfactor < priv->component_infos[cCb].Vfactor)
792 || (priv->component_infos[cY].Vfactor < priv->component_infos[cCr].Vfactor))
793 error("Vertical sampling factor for Y should be greater than vertical sampling factor for Cb or Cr\n");
794 if ( (priv->component_infos[cCb].Hfactor!=1)
795 || (priv->component_infos[cCr].Hfactor!=1)
796 || (priv->component_infos[cCb].Vfactor!=1)
797 || (priv->component_infos[cCr].Vfactor!=1))
798 error("Sampling other than 1x1 for Cr and Cb is not supported");
799 #endif
801 return 0;
802 bogus_jpeg_format:
803 trace("Bogus jpeg format\n");
804 return -1;
807 /*******************************************************************************
809 * Functions exported of the library.
811 * Note: Some applications can access directly to internal pointer of the
812 * structure. It's is not recommended, but if you have many images to
813 * uncompress with the same parameters, some functions can be called to speedup
814 * the decoding.
816 ******************************************************************************/
819 * Allocate a new tinyjpeg decoder object.
821 * Before calling any other functions, an object need to be called.
823 struct jdec_private *tinyjpeg_init(void)
825 struct jdec_private *priv;
827 priv = (struct jdec_private *)calloc(1, sizeof(struct jdec_private));
828 if (priv == NULL)
829 return NULL;
830 return priv;
834 * Free a tinyjpeg object.
836 * No others function can be called after this one.
838 void tinyjpeg_free(struct jdec_private *priv)
840 int i;
841 for (i=0; i<COMPONENTS; i++) {
842 if (priv->components[i])
843 free(priv->components[i]);
844 priv->components[i] = NULL;
846 free(priv);
850 * Initialize the tinyjpeg object and prepare the decoding of the stream.
852 * Check if the jpeg can be decoded with this jpeg decoder.
853 * Fill some table used for preprocessing.
855 int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size)
857 int ret;
859 /* Identify the file */
860 if ((buf[0] != 0xFF) || (buf[1] != SOI))
861 error("Not a JPG file ?\n");
863 priv->stream_begin = buf+2;
864 priv->stream_length = size-2;
865 priv->stream_end = priv->stream_begin + priv->stream_length;
867 ret = parse_JFIF(priv, priv->stream_begin);
869 return ret;
873 * Decode and convert the jpeg image into @pixfmt@ image
875 * Note: components will be automaticaly allocated if no memory is attached.
877 int tinyjpeg_decode(struct jdec_private *priv,
878 const struct tinyjpeg_colorspace *pixfmt)
880 int x, y, sx, sy;
881 int xshift_by_mcu, yshift_by_mcu;
882 int xstride_by_mcu, ystride_by_mcu;
883 unsigned int bytes_per_blocklines[3], bytes_per_mcu[3];
884 decode_MCU_fct decode_MCU;
885 const decode_MCU_fct *decode_mcu_table;
886 convert_colorspace_fct convert_to_pixfmt;
887 uint8_t *pptr[3];
889 decode_mcu_table = pixfmt->decode_mcu_table;
891 /* Fix: check return value */
892 pixfmt->initialize(priv, bytes_per_blocklines, bytes_per_mcu);
894 xshift_by_mcu = yshift_by_mcu = 3;
895 if ((priv->component_infos[cY].Hfactor | priv->component_infos[cY].Vfactor) == 1) {
896 decode_MCU = decode_mcu_table[0];
897 convert_to_pixfmt = pixfmt->convert_colorspace[0];
898 trace("Use decode 1x1 sampling\n");
899 } else if (priv->component_infos[cY].Hfactor == 1) {
900 decode_MCU = decode_mcu_table[1];
901 convert_to_pixfmt = pixfmt->convert_colorspace[1];
902 yshift_by_mcu = 4;
903 trace("Use decode 1x2 sampling (not supported)\n");
904 } else if (priv->component_infos[cY].Vfactor == 2) {
905 decode_MCU = decode_mcu_table[3];
906 convert_to_pixfmt = pixfmt->convert_colorspace[3];
907 xshift_by_mcu = 4;
908 yshift_by_mcu = 4;
909 trace("Use decode 2x2 sampling\n");
910 } else {
911 decode_MCU = decode_mcu_table[2];
912 convert_to_pixfmt = pixfmt->convert_colorspace[2];
913 xshift_by_mcu = 4;
914 trace("Use decode 2x1 sampling\n");
917 resync(priv);
919 /* Don't forget to that block can be either 8 or 16 lines */
920 bytes_per_blocklines[0] <<= yshift_by_mcu-3;
921 bytes_per_blocklines[1] <<= yshift_by_mcu-3;
922 bytes_per_blocklines[2] <<= yshift_by_mcu-3;
924 bytes_per_mcu[0] <<= xshift_by_mcu-3;
925 bytes_per_mcu[1] <<= xshift_by_mcu-3;
926 bytes_per_mcu[2] <<= xshift_by_mcu-3;
928 xstride_by_mcu = 1 << xshift_by_mcu;
929 ystride_by_mcu = 1 << yshift_by_mcu;
931 pptr[0] = priv->components[0];
932 pptr[1] = priv->components[1];
933 pptr[2] = priv->components[2];
935 trace("bpbl = %d, bpmcu = %d\n",
936 bytes_per_blocklines[0], bytes_per_mcu[0]);
938 for (y = priv->height; y > 0; y -= ystride_by_mcu)
940 trace("Decoding row %d\n", priv->height-y);
941 priv->plane[0] = pptr[0]; pptr[0] += bytes_per_blocklines[0];
942 priv->plane[1] = pptr[1]; pptr[1] += bytes_per_blocklines[1];
943 priv->plane[2] = pptr[2]; pptr[2] += bytes_per_blocklines[2];
945 sy = min(y, ystride_by_mcu);
947 for (x = priv->width; x > 0; x -= xstride_by_mcu)
949 sx = min(x, xstride_by_mcu);
950 trace("Block size: %dx%d\n", sx, sy);
952 decode_MCU(priv);
953 convert_to_pixfmt(priv, sx, sy);
954 priv->plane[0] += bytes_per_mcu[0];
955 priv->plane[1] += bytes_per_mcu[1];
956 priv->plane[2] += bytes_per_mcu[2];
957 if (priv->restarts_to_go>0)
959 priv->restarts_to_go--;
960 if (priv->restarts_to_go == 0)
962 priv->stream -= (priv->nbits_in_reservoir/8);
963 resync(priv);
964 if (find_next_rst_marker(priv) < 0)
965 return -1;
971 trace("Input file size: %d\n", priv->stream_length+2);
972 trace("Input bytes actually read: %d\n", priv->stream - priv->stream_begin + 2);
974 return 0;
977 const char *tinyjpeg_get_errorstring(struct jdec_private *priv)
979 /* FIXME: the error string must be store in the context */
980 priv = priv;
981 return error_string;
984 void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height)
986 *width = priv->width;
987 *height = priv->height;
990 int tinyjpeg_get_components(struct jdec_private *priv, unsigned char **components, unsigned int ncomponents)
992 unsigned int i;
993 if (ncomponents > COMPONENTS)
994 ncomponents = COMPONENTS;
995 for (i=0; i<ncomponents; i++)
996 components[i] = priv->components[i];
997 return 0;
1000 int tinyjpeg_set_components(struct jdec_private *priv, unsigned char * const *components, unsigned int ncomponents)
1002 unsigned int i;
1003 if (ncomponents > COMPONENTS)
1004 ncomponents = COMPONENTS;
1005 for (i=0; i<ncomponents; i++)
1006 priv->components[i] = components[i];
1007 return 0;
1010 int tinyjpeg_get_bytes_per_row(struct jdec_private *priv,
1011 unsigned int *bytes,
1012 unsigned int ncomponents)
1014 unsigned int i;
1015 if (ncomponents > COMPONENTS)
1016 ncomponents = COMPONENTS;
1017 for (i=0; i<ncomponents; i++)
1018 bytes[i] = priv->bytes_per_row[i];
1019 return 0;
1022 int tinyjpeg_set_bytes_per_row(struct jdec_private *priv,
1023 const unsigned int *bytes,
1024 unsigned int ncomponents)
1026 unsigned int i;
1027 if (ncomponents > COMPONENTS)
1028 ncomponents = COMPONENTS;
1029 for (i=0; i<ncomponents; i++)
1030 priv->bytes_per_row[i] = bytes[i];
1031 return 0;
1034 int tinyjpeg_set_flags(struct jdec_private *priv, int flags)
1036 int oldflags = priv->flags;
1037 priv->flags = flags;
1038 return oldflags;