source: bootcd/isolinux/syslinux-6.03/com32/lib/jpeg/tinyjpeg.c @ e16e8f2

Last change on this file since e16e8f2 was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 29.8 KB
Line 
1/*
2 * Small jpeg decoder library
3 *
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:
8 *
9 * - Redistributions of source code must retain the above copyright notice,
10 *  this list of conditions and the following disclaimer.
11 *
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.
15 *
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.
19 *
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.
31 *
32 */
33
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37#include <stdint.h>
38#include <errno.h>
39
40#include "tinyjpeg.h"
41#include "tinyjpeg-internal.h"
42
43/* Global variable to return the last error found while deconding */
44static char error_string[256];
45
46static const unsigned char zigzag[64] =
47{
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
56};
57
58/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
59/* IMPORTANT: these are only valid for 8-bit data precision! */
60static const unsigned char bits_dc_luminance[17] =
61{
62  0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
63};
64static const unsigned char val_dc_luminance[] =
65{
66  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
67};
68
69static const unsigned char bits_dc_chrominance[17] =
70{
71  0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
72};
73static const unsigned char val_dc_chrominance[] =
74{
75  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
76};
77
78static const unsigned char bits_ac_luminance[17] =
79{
80  0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
81};
82static const unsigned char val_ac_luminance[] =
83{
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
105};
106
107static const unsigned char bits_ac_chrominance[17] =
108{
109  0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
110};
111
112static const unsigned char val_ac_chrominance[] =
113{
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
135};
136
137
138/*
139 * 4 functions to manage the stream
140 *
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.
149 *
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
157 *                        ^
158 *                        bit 1
159 *            To get two bits from this example
160 *                 result = (reservoir >> 15) & 3
161 *
162 */
163#define fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \
164   while (nbits_in_reservoir<nbits_wanted) \
165    { \
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; \
175    } \
176}  while(0);
177
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);
187
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);
192
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);
200 */
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);
205
206
207#define be16_to_cpu(x) (((x)[0]<<8)|(x)[1])
208
209static void resync(struct jdec_private *priv);
210
211/**
212 * Get the next (valid) huffman code in the stream.
213 *
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.
219 *
220 * If the code is not present for any reason, -1 is return.
221 */
222static int get_next_huffman_code(struct jdec_private *priv, struct huffman_table *huffman_table)
223{
224  int value, hcode;
225  unsigned int extra_nbits, nbits;
226  uint16_t *slowtable;
227
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))
231  {
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;
235  }
236
237  /* Decode more bits each time ... */
238  for (extra_nbits=0; extra_nbits<16-HUFFMAN_HASH_NBITS; extra_nbits++)
239   {
240     nbits = HUFFMAN_HASH_NBITS + 1 + extra_nbits;
241
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];
249        }
250        slowtable+=2;
251     }
252   }
253  return 0;
254}
255
256
257
258
259/**
260 *
261 * Decode a single block that contains the DCT coefficients.
262 * The table coefficients is already dezigzaged at the end of the operation.
263 *
264 */
265void tinyjpeg_process_Huffman_data_unit(struct jdec_private *priv, int component)
266{
267  unsigned char j;
268  unsigned int huff_code;
269  unsigned char size_val, count_0;
270
271  struct component *c = &priv->component_infos[component];
272  short int DCT[64];
273
274
275  /* Initialize the DCT coef table */
276  memset(DCT, 0, sizeof(DCT));
277
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;
287  }
288
289  /* AC coefficient decoding */
290  j = 1;
291  while (j<64)
292   {
293     huff_code = get_next_huffman_code(priv, c->AC_table);
294     //trace("- %x\n", huff_code);
295
296     size_val = huff_code & 0xF;
297     count_0 = huff_code >> 4;
298
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 */
305      }
306     else
307      {
308        j += count_0;   /* skip count_0 zeroes */
309        if (__unlikely(j >= 64))
310         {
311           snprintf(error_string, sizeof(error_string), "Bad huffman data (buffer overflow)");
312           break;
313         }
314        get_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, size_val, DCT[j]);
315        j++;
316      }
317   }
318
319  for (j = 0; j < 64; j++)
320    c->DCT[j] = DCT[zigzag[j]];
321}
322
323/*
324 * Takes two array of bits, and build the huffman table for size, and code
325 *
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.
329 */
330static void build_huffman_table(const unsigned char *bits, const unsigned char *vals, struct huffman_table *table)
331{
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
336  /*
337   * Build a temp array
338   *   huffsize[X] => numbers of bits to write vals[X]
339   */
340  hz = huffsize;
341  for (i=1; i<=16; i++)
342   {
343     for (j=1; j<=bits[i]; j++)
344       *hz++ = i;
345   }
346  *hz = 0;
347
348  memset(table->lookup, 0xff, sizeof(table->lookup));
349  for (i=0; i<(16-HUFFMAN_HASH_NBITS); i++)
350    table->slowtable[i][0] = 0;
351
352  /* Build a temp array
353   *   huffcode[X] => code used to write vals[X]
354   */
355  code = 0;
356  hc = huffcode;
357  hz = huffsize;
358  nbits = *hz;
359  while (*hz)
360   {
361     while (*hz == nbits)
362      {
363        *hc++ = code++;
364        hz++;
365      }
366     code <<= 1;
367     nbits++;
368   }
369
370  /*
371   * Build the lookup table, and the slowtable if needed.
372   */
373  for (i=0; huffsize[i]; i++)
374   {
375     val = vals[i];
376     code = huffcode[i];
377     code_size = huffsize[i];
378
379     trace("val=%2.2x code=%8.8x codesize=%2.2d\n", val, code, code_size);
380
381     table->code_size[val] = code_size;
382     if (code_size <= HUFFMAN_HASH_NBITS)
383      {
384        /*
385         * Good: val can be put in the lookup table, so fill all value of this
386         * column with value val
387         */
388        int repeat = 1UL<<(HUFFMAN_HASH_NBITS - code_size);
389        code <<= HUFFMAN_HASH_NBITS - code_size;
390        while ( repeat-- )
391          table->lookup[code++] = val;
392
393      }
394     else
395      {
396        /* Perhaps sorting the array will be an optimization */
397        uint16_t *slowtable = table->slowtable[code_size-HUFFMAN_HASH_NBITS-1];
398        while(slowtable[0])
399          slowtable+=2;
400        slowtable[0] = code;
401        slowtable[1] = val;
402        slowtable[2] = 0;
403        /* TODO: NEED TO CHECK FOR AN OVERFLOW OF THE TABLE */
404      }
405
406   }
407}
408
409static void build_default_huffman_tables(struct jdec_private *priv)
410{
411  if (   (priv->flags & TINYJPEG_FLAGS_MJPEG_TABLE)
412      && priv->default_huffman_table_initialized)
413    return;
414
415  build_huffman_table(bits_dc_luminance, val_dc_luminance, &priv->HTDC[0]);
416  build_huffman_table(bits_ac_luminance, val_ac_luminance, &priv->HTAC[0]);
417
418  build_huffman_table(bits_dc_chrominance, val_dc_chrominance, &priv->HTDC[1]);
419  build_huffman_table(bits_ac_chrominance, val_ac_chrominance, &priv->HTAC[1]);
420
421  priv->default_huffman_table_initialized = 1;
422}
423
424
425
426/*******************************************************************************
427 *
428 * Colorspace conversion routine
429 *
430 *
431 * Note:
432 * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
433 * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
434 * The conversion equations to be implemented are therefore
435 *      R = Y                + 1.40200 * Cr
436 *      G = Y - 0.34414 * Cb - 0.71414 * Cr
437 *      B = Y + 1.77200 * Cb
438 *
439 ******************************************************************************/
440
441static void print_SOF(const unsigned char *stream)
442{
443#if JPEG_DEBUG
444  int width, height, nr_components, precision;
445  const char *nr_components_to_string[] = {
446     "????",
447     "Grayscale",
448     "????",
449     "YCbCr",
450     "CYMK"
451  };
452
453  precision = stream[2];
454  height = be16_to_cpu(stream+3);
455  width  = be16_to_cpu(stream+5);
456  nr_components = stream[7];
457
458  trace("> SOF marker\n");
459  trace("Size:%dx%d nr_components:%d (%s)  precision:%d\n",
460      width, height,
461      nr_components, nr_components_to_string[nr_components],
462      precision);
463#endif
464  (void)stream;
465}
466
467/*******************************************************************************
468 *
469 * JPEG/JFIF Parsing functions
470 *
471 * Note: only a small subset of the jpeg file format is supported. No markers,
472 * nor progressive stream is supported.
473 *
474 ******************************************************************************/
475
476static void build_quantization_table(float *qtable, const unsigned char *ref_table)
477{
478  /* Taken from libjpeg. Copyright Independent JPEG Group's LLM idct.
479   * For float AA&N IDCT method, divisors are equal to quantization
480   * coefficients scaled by scalefactor[row]*scalefactor[col], where
481   *   scalefactor[0] = 1
482   *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
483   * We apply a further scale factor of 8.
484   * What's actually stored is 1/divisor so that the inner loop can
485   * use a multiplication rather than a division.
486   */
487  int i, j;
488  static const double aanscalefactor[8] = {
489     1.0, 1.387039845, 1.306562965, 1.175875602,
490     1.0, 0.785694958, 0.541196100, 0.275899379
491  };
492  const unsigned char *zz = zigzag;
493
494  for (i=0; i<8; i++) {
495     for (j=0; j<8; j++) {
496       *qtable++ = ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j];
497     }
498   }
499
500}
501
502static int parse_DQT(struct jdec_private *priv, const unsigned char *stream)
503{
504  int qi;
505  float *table;
506  const unsigned char *dqt_block_end;
507
508  trace("> DQT marker\n");
509  dqt_block_end = stream + be16_to_cpu(stream);
510  stream += 2;  /* Skip length */
511
512  while (stream < dqt_block_end)
513   {
514     qi = *stream++;
515#if SANITY_CHECK
516     if (qi>>4)
517       error("16 bits quantization table is not supported\n");
518     if (qi>4)
519       error("No more 4 quantization table is supported (got %d)\n", qi);
520#endif
521     table = priv->Q_tables[qi];
522     build_quantization_table(table, stream);
523     stream += 64;
524   }
525  trace("< DQT marker\n");
526  return 0;
527}
528
529static int parse_SOF(struct jdec_private *priv, const unsigned char *stream)
530{
531  int i, width, height, nr_components, cid, sampling_factor;
532  int Q_table;
533  struct component *c;
534
535  trace("> SOF marker\n");
536  print_SOF(stream);
537
538  height = be16_to_cpu(stream+3);
539  width  = be16_to_cpu(stream+5);
540  nr_components = stream[7];
541#if SANITY_CHECK
542  if (stream[2] != 8)
543    error("Precision other than 8 is not supported\n");
544  if (width>JPEG_MAX_WIDTH || height>JPEG_MAX_HEIGHT)
545    error("Width and Height (%dx%d) seems suspicious\n", width, height);
546  if (nr_components != 3)
547    error("We only support YUV images\n");
548#endif
549  stream += 8;
550  for (i=0; i<nr_components; i++) {
551     cid = *stream++;
552     sampling_factor = *stream++;
553     Q_table = *stream++;
554     c = &priv->component_infos[i];
555#if SANITY_CHECK
556     c->cid = cid;
557     if (Q_table >= COMPONENTS)
558       error("Bad Quantization table index (got %d, max allowed %d)\n", Q_table, COMPONENTS-1);
559#endif
560     c->Vfactor = sampling_factor&0xf;
561     c->Hfactor = sampling_factor>>4;
562     c->Q_table = priv->Q_tables[Q_table];
563     trace("Component:%d  factor:%dx%d  Quantization table:%d\n",
564           cid, c->Hfactor, c->Hfactor, Q_table );
565
566  }
567  priv->width = width;
568  priv->height = height;
569
570  trace("< SOF marker\n");
571
572  return 0;
573}
574
575static int parse_SOS(struct jdec_private *priv, const unsigned char *stream)
576{
577  unsigned int i, cid, table;
578  unsigned int nr_components = stream[2];
579
580  trace("> SOS marker\n");
581
582#if SANITY_CHECK
583  if (nr_components != 3)
584    error("We only support YCbCr image\n");
585#endif
586
587  stream += 3;
588  for (i=0;i<nr_components;i++) {
589     cid = *stream++;
590     table = *stream++;
591#if SANITY_CHECK
592     if ((table&0xf)>=4)
593        error("We do not support more than 2 AC Huffman table\n");
594     if ((table>>4)>=4)
595        error("We do not support more than 2 DC Huffman table\n");
596     if (cid != priv->component_infos[i].cid)
597        error("SOS cid order (%d:%d) isn't compatible with the SOF marker (%d:%d)\n",
598              i, cid, i, priv->component_infos[i].cid);
599     trace("ComponentId:%d  tableAC:%d tableDC:%d\n", cid, table&0xf, table>>4);
600#endif
601     priv->component_infos[i].AC_table = &priv->HTAC[table&0xf];
602     priv->component_infos[i].DC_table = &priv->HTDC[table>>4];
603  }
604  priv->stream = stream+3;
605  trace("< SOS marker\n");
606  return 0;
607}
608
609static int parse_DHT(struct jdec_private *priv, const unsigned char *stream)
610{
611  unsigned int count, i;
612  unsigned char huff_bits[17];
613  int length, index;
614
615  length = be16_to_cpu(stream) - 2;
616  stream += 2;  /* Skip length */
617
618  trace("> DHT marker (length=%d)\n", length);
619
620  while (length>0) {
621     index = *stream++;
622
623     /* We need to calculate the number of bytes 'vals' will takes */
624     huff_bits[0] = 0;
625     count = 0;
626     for (i=1; i<17; i++) {
627        huff_bits[i] = *stream++;
628        count += huff_bits[i];
629     }
630#if SANITY_CHECK
631     if (count >= HUFFMAN_BITS_SIZE)
632       error("No more than %d bytes is allowed to describe a huffman table", HUFFMAN_BITS_SIZE);
633     if ( (index &0xf) >= HUFFMAN_TABLES)
634       error("No more than %d Huffman tables is supported (got %d)\n", HUFFMAN_TABLES, index&0xf);
635     trace("Huffman table %s[%d] length=%d\n", (index&0xf0)?"AC":"DC", index&0xf, count);
636#endif
637
638     if (index & 0xf0 )
639       build_huffman_table(huff_bits, stream, &priv->HTAC[index&0xf]);
640     else
641       build_huffman_table(huff_bits, stream, &priv->HTDC[index&0xf]);
642
643     length -= 1;
644     length -= 16;
645     length -= count;
646     stream += count;
647  }
648  trace("< DHT marker\n");
649  return 0;
650}
651
652static int parse_DRI(struct jdec_private *priv, const unsigned char *stream)
653{
654  unsigned int length;
655
656  trace("> DRI marker\n");
657
658  length = be16_to_cpu(stream);
659
660#if SANITY_CHECK
661  if (length != 4)
662    error("Length of DRI marker need to be 4\n");
663#endif
664
665  priv->restart_interval = be16_to_cpu(stream+2);
666
667#if JPEG_DEBUG
668  trace("Restart interval = %d\n", priv->restart_interval);
669#endif
670
671  trace("< DRI marker\n");
672
673  return 0;
674}
675
676
677
678static void resync(struct jdec_private *priv)
679{
680  int i;
681
682  /* Init DC coefficients */
683  for (i=0; i<COMPONENTS; i++)
684     priv->component_infos[i].previous_DC = 0;
685
686  priv->reservoir = 0;
687  priv->nbits_in_reservoir = 0;
688  if (priv->restart_interval > 0)
689    priv->restarts_to_go = priv->restart_interval;
690  else
691    priv->restarts_to_go = -1;
692}
693
694static int find_next_rst_marker(struct jdec_private *priv)
695{
696  int rst_marker_found = 0;
697  int marker;
698  const unsigned char *stream = priv->stream;
699
700  /* Parse marker */
701  while (!rst_marker_found)
702   {
703     while (*stream++ != 0xff)
704      {
705        if (stream >= priv->stream_end)
706          error("EOF while search for a RST marker.");
707      }
708     /* Skip any padding ff byte (this is normal) */
709     while (*stream == 0xff)
710       stream++;
711
712     marker = *stream++;
713     if ((RST+priv->last_rst_marker_seen) == marker)
714       rst_marker_found = 1;
715     else if (marker >= RST && marker <= RST7)
716       error("Wrong Reset marker found, abording");
717     else if (marker == EOI)
718       return 0;
719   }
720  trace("RST Marker %d found at offset %d\n", priv->last_rst_marker_seen, stream - priv->stream_begin);
721
722  priv->stream = stream;
723  priv->last_rst_marker_seen++;
724  priv->last_rst_marker_seen &= 7;
725
726  return 0;
727}
728
729static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream)
730{
731  int chuck_len;
732  int marker;
733  int sos_marker_found = 0;
734  int dht_marker_found = 0;
735  const unsigned char *next_chunck;
736
737  /* Parse marker */
738  while (!sos_marker_found)
739   {
740     if (*stream++ != 0xff)
741       goto bogus_jpeg_format;
742     /* Skip any padding ff byte (this is normal) */
743     while (*stream == 0xff)
744       stream++;
745
746     marker = *stream++;
747     chuck_len = be16_to_cpu(stream);
748     next_chunck = stream + chuck_len;
749     switch (marker)
750      {
751       case SOF:
752         if (parse_SOF(priv, stream) < 0)
753           return -1;
754         break;
755       case DQT:
756         if (parse_DQT(priv, stream) < 0)
757           return -1;
758         break;
759       case SOS:
760         if (parse_SOS(priv, stream) < 0)
761           return -1;
762         sos_marker_found = 1;
763         break;
764       case DHT:
765         if (parse_DHT(priv, stream) < 0)
766           return -1;
767         dht_marker_found = 1;
768         break;
769       case DRI:
770         if (parse_DRI(priv, stream) < 0)
771           return -1;
772         break;
773       default:
774         trace("> Unknown marker %2.2x\n", marker);
775         break;
776      }
777
778     stream = next_chunck;
779   }
780
781  if (!dht_marker_found) {
782    trace("No Huffman table loaded, using the default one\n");
783    build_default_huffman_tables(priv);
784  }
785
786#ifdef SANITY_CHECK
787  if (   (priv->component_infos[cY].Hfactor < priv->component_infos[cCb].Hfactor)
788      || (priv->component_infos[cY].Hfactor < priv->component_infos[cCr].Hfactor))
789    error("Horizontal sampling factor for Y should be greater than horitontal sampling factor for Cb or Cr\n");
790  if (   (priv->component_infos[cY].Vfactor < priv->component_infos[cCb].Vfactor)
791      || (priv->component_infos[cY].Vfactor < priv->component_infos[cCr].Vfactor))
792    error("Vertical sampling factor for Y should be greater than vertical sampling factor for Cb or Cr\n");
793  if (   (priv->component_infos[cCb].Hfactor!=1)
794      || (priv->component_infos[cCr].Hfactor!=1)
795      || (priv->component_infos[cCb].Vfactor!=1)
796      || (priv->component_infos[cCr].Vfactor!=1))
797    error("Sampling other than 1x1 for Cr and Cb is not supported");
798#endif
799
800  return 0;
801bogus_jpeg_format:
802  trace("Bogus jpeg format\n");
803  return -1;
804}
805
806/*******************************************************************************
807 *
808 * Functions exported of the library.
809 *
810 * Note: Some applications can access directly to internal pointer of the
811 * structure. It's is not recommended, but if you have many images to
812 * uncompress with the same parameters, some functions can be called to speedup
813 * the decoding.
814 *
815 ******************************************************************************/
816
817/**
818 * Allocate a new tinyjpeg decoder object.
819 *
820 * Before calling any other functions, an object need to be called.
821 */
822struct jdec_private *tinyjpeg_init(void)
823{
824  struct jdec_private *priv;
825
826  priv = (struct jdec_private *)calloc(1, sizeof(struct jdec_private));
827  if (priv == NULL)
828    return NULL;
829  return priv;
830}
831
832/**
833 * Free a tinyjpeg object.
834 *
835 * No others function can be called after this one.
836 */
837void tinyjpeg_free(struct jdec_private *priv)
838{
839  int i;
840  for (i=0; i<COMPONENTS; i++) {
841     if (priv->components[i])
842       free(priv->components[i]);
843     priv->components[i] = NULL;
844  }
845  free(priv);
846}
847
848/**
849 * Initialize the tinyjpeg object and prepare the decoding of the stream.
850 *
851 * Check if the jpeg can be decoded with this jpeg decoder.
852 * Fill some table used for preprocessing.
853 */
854int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size)
855{
856  int ret;
857
858  /* Identify the file */
859  if ((buf[0] != 0xFF) || (buf[1] != SOI))
860    error("Not a JPG file ?\n");
861
862  priv->stream_begin = buf+2;
863  priv->stream_length = size-2;
864  priv->stream_end = priv->stream_begin + priv->stream_length;
865
866  ret = parse_JFIF(priv, priv->stream_begin);
867
868  return ret;
869}
870
871/**
872 * Decode and convert the jpeg image into @pixfmt@ image
873 *
874 * Note: components will be automaticaly allocated if no memory is attached.
875 */
876int tinyjpeg_decode(struct jdec_private *priv,
877                    const struct tinyjpeg_colorspace *pixfmt)
878{
879  int x, y, sx, sy;
880  int xshift_by_mcu, yshift_by_mcu;
881  int xstride_by_mcu, ystride_by_mcu;
882  unsigned int bytes_per_blocklines[3], bytes_per_mcu[3];
883  decode_MCU_fct decode_MCU;
884  const decode_MCU_fct *decode_mcu_table;
885  convert_colorspace_fct convert_to_pixfmt;
886  uint8_t *pptr[3];
887
888  decode_mcu_table = pixfmt->decode_mcu_table;
889
890  /* Fix: check return value */
891  pixfmt->initialize(priv, bytes_per_blocklines, bytes_per_mcu);
892
893  xshift_by_mcu = yshift_by_mcu = 3;
894  if ((priv->component_infos[cY].Hfactor | priv->component_infos[cY].Vfactor) == 1) {
895     decode_MCU = decode_mcu_table[0];
896     convert_to_pixfmt = pixfmt->convert_colorspace[0];
897     trace("Use decode 1x1 sampling\n");
898  } else if (priv->component_infos[cY].Hfactor == 1) {
899     decode_MCU = decode_mcu_table[1];
900     convert_to_pixfmt = pixfmt->convert_colorspace[1];
901     yshift_by_mcu = 4;
902     trace("Use decode 1x2 sampling (not supported)\n");
903  } else if (priv->component_infos[cY].Vfactor == 2) {
904     decode_MCU = decode_mcu_table[3];
905     convert_to_pixfmt = pixfmt->convert_colorspace[3];
906     xshift_by_mcu = 4;
907     yshift_by_mcu = 4;
908     trace("Use decode 2x2 sampling\n");
909  } else {
910     decode_MCU = decode_mcu_table[2];
911     convert_to_pixfmt = pixfmt->convert_colorspace[2];
912     xshift_by_mcu = 4;
913     trace("Use decode 2x1 sampling\n");
914  }
915
916  resync(priv);
917
918  /* Don't forget to that block can be either 8 or 16 lines */
919  bytes_per_blocklines[0] <<= yshift_by_mcu-3;
920  bytes_per_blocklines[1] <<= yshift_by_mcu-3;
921  bytes_per_blocklines[2] <<= yshift_by_mcu-3;
922
923  bytes_per_mcu[0] <<= xshift_by_mcu-3;
924  bytes_per_mcu[1] <<= xshift_by_mcu-3;
925  bytes_per_mcu[2] <<= xshift_by_mcu-3;
926
927  xstride_by_mcu = 1 << xshift_by_mcu;
928  ystride_by_mcu = 1 << yshift_by_mcu;
929
930  pptr[0] = priv->components[0];
931  pptr[1] = priv->components[1];
932  pptr[2] = priv->components[2];
933
934  trace("bpbl = %d, bpmcu = %d\n",
935        bytes_per_blocklines[0], bytes_per_mcu[0]);
936
937  for (y = priv->height; y > 0; y -= ystride_by_mcu)
938   {
939     trace("Decoding row %d\n", priv->height-y);
940     priv->plane[0] = pptr[0];  pptr[0] += bytes_per_blocklines[0];
941     priv->plane[1] = pptr[1];  pptr[1] += bytes_per_blocklines[1];
942     priv->plane[2] = pptr[2];  pptr[2] += bytes_per_blocklines[2];
943
944     sy = min(y, ystride_by_mcu);
945
946     for (x = priv->width; x > 0; x -= xstride_by_mcu)
947      {
948        sx = min(x, xstride_by_mcu);
949        trace("Block size: %dx%d\n", sx, sy);
950
951        decode_MCU(priv);
952        convert_to_pixfmt(priv, sx, sy);
953        priv->plane[0] += bytes_per_mcu[0];
954        priv->plane[1] += bytes_per_mcu[1];
955        priv->plane[2] += bytes_per_mcu[2];
956        if (priv->restarts_to_go>0)
957         {
958           priv->restarts_to_go--;
959           if (priv->restarts_to_go == 0)
960            {
961              priv->stream -= (priv->nbits_in_reservoir/8);
962              resync(priv);
963              if (find_next_rst_marker(priv) < 0)
964                return -1;
965            }
966         }
967      }
968   }
969
970  trace("Input file size: %d\n", priv->stream_length+2);
971  trace("Input bytes actually read: %d\n", priv->stream - priv->stream_begin + 2);
972
973  return 0;
974}
975
976const char *tinyjpeg_get_errorstring(struct jdec_private *priv)
977{
978  /* FIXME: the error string must be store in the context */
979  priv = priv;
980  return error_string;
981}
982
983void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height)
984{
985  *width = priv->width;
986  *height = priv->height;
987}
988
989int tinyjpeg_get_components(struct jdec_private *priv, unsigned char **components, unsigned int ncomponents)
990{
991  unsigned int i;
992  if (ncomponents > COMPONENTS)
993    ncomponents = COMPONENTS;
994  for (i=0; i<ncomponents; i++)
995    components[i] = priv->components[i];
996  return 0;
997}
998
999int tinyjpeg_set_components(struct jdec_private *priv, unsigned char * const *components, unsigned int ncomponents)
1000{
1001  unsigned int i;
1002  if (ncomponents > COMPONENTS)
1003    ncomponents = COMPONENTS;
1004  for (i=0; i<ncomponents; i++)
1005    priv->components[i] = components[i];
1006  return 0;
1007}
1008
1009int tinyjpeg_get_bytes_per_row(struct jdec_private *priv,
1010                               unsigned int *bytes,
1011                               unsigned int ncomponents)
1012{
1013  unsigned int i;
1014  if (ncomponents > COMPONENTS)
1015    ncomponents = COMPONENTS;
1016  for (i=0; i<ncomponents; i++)
1017    bytes[i] = priv->bytes_per_row[i];
1018  return 0;
1019}
1020
1021int tinyjpeg_set_bytes_per_row(struct jdec_private *priv,
1022                               const unsigned int *bytes,
1023                               unsigned int ncomponents)
1024{
1025  unsigned int i;
1026  if (ncomponents > COMPONENTS)
1027    ncomponents = COMPONENTS;
1028  for (i=0; i<ncomponents; i++)
1029    priv->bytes_per_row[i] = bytes[i];
1030  return 0;
1031}
1032
1033int tinyjpeg_set_flags(struct jdec_private *priv, int flags)
1034{
1035  int oldflags = priv->flags;
1036  priv->flags = flags;
1037  return oldflags;
1038}
Note: See TracBrowser for help on using the repository browser.