Home | History | Annotate | Download | only in jpeg
      1 /*
      2  * Small jpeg decoder library
      3  *
      4  * Copyright (c) 2006, Luc Saillard <luc (at) 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  */
    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  */
    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  */
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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  */
    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  */
    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  */
    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  */
    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 
    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 
    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 
    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 
    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 
   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 
   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 
   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