• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
44 static char error_string[256];
45 
46 static 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! */
60 static 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 };
64 static const unsigned char val_dc_luminance[] =
65 {
66   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
67 };
68 
69 static 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 };
73 static const unsigned char val_dc_chrominance[] =
74 {
75   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
76 };
77 
78 static 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 };
82 static 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 
107 static 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 
112 static 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 
209 static 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  */
get_next_huffman_code(struct jdec_private * priv,struct huffman_table * huffman_table)222 static 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  */
tinyjpeg_process_Huffman_data_unit(struct jdec_private * priv,int component)265 void 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  */
build_huffman_table(const unsigned char * bits,const unsigned char * vals,struct huffman_table * table)330 static 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 
build_default_huffman_tables(struct jdec_private * priv)409 static 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 
print_SOF(const unsigned char * stream)441 static 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 
build_quantization_table(float * qtable,const unsigned char * ref_table)476 static 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 
parse_DQT(struct jdec_private * priv,const unsigned char * stream)502 static 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 
parse_SOF(struct jdec_private * priv,const unsigned char * stream)529 static 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 
parse_SOS(struct jdec_private * priv,const unsigned char * stream)575 static 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 
parse_DHT(struct jdec_private * priv,const unsigned char * stream)609 static 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 
parse_DRI(struct jdec_private * priv,const unsigned char * stream)652 static 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 
resync(struct jdec_private * priv)678 static 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 
find_next_rst_marker(struct jdec_private * priv)694 static 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 
parse_JFIF(struct jdec_private * priv,const unsigned char * stream)729 static 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;
801 bogus_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  */
tinyjpeg_init(void)822 struct 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  */
tinyjpeg_free(struct jdec_private * priv)837 void 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  */
tinyjpeg_parse_header(struct jdec_private * priv,const unsigned char * buf,unsigned int size)854 int 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  */
tinyjpeg_decode(struct jdec_private * priv,const struct tinyjpeg_colorspace * pixfmt)876 int 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 
tinyjpeg_get_errorstring(struct jdec_private * priv)976 const 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 
tinyjpeg_get_size(struct jdec_private * priv,unsigned int * width,unsigned int * height)983 void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height)
984 {
985   *width = priv->width;
986   *height = priv->height;
987 }
988 
tinyjpeg_get_components(struct jdec_private * priv,unsigned char ** components,unsigned int ncomponents)989 int 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 
tinyjpeg_set_components(struct jdec_private * priv,unsigned char * const * components,unsigned int ncomponents)999 int 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 
tinyjpeg_get_bytes_per_row(struct jdec_private * priv,unsigned int * bytes,unsigned int ncomponents)1009 int 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 
tinyjpeg_set_bytes_per_row(struct jdec_private * priv,const unsigned int * bytes,unsigned int ncomponents)1021 int 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 
tinyjpeg_set_flags(struct jdec_private * priv,int flags)1033 int tinyjpeg_set_flags(struct jdec_private *priv, int flags)
1034 {
1035   int oldflags = priv->flags;
1036   priv->flags = flags;
1037   return oldflags;
1038 }
1039