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