1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
11 * (This is a real mess if it has to be coded in one single C file)
13 * Copyright (C) 2009 Andrew Mahone fractional decode, split IDCT - 16-point
14 * IDCT based on IJG jpeg-7 pre-release
15 * File scrolling addition (C) 2005 Alexander Spyridakis
16 * Copyright (C) 2004 Jörg Hohensohn aka [IDC]Dragon
17 * Heavily borrowed from the IJG implementation (C) Thomas G. Lane
18 * Small & fast downscaling IDCT (C) 2002 by Guido Vollbeding JPEGclub.org
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version 2
23 * of the License, or (at your option) any later version.
25 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
26 * KIND, either express or implied.
28 ****************************************************************************/
32 #include "jpeg_load.h"
33 /*#define JPEG_BS_DEBUG*/
34 //#define ROCKBOX_DEBUG_JPEG
35 /* for portability of below JPEG code */
36 #define MEMSET(p,v,c) memset(p,v,c)
37 #define MEMCPY(d,s,c) memcpy(d,s,c)
38 #define INLINE static inline
39 #define ENDIAN_SWAP16(n) n /* only for poor little endian machines */
40 #ifdef ROCKBOX_DEBUG_JPEG
41 #define JDEBUGF DEBUGF
46 /**************** begin JPEG code ********************/
49 typedef struct uint8_rgb jpeg_pix_t
;
51 typedef uint8_t jpeg_pix_t
;
53 #define JPEG_IDCT_TRANSPOSE
54 #define JPEG_PIX_SZ (sizeof(jpeg_pix_t))
56 #define COLOR_EXTRA_IDCT_WS 64
58 #define COLOR_EXTRA_IDCT_WS 0
60 #ifdef JPEG_IDCT_TRANSPOSE
61 #define V_OUT(n) ws2[8*n]
63 #define TRANSPOSE_EXTRA_IDCT_WS 64
65 #define V_OUT(n) ws[8*n]
67 #define TRANSPOSE_EXTRA_IDCT_WS 0
69 #define IDCT_WS_SIZE (64 + TRANSPOSE_EXTRA_IDCT_WS + COLOR_EXTRA_IDCT_WS)
71 /* This can't be in jpeg_load.h because plugin.h includes it, and it conflicts
72 * with the definition in jpeg_decoder.h
84 unsigned long int bitbuf
;
89 int x_size
, y_size
; /* size of image (can be less than block boundary) */
90 int x_phys
, y_phys
; /* physical size, block aligned */
91 int x_mbl
; /* x dimension of MBL */
92 int y_mbl
; /* y dimension of MBL */
93 int blocks
; /* blocks per MB */
94 int restart_interval
; /* number of MCUs between RSTm markers */
95 int restart
; /* blocks until next restart marker */
96 int mcu_row
; /* current row relative to first row of this row of MCUs */
97 unsigned char *out_ptr
; /* pointer to current row to output */
98 int cur_row
; /* current row relative to top of image */
100 int store_pos
[4]; /* for Y block ordering */
101 #ifdef HAVE_LCD_COLOR
103 int h_scale
[2]; /* horizontal scalefactor = (2**N) / 8 */
104 int v_scale
[2]; /* same as above, for vertical direction */
105 int k_need
[2]; /* per component zig-zag index of last needed coefficient */
106 int zero_need
[2]; /* per compenent number of coefficients to zero */
109 int h_scale
[1]; /* horizontal scalefactor = (2**N) / 8 */
110 int v_scale
[1]; /* same as above, for vertical direction */
111 int k_need
[1]; /* per component zig-zag index of last needed coefficient */
112 int zero_need
[1]; /* per compenent number of coefficients to zero */
116 int16_t quanttable
[4][QUANT_TABLE_LENGTH
];/* raw quantization tables 0-3 */
118 struct huffman_table hufftable
[2]; /* Huffman tables */
119 struct derived_tbl dc_derived_tbls
[2]; /* Huffman-LUTs */
120 struct derived_tbl ac_derived_tbls
[2];
122 struct frame_component frameheader
[3]; /* Component descriptor */
123 struct scan_component scanheader
[3]; /* currently not used */
125 int mcu_membership
[6]; /* info per block */
126 int tab_membership
[6];
127 int subsample_x
[3]; /* info per component */
130 unsigned char buf
[JPEG_READ_BUF_SIZE
];
131 struct img_part part
;
135 static struct jpeg jpeg
;
138 INLINE
unsigned range_limit(int value
)
140 #if CONFIG_CPU == SH7034
142 asm ( /* Note: Uses knowledge that only low byte of result is used */
143 "extu.b %[v],%[t] \n"
144 "cmp/eq %[v],%[t] \n" /* low byte == whole number ? */
145 "bt 1f \n" /* yes: no overflow */
146 "cmp/pz %[v] \n" /* overflow: positive? */
147 "subc %[v],%[v] \n" /* %[r] now either 0 or 0xffffffff */
154 #elif defined(CPU_COLDFIRE)
155 /* Note: Uses knowledge that only the low byte of the result is used */
157 "cmp.l #255,%[v] \n" /* overflow? */
158 "bls.b 1f \n" /* no: return value */
159 /* yes: set low byte to appropriate boundary */
166 #elif defined(CPU_ARM)
167 /* Note: Uses knowledge that only the low byte of the result is used */
169 "cmp %[v], #255 \n" /* out of range 0..255? */
170 "mvnhi %[v], %[v], asr #31 \n" /* yes: set all bits to ~(sign_bit) */
176 if ((unsigned)value
<= 255)
186 INLINE
unsigned scale_output(int value
)
188 #if defined(CPU_ARM) && ARM_ARCH >= 6
190 "usat %[v], #8, %[v], asr #18\n"
195 return range_limit(value
>> 18);
199 /* IDCT implementation */
202 #define CONST_BITS 13
206 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
207 * causing a lot of useless floating-point operations at run time.
208 * To get around this we use the following pre-calculated constants.
209 * If you change CONST_BITS you may want to add appropriate values.
210 * (With a reasonable C compiler, you can just rely on the FIX() macro...)
212 #define FIX_0_298631336 2446 /* FIX(0.298631336) */
213 #define FIX_0_390180644 3196 /* FIX(0.390180644) */
214 #define FIX_0_541196100 4433 /* FIX(0.541196100) */
215 #define FIX_0_765366865 6270 /* FIX(0.765366865) */
216 #define FIX_0_899976223 7373 /* FIX(0.899976223) */
217 #define FIX_1_175875602 9633 /* FIX(1.175875602) */
218 #define FIX_1_501321110 12299 /* FIX(1.501321110) */
219 #define FIX_1_847759065 15137 /* FIX(1.847759065) */
220 #define FIX_1_961570560 16069 /* FIX(1.961570560) */
221 #define FIX_2_053119869 16819 /* FIX(2.053119869) */
222 #define FIX_2_562915447 20995 /* FIX(2.562915447) */
223 #define FIX_3_072711026 25172 /* FIX(3.072711026) */
227 /* Multiply an long variable by an long constant to yield an long result.
228 * For 8-bit samples with the recommended scaling, all the variable
229 * and constant values involved are no more than 16 bits wide, so a
230 * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
231 * For 12-bit samples, a full 32-bit multiplication will be needed.
233 #define MULTIPLY(var1, var2) ((var1) * (var2))
235 #if defined(CPU_SH) || defined(CPU_COLDFIRE) || \
236 (defined(CPU_ARM) && ARM_ARCH > 4)
237 #define MULTIPLY16(var,const) (((short) (var)) * ((short) (const)))
239 #define MULTIPLY16 MULTIPLY
243 * Macros for handling fixed-point arithmetic; these are used by many
244 * but not all of the DCT/IDCT modules.
246 * All values are expected to be of type INT32.
247 * Fractional constants are scaled left by CONST_BITS bits.
248 * CONST_BITS is defined within each module using these macros,
249 * and may differ from one module to the next.
251 #define ONE ((long)1)
252 #define CONST_SCALE (ONE << CONST_BITS)
254 /* Convert a positive real constant to an integer scaled by CONST_SCALE.
255 * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
256 * thus causing a lot of useless floating-point operations at run time.
258 #define FIX(x) ((long) ((x) * CONST_SCALE + 0.5))
259 #define RIGHT_SHIFT(x,shft) ((x) >> (shft))
261 /* Descale and correctly round an int value that's scaled by N bits.
262 * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
263 * the fudge factor is correct for either sign of X.
265 #define DESCALE(x,n) (((x) + (1l << ((n)-1))) >> (n))
267 #define DS_OUT ((CONST_BITS)+(PASS1_BITS)+3)
270 * Conversion of full 0-255 range YCrCb to RGB:
271 * |R| |1.000000 -0.000001 1.402000| |Y'|
272 * |G| = |1.000000 -0.334136 -0.714136| |Pb|
273 * |B| |1.000000 1.772000 0.000000| |Pr|
274 * Scaled (yields s15-bit output):
275 * |R| |128 0 179| |Y |
276 * |G| = |128 -43 -91| |Cb - 128|
277 * |B| |128 227 0| |Cr - 128|
284 #define COMPONENT_SHIFT 15
287 /* horizontal-pass 1-point IDCT */
288 static void jpeg_idct1h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
)
290 for (; ws
< end
; ws
+= 8)
292 *out
= range_limit(128 + (int) DESCALE(*ws
, 3 + PASS1_BITS
));
297 /* vertical-pass 2-point IDCT */
298 static void jpeg_idct2v(int16_t *ws
, int16_t *end
)
300 for (; ws
< end
; ws
++)
304 ws
[0*8] = tmp1
+ tmp2
;
305 ws
[1*8] = tmp1
- tmp2
;
309 /* horizontal-pass 2-point IDCT */
310 static void jpeg_idct2h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
)
312 for (; ws
< end
; ws
+= 8, out
+= rowstep
)
314 int tmp1
= ws
[0] + (ONE
<< (PASS1_BITS
+ 2))
315 + (128 << (PASS1_BITS
+ 3));
317 out
[JPEG_PIX_SZ
*0] = range_limit((int) RIGHT_SHIFT(tmp1
+ tmp2
,
319 out
[JPEG_PIX_SZ
*1] = range_limit((int) RIGHT_SHIFT(tmp1
- tmp2
,
324 /* vertical-pass 4-point IDCT */
325 static void jpeg_idct4v(int16_t *ws
, int16_t *end
)
327 for (; ws
< end
; ws
++)
329 int tmp0
, tmp2
, tmp10
, tmp12
;
336 tmp10
= (tmp0
+ tmp2
) << PASS1_BITS
;
337 tmp12
= (tmp0
- tmp2
) << PASS1_BITS
;
340 /* Same rotation as in the even part of the 8x8 LL&M IDCT */
345 z1
= MULTIPLY16(z2
+ z3
, FIX_0_541196100
) +
346 (ONE
<< (CONST_BITS
- PASS1_BITS
- 1));
347 tmp0
= RIGHT_SHIFT(z1
+ MULTIPLY16(z3
, - FIX_1_847759065
),
348 CONST_BITS
-PASS1_BITS
);
349 tmp2
= RIGHT_SHIFT(z1
+ MULTIPLY16(z2
, FIX_0_765366865
),
350 CONST_BITS
-PASS1_BITS
);
352 /* Final output stage */
353 ws
[8*0] = (int) (tmp10
+ tmp2
);
354 ws
[8*3] = (int) (tmp10
- tmp2
);
355 ws
[8*1] = (int) (tmp12
+ tmp0
);
356 ws
[8*2] = (int) (tmp12
- tmp0
);
360 /* horizontal-pass 4-point IDCT */
361 static void jpeg_idct4h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
)
363 for (; ws
< end
; out
+= rowstep
, ws
+= 8)
365 int tmp0
, tmp2
, tmp10
, tmp12
;
369 tmp0
= (int) ws
[0] + (ONE
<< (PASS1_BITS
+ 2))
370 + (128 << (PASS1_BITS
+ 3));
373 tmp10
= (tmp0
+ tmp2
) << CONST_BITS
;
374 tmp12
= (tmp0
- tmp2
) << CONST_BITS
;
377 /* Same rotation as in the even part of the 8x8 LL&M IDCT */
382 z1
= MULTIPLY16(z2
+ z3
, FIX_0_541196100
);
383 tmp0
= z1
- MULTIPLY16(z3
, FIX_1_847759065
);
384 tmp2
= z1
+ MULTIPLY16(z2
, FIX_0_765366865
);
386 /* Final output stage */
388 out
[JPEG_PIX_SZ
*0] = range_limit((int) RIGHT_SHIFT(tmp10
+ tmp2
,
390 out
[JPEG_PIX_SZ
*3] = range_limit((int) RIGHT_SHIFT(tmp10
- tmp2
,
392 out
[JPEG_PIX_SZ
*1] = range_limit((int) RIGHT_SHIFT(tmp12
+ tmp0
,
394 out
[JPEG_PIX_SZ
*2] = range_limit((int) RIGHT_SHIFT(tmp12
- tmp0
,
399 /* vertical-pass 8-point IDCT */
400 static void jpeg_idct8v(int16_t *ws
, int16_t *end
)
402 long tmp0
, tmp1
, tmp2
, tmp3
;
403 long tmp10
, tmp11
, tmp12
, tmp13
;
404 long z1
, z2
, z3
, z4
, z5
;
405 #ifdef JPEG_IDCT_TRANSPOSE
406 int16_t *ws2
= ws
+ 64;
407 for (; ws
< end
; ws
+= 8, ws2
++)
410 for (; ws
< end
; ws
++)
413 /* Due to quantization, we will usually find that many of the input
414 * coefficients are zero, especially the AC terms. We can exploit this
415 * by short-circuiting the IDCT calculation for any column in which all
416 * the AC terms are zero. In that case each output is equal to the
417 * DC coefficient (with scale factor as needed).
418 * With typical images and quantization tables, half or more of the
419 * column DCT calculations can be simplified this way.
421 if ((ws
[V_IN_ST
*1] | ws
[V_IN_ST
*2] | ws
[V_IN_ST
*3]
422 | ws
[V_IN_ST
*4] | ws
[V_IN_ST
*5] | ws
[V_IN_ST
*6] | ws
[V_IN_ST
*7]) == 0)
424 /* AC terms all zero */
425 int dcval
= ws
[V_IN_ST
*0] << PASS1_BITS
;
427 V_OUT(0) = V_OUT(1) = V_OUT(2) = V_OUT(3) = V_OUT(4) = V_OUT(5) =
428 V_OUT(6) = V_OUT(7) = dcval
;
432 /* Even part: reverse the even part of the forward DCT. */
433 /* The rotator is sqrt(2)*c(-6). */
438 z1
= MULTIPLY16(z2
+ z3
, FIX_0_541196100
);
439 tmp2
= z1
+ MULTIPLY16(z3
, - FIX_1_847759065
);
440 tmp3
= z1
+ MULTIPLY16(z2
, FIX_0_765366865
);
442 z2
= ws
[V_IN_ST
*0] << CONST_BITS
;
443 z2
+= ONE
<< (CONST_BITS
- PASS1_BITS
- 1);
444 z3
= ws
[V_IN_ST
*4] << CONST_BITS
;
454 /* Odd part per figure 8; the matrix is unitary and hence its
455 transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. */
457 tmp0
= ws
[V_IN_ST
*7];
458 tmp1
= ws
[V_IN_ST
*5];
459 tmp2
= ws
[V_IN_ST
*3];
460 tmp3
= ws
[V_IN_ST
*1];
466 z5
= MULTIPLY16(z3
+ z4
, FIX_1_175875602
); /* sqrt(2) * c3 */
468 tmp0
= MULTIPLY16(tmp0
, FIX_0_298631336
); /* sqrt(2) * (-c1+c3+c5-c7) */
469 tmp1
= MULTIPLY16(tmp1
, FIX_2_053119869
); /* sqrt(2) * ( c1+c3-c5+c7) */
470 tmp2
= MULTIPLY16(tmp2
, FIX_3_072711026
); /* sqrt(2) * ( c1+c3+c5-c7) */
471 tmp3
= MULTIPLY16(tmp3
, FIX_1_501321110
); /* sqrt(2) * ( c1+c3-c5-c7) */
472 z1
= MULTIPLY16(z1
, - FIX_0_899976223
); /* sqrt(2) * (c7-c3) */
473 z2
= MULTIPLY16(z2
, - FIX_2_562915447
); /* sqrt(2) * (-c1-c3) */
474 z3
= MULTIPLY16(z3
, - FIX_1_961570560
); /* sqrt(2) * (-c3-c5) */
475 z4
= MULTIPLY16(z4
, - FIX_0_390180644
); /* sqrt(2) * (c5-c3) */
485 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
487 V_OUT(0) = (int) RIGHT_SHIFT(tmp10
+ tmp3
, CONST_BITS
-PASS1_BITS
);
488 V_OUT(7) = (int) RIGHT_SHIFT(tmp10
- tmp3
, CONST_BITS
-PASS1_BITS
);
489 V_OUT(1) = (int) RIGHT_SHIFT(tmp11
+ tmp2
, CONST_BITS
-PASS1_BITS
);
490 V_OUT(6) = (int) RIGHT_SHIFT(tmp11
- tmp2
, CONST_BITS
-PASS1_BITS
);
491 V_OUT(2) = (int) RIGHT_SHIFT(tmp12
+ tmp1
, CONST_BITS
-PASS1_BITS
);
492 V_OUT(5) = (int) RIGHT_SHIFT(tmp12
- tmp1
, CONST_BITS
-PASS1_BITS
);
493 V_OUT(3) = (int) RIGHT_SHIFT(tmp13
+ tmp0
, CONST_BITS
-PASS1_BITS
);
494 V_OUT(4) = (int) RIGHT_SHIFT(tmp13
- tmp0
, CONST_BITS
-PASS1_BITS
);
498 /* horizontal-pass 8-point IDCT */
499 static void jpeg_idct8h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
)
501 long tmp0
, tmp1
, tmp2
, tmp3
;
502 long tmp10
, tmp11
, tmp12
, tmp13
;
503 long z1
, z2
, z3
, z4
, z5
;
504 for (; ws
< end
; out
+= rowstep
, ws
+= 8)
506 /* Rows of zeroes can be exploited in the same way as we did with
507 * columns. However, the column calculation has created many nonzero AC
508 * terms, so the simplification applies less often (typically 5% to 10%
509 * of the time). On machines with very fast multiplication, it's
510 * possible that the test takes more time than it's worth. In that
511 * case this section may be commented out.
514 #ifndef NO_ZERO_ROW_TEST
515 if ((ws
[1] | ws
[2] | ws
[3]
516 | ws
[4] | ws
[5] | ws
[6] | ws
[7]) == 0)
518 /* AC terms all zero */
519 unsigned char dcval
= range_limit(128 + (int) DESCALE((long) ws
[0],
522 out
[JPEG_PIX_SZ
*0] = dcval
;
523 out
[JPEG_PIX_SZ
*1] = dcval
;
524 out
[JPEG_PIX_SZ
*2] = dcval
;
525 out
[JPEG_PIX_SZ
*3] = dcval
;
526 out
[JPEG_PIX_SZ
*4] = dcval
;
527 out
[JPEG_PIX_SZ
*5] = dcval
;
528 out
[JPEG_PIX_SZ
*6] = dcval
;
529 out
[JPEG_PIX_SZ
*7] = dcval
;
534 /* Even part: reverse the even part of the forward DCT. */
535 /* The rotator is sqrt(2)*c(-6). */
540 z1
= MULTIPLY16(z2
+ z3
, FIX_0_541196100
);
541 tmp2
= z1
+ MULTIPLY16(z3
, - FIX_1_847759065
);
542 tmp3
= z1
+ MULTIPLY16(z2
, FIX_0_765366865
);
544 z4
= (long) ws
[0] + (ONE
<< (PASS1_BITS
+ 2))
545 + (128 << (PASS1_BITS
+ 3));
547 z5
= (long) ws
[4] << CONST_BITS
;
556 /* Odd part per figure 8; the matrix is unitary and hence its
557 * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. */
568 z5
= MULTIPLY16(z3
+ z4
, FIX_1_175875602
); /* sqrt(2) * c3 */
570 tmp0
= MULTIPLY16(tmp0
, FIX_0_298631336
); /* sqrt(2) * (-c1+c3+c5-c7) */
571 tmp1
= MULTIPLY16(tmp1
, FIX_2_053119869
); /* sqrt(2) * ( c1+c3-c5+c7) */
572 tmp2
= MULTIPLY16(tmp2
, FIX_3_072711026
); /* sqrt(2) * ( c1+c3+c5-c7) */
573 tmp3
= MULTIPLY16(tmp3
, FIX_1_501321110
); /* sqrt(2) * ( c1+c3-c5-c7) */
574 z1
= MULTIPLY16(z1
, - FIX_0_899976223
); /* sqrt(2) * (c7-c3) */
575 z2
= MULTIPLY16(z2
, - FIX_2_562915447
); /* sqrt(2) * (-c1-c3) */
576 z3
= MULTIPLY16(z3
, - FIX_1_961570560
); /* sqrt(2) * (-c3-c5) */
577 z4
= MULTIPLY16(z4
, - FIX_0_390180644
); /* sqrt(2) * (c5-c3) */
587 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
589 out
[JPEG_PIX_SZ
*0] = range_limit((int) RIGHT_SHIFT(tmp10
+ tmp3
,
591 out
[JPEG_PIX_SZ
*7] = range_limit((int) RIGHT_SHIFT(tmp10
- tmp3
,
593 out
[JPEG_PIX_SZ
*1] = range_limit((int) RIGHT_SHIFT(tmp11
+ tmp2
,
595 out
[JPEG_PIX_SZ
*6] = range_limit((int) RIGHT_SHIFT(tmp11
- tmp2
,
597 out
[JPEG_PIX_SZ
*2] = range_limit((int) RIGHT_SHIFT(tmp12
+ tmp1
,
599 out
[JPEG_PIX_SZ
*5] = range_limit((int) RIGHT_SHIFT(tmp12
- tmp1
,
601 out
[JPEG_PIX_SZ
*3] = range_limit((int) RIGHT_SHIFT(tmp13
+ tmp0
,
603 out
[JPEG_PIX_SZ
*4] = range_limit((int) RIGHT_SHIFT(tmp13
- tmp0
,
609 extern void jpeg_idct1h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
);
610 extern void jpeg_idct2v(int16_t *ws
, int16_t *end
);
611 extern void jpeg_idct2h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
);
612 extern void jpeg_idct4v(int16_t *ws
, int16_t *end
);
613 extern void jpeg_idct4h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
);
614 extern void jpeg_idct8v(int16_t *ws
, int16_t *end
);
615 extern void jpeg_idct8h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
);
618 #ifdef HAVE_LCD_COLOR
619 /* vertical-pass 16-point IDCT */
620 static void jpeg_idct16v(int16_t *ws
, int16_t *end
)
622 long tmp0
, tmp1
, tmp2
, tmp3
, tmp10
, tmp11
, tmp12
, tmp13
;
623 long tmp20
, tmp21
, tmp22
, tmp23
, tmp24
, tmp25
, tmp26
, tmp27
;
625 #ifdef JPEG_IDCT_TRANSPOSE
626 int16_t *ws2
= ws
+ 64;
627 for (; ws
< end
; ws
+= 8, ws2
++)
630 for (; ws
< end
; ws
++)
635 tmp0
= ws
[V_IN_ST
*0] << CONST_BITS
;
636 /* Add fudge factor here for final descale. */
637 tmp0
+= 1 << (CONST_BITS
-PASS1_BITS
-1);
640 tmp1
= MULTIPLY(z1
, FIX(1.306562965)); /* c4[16] = c2[8] */
641 tmp2
= MULTIPLY(z1
, FIX_0_541196100
); /* c12[16] = c6[8] */
651 z4
= MULTIPLY(z3
, FIX(0.275899379)); /* c14[16] = c7[8] */
652 z3
= MULTIPLY(z3
, FIX(1.387039845)); /* c2[16] = c1[8] */
654 /* (c6+c2)[16] = (c3+c1)[8] */
655 tmp0
= z3
+ MULTIPLY(z2
, FIX_2_562915447
);
656 /* (c6-c14)[16] = (c3-c7)[8] */
657 tmp1
= z4
+ MULTIPLY(z1
, FIX_0_899976223
);
658 /* (c2-c10)[16] = (c1-c5)[8] */
659 tmp2
= z3
- MULTIPLY(z1
, FIX(0.601344887));
660 /* (c10-c14)[16] = (c5-c7)[8] */
661 tmp3
= z4
- MULTIPLY(z2
, FIX(0.509795579));
663 tmp20
= tmp10
+ tmp0
;
664 tmp27
= tmp10
- tmp0
;
665 tmp21
= tmp12
+ tmp1
;
666 tmp26
= tmp12
- tmp1
;
667 tmp22
= tmp13
+ tmp2
;
668 tmp25
= tmp13
- tmp2
;
669 tmp23
= tmp11
+ tmp3
;
670 tmp24
= tmp11
- tmp3
;
681 tmp1
= MULTIPLY(z1
+ z2
, FIX(1.353318001)); /* c3 */
682 tmp2
= MULTIPLY(tmp11
, FIX(1.247225013)); /* c5 */
683 tmp3
= MULTIPLY(z1
+ z4
, FIX(1.093201867)); /* c7 */
684 tmp10
= MULTIPLY(z1
- z4
, FIX(0.897167586)); /* c9 */
685 tmp11
= MULTIPLY(tmp11
, FIX(0.666655658)); /* c11 */
686 tmp12
= MULTIPLY(z1
- z2
, FIX(0.410524528)); /* c13 */
687 tmp0
= tmp1
+ tmp2
+ tmp3
-
688 MULTIPLY(z1
, FIX(2.286341144)); /* c7+c5+c3-c1 */
689 tmp13
= tmp10
+ tmp11
+ tmp12
-
690 MULTIPLY(z1
, FIX(1.835730603)); /* c9+c11+c13-c15 */
691 z1
= MULTIPLY(z2
+ z3
, FIX(0.138617169)); /* c15 */
692 tmp1
+= z1
+ MULTIPLY(z2
, FIX(0.071888074)); /* c9+c11-c3-c15 */
693 tmp2
+= z1
- MULTIPLY(z3
, FIX(1.125726048)); /* c5+c7+c15-c3 */
694 z1
= MULTIPLY(z3
- z2
, FIX(1.407403738)); /* c1 */
695 tmp11
+= z1
- MULTIPLY(z3
, FIX(0.766367282)); /* c1+c11-c9-c13 */
696 tmp12
+= z1
+ MULTIPLY(z2
, FIX(1.971951411)); /* c1+c5+c13-c7 */
698 z1
= MULTIPLY(z2
, - FIX(0.666655658)); /* -c11 */
700 tmp3
+= z1
+ MULTIPLY(z4
, FIX(1.065388962)); /* c3+c11+c15-c7 */
701 z2
= MULTIPLY(z2
, - FIX(1.247225013)); /* -c5 */
702 tmp10
+= z2
+ MULTIPLY(z4
, FIX(3.141271809)); /* c1+c5+c9-c13 */
704 z2
= MULTIPLY(z3
+ z4
, - FIX(1.353318001)); /* -c3 */
707 z2
= MULTIPLY(z4
- z3
, FIX(0.410524528)); /* c13 */
711 /* Final output stage */
712 V_OUT(0) = (int) RIGHT_SHIFT(tmp20
+ tmp0
, CONST_BITS
-PASS1_BITS
);
713 V_OUT(15) = (int) RIGHT_SHIFT(tmp20
- tmp0
, CONST_BITS
-PASS1_BITS
);
714 V_OUT(1) = (int) RIGHT_SHIFT(tmp21
+ tmp1
, CONST_BITS
-PASS1_BITS
);
715 V_OUT(14) = (int) RIGHT_SHIFT(tmp21
- tmp1
, CONST_BITS
-PASS1_BITS
);
716 V_OUT(2) = (int) RIGHT_SHIFT(tmp22
+ tmp2
, CONST_BITS
-PASS1_BITS
);
717 V_OUT(13) = (int) RIGHT_SHIFT(tmp22
- tmp2
, CONST_BITS
-PASS1_BITS
);
718 V_OUT(3) = (int) RIGHT_SHIFT(tmp23
+ tmp3
, CONST_BITS
-PASS1_BITS
);
719 V_OUT(12) = (int) RIGHT_SHIFT(tmp23
- tmp3
, CONST_BITS
-PASS1_BITS
);
720 V_OUT(4) = (int) RIGHT_SHIFT(tmp24
+ tmp10
, CONST_BITS
-PASS1_BITS
);
721 V_OUT(11) = (int) RIGHT_SHIFT(tmp24
- tmp10
, CONST_BITS
-PASS1_BITS
);
722 V_OUT(5) = (int) RIGHT_SHIFT(tmp25
+ tmp11
, CONST_BITS
-PASS1_BITS
);
723 V_OUT(10) = (int) RIGHT_SHIFT(tmp25
- tmp11
, CONST_BITS
-PASS1_BITS
);
724 V_OUT(6) = (int) RIGHT_SHIFT(tmp26
+ tmp12
, CONST_BITS
-PASS1_BITS
);
725 V_OUT(9) = (int) RIGHT_SHIFT(tmp26
- tmp12
, CONST_BITS
-PASS1_BITS
);
726 V_OUT(7) = (int) RIGHT_SHIFT(tmp27
+ tmp13
, CONST_BITS
-PASS1_BITS
);
727 V_OUT(8) = (int) RIGHT_SHIFT(tmp27
- tmp13
, CONST_BITS
-PASS1_BITS
);
731 /* horizontal-pass 16-point IDCT */
732 static void jpeg_idct16h(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
)
734 long tmp0
, tmp1
, tmp2
, tmp3
, tmp10
, tmp11
, tmp12
, tmp13
;
735 long tmp20
, tmp21
, tmp22
, tmp23
, tmp24
, tmp25
, tmp26
, tmp27
;
737 for (; ws
< end
; out
+= rowstep
, ws
+= 8)
741 /* Add fudge factor here for final descale. */
742 tmp0
= (long) ws
[0] + (ONE
<< (PASS1_BITS
+2))
743 + (128 << (PASS1_BITS
+ 3));
747 tmp1
= MULTIPLY(z1
, FIX(1.306562965)); /* c4[16] = c2[8] */
748 tmp2
= MULTIPLY(z1
, FIX_0_541196100
); /* c12[16] = c6[8] */
758 z4
= MULTIPLY(z3
, FIX(0.275899379)); /* c14[16] = c7[8] */
759 z3
= MULTIPLY(z3
, FIX(1.387039845)); /* c2[16] = c1[8] */
761 /* (c6+c2)[16] = (c3+c1)[8] */
762 tmp0
= z3
+ MULTIPLY(z2
, FIX_2_562915447
);
763 /* (c6-c14)[16] = (c3-c7)[8] */
764 tmp1
= z4
+ MULTIPLY(z1
, FIX_0_899976223
);
765 /* (c2-c10)[16] = (c1-c5)[8] */
766 tmp2
= z3
- MULTIPLY(z1
, FIX(0.601344887));
767 /* (c10-c14)[16] = (c5-c7)[8] */
768 tmp3
= z4
- MULTIPLY(z2
, FIX(0.509795579));
770 tmp20
= tmp10
+ tmp0
;
771 tmp27
= tmp10
- tmp0
;
772 tmp21
= tmp12
+ tmp1
;
773 tmp26
= tmp12
- tmp1
;
774 tmp22
= tmp13
+ tmp2
;
775 tmp25
= tmp13
- tmp2
;
776 tmp23
= tmp11
+ tmp3
;
777 tmp24
= tmp11
- tmp3
;
788 tmp1
= MULTIPLY(z1
+ z2
, FIX(1.353318001)); /* c3 */
789 tmp2
= MULTIPLY(tmp11
, FIX(1.247225013)); /* c5 */
790 tmp3
= MULTIPLY(z1
+ z4
, FIX(1.093201867)); /* c7 */
791 tmp10
= MULTIPLY(z1
- z4
, FIX(0.897167586)); /* c9 */
792 tmp11
= MULTIPLY(tmp11
, FIX(0.666655658)); /* c11 */
793 tmp12
= MULTIPLY(z1
- z2
, FIX(0.410524528)); /* c13 */
794 tmp0
= tmp1
+ tmp2
+ tmp3
-
795 MULTIPLY(z1
, FIX(2.286341144)); /* c7+c5+c3-c1 */
796 tmp13
= tmp10
+ tmp11
+ tmp12
-
797 MULTIPLY(z1
, FIX(1.835730603)); /* c9+c11+c13-c15 */
798 z1
= MULTIPLY(z2
+ z3
, FIX(0.138617169)); /* c15 */
799 tmp1
+= z1
+ MULTIPLY(z2
, FIX(0.071888074)); /* c9+c11-c3-c15 */
800 tmp2
+= z1
- MULTIPLY(z3
, FIX(1.125726048)); /* c5+c7+c15-c3 */
801 z1
= MULTIPLY(z3
- z2
, FIX(1.407403738)); /* c1 */
802 tmp11
+= z1
- MULTIPLY(z3
, FIX(0.766367282)); /* c1+c11-c9-c13 */
803 tmp12
+= z1
+ MULTIPLY(z2
, FIX(1.971951411)); /* c1+c5+c13-c7 */
805 z1
= MULTIPLY(z2
, - FIX(0.666655658)); /* -c11 */
807 tmp3
+= z1
+ MULTIPLY(z4
, FIX(1.065388962)); /* c3+c11+c15-c7 */
808 z2
= MULTIPLY(z2
, - FIX(1.247225013)); /* -c5 */
809 tmp10
+= z2
+ MULTIPLY(z4
, FIX(3.141271809)); /* c1+c5+c9-c13 */
811 z2
= MULTIPLY(z3
+ z4
, - FIX(1.353318001)); /* -c3 */
814 z2
= MULTIPLY(z4
- z3
, FIX(0.410524528)); /* c13 */
818 /* Final output stage */
820 out
[JPEG_PIX_SZ
*0] = scale_output(tmp20
+ tmp0
);
821 out
[JPEG_PIX_SZ
*15] = scale_output(tmp20
- tmp0
);
822 out
[JPEG_PIX_SZ
*1] = scale_output(tmp21
+ tmp1
);
823 out
[JPEG_PIX_SZ
*14] = scale_output(tmp21
- tmp1
);
824 out
[JPEG_PIX_SZ
*2] = scale_output(tmp22
+ tmp2
);
825 out
[JPEG_PIX_SZ
*13] = scale_output(tmp22
- tmp2
);
826 out
[JPEG_PIX_SZ
*3] = scale_output(tmp23
+ tmp3
);
827 out
[JPEG_PIX_SZ
*12] = scale_output(tmp23
- tmp3
);
828 out
[JPEG_PIX_SZ
*4] = scale_output(tmp24
+ tmp10
);
829 out
[JPEG_PIX_SZ
*11] = scale_output(tmp24
- tmp10
);
830 out
[JPEG_PIX_SZ
*5] = scale_output(tmp25
+ tmp11
);
831 out
[JPEG_PIX_SZ
*10] = scale_output(tmp25
- tmp11
);
832 out
[JPEG_PIX_SZ
*6] = scale_output(tmp26
+ tmp12
);
833 out
[JPEG_PIX_SZ
*9] = scale_output(tmp26
- tmp12
);
834 out
[JPEG_PIX_SZ
*7] = scale_output(tmp27
+ tmp13
);
835 out
[JPEG_PIX_SZ
*8] = scale_output(tmp27
- tmp13
);
842 void (*v_idct
)(int16_t *ws
, int16_t *end
);
843 void (*h_idct
)(int16_t *ws
, unsigned char *out
, int16_t *end
, int rowstep
);
846 static const struct idct_entry idct_tbl
[] = {
847 { PASS1_BITS
, NULL
, jpeg_idct1h
},
848 { PASS1_BITS
, jpeg_idct2v
, jpeg_idct2h
},
849 { 0, jpeg_idct4v
, jpeg_idct4h
},
850 { 0, jpeg_idct8v
, jpeg_idct8h
},
851 #ifdef HAVE_LCD_COLOR
852 { 0, jpeg_idct16v
, jpeg_idct16h
},
856 /* JPEG decoder implementation */
859 INLINE
unsigned char *jpeg_getc(struct jpeg
* p_jpeg
)
861 if (LIKELY(p_jpeg
->len
))
864 return p_jpeg
->data
++;
869 INLINE
bool skip_bytes(struct jpeg
* p_jpeg
, int count
)
871 if (p_jpeg
->len
>= (unsigned)count
)
873 p_jpeg
->len
-= count
;
874 p_jpeg
->data
+= count
;
877 p_jpeg
->data
+= p_jpeg
->len
;
883 INLINE
void jpeg_putc(struct jpeg
* p_jpeg
)
889 INLINE
void fill_buf(struct jpeg
* p_jpeg
)
891 p_jpeg
->buf_left
= read(p_jpeg
->fd
, p_jpeg
->buf
,
892 (p_jpeg
->len
>= JPEG_READ_BUF_SIZE
)?
893 JPEG_READ_BUF_SIZE
: p_jpeg
->len
);
894 p_jpeg
->buf_index
= 0;
895 if (p_jpeg
->buf_left
> 0)
896 p_jpeg
->len
-= p_jpeg
->buf_left
;
899 static unsigned char *jpeg_getc(struct jpeg
* p_jpeg
)
901 if (UNLIKELY(p_jpeg
->buf_left
< 1))
903 if (UNLIKELY(p_jpeg
->buf_left
< 1))
906 return (p_jpeg
->buf_index
++) + p_jpeg
->buf
;
909 INLINE
bool skip_bytes_seek(struct jpeg
* p_jpeg
)
911 if (UNLIKELY(lseek(p_jpeg
->fd
, -p_jpeg
->buf_left
, SEEK_CUR
) < 0))
913 p_jpeg
->buf_left
= 0;
917 static bool skip_bytes(struct jpeg
* p_jpeg
, int count
)
919 p_jpeg
->buf_left
-= count
;
920 p_jpeg
->buf_index
+= count
;
921 return p_jpeg
->buf_left
>= 0 || skip_bytes_seek(p_jpeg
);
924 static void jpeg_putc(struct jpeg
* p_jpeg
)
931 #define e_skip_bytes(jpeg, count) \
933 if (UNLIKELY(!skip_bytes((jpeg),(count)))) \
937 #define e_getc(jpeg, code) \
940 if (UNLIKELY(!(c = jpeg_getc(jpeg)))) \
945 #define d_getc(jpeg, def) \
947 unsigned char *cp = jpeg_getc(jpeg); \
948 unsigned char c = LIKELY(cp) ? *cp : (def); \
952 /* Preprocess the JPEG JFIF file */
953 static int process_markers(struct jpeg
* p_jpeg
)
956 int marker_size
; /* variable length of marker segment */
958 int ret
= 0; /* returned flags */
960 while ((c
= e_getc(p_jpeg
, -1)))
962 if (c
!= 0xFF) /* no marker? */
964 JDEBUGF("Non-marker data\n");
966 break; /* exit marker processing */
969 c
= e_getc(p_jpeg
, -1);
970 JDEBUGF("marker value %X\n",c
);
973 case 0xFF: /* Fill byte */
975 case 0x00: /* Zero stuffed byte - entropy data */
979 case 0xC0: /* SOF Huff - Baseline DCT */
981 JDEBUGF("SOF marker ");
983 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
984 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
985 JDEBUGF("len: %d\n", marker_size
);
986 n
= e_getc(p_jpeg
, -1); /* sample precision (= 8 or 12) */
989 return(-1); /* Unsupported sample precision */
991 p_jpeg
->y_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
992 p_jpeg
->y_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
993 p_jpeg
->x_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
994 p_jpeg
->x_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
995 JDEBUGF(" dimensions: %dx%d\n", p_jpeg
->x_size
,
998 n
= (marker_size
-2-6)/3;
999 if (e_getc(p_jpeg
, -1) != n
|| (n
!= 1 && n
!= 3))
1001 return(-2); /* Unsupported SOF0 component specification */
1005 /* Component info */
1006 p_jpeg
->frameheader
[i
].ID
= e_getc(p_jpeg
, -1);
1007 p_jpeg
->frameheader
[i
].horizontal_sampling
=
1008 (c
= e_getc(p_jpeg
, -1)) >> 4;
1009 p_jpeg
->frameheader
[i
].vertical_sampling
= c
& 0x0F;
1010 p_jpeg
->frameheader
[i
].quanttable_select
=
1012 if (p_jpeg
->frameheader
[i
].horizontal_sampling
> 2
1013 || p_jpeg
->frameheader
[i
].vertical_sampling
> 2)
1014 return -3; /* Unsupported SOF0 subsampling */
1020 case 0xC1: /* SOF Huff - Extended sequential DCT*/
1021 case 0xC2: /* SOF Huff - Progressive DCT*/
1022 case 0xC3: /* SOF Huff - Spatial (sequential) lossless*/
1023 case 0xC5: /* SOF Huff - Differential sequential DCT*/
1024 case 0xC6: /* SOF Huff - Differential progressive DCT*/
1025 case 0xC7: /* SOF Huff - Differential spatial*/
1026 case 0xC8: /* SOF Arith - Reserved for JPEG extensions*/
1027 case 0xC9: /* SOF Arith - Extended sequential DCT*/
1028 case 0xCA: /* SOF Arith - Progressive DCT*/
1029 case 0xCB: /* SOF Arith - Spatial (sequential) lossless*/
1030 case 0xCD: /* SOF Arith - Differential sequential DCT*/
1031 case 0xCE: /* SOF Arith - Differential progressive DCT*/
1032 case 0xCF: /* SOF Arith - Differential spatial*/
1034 return (-4); /* other DCT model than baseline not implemented */
1037 case 0xC4: /* Define Huffman Table(s) */
1040 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
1041 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1044 while (marker_size
> 17) /* another table */
1046 c
= e_getc(p_jpeg
, -1);
1049 i
= c
& 0x0F; /* table index */
1052 return (-5); /* Huffman table index out of range */
1054 if (c
& 0xF0) /* AC table */
1056 for (j
=0; j
<16; j
++)
1058 p_jpeg
->hufftable
[i
].huffmancodes_ac
[j
] =
1059 (c
= e_getc(p_jpeg
, -1));
1063 if(16 + sum
> AC_LEN
)
1064 return -10; /* longer than allowed */
1066 for (; j
< 16 + sum
; j
++)
1068 p_jpeg
->hufftable
[i
].huffmancodes_ac
[j
] =
1075 for (j
=0; j
<16; j
++)
1077 p_jpeg
->hufftable
[i
].huffmancodes_dc
[j
] =
1078 (c
= e_getc(p_jpeg
, -1));
1082 if(16 + sum
> DC_LEN
)
1083 return -11; /* longer than allowed */
1085 for (; j
< 16 + sum
; j
++)
1087 p_jpeg
->hufftable
[i
].huffmancodes_dc
[j
] =
1094 e_skip_bytes(p_jpeg
, marker_size
);
1098 case 0xCC: /* Define Arithmetic coding conditioning(s) */
1099 return(-6); /* Arithmetic coding not supported */
1101 case 0xD8: /* Start of Image */
1104 case 0xD9: /* End of Image */
1107 case 0x01: /* for temp private use arith code */
1108 JDEBUGF("private\n");
1109 break; /* skip parameterless marker */
1112 case 0xDA: /* Start of Scan */
1115 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
1116 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1119 n
= (marker_size
-1-3)/2;
1120 if (e_getc(p_jpeg
, -1) != n
|| (n
!= 1 && n
!= 3))
1122 return (-7); /* Unsupported SOS component specification */
1127 p_jpeg
->scanheader
[i
].ID
= e_getc(p_jpeg
, -1);
1128 p_jpeg
->scanheader
[i
].DC_select
= (c
= e_getc(p_jpeg
, -1))
1130 p_jpeg
->scanheader
[i
].AC_select
= c
& 0x0F;
1133 /* skip spectral information */
1134 e_skip_bytes(p_jpeg
, marker_size
);
1138 case 0xDB: /* Define quantization Table(s) */
1141 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
1142 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1145 n
= (marker_size
)/(QUANT_TABLE_LENGTH
+1); /* # of tables */
1148 int id
= e_getc(p_jpeg
, -1); /* ID */
1152 return (-8); /* Unsupported quantization table */
1154 /* Read Quantisation table: */
1155 for (j
=0; j
<QUANT_TABLE_LENGTH
; j
++)
1157 p_jpeg
->quanttable
[id
][j
] = e_getc(p_jpeg
, -1);
1161 e_skip_bytes(p_jpeg
, marker_size
);
1165 case 0xDD: /* Define Restart Interval */
1167 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
1168 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1171 p_jpeg
->restart_interval
= e_getc(p_jpeg
, -1) << 8;
1172 p_jpeg
->restart_interval
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1173 e_skip_bytes(p_jpeg
, marker_size
); /* skip segment */
1177 case 0xDC: /* Define Number of Lines */
1178 case 0xDE: /* Define Hierarchical progression */
1179 case 0xDF: /* Expand Reference Component(s) */
1180 case 0xE0: /* Application Field 0*/
1181 case 0xE1: /* Application Field 1*/
1182 case 0xE2: /* Application Field 2*/
1183 case 0xE3: /* Application Field 3*/
1184 case 0xE4: /* Application Field 4*/
1185 case 0xE5: /* Application Field 5*/
1186 case 0xE6: /* Application Field 6*/
1187 case 0xE7: /* Application Field 7*/
1188 case 0xE8: /* Application Field 8*/
1189 case 0xE9: /* Application Field 9*/
1190 case 0xEA: /* Application Field 10*/
1191 case 0xEB: /* Application Field 11*/
1192 case 0xEC: /* Application Field 12*/
1193 case 0xED: /* Application Field 13*/
1194 case 0xEE: /* Application Field 14*/
1195 case 0xEF: /* Application Field 15*/
1196 case 0xFE: /* Comment */
1198 marker_size
= e_getc(p_jpeg
, -1) << 8; /* Highbyte */
1199 marker_size
|= e_getc(p_jpeg
, -1); /* Lowbyte */
1201 JDEBUGF("unhandled marker len %d\n", marker_size
);
1202 e_skip_bytes(p_jpeg
, marker_size
); /* skip segment */
1206 case 0xF0: /* Reserved for JPEG extensions */
1207 case 0xF1: /* Reserved for JPEG extensions */
1208 case 0xF2: /* Reserved for JPEG extensions */
1209 case 0xF3: /* Reserved for JPEG extensions */
1210 case 0xF4: /* Reserved for JPEG extensions */
1211 case 0xF5: /* Reserved for JPEG extensions */
1212 case 0xF6: /* Reserved for JPEG extensions */
1213 case 0xF7: /* Reserved for JPEG extensions */
1214 case 0xF8: /* Reserved for JPEG extensions */
1215 case 0xF9: /* Reserved for JPEG extensions */
1216 case 0xFA: /* Reserved for JPEG extensions */
1217 case 0xFB: /* Reserved for JPEG extensions */
1218 case 0xFC: /* Reserved for JPEG extensions */
1219 case 0xFD: /* Reserved for JPEG extensions */
1220 case 0x02: /* Reserved */
1222 return (-9); /* Unknown marker */
1226 return (ret
); /* return flags with seen markers */
1229 static const struct huffman_table luma_table
=
1232 0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
1233 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B
1236 0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,
1237 0x01,0x7D,0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,
1238 0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,
1239 0xB1,0xC1,0x15,0x52,0xD1,0xF0,0x24,0x33,0x62,0x72,0x82,0x09,0x0A,0x16,
1240 0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,0x29,0x2A,0x34,0x35,0x36,0x37,
1241 0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x53,0x54,0x55,
1242 0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x73,
1243 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
1244 0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,
1245 0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,
1246 0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,
1247 0xD7,0xD8,0xD9,0xDA,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,
1248 0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA
1252 static const struct huffman_table chroma_table
=
1255 0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,
1256 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B
1259 0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01,
1260 0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,
1261 0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,
1262 0xC1,0x09,0x23,0x33,0x52,0xF0,0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,
1263 0xE1,0x25,0xF1,0x17,0x18,0x19,0x1A,0x26,0x27,0x28,0x29,0x2A,0x35,0x36,
1264 0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x53,0x54,
1265 0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
1266 0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85,0x86,0x87,
1267 0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,
1268 0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,
1269 0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,
1270 0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,
1271 0xEA,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA
1275 static void default_huff_tbl(struct jpeg
* p_jpeg
)
1278 MEMCPY(&p_jpeg
->hufftable
[0], &luma_table
, sizeof(luma_table
));
1279 MEMCPY(&p_jpeg
->hufftable
[1], &chroma_table
, sizeof(chroma_table
));
1284 /* Compute the derived values for a Huffman table */
1285 static void fix_huff_tbl(int* htbl
, struct derived_tbl
* dtbl
)
1290 unsigned int huffcode
[257];
1293 dtbl
->pub
= htbl
; /* fill in back link */
1295 /* Figure C.1: make table of Huffman code length for each symbol */
1296 /* Note that this is in code-length order. */
1299 for (l
= 1; l
<= 16; l
++)
1300 { /* all possible code length */
1301 for (i
= 1; i
<= (int) htbl
[l
-1]; i
++) /* all codes per length */
1302 huffsize
[p
++] = (char) l
;
1306 /* Figure C.2: generate the codes themselves */
1307 /* Note that this is in code-length order. */
1314 while (((int) huffsize
[p
]) == si
)
1316 huffcode
[p
++] = code
;
1323 /* Figure F.15: generate decoding tables for bit-sequential decoding */
1326 for (l
= 1; l
<= 16; l
++)
1330 /* huffval[] index of 1st symbol of code length l */
1331 dtbl
->valptr
[l
] = p
;
1332 dtbl
->mincode
[l
] = huffcode
[p
]; /* minimum code of length l */
1334 dtbl
->maxcode
[l
] = huffcode
[p
-1]; /* maximum code of length l */
1338 dtbl
->maxcode
[l
] = -1; /* -1 if no codes of this length */
1341 dtbl
->maxcode
[17] = 0xFFFFFL
; /* ensures huff_DECODE terminates */
1343 /* Compute lookahead tables to speed up decoding.
1344 * First we set all the table entries to 0, indicating "too long";
1345 * then we iterate through the Huffman codes that are short enough and
1346 * fill in all the entries that correspond to bit sequences starting
1350 MEMSET(dtbl
->look_nbits
, 0, sizeof(dtbl
->look_nbits
));
1353 for (l
= 1; l
<= HUFF_LOOKAHEAD
; l
++)
1355 for (i
= 1; i
<= (int) htbl
[l
-1]; i
++, p
++)
1357 /* l = current code's length, p = its index in huffcode[] &
1358 * huffval[]. Generate left-justified code followed by all possible
1361 lookbits
= huffcode
[p
] << (HUFF_LOOKAHEAD
-l
);
1362 for (ctr
= 1 << (HUFF_LOOKAHEAD
-l
); ctr
> 0; ctr
--)
1364 dtbl
->look_nbits
[lookbits
] = l
;
1365 dtbl
->look_sym
[lookbits
] = htbl
[16+p
];
1373 /* zag[i] is the natural-order position of the i'th element of zigzag order. */
1374 static const unsigned char zag
[] =
1376 #ifdef JPEG_IDCT_TRANSPOSE
1377 0, 8, 1, 2, 9, 16, 24, 17,
1378 10, 3, 4, 11, 18, 25, 32, 40,
1379 33, 26, 19, 12, 5, 6, 13, 20,
1380 27, 34, 41, 48, 56, 49, 42, 35,
1381 28, 21, 14, 7, 15, 22, 29, 36,
1382 43, 50, 57, 58, 51, 44, 37, 30,
1383 23, 31, 38, 45, 52, 59, 60, 53,
1384 46, 39, 47, 54, 61, 62, 55, 63,
1386 0, 1, 8, 16, 9, 2, 3, 10,
1387 17, 24, 32, 25, 18, 11, 4, 5,
1388 12, 19, 26, 33, 40, 48, 41, 34,
1389 27, 20, 13, 6, 7, 14, 21, 28,
1390 35, 42, 49, 56, 57, 50, 43, 36,
1391 29, 22, 15, 23, 30, 37, 44, 51,
1392 58, 59, 52, 45, 38, 31, 39, 46,
1393 53, 60, 61, 54, 47, 55, 62, 63,
1396 /* zig[i] is the the zig-zag order position of the i'th element of natural
1397 * order, reading left-to-right then top-to-bottom.
1399 static const unsigned char zig
[] =
1401 0, 1, 5, 6, 14, 15, 27, 28,
1402 2, 4, 7, 13, 16, 26, 29, 42,
1403 3, 8, 12, 17, 25, 30, 41, 43,
1404 9, 11, 18, 24, 31, 40, 44, 53,
1405 10, 19, 23, 32, 39, 45, 52, 54,
1406 20, 22, 33, 38, 46, 51, 55, 60,
1407 21, 34, 37, 47, 50, 56, 59, 61,
1408 35, 36, 48, 49, 57, 58, 62, 63
1411 /* Reformat some image header data so that the decoder can use it properly. */
1412 INLINE
void fix_headers(struct jpeg
* p_jpeg
)
1417 p_jpeg
->store_pos
[i
] = i
; /* default ordering */
1419 /* assignments for the decoding of blocks */
1420 if (p_jpeg
->frameheader
[0].horizontal_sampling
== 2
1421 && p_jpeg
->frameheader
[0].vertical_sampling
== 1)
1424 p_jpeg
->x_mbl
= (p_jpeg
->x_size
+15) / 16;
1425 p_jpeg
->x_phys
= p_jpeg
->x_mbl
* 16;
1426 p_jpeg
->y_mbl
= (p_jpeg
->y_size
+7) / 8;
1427 p_jpeg
->y_phys
= p_jpeg
->y_mbl
* 8;
1428 p_jpeg
->mcu_membership
[0] = 0; /* Y1=Y2=0, U=1, V=2 */
1429 p_jpeg
->mcu_membership
[1] = 0;
1430 p_jpeg
->mcu_membership
[2] = 1;
1431 p_jpeg
->mcu_membership
[3] = 2;
1432 p_jpeg
->tab_membership
[0] = 0; /* DC, DC, AC, AC */
1433 p_jpeg
->tab_membership
[1] = 0;
1434 p_jpeg
->tab_membership
[2] = 1;
1435 p_jpeg
->tab_membership
[3] = 1;
1436 p_jpeg
->subsample_x
[0] = 1;
1437 p_jpeg
->subsample_x
[1] = 2;
1438 p_jpeg
->subsample_x
[2] = 2;
1439 p_jpeg
->subsample_y
[0] = 1;
1440 p_jpeg
->subsample_y
[1] = 1;
1441 p_jpeg
->subsample_y
[2] = 1;
1443 if (p_jpeg
->frameheader
[0].horizontal_sampling
== 1
1444 && p_jpeg
->frameheader
[0].vertical_sampling
== 2)
1445 { /* 4:2:2 vertically subsampled */
1446 p_jpeg
->store_pos
[1] = 2; /* block positions are mirrored */
1447 p_jpeg
->store_pos
[2] = 1;
1449 p_jpeg
->x_mbl
= (p_jpeg
->x_size
+7) / 8;
1450 p_jpeg
->x_phys
= p_jpeg
->x_mbl
* 8;
1451 p_jpeg
->y_mbl
= (p_jpeg
->y_size
+15) / 16;
1452 p_jpeg
->y_phys
= p_jpeg
->y_mbl
* 16;
1453 p_jpeg
->mcu_membership
[0] = 0; /* Y1=Y2=0, U=1, V=2 */
1454 p_jpeg
->mcu_membership
[1] = 0;
1455 p_jpeg
->mcu_membership
[2] = 1;
1456 p_jpeg
->mcu_membership
[3] = 2;
1457 p_jpeg
->tab_membership
[0] = 0; /* DC, DC, AC, AC */
1458 p_jpeg
->tab_membership
[1] = 0;
1459 p_jpeg
->tab_membership
[2] = 1;
1460 p_jpeg
->tab_membership
[3] = 1;
1461 p_jpeg
->subsample_x
[0] = 1;
1462 p_jpeg
->subsample_x
[1] = 1;
1463 p_jpeg
->subsample_x
[2] = 1;
1464 p_jpeg
->subsample_y
[0] = 1;
1465 p_jpeg
->subsample_y
[1] = 2;
1466 p_jpeg
->subsample_y
[2] = 2;
1468 else if (p_jpeg
->frameheader
[0].horizontal_sampling
== 2
1469 && p_jpeg
->frameheader
[0].vertical_sampling
== 2)
1472 p_jpeg
->x_mbl
= (p_jpeg
->x_size
+15) / 16;
1473 p_jpeg
->x_phys
= p_jpeg
->x_mbl
* 16;
1474 p_jpeg
->y_mbl
= (p_jpeg
->y_size
+15) / 16;
1475 p_jpeg
->y_phys
= p_jpeg
->y_mbl
* 16;
1476 p_jpeg
->mcu_membership
[0] = 0;
1477 p_jpeg
->mcu_membership
[1] = 0;
1478 p_jpeg
->mcu_membership
[2] = 0;
1479 p_jpeg
->mcu_membership
[3] = 0;
1480 p_jpeg
->mcu_membership
[4] = 1;
1481 p_jpeg
->mcu_membership
[5] = 2;
1482 p_jpeg
->tab_membership
[0] = 0;
1483 p_jpeg
->tab_membership
[1] = 0;
1484 p_jpeg
->tab_membership
[2] = 0;
1485 p_jpeg
->tab_membership
[3] = 0;
1486 p_jpeg
->tab_membership
[4] = 1;
1487 p_jpeg
->tab_membership
[5] = 1;
1488 p_jpeg
->subsample_x
[0] = 1;
1489 p_jpeg
->subsample_x
[1] = 2;
1490 p_jpeg
->subsample_x
[2] = 2;
1491 p_jpeg
->subsample_y
[0] = 1;
1492 p_jpeg
->subsample_y
[1] = 2;
1493 p_jpeg
->subsample_y
[2] = 2;
1495 else if (p_jpeg
->frameheader
[0].horizontal_sampling
== 1
1496 && p_jpeg
->frameheader
[0].vertical_sampling
== 1)
1498 /* don't overwrite p_jpeg->blocks */
1499 p_jpeg
->x_mbl
= (p_jpeg
->x_size
+7) / 8;
1500 p_jpeg
->x_phys
= p_jpeg
->x_mbl
* 8;
1501 p_jpeg
->y_mbl
= (p_jpeg
->y_size
+7) / 8;
1502 p_jpeg
->y_phys
= p_jpeg
->y_mbl
* 8;
1503 p_jpeg
->mcu_membership
[0] = 0;
1504 p_jpeg
->mcu_membership
[1] = 1;
1505 p_jpeg
->mcu_membership
[2] = 2;
1506 p_jpeg
->tab_membership
[0] = 0;
1507 p_jpeg
->tab_membership
[1] = 1;
1508 p_jpeg
->tab_membership
[2] = 1;
1509 p_jpeg
->subsample_x
[0] = 1;
1510 p_jpeg
->subsample_x
[1] = 1;
1511 p_jpeg
->subsample_x
[2] = 1;
1512 p_jpeg
->subsample_y
[0] = 1;
1513 p_jpeg
->subsample_y
[1] = 1;
1514 p_jpeg
->subsample_y
[2] = 1;
1523 INLINE
void fix_huff_tables(struct jpeg
*p_jpeg
)
1525 fix_huff_tbl(p_jpeg
->hufftable
[0].huffmancodes_dc
,
1526 &p_jpeg
->dc_derived_tbls
[0]);
1527 fix_huff_tbl(p_jpeg
->hufftable
[0].huffmancodes_ac
,
1528 &p_jpeg
->ac_derived_tbls
[0]);
1529 fix_huff_tbl(p_jpeg
->hufftable
[1].huffmancodes_dc
,
1530 &p_jpeg
->dc_derived_tbls
[1]);
1531 fix_huff_tbl(p_jpeg
->hufftable
[1].huffmancodes_ac
,
1532 &p_jpeg
->ac_derived_tbls
[1]);
1535 /* Because some of the IDCT routines never multiply by any constants, and
1536 * therefore do not produce shifted output, we add the shift into the
1537 * quantization table when one of these IDCT routines is used, rather than
1538 * have the IDCT shift each value it processes.
1540 INLINE
void fix_quant_tables(struct jpeg
*p_jpeg
)
1543 for (i
= 0; i
< 2; i
++)
1545 shift
= idct_tbl
[p_jpeg
->v_scale
[i
]].scale
;
1548 for (j
= 0; j
< 64; j
++)
1549 p_jpeg
->quanttable
[i
][j
] <<= shift
;
1555 * These functions/macros provide the in-line portion of bit fetching.
1556 * Use check_bit_buffer to ensure there are N bits in get_buffer
1557 * before using get_bits, peek_bits, or drop_bits.
1558 * check_bit_buffer(state,n,action);
1559 * Ensure there are N bits in get_buffer; if suspend, take action.
1560 * val = get_bits(n);
1561 * Fetch next N bits.
1562 * val = peek_bits(n);
1563 * Fetch next N bits without removing them from the buffer.
1565 * Discard next N bits.
1566 * The value N should be a simple variable, not an expression, because it
1567 * is evaluated multiple times.
1570 static void fill_bit_buffer(struct jpeg
* p_jpeg
)
1572 unsigned char byte
, marker
;
1574 if (p_jpeg
->marker_val
)
1575 p_jpeg
->marker_ind
+= 16;
1576 byte
= d_getc(p_jpeg
, 0);
1577 if (UNLIKELY(byte
== 0xFF)) /* legal marker can be byte stuffing or RSTm */
1578 { /* simplification: just skip the (one-byte) marker code */
1579 marker
= d_getc(p_jpeg
, 0);
1580 if ((marker
& ~7) == 0xD0)
1582 p_jpeg
->marker_val
= marker
;
1583 p_jpeg
->marker_ind
= 8;
1586 p_jpeg
->bitbuf
= (p_jpeg
->bitbuf
<< 8) | byte
;
1588 byte
= d_getc(p_jpeg
, 0);
1589 if (UNLIKELY(byte
== 0xFF)) /* legal marker can be byte stuffing or RSTm */
1590 { /* simplification: just skip the (one-byte) marker code */
1591 marker
= d_getc(p_jpeg
, 0);
1592 if ((marker
& ~7) == 0xD0)
1594 p_jpeg
->marker_val
= marker
;
1595 p_jpeg
->marker_ind
= 0;
1598 p_jpeg
->bitbuf
= (p_jpeg
->bitbuf
<< 8) | byte
;
1599 p_jpeg
->bitbuf_bits
+= 16;
1600 #ifdef JPEG_BS_DEBUG
1601 DEBUGF("read in: %04X\n", p_jpeg
->bitbuf
& 0xFFFF);
1605 INLINE
void check_bit_buffer(struct jpeg
*p_jpeg
, int nbits
)
1607 if (nbits
> p_jpeg
->bitbuf_bits
)
1608 fill_bit_buffer(p_jpeg
);
1611 INLINE
int get_bits(struct jpeg
*p_jpeg
, int nbits
)
1613 #ifdef JPEG_BS_DEBUG
1614 if (nbits
> p_jpeg
->bitbuf_bits
)
1615 DEBUGF("bitbuffer underrun\n");
1616 int mask
= BIT_N(p_jpeg
->bitbuf_bits
- 1);
1618 DEBUGF("get %d bits: ", nbits
);
1619 for (i
= 0; i
< nbits
; i
++)
1620 DEBUGF("%d",!!(p_jpeg
->bitbuf
& (mask
>>= 1)));
1623 return ((int) (p_jpeg
->bitbuf
>> (p_jpeg
->bitbuf_bits
-= nbits
))) &
1627 INLINE
int peek_bits(struct jpeg
*p_jpeg
, int nbits
)
1629 #ifdef JPEG_BS_DEBUG
1630 int mask
= BIT_N(p_jpeg
->bitbuf_bits
- 1);
1632 DEBUGF("peek %d bits: ", nbits
);
1633 for (i
= 0; i
< nbits
; i
++)
1634 DEBUGF("%d",!!(p_jpeg
->bitbuf
& (mask
>>= 1)));
1637 return ((int) (p_jpeg
->bitbuf
>> (p_jpeg
->bitbuf_bits
- nbits
))) &
1641 INLINE
void drop_bits(struct jpeg
*p_jpeg
, int nbits
)
1643 #ifdef JPEG_BS_DEBUG
1644 int mask
= BIT_N(p_jpeg
->bitbuf_bits
- 1);
1646 DEBUGF("drop %d bits: ", nbits
);
1647 for (i
= 0; i
< nbits
; i
++)
1648 DEBUGF("%d",!!(p_jpeg
->bitbuf
& (mask
>>= 1)));
1651 p_jpeg
->bitbuf_bits
-= nbits
;
1654 /* re-synchronize to entropy data (skip restart marker) */
1655 static void search_restart(struct jpeg
*p_jpeg
)
1657 if (p_jpeg
->marker_val
)
1659 p_jpeg
->marker_val
= 0;
1660 p_jpeg
->bitbuf_bits
= p_jpeg
->marker_ind
;
1661 p_jpeg
->marker_ind
= 0;
1665 p_jpeg
->bitbuf_bits
= 0;
1666 while ((byte
= d_getc(p_jpeg
, 0xFF)))
1670 byte
= d_getc(p_jpeg
, 0xD0);
1671 if ((byte
& ~7) == 0xD0)
1681 /* Figure F.12: extend sign bit. */
1682 #if CONFIG_CPU == SH7034
1683 /* SH1 lacks a variable-shift instruction */
1684 #define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
1686 static const int extend_test
[16] = /* entry n is 2**(n-1) */
1688 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
1689 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000
1692 static const int extend_offset
[16] = /* entry n is (-1 << n) + 1 */
1694 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
1695 ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
1696 ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
1697 ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1
1700 /* This saves some code and data size, benchmarks about the same on RAM */
1701 #define HUFF_EXTEND(x,s) \
1705 x__ & BIT_N(s__- 1) ? x__ : x__ + (-1 << s__) + 1; \
1709 /* Decode a single value */
1710 #define huff_decode_dc(p_jpeg, tbl, s, r) \
1714 check_bit_buffer((p_jpeg), HUFF_LOOKAHEAD); \
1715 look = peek_bits((p_jpeg), HUFF_LOOKAHEAD); \
1716 if ((nb = (tbl)->look_nbits[look]) != 0) \
1718 drop_bits((p_jpeg), nb); \
1719 s = (tbl)->look_sym[look]; \
1720 check_bit_buffer((p_jpeg), s); \
1721 r = get_bits((p_jpeg), s); \
1723 /* slow_DECODE(s, HUFF_LOOKAHEAD+1)) < 0); */ \
1725 nb=HUFF_LOOKAHEAD+1; \
1726 check_bit_buffer((p_jpeg), nb); \
1727 code = get_bits((p_jpeg), nb); \
1728 while (code > (tbl)->maxcode[nb]) \
1731 check_bit_buffer((p_jpeg), 1); \
1732 code |= get_bits((p_jpeg), 1); \
1735 if (nb > 16) /* error in Huffman */ \
1737 r = 0; s = 0; /* fake a zero, this is most safe */ \
1739 s = (tbl)->pub[16 + (tbl)->valptr[nb] + \
1740 ((int) (code - (tbl)->mincode[nb]))]; \
1741 check_bit_buffer((p_jpeg), s); \
1742 r = get_bits((p_jpeg), s); \
1744 } /* end slow decode */ \
1747 #define huff_decode_ac(p_jpeg, tbl, s) \
1751 check_bit_buffer((p_jpeg), HUFF_LOOKAHEAD); \
1752 look = peek_bits((p_jpeg), HUFF_LOOKAHEAD); \
1753 if ((nb = (tbl)->look_nbits[look]) != 0) \
1755 drop_bits((p_jpeg), nb); \
1756 s = (tbl)->look_sym[look]; \
1758 /* slow_DECODE(s, HUFF_LOOKAHEAD+1)) < 0); */ \
1760 nb=HUFF_LOOKAHEAD+1; \
1761 check_bit_buffer((p_jpeg), nb); \
1762 code = get_bits((p_jpeg), nb); \
1763 while (code > (tbl)->maxcode[nb]) \
1766 check_bit_buffer((p_jpeg), 1); \
1767 code |= get_bits((p_jpeg), 1); \
1770 if (nb > 16) /* error in Huffman */ \
1772 s = 0; /* fake a zero, this is most safe */ \
1774 s = (tbl)->pub[16 + (tbl)->valptr[nb] + \
1775 ((int) (code - (tbl)->mincode[nb]))]; \
1777 } /* end slow decode */ \
1780 static struct img_part
*store_row_jpeg(void *jpeg_args
)
1782 struct jpeg
*p_jpeg
= (struct jpeg
*) jpeg_args
;
1783 #ifdef HAVE_LCD_COLOR
1784 int mcu_hscale
= p_jpeg
->h_scale
[1];
1785 int mcu_vscale
= p_jpeg
->v_scale
[1];
1787 int mcu_hscale
= (p_jpeg
->h_scale
[0] +
1788 p_jpeg
->frameheader
[0].horizontal_sampling
- 1);
1789 int mcu_vscale
= (p_jpeg
->v_scale
[0] +
1790 p_jpeg
->frameheader
[0].vertical_sampling
- 1);
1792 unsigned int width
= p_jpeg
->x_mbl
<< mcu_hscale
;
1793 unsigned int b_width
= width
* JPEG_PIX_SZ
;
1794 int height
= BIT_N(mcu_vscale
);
1796 if (!p_jpeg
->mcu_row
) /* Need to decode a new row of MCUs */
1798 p_jpeg
->out_ptr
= (unsigned char *)p_jpeg
->img_buf
;
1800 #ifdef HAVE_LCD_COLOR
1801 unsigned mcu_width
= BIT_N(mcu_hscale
);
1803 int mcu_offset
= JPEG_PIX_SZ
<< mcu_hscale
;
1804 unsigned char *out
= p_jpeg
->out_ptr
;
1805 store_offs
[p_jpeg
->store_pos
[0]] = 0;
1806 store_offs
[p_jpeg
->store_pos
[1]] = JPEG_PIX_SZ
<< p_jpeg
->h_scale
[0];
1807 store_offs
[p_jpeg
->store_pos
[2]] = b_width
<< p_jpeg
->v_scale
[0];
1808 store_offs
[p_jpeg
->store_pos
[3]] = store_offs
[1] + store_offs
[2];
1809 /* decoded DCT coefficients */
1810 int16_t block
[IDCT_WS_SIZE
] __attribute__((aligned(8)));
1811 for (x
= 0; x
< p_jpeg
->x_mbl
; x
++)
1814 for (blkn
= 0; blkn
< p_jpeg
->blocks
; blkn
++)
1816 int ci
= p_jpeg
->mcu_membership
[blkn
]; /* component index */
1817 int ti
= p_jpeg
->tab_membership
[blkn
]; /* table index */
1818 #ifdef JPEG_IDCT_TRANSPOSE
1819 bool transpose
= p_jpeg
->v_scale
[!!ci
] > 2;
1821 int k
= 1; /* coefficient index */
1822 int s
, r
; /* huffman values */
1823 struct derived_tbl
* dctbl
= &p_jpeg
->dc_derived_tbls
[ti
];
1824 struct derived_tbl
* actbl
= &p_jpeg
->ac_derived_tbls
[ti
];
1826 /* Section F.2.2.1: decode the DC coefficient difference */
1827 huff_decode_dc(p_jpeg
, dctbl
, s
, r
);
1829 #ifndef HAVE_LCD_COLOR
1833 s
= HUFF_EXTEND(r
, s
);
1834 #ifdef HAVE_LCD_COLOR
1835 p_jpeg
->last_dc_val
[ci
] += s
;
1836 /* output it (assumes zag[0] = 0) */
1837 block
[0] = MULTIPLY16(p_jpeg
->last_dc_val
[ci
],
1838 p_jpeg
->quanttable
[!!ci
][0]);
1840 p_jpeg
->last_dc_val
+= s
;
1841 /* output it (assumes zag[0] = 0) */
1842 block
[0] = MULTIPLY16(p_jpeg
->last_dc_val
,
1843 p_jpeg
->quanttable
[0][0]);
1845 /* coefficient buffer must be cleared */
1846 MEMSET(block
+1, 0, p_jpeg
->zero_need
[!!ci
] * sizeof(int));
1847 /* Section F.2.2.2: decode the AC coefficients */
1850 huff_decode_ac(p_jpeg
, actbl
, s
);
1856 check_bit_buffer(p_jpeg
, s
);
1857 if (k
>= p_jpeg
->k_need
[!!ci
])
1859 r
= get_bits(p_jpeg
, s
);
1860 r
= HUFF_EXTEND(r
, s
);
1861 r
= MULTIPLY16(r
, p_jpeg
->quanttable
[!!ci
][k
]);
1862 #ifdef JPEG_IDCT_TRANSPOSE
1863 block
[zag
[transpose
? k
: k
+ 64]] = r
;
1879 huff_decode_ac(p_jpeg
, actbl
, s
);
1886 check_bit_buffer(p_jpeg
, s
);
1888 drop_bits(p_jpeg
, s
);
1898 #ifndef HAVE_LCD_COLOR
1902 int idct_cols
= BIT_N(MIN(p_jpeg
->h_scale
[!!ci
], 3));
1903 int idct_rows
= BIT_N(p_jpeg
->v_scale
[!!ci
]);
1904 unsigned char *b_out
= out
+ (ci
? ci
: store_offs
[blkn
]);
1905 if (idct_tbl
[p_jpeg
->v_scale
[!!ci
]].v_idct
)
1906 #ifdef JPEG_IDCT_TRANSPOSE
1907 idct_tbl
[p_jpeg
->v_scale
[!!ci
]].v_idct(block
,
1908 transpose
? block
+ 8 * idct_cols
1909 : block
+ idct_cols
);
1910 uint16_t * h_block
= transpose
? block
+ 64 : block
;
1911 idct_tbl
[p_jpeg
->h_scale
[!!ci
]].h_idct(h_block
, b_out
,
1912 h_block
+ idct_rows
* 8, b_width
);
1914 idct_tbl
[p_jpeg
->v_scale
[!!ci
]].v_idct(block
,
1916 idct_tbl
[p_jpeg
->h_scale
[!!ci
]].h_idct(block
, b_out
,
1917 block
+ idct_rows
* 8, b_width
);
1921 /* don't starve other threads while an MCU row decodes */
1923 #ifdef HAVE_LCD_COLOR
1926 unsigned char *row
= out
;
1927 if (p_jpeg
->blocks
== 1)
1929 for (yp
= 0; yp
< height
; yp
++, row
+= b_width
)
1931 unsigned char *px
= row
;
1932 for (xp
= 0; xp
< mcu_width
; xp
++, px
+= JPEG_PIX_SZ
)
1934 px
[1] = px
[2] = px
[0];
1940 if (p_jpeg
->restart_interval
&& --p_jpeg
->restart
== 0)
1941 { /* if a restart marker is due: */
1942 p_jpeg
->restart
= p_jpeg
->restart_interval
; /* count again */
1943 search_restart(p_jpeg
); /* align the bitstream */
1944 #ifdef HAVE_LCD_COLOR
1945 p_jpeg
->last_dc_val
[0] = p_jpeg
->last_dc_val
[1] =
1946 p_jpeg
->last_dc_val
[2] = 0; /* reset decoder */
1948 p_jpeg
->last_dc_val
= 0;
1952 } /* if !p_jpeg->mcu_row */
1953 p_jpeg
->mcu_row
= (p_jpeg
->mcu_row
+ 1) & (height
- 1);
1954 p_jpeg
->part
.len
= width
;
1955 p_jpeg
->part
.buf
= (jpeg_pix_t
*)p_jpeg
->out_ptr
;
1956 p_jpeg
->out_ptr
+= b_width
;
1957 return &(p_jpeg
->part
);
1960 /******************************************************************************
1963 * Reads a JPEG file and puts the data in rockbox format in *bitmap.
1965 *****************************************************************************/
1966 #ifndef JPEG_FROM_MEM
1967 int clip_jpeg_file(const char* filename
,
1969 unsigned long jpeg_size
,
1973 const struct custom_format
*cformat
)
1976 fd
= open(filename
, O_RDONLY
);
1977 JDEBUGF("read_jpeg_file: filename: %s buffer len: %d cformat: %p\n",
1978 filename
, maxsize
, cformat
);
1979 /* Exit if file opening failed */
1981 DEBUGF("read_jpeg_file: can't open '%s', rc: %d\n", filename
, fd
);
1984 lseek(fd
, offset
, SEEK_SET
);
1985 ret
= clip_jpeg_fd(fd
, jpeg_size
, bm
, maxsize
, format
, cformat
);
1990 int read_jpeg_file(const char* filename
,
1994 const struct custom_format
*cformat
)
1996 return clip_jpeg_file(filename
, 0, 0, bm
, maxsize
, format
, cformat
);
2000 static int calc_scale(int in_size
, int out_size
)
2004 for (scale
= 0; scale
< 3; scale
++)
2006 if (out_size
<= in_size
)
2014 #ifdef JPEG_FROM_MEM
2015 int get_jpeg_dim_mem(unsigned char *data
, unsigned long len
,
2018 struct jpeg
*p_jpeg
= &jpeg
;
2019 memset(p_jpeg
, 0, sizeof(struct jpeg
));
2020 p_jpeg
->data
= data
;
2022 int status
= process_markers(p_jpeg
);
2025 if ((status
& (DQT
| SOF0
)) != (DQT
| SOF0
))
2026 return -(status
* 16);
2027 size
->width
= p_jpeg
->x_size
;
2028 size
->height
= p_jpeg
->y_size
;
2032 int decode_jpeg_mem(unsigned char *data
,
2034 int clip_jpeg_fd(int fd
,
2040 const struct custom_format
*cformat
)
2042 bool resize
= false, dither
= false;
2047 #ifdef JPEG_FROM_MEM
2048 struct jpeg
*p_jpeg
= &jpeg
;
2050 struct jpeg
*p_jpeg
= (struct jpeg
*)bm
->data
;
2051 int tmp_size
= maxsize
;
2052 ALIGN_BUFFER(p_jpeg
, tmp_size
, sizeof(int));
2053 /* not enough memory for our struct jpeg */
2054 if ((size_t)tmp_size
< sizeof(struct jpeg
))
2057 memset(p_jpeg
, 0, sizeof(struct jpeg
));
2059 #ifdef JPEG_FROM_MEM
2060 p_jpeg
->data
= data
;
2063 if (p_jpeg
->len
== 0)
2064 p_jpeg
->len
= filesize(p_jpeg
->fd
);
2066 status
= process_markers(p_jpeg
);
2067 #ifndef JPEG_FROM_MEM
2068 JDEBUGF("position in file: %d buffer fill: %d\n",
2069 (int)lseek(p_jpeg
->fd
, 0, SEEK_CUR
), p_jpeg
->buf_left
);
2073 if ((status
& (DQT
| SOF0
)) != (DQT
| SOF0
))
2074 return -(status
* 16);
2075 if (!(status
& DHT
)) /* if no Huffman table present: */
2076 default_huff_tbl(p_jpeg
); /* use default */
2077 fix_headers(p_jpeg
); /* derive Huffman and other lookup-tables */
2078 src_dim
.width
= p_jpeg
->x_size
;
2079 src_dim
.height
= p_jpeg
->y_size
;
2080 if (format
& FORMAT_RESIZE
)
2082 if (format
& FORMAT_DITHER
)
2084 #ifdef HAVE_LCD_COLOR
2085 bm
->alpha_offset
= 0; /* no alpha channel */
2088 struct dim resize_dim
= {
2090 .height
= bm
->height
,
2092 if (format
& FORMAT_KEEP_ASPECT
)
2093 recalc_dimension(&resize_dim
, &src_dim
);
2094 bm
->width
= resize_dim
.width
;
2095 bm
->height
= resize_dim
.height
;
2097 bm
->width
= p_jpeg
->x_size
;
2098 bm
->height
= p_jpeg
->y_size
;
2100 p_jpeg
->h_scale
[0] = calc_scale(p_jpeg
->x_size
, bm
->width
);
2101 p_jpeg
->v_scale
[0] = calc_scale(p_jpeg
->y_size
, bm
->height
);
2102 JDEBUGF("luma IDCT size: %dx%d\n", BIT_N(p_jpeg
->h_scale
[0]),
2103 BIT_N(p_jpeg
->v_scale
[0]));
2104 if ((p_jpeg
->x_size
<< p_jpeg
->h_scale
[0]) >> 3 == bm
->width
&&
2105 (p_jpeg
->y_size
<< p_jpeg
->v_scale
[0]) >> 3 == bm
->height
)
2107 #ifdef HAVE_LCD_COLOR
2108 p_jpeg
->h_scale
[1] = p_jpeg
->h_scale
[0] +
2109 p_jpeg
->frameheader
[0].horizontal_sampling
- 1;
2110 p_jpeg
->v_scale
[1] = p_jpeg
->v_scale
[0] +
2111 p_jpeg
->frameheader
[0].vertical_sampling
- 1;
2112 JDEBUGF("chroma IDCT size: %dx%d\n", BIT_N(p_jpeg
->h_scale
[1]),
2113 BIT_N(p_jpeg
->v_scale
[1]));
2115 JDEBUGF("scaling from %dx%d -> %dx%d\n",
2116 (p_jpeg
->x_size
<< p_jpeg
->h_scale
[0]) >> 3,
2117 (p_jpeg
->y_size
<< p_jpeg
->v_scale
[0]) >> 3,
2118 bm
->width
, bm
->height
);
2119 fix_quant_tables(p_jpeg
);
2120 int decode_w
= BIT_N(p_jpeg
->h_scale
[0]) - 1;
2121 int decode_h
= BIT_N(p_jpeg
->v_scale
[0]) - 1;
2122 src_dim
.width
= (p_jpeg
->x_size
<< p_jpeg
->h_scale
[0]) >> 3;
2123 src_dim
.height
= (p_jpeg
->y_size
<< p_jpeg
->v_scale
[0]) >> 3;
2124 #ifdef JPEG_IDCT_TRANSPOSE
2125 if (p_jpeg
->v_scale
[0] > 2)
2126 p_jpeg
->zero_need
[0] = (decode_w
<< 3) + decode_h
;
2129 p_jpeg
->zero_need
[0] = (decode_h
<< 3) + decode_w
;
2130 p_jpeg
->k_need
[0] = zig
[(decode_h
<< 3) + decode_w
];
2131 JDEBUGF("need luma components to %d\n", p_jpeg
->k_need
[0]);
2132 #ifdef HAVE_LCD_COLOR
2133 decode_w
= BIT_N(MIN(p_jpeg
->h_scale
[1],3)) - 1;
2134 decode_h
= BIT_N(MIN(p_jpeg
->v_scale
[1],3)) - 1;
2135 if (p_jpeg
->v_scale
[1] > 2)
2136 p_jpeg
->zero_need
[1] = (decode_w
<< 3) + decode_h
;
2138 p_jpeg
->zero_need
[1] = (decode_h
<< 3) + decode_w
;
2139 p_jpeg
->k_need
[1] = zig
[(decode_h
<< 3) + decode_w
];
2140 JDEBUGF("need chroma components to %d\n", p_jpeg
->k_need
[1]);
2143 bm_size
= cformat
->get_size(bm
);
2145 bm_size
= BM_SIZE(bm
->width
,bm
->height
,FORMAT_NATIVE
,false);
2146 if (bm_size
> maxsize
)
2148 char *buf_start
= (char *)bm
->data
+ bm_size
;
2149 char *buf_end
= (char *)bm
->data
+ maxsize
;
2150 maxsize
= buf_end
- buf_start
;
2151 #ifndef JPEG_FROM_MEM
2152 ALIGN_BUFFER(buf_start
, maxsize
, sizeof(uint32_t));
2153 if (maxsize
< (int)sizeof(struct jpeg
))
2155 memmove(buf_start
, p_jpeg
, sizeof(struct jpeg
));
2156 p_jpeg
= (struct jpeg
*)buf_start
;
2157 buf_start
+= sizeof(struct jpeg
);
2158 maxsize
= buf_end
- buf_start
;
2160 fix_huff_tables(p_jpeg
);
2161 #ifdef HAVE_LCD_COLOR
2162 int decode_buf_size
= (p_jpeg
->x_mbl
<< p_jpeg
->h_scale
[1])
2163 << p_jpeg
->v_scale
[1];
2165 int decode_buf_size
= (p_jpeg
->x_mbl
<< p_jpeg
->h_scale
[0])
2166 << p_jpeg
->v_scale
[0];
2167 decode_buf_size
<<= p_jpeg
->frameheader
[0].horizontal_sampling
+
2168 p_jpeg
->frameheader
[0].vertical_sampling
- 2;
2170 decode_buf_size
*= JPEG_PIX_SZ
;
2171 JDEBUGF("decode buffer size: %d\n", decode_buf_size
);
2172 p_jpeg
->img_buf
= (jpeg_pix_t
*)buf_start
;
2173 if (buf_end
- buf_start
< decode_buf_size
)
2175 buf_start
+= decode_buf_size
;
2176 maxsize
= buf_end
- buf_start
;
2177 memset(p_jpeg
->img_buf
, 0, decode_buf_size
);
2178 p_jpeg
->mcu_row
= 0;
2179 p_jpeg
->restart
= p_jpeg
->restart_interval
;
2181 rset
.rowstop
= bm
->height
;
2183 p_jpeg
->resize
= resize
;
2186 if (resize_on_load(bm
, dither
, &src_dim
, &rset
, buf_start
, maxsize
,
2187 cformat
, IF_PIX_FMT(p_jpeg
->blocks
== 1 ? 0 : 1,) store_row_jpeg
,
2192 struct scaler_context ctx
= {
2197 void (*output_row_8
)(uint32_t, void*, struct scaler_context
*) =
2198 output_row_8_native
;
2199 #elif defined(PLUGIN)
2200 void (*output_row_8
)(uint32_t, void*, struct scaler_context
*) = NULL
;
2202 #if LCD_DEPTH > 1 || defined(PLUGIN)
2204 output_row_8
= cformat
->output_row_8
;
2206 struct img_part
*part
;
2207 for (row
= 0; row
< bm
->height
; row
++)
2209 part
= store_row_jpeg(p_jpeg
);
2210 #ifdef HAVE_LCD_COLOR
2211 if (p_jpeg
->blocks
> 1)
2213 struct uint8_rgb
*qp
= part
->buf
;
2214 struct uint8_rgb
*end
= qp
+ bm
->width
;
2217 for (; qp
< end
; qp
++)
2222 yuv_to_rgb(y
, u
, v
, &r
, &g
, &b
);
2229 output_row_8(row
, part
->buf
, &ctx
);
2236 #ifndef JPEG_FROM_MEM
2237 int read_jpeg_fd(int fd
,
2241 const struct custom_format
*cformat
)
2243 return clip_jpeg_fd(fd
, 0, bm
, maxsize
, format
, cformat
);
2247 /**************** end JPEG code ********************/