| rev |
line source |
|
nengel@0
|
1 /*
|
|
nengel@0
|
2 * Small jpeg decoder library (Internal header)
|
|
nengel@0
|
3 *
|
|
nengel@0
|
4 * Copyright (c) 2006, Luc Saillard <luc@saillard.org>
|
|
nengel@0
|
5 * All rights reserved.
|
|
nengel@0
|
6 * Redistribution and use in source and binary forms, with or without
|
|
nengel@0
|
7 * modification, are permitted provided that the following conditions are met:
|
|
nengel@0
|
8 *
|
|
nengel@0
|
9 * - Redistributions of source code must retain the above copyright notice,
|
|
nengel@0
|
10 * this list of conditions and the following disclaimer.
|
|
nengel@0
|
11 *
|
|
nengel@0
|
12 * - Redistributions in binary form must reproduce the above copyright notice,
|
|
nengel@0
|
13 * this list of conditions and the following disclaimer in the documentation
|
|
nengel@0
|
14 * and/or other materials provided with the distribution.
|
|
nengel@0
|
15 *
|
|
nengel@0
|
16 * - Neither the name of the author nor the names of its contributors may be
|
|
nengel@0
|
17 * used to endorse or promote products derived from this software without
|
|
nengel@0
|
18 * specific prior written permission.
|
|
nengel@0
|
19 *
|
|
nengel@0
|
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
nengel@0
|
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
nengel@0
|
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
nengel@0
|
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
nengel@0
|
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
nengel@0
|
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
nengel@0
|
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
nengel@0
|
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
nengel@0
|
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
nengel@0
|
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
nengel@0
|
30 * POSSIBILITY OF SUCH DAMAGE.
|
|
nengel@0
|
31 *
|
|
nengel@0
|
32 */
|
|
nengel@0
|
33
|
|
nengel@0
|
34 #ifndef __TINYJPEG_INTERNAL_H_
|
|
nengel@0
|
35 #define __TINYJPEG_INTERNAL_H_
|
|
nengel@0
|
36
|
|
nengel@0
|
37 #define SANITY_CHECK 1
|
|
nengel@0
|
38
|
|
nengel@0
|
39 struct jdec_private;
|
|
nengel@0
|
40
|
|
nengel@0
|
41 #define HUFFMAN_BITS_SIZE 256
|
|
nengel@0
|
42 #define HUFFMAN_HASH_NBITS 9
|
|
nengel@0
|
43 #define HUFFMAN_HASH_SIZE (1UL<<HUFFMAN_HASH_NBITS)
|
|
nengel@0
|
44 #define HUFFMAN_HASH_MASK (HUFFMAN_HASH_SIZE-1)
|
|
nengel@0
|
45
|
|
nengel@0
|
46 #define HUFFMAN_TABLES 4
|
|
nengel@0
|
47 #define COMPONENTS 3
|
|
nengel@0
|
48
|
|
nengel@0
|
49 #define cY 0
|
|
nengel@0
|
50 #define cCb 1
|
|
nengel@0
|
51 #define cCr 2
|
|
nengel@0
|
52
|
|
nengel@0
|
53 #define BLACK_Y 0
|
|
nengel@0
|
54 #define BLACK_U 127
|
|
nengel@0
|
55 #define BLACK_V 127
|
|
nengel@0
|
56
|
|
nengel@0
|
57 #if DEBUG
|
|
nengel@0
|
58 #define trace(fmt, args...) do { \
|
|
nengel@0
|
59 fprintf(stderr, fmt, ## args); \
|
|
nengel@0
|
60 fflush(stderr); \
|
|
nengel@0
|
61 } while(0)
|
|
nengel@0
|
62 #else
|
|
nengel@0
|
63 #define trace(fmt, args...) do { } while (0)
|
|
nengel@0
|
64 #endif
|
|
nengel@0
|
65 #define error(fmt, args...) do { \
|
|
nengel@0
|
66 snprintf(error_string, sizeof(error_string), fmt, ## args); \
|
|
nengel@0
|
67 return -1; \
|
|
nengel@0
|
68 } while(0)
|
|
nengel@0
|
69
|
|
nengel@0
|
70 #define be16_to_cpu(x) (((x)[0]<<8)|(x)[1])
|
|
nengel@0
|
71
|
|
nengel@0
|
72 enum std_markers {
|
|
nengel@0
|
73 DQT = 0xDB, /* Define Quantization Table */
|
|
nengel@0
|
74 SOF = 0xC0, /* Start of Frame (size information) */
|
|
nengel@0
|
75 DHT = 0xC4, /* Huffman Table */
|
|
nengel@0
|
76 SOI = 0xD8, /* Start of Image */
|
|
nengel@0
|
77 SOS = 0xDA, /* Start of Scan */
|
|
nengel@0
|
78 RST = 0xD0, /* Reset Marker d0 -> .. */
|
|
nengel@0
|
79 RST7 = 0xD7, /* Reset Marker .. -> d7 */
|
|
nengel@0
|
80 EOI = 0xD9, /* End of Image */
|
|
nengel@0
|
81 DRI = 0xDD, /* Define Restart Interval */
|
|
nengel@0
|
82 APP0 = 0xE0,
|
|
nengel@0
|
83 };
|
|
nengel@0
|
84
|
|
nengel@0
|
85 struct huffman_table
|
|
nengel@0
|
86 {
|
|
nengel@0
|
87 /* Fast look up table, using HUFFMAN_HASH_NBITS bits we can have directly the symbol,
|
|
nengel@0
|
88 * if the symbol is <0, then we need to look into the tree table */
|
|
nengel@0
|
89 short int lookup[HUFFMAN_HASH_SIZE];
|
|
nengel@0
|
90 /* code size: give the number of bits of a symbol is encoded */
|
|
nengel@0
|
91 unsigned char code_size[HUFFMAN_HASH_SIZE];
|
|
nengel@0
|
92 /* some place to store value that is not encoded in the lookup table */
|
|
nengel@0
|
93 uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
|
|
nengel@0
|
94 };
|
|
nengel@0
|
95
|
|
nengel@0
|
96 struct component
|
|
nengel@0
|
97 {
|
|
nengel@0
|
98 unsigned int Hfactor;
|
|
nengel@0
|
99 unsigned int Vfactor;
|
|
nengel@0
|
100 float *Q_table; /* Pointer to the quantisation table to use */
|
|
nengel@0
|
101 struct huffman_table *AC_table;
|
|
nengel@0
|
102 struct huffman_table *DC_table;
|
|
nengel@0
|
103 short int previous_DC; /* Previous DC coefficient */
|
|
nengel@0
|
104 short int DCT[64]; /* DCT coef */
|
|
nengel@0
|
105 #if SANITY_CHECK
|
|
nengel@0
|
106 unsigned int cid;
|
|
nengel@0
|
107 #endif
|
|
nengel@0
|
108 };
|
|
nengel@0
|
109
|
|
nengel@0
|
110 typedef int (*decode_MCU_fct) (struct jdec_private *priv);
|
|
nengel@0
|
111 typedef void (*convert_colorspace_fct) (struct jdec_private *priv);
|
|
nengel@0
|
112
|
|
nengel@0
|
113 struct jdec_private
|
|
nengel@0
|
114 {
|
|
nengel@0
|
115 /* Public variables */
|
|
nengel@0
|
116 uint8_t *components[COMPONENTS];
|
|
nengel@0
|
117 unsigned int width, height; /* Size of the image */
|
|
nengel@0
|
118 unsigned int mcus_in_width, mcus_in_height;
|
|
nengel@0
|
119 unsigned int mcus_posx, mcus_posy;
|
|
nengel@0
|
120 unsigned int flags;
|
|
nengel@0
|
121
|
|
nengel@0
|
122 /* Private variables */
|
|
nengel@0
|
123 const unsigned char *stream_begin, *stream_end;
|
|
nengel@0
|
124 unsigned int stream_length;
|
|
nengel@0
|
125
|
|
nengel@0
|
126 const unsigned char *stream; /* Pointer to the current stream */
|
|
nengel@0
|
127 unsigned int reservoir, nbits_in_reservoir;
|
|
nengel@0
|
128
|
|
nengel@0
|
129 struct component component_infos[COMPONENTS];
|
|
nengel@0
|
130 float Q_tables[COMPONENTS][64]; /* quantization tables */
|
|
nengel@0
|
131 struct huffman_table HTDC[HUFFMAN_TABLES]; /* DC huffman tables */
|
|
nengel@0
|
132 struct huffman_table HTAC[HUFFMAN_TABLES]; /* AC huffman tables */
|
|
nengel@0
|
133 int default_huffman_table_initialized;
|
|
nengel@0
|
134 unsigned int restart_interval;
|
|
nengel@0
|
135 // int restarts_to_go; /* MCUs left in this restart interval */
|
|
nengel@0
|
136 int last_rst_marker_seen; /* Rst marker is incremented each time */
|
|
nengel@0
|
137
|
|
nengel@0
|
138 /* Temp space used after the IDCT to store each components */
|
|
nengel@0
|
139 uint8_t Y[64*4], Cr[64], Cb[64];
|
|
nengel@0
|
140
|
|
nengel@0
|
141 /* Internal Pointer use for colorspace conversion, do not modify it !!! */
|
|
nengel@0
|
142 uint8_t *plane;
|
|
nengel@0
|
143
|
|
nengel@0
|
144 };
|
|
nengel@0
|
145
|
|
nengel@0
|
146 #if defined(__GNUC__) && (__GNUC__ > 3) && defined(__OPTIMIZE__)
|
|
nengel@0
|
147 #define __likely(x) __builtin_expect(!!(x), 1)
|
|
nengel@0
|
148 #define __unlikely(x) __builtin_expect(!!(x), 0)
|
|
nengel@0
|
149 #else
|
|
nengel@0
|
150 #define __likely(x) (x)
|
|
nengel@0
|
151 #define __unlikely(x) (x)
|
|
nengel@0
|
152 #endif
|
|
nengel@0
|
153
|
|
nengel@0
|
154 #define IDCT tinyjpeg_idct_float
|
|
nengel@0
|
155 void tinyjpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride);
|
|
nengel@0
|
156 int parse_JFIF(struct jdec_private *priv, const unsigned char *stream);
|
|
nengel@0
|
157
|
|
nengel@0
|
158 #endif
|
|
nengel@0
|
159
|