sl@0
|
1 |
/*
|
sl@0
|
2 |
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
sl@0
|
3 |
* All rights reserved.
|
sl@0
|
4 |
* This component and the accompanying materials are made available
|
sl@0
|
5 |
* under the terms of "Eclipse Public License v1.0"
|
sl@0
|
6 |
* which accompanies this distribution, and is available
|
sl@0
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
sl@0
|
8 |
*
|
sl@0
|
9 |
* Initial Contributors:
|
sl@0
|
10 |
* Nokia Corporation - initial contribution.
|
sl@0
|
11 |
*
|
sl@0
|
12 |
* Contributors:
|
sl@0
|
13 |
*
|
sl@0
|
14 |
* Description:
|
sl@0
|
15 |
*
|
sl@0
|
16 |
*/
|
sl@0
|
17 |
|
sl@0
|
18 |
#include <sys/stat.h>
|
sl@0
|
19 |
#include <fcntl.h>
|
sl@0
|
20 |
#include <unistd.h>
|
sl@0
|
21 |
#include <stdlib.h>
|
sl@0
|
22 |
#include <stdio.h>
|
sl@0
|
23 |
#include <string.h>
|
sl@0
|
24 |
#include <ctype.h>
|
sl@0
|
25 |
#include <limits.h>
|
sl@0
|
26 |
#include <liboil/liboil-stdint.h>
|
sl@0
|
27 |
#include <liboil/liboil.h>
|
sl@0
|
28 |
#include <liboil/liboildebug.h>
|
sl@0
|
29 |
#include <stdarg.h>
|
sl@0
|
30 |
|
sl@0
|
31 |
#include "jpeg_internal.h"
|
sl@0
|
32 |
#include <liboil/globals.h>
|
sl@0
|
33 |
|
sl@0
|
34 |
#define MAX(a,b) ((a)>(b) ? (a) : (b))
|
sl@0
|
35 |
|
sl@0
|
36 |
|
sl@0
|
37 |
extern uint8_t jpeg_standard_tables[];
|
sl@0
|
38 |
extern int jpeg_standard_tables_size;
|
sl@0
|
39 |
|
sl@0
|
40 |
void jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...);
|
sl@0
|
41 |
|
sl@0
|
42 |
void jpeg_decoder_define_huffman_tables (JpegDecoder * dec);
|
sl@0
|
43 |
void jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec);
|
sl@0
|
44 |
void jpeg_decoder_define_quantization_tables (JpegDecoder *dec);
|
sl@0
|
45 |
void jpeg_decoder_define_restart_interval (JpegDecoder *dec);
|
sl@0
|
46 |
void jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker);
|
sl@0
|
47 |
void jpeg_decoder_start_of_scan (JpegDecoder * dec);
|
sl@0
|
48 |
|
sl@0
|
49 |
|
sl@0
|
50 |
/* misc helper function declarations */
|
sl@0
|
51 |
|
sl@0
|
52 |
static void dumpbits (JpegBits * bits);
|
sl@0
|
53 |
static char *sprintbits (char *str, unsigned int bits, int n);
|
sl@0
|
54 |
|
sl@0
|
55 |
static void huffman_table_load_std_jpeg (JpegDecoder * dec);
|
sl@0
|
56 |
|
sl@0
|
57 |
static void jpeg_decoder_verify_header (JpegDecoder *dec);
|
sl@0
|
58 |
static void jpeg_decoder_init_decoder (JpegDecoder *dec);
|
sl@0
|
59 |
|
sl@0
|
60 |
|
sl@0
|
61 |
|
sl@0
|
62 |
static void
|
sl@0
|
63 |
jpeg_decoder_verify_header (JpegDecoder *dec)
|
sl@0
|
64 |
{
|
sl@0
|
65 |
int max_quant_table = 0;
|
sl@0
|
66 |
int i;
|
sl@0
|
67 |
|
sl@0
|
68 |
if (dec->sof_type != JPEG_MARKER_SOF_0) {
|
sl@0
|
69 |
OIL_ERROR("only handle baseline DCT");
|
sl@0
|
70 |
dec->error = TRUE;
|
sl@0
|
71 |
}
|
sl@0
|
72 |
|
sl@0
|
73 |
if (dec->width < 1) {
|
sl@0
|
74 |
OIL_ERROR("height can't be 0");
|
sl@0
|
75 |
dec->error = TRUE;
|
sl@0
|
76 |
}
|
sl@0
|
77 |
|
sl@0
|
78 |
switch (dec->sof_type) {
|
sl@0
|
79 |
case JPEG_MARKER_SOF_0:
|
sl@0
|
80 |
/* baseline DCT */
|
sl@0
|
81 |
max_quant_table = 3;
|
sl@0
|
82 |
if (dec->depth != 8) {
|
sl@0
|
83 |
OIL_ERROR("depth must be 8 (%d)", dec->depth);
|
sl@0
|
84 |
dec->error = TRUE;
|
sl@0
|
85 |
}
|
sl@0
|
86 |
break;
|
sl@0
|
87 |
case JPEG_MARKER_SOF_1:
|
sl@0
|
88 |
/* extended DCT */
|
sl@0
|
89 |
max_quant_table = 3;
|
sl@0
|
90 |
if (dec->depth != 8 && dec->depth != 12) {
|
sl@0
|
91 |
OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
|
sl@0
|
92 |
dec->error = TRUE;
|
sl@0
|
93 |
}
|
sl@0
|
94 |
break;
|
sl@0
|
95 |
case JPEG_MARKER_SOF_2:
|
sl@0
|
96 |
/* progressive DCT */
|
sl@0
|
97 |
max_quant_table = 3;
|
sl@0
|
98 |
if (dec->depth != 8 && dec->depth != 12) {
|
sl@0
|
99 |
OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
|
sl@0
|
100 |
dec->error = TRUE;
|
sl@0
|
101 |
}
|
sl@0
|
102 |
break;
|
sl@0
|
103 |
case JPEG_MARKER_SOF_3:
|
sl@0
|
104 |
/* lossless DCT */
|
sl@0
|
105 |
max_quant_table = 0;
|
sl@0
|
106 |
if (dec->depth < 2 || dec->depth > 16) {
|
sl@0
|
107 |
OIL_ERROR("depth must be between 2 and 16 (%d)", dec->depth);
|
sl@0
|
108 |
dec->error = TRUE;
|
sl@0
|
109 |
}
|
sl@0
|
110 |
break;
|
sl@0
|
111 |
default:
|
sl@0
|
112 |
break;
|
sl@0
|
113 |
}
|
sl@0
|
114 |
|
sl@0
|
115 |
if (dec->n_components < 0 || dec->n_components > 255) {
|
sl@0
|
116 |
OIL_ERROR("n_components must be in the range 0-255 (%d)",
|
sl@0
|
117 |
dec->n_components);
|
sl@0
|
118 |
dec->error = TRUE;
|
sl@0
|
119 |
}
|
sl@0
|
120 |
if (dec->sof_type == JPEG_MARKER_SOF_2 && dec->n_components > 4) {
|
sl@0
|
121 |
OIL_ERROR("n_components must be <= 4 for progressive DCT (%d)",
|
sl@0
|
122 |
dec->n_components);
|
sl@0
|
123 |
dec->error = TRUE;
|
sl@0
|
124 |
}
|
sl@0
|
125 |
|
sl@0
|
126 |
for (i = 0; i < dec->n_components; i++) {
|
sl@0
|
127 |
if (dec->components[i].id < 0 || dec->components[i].id > 255) {
|
sl@0
|
128 |
OIL_ERROR("component ID out of range");
|
sl@0
|
129 |
dec->error = TRUE;
|
sl@0
|
130 |
break;
|
sl@0
|
131 |
}
|
sl@0
|
132 |
if (dec->components[i].h_sample < 1 || dec->components[i].h_sample > 4 ||
|
sl@0
|
133 |
dec->components[i].v_sample < 1 || dec->components[i].v_sample > 4) {
|
sl@0
|
134 |
OIL_ERROR("sample factor(s) for component %d out of range %d %d",
|
sl@0
|
135 |
i, dec->components[i].h_sample, dec->components[i].v_sample);
|
sl@0
|
136 |
dec->error = TRUE;
|
sl@0
|
137 |
break;
|
sl@0
|
138 |
}
|
sl@0
|
139 |
if (dec->components[i].quant_table < 0 ||
|
sl@0
|
140 |
dec->components[i].quant_table > max_quant_table) {
|
sl@0
|
141 |
OIL_ERROR("quant table for component %d out of range (%d)",
|
sl@0
|
142 |
i, dec->components[i].quant_table);
|
sl@0
|
143 |
dec->error = TRUE;
|
sl@0
|
144 |
break;
|
sl@0
|
145 |
}
|
sl@0
|
146 |
}
|
sl@0
|
147 |
}
|
sl@0
|
148 |
|
sl@0
|
149 |
static void
|
sl@0
|
150 |
jpeg_decoder_init_decoder (JpegDecoder *dec)
|
sl@0
|
151 |
{
|
sl@0
|
152 |
int max_h_sample = 0;
|
sl@0
|
153 |
int max_v_sample = 0;
|
sl@0
|
154 |
int i;
|
sl@0
|
155 |
|
sl@0
|
156 |
/* decoder limitations */
|
sl@0
|
157 |
if (dec->n_components != 3) {
|
sl@0
|
158 |
jpeg_decoder_error(dec, "wrong number of components %d", dec->n_components);
|
sl@0
|
159 |
return;
|
sl@0
|
160 |
}
|
sl@0
|
161 |
if (dec->sof_type != JPEG_MARKER_SOF_0) {
|
sl@0
|
162 |
jpeg_decoder_error(dec, "only handle baseline DCT");
|
sl@0
|
163 |
return;
|
sl@0
|
164 |
}
|
sl@0
|
165 |
|
sl@0
|
166 |
|
sl@0
|
167 |
|
sl@0
|
168 |
|
sl@0
|
169 |
for (i=0; i < dec->n_components; i++) {
|
sl@0
|
170 |
max_h_sample = MAX (max_h_sample, dec->components[i].h_sample);
|
sl@0
|
171 |
max_v_sample = MAX (max_v_sample, dec->components[i].v_sample);
|
sl@0
|
172 |
}
|
sl@0
|
173 |
|
sl@0
|
174 |
dec->width_blocks =
|
sl@0
|
175 |
(dec->width + 8 * max_h_sample - 1) / (8 * max_h_sample);
|
sl@0
|
176 |
dec->height_blocks =
|
sl@0
|
177 |
(dec->height + 8 * max_v_sample - 1) / (8 * max_v_sample);
|
sl@0
|
178 |
for (i = 0; i < dec->n_components; i++) {
|
sl@0
|
179 |
int rowstride;
|
sl@0
|
180 |
int image_size;
|
sl@0
|
181 |
|
sl@0
|
182 |
dec->components[i].h_subsample = max_h_sample /
|
sl@0
|
183 |
dec->components[i].h_sample;
|
sl@0
|
184 |
dec->components[i].v_subsample = max_v_sample /
|
sl@0
|
185 |
dec->components[i].v_sample;
|
sl@0
|
186 |
|
sl@0
|
187 |
rowstride = dec->width_blocks * 8 * max_h_sample /
|
sl@0
|
188 |
dec->components[i].h_subsample;
|
sl@0
|
189 |
image_size = rowstride *
|
sl@0
|
190 |
(dec->height_blocks * 8 * max_v_sample /
|
sl@0
|
191 |
dec->components[i].v_subsample);
|
sl@0
|
192 |
dec->components[i].rowstride = rowstride;
|
sl@0
|
193 |
dec->components[i].image = malloc (image_size);
|
sl@0
|
194 |
}
|
sl@0
|
195 |
}
|
sl@0
|
196 |
|
sl@0
|
197 |
|
sl@0
|
198 |
void
|
sl@0
|
199 |
generate_code_table (int *huffsize)
|
sl@0
|
200 |
{
|
sl@0
|
201 |
int code;
|
sl@0
|
202 |
int i;
|
sl@0
|
203 |
int j;
|
sl@0
|
204 |
int k;
|
sl@0
|
205 |
char str[33];
|
sl@0
|
206 |
|
sl@0
|
207 |
//int l;
|
sl@0
|
208 |
|
sl@0
|
209 |
code = 0;
|
sl@0
|
210 |
k = 0;
|
sl@0
|
211 |
for (i = 0; i < 16; i++) {
|
sl@0
|
212 |
for (j = 0; j < huffsize[i]; j++) {
|
sl@0
|
213 |
OIL_DEBUG ("huffcode[%d] = %s", k,
|
sl@0
|
214 |
sprintbits (str, code >> (15 - i), i + 1));
|
sl@0
|
215 |
code++;
|
sl@0
|
216 |
k++;
|
sl@0
|
217 |
}
|
sl@0
|
218 |
code <<= 1;
|
sl@0
|
219 |
}
|
sl@0
|
220 |
|
sl@0
|
221 |
}
|
sl@0
|
222 |
|
sl@0
|
223 |
int
|
sl@0
|
224 |
huffman_table_init_jpeg (HuffmanTable *table, JpegBits * bits)
|
sl@0
|
225 |
{
|
sl@0
|
226 |
int n_symbols;
|
sl@0
|
227 |
int huffsize[16];
|
sl@0
|
228 |
int i, j, k;
|
sl@0
|
229 |
unsigned int symbol;
|
sl@0
|
230 |
int n = 0;
|
sl@0
|
231 |
|
sl@0
|
232 |
huffman_table_init (table);
|
sl@0
|
233 |
|
sl@0
|
234 |
/* huffsize[i] is the number of symbols that have length
|
sl@0
|
235 |
* (i+1) bits. Maximum bit length is 16 bits, so there are
|
sl@0
|
236 |
* 16 entries. */
|
sl@0
|
237 |
n_symbols = 0;
|
sl@0
|
238 |
for (i = 0; i < 16; i++) {
|
sl@0
|
239 |
huffsize[i] = jpeg_bits_get_u8 (bits);
|
sl@0
|
240 |
n++;
|
sl@0
|
241 |
n_symbols += huffsize[i];
|
sl@0
|
242 |
}
|
sl@0
|
243 |
|
sl@0
|
244 |
/* Build up the symbol table. The first symbol is all 0's, with
|
sl@0
|
245 |
* the number of bits determined by the first non-zero entry in
|
sl@0
|
246 |
* huffsize[]. Subsequent symbols with the same bit length are
|
sl@0
|
247 |
* incremented by 1. Increasing the bit length shifts the
|
sl@0
|
248 |
* symbol 1 bit to the left. */
|
sl@0
|
249 |
symbol = 0;
|
sl@0
|
250 |
k = 0;
|
sl@0
|
251 |
for (i = 0; i < 16; i++) {
|
sl@0
|
252 |
for (j = 0; j < huffsize[i]; j++) {
|
sl@0
|
253 |
huffman_table_add (table, symbol, i + 1, jpeg_bits_get_u8 (bits));
|
sl@0
|
254 |
n++;
|
sl@0
|
255 |
symbol++;
|
sl@0
|
256 |
k++;
|
sl@0
|
257 |
}
|
sl@0
|
258 |
/* This checks that our symbol is actually less than the
|
sl@0
|
259 |
* number of bits we think it is. This is only triggered
|
sl@0
|
260 |
* for bad huffsize[] arrays. */
|
sl@0
|
261 |
if (symbol >= (1 << (i + 1))) {
|
sl@0
|
262 |
/* FIXME jpeg_decoder_error() */
|
sl@0
|
263 |
OIL_DEBUG ("bad huffsize[] array");
|
sl@0
|
264 |
return -1;
|
sl@0
|
265 |
}
|
sl@0
|
266 |
|
sl@0
|
267 |
symbol <<= 1;
|
sl@0
|
268 |
}
|
sl@0
|
269 |
|
sl@0
|
270 |
huffman_table_dump (table);
|
sl@0
|
271 |
|
sl@0
|
272 |
return n;
|
sl@0
|
273 |
}
|
sl@0
|
274 |
|
sl@0
|
275 |
static void
|
sl@0
|
276 |
dumpbits (JpegBits * bits)
|
sl@0
|
277 |
{
|
sl@0
|
278 |
int i;
|
sl@0
|
279 |
int j;
|
sl@0
|
280 |
unsigned char *p;
|
sl@0
|
281 |
char s[40];
|
sl@0
|
282 |
|
sl@0
|
283 |
p = bits->ptr;
|
sl@0
|
284 |
for (i = 0; i < 8; i++) {
|
sl@0
|
285 |
sprintf (s, "%02x %02x %02x %02x %02x %02x %02x %02x ........",
|
sl@0
|
286 |
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
|
sl@0
|
287 |
for (j = 0; j < 8; j++) {
|
sl@0
|
288 |
s[j + 24] = (isprint (p[j])) ? p[j] : '.';
|
sl@0
|
289 |
}
|
sl@0
|
290 |
OIL_DEBUG ("%s", s);
|
sl@0
|
291 |
p += 8;
|
sl@0
|
292 |
}
|
sl@0
|
293 |
|
sl@0
|
294 |
}
|
sl@0
|
295 |
|
sl@0
|
296 |
int
|
sl@0
|
297 |
jpeg_decoder_find_component_by_id (JpegDecoder * dec, int id)
|
sl@0
|
298 |
{
|
sl@0
|
299 |
int i;
|
sl@0
|
300 |
|
sl@0
|
301 |
for (i = 0; i < dec->n_components; i++) {
|
sl@0
|
302 |
if (dec->components[i].id == id)
|
sl@0
|
303 |
return i;
|
sl@0
|
304 |
}
|
sl@0
|
305 |
OIL_DEBUG ("undefined component id %d", id);
|
sl@0
|
306 |
return 0;
|
sl@0
|
307 |
}
|
sl@0
|
308 |
|
sl@0
|
309 |
int
|
sl@0
|
310 |
jpeg_decoder_application0 (JpegDecoder * dec, JpegBits * bits)
|
sl@0
|
311 |
{
|
sl@0
|
312 |
int length;
|
sl@0
|
313 |
|
sl@0
|
314 |
OIL_DEBUG ("app0");
|
sl@0
|
315 |
|
sl@0
|
316 |
length = get_be_u16 (bits);
|
sl@0
|
317 |
OIL_DEBUG ("length=%d", length);
|
sl@0
|
318 |
|
sl@0
|
319 |
if (memcmp (bits->ptr, "JFIF", 4) == 0 && bits->ptr[4] == 0) {
|
sl@0
|
320 |
int version;
|
sl@0
|
321 |
int units;
|
sl@0
|
322 |
int x_density;
|
sl@0
|
323 |
int y_density;
|
sl@0
|
324 |
int x_thumbnail;
|
sl@0
|
325 |
int y_thumbnail;
|
sl@0
|
326 |
|
sl@0
|
327 |
OIL_DEBUG ("JFIF");
|
sl@0
|
328 |
bits->ptr += 5;
|
sl@0
|
329 |
|
sl@0
|
330 |
version = get_be_u16 (bits);
|
sl@0
|
331 |
units = get_u8 (bits);
|
sl@0
|
332 |
x_density = get_be_u16 (bits);
|
sl@0
|
333 |
y_density = get_be_u16 (bits);
|
sl@0
|
334 |
x_thumbnail = get_u8 (bits);
|
sl@0
|
335 |
y_thumbnail = get_u8 (bits);
|
sl@0
|
336 |
|
sl@0
|
337 |
OIL_DEBUG ("version = %04x", version);
|
sl@0
|
338 |
OIL_DEBUG ("units = %d", units);
|
sl@0
|
339 |
OIL_DEBUG ("x_density = %d", x_density);
|
sl@0
|
340 |
OIL_DEBUG ("y_density = %d", y_density);
|
sl@0
|
341 |
OIL_DEBUG ("x_thumbnail = %d", x_thumbnail);
|
sl@0
|
342 |
OIL_DEBUG ("y_thumbnail = %d", y_thumbnail);
|
sl@0
|
343 |
|
sl@0
|
344 |
}
|
sl@0
|
345 |
|
sl@0
|
346 |
if (memcmp (bits->ptr, "JFXX", 4) == 0 && bits->ptr[4] == 0) {
|
sl@0
|
347 |
OIL_DEBUG ("JFIF extension (not handled)");
|
sl@0
|
348 |
bits->ptr += length - 2;
|
sl@0
|
349 |
}
|
sl@0
|
350 |
|
sl@0
|
351 |
return length;
|
sl@0
|
352 |
}
|
sl@0
|
353 |
|
sl@0
|
354 |
int
|
sl@0
|
355 |
jpeg_decoder_application_misc (JpegDecoder * dec, JpegBits * bits)
|
sl@0
|
356 |
{
|
sl@0
|
357 |
int length;
|
sl@0
|
358 |
|
sl@0
|
359 |
OIL_DEBUG ("appX");
|
sl@0
|
360 |
|
sl@0
|
361 |
length = get_be_u16 (bits);
|
sl@0
|
362 |
OIL_DEBUG ("length=%d", length);
|
sl@0
|
363 |
|
sl@0
|
364 |
OIL_DEBUG ("JPEG application tag X ignored");
|
sl@0
|
365 |
dumpbits (bits);
|
sl@0
|
366 |
|
sl@0
|
367 |
bits->ptr += length - 2;
|
sl@0
|
368 |
|
sl@0
|
369 |
return length;
|
sl@0
|
370 |
}
|
sl@0
|
371 |
|
sl@0
|
372 |
int
|
sl@0
|
373 |
jpeg_decoder_comment (JpegDecoder * dec, JpegBits * bits)
|
sl@0
|
374 |
{
|
sl@0
|
375 |
int length;
|
sl@0
|
376 |
|
sl@0
|
377 |
OIL_DEBUG ("comment");
|
sl@0
|
378 |
|
sl@0
|
379 |
length = get_be_u16 (bits);
|
sl@0
|
380 |
OIL_DEBUG ("length=%d", length);
|
sl@0
|
381 |
|
sl@0
|
382 |
dumpbits (bits);
|
sl@0
|
383 |
|
sl@0
|
384 |
bits->ptr += length - 2;
|
sl@0
|
385 |
|
sl@0
|
386 |
return length;
|
sl@0
|
387 |
}
|
sl@0
|
388 |
|
sl@0
|
389 |
int
|
sl@0
|
390 |
jpeg_decoder_restart_interval (JpegDecoder * dec, JpegBits * bits)
|
sl@0
|
391 |
{
|
sl@0
|
392 |
int length;
|
sl@0
|
393 |
|
sl@0
|
394 |
OIL_DEBUG ("comment");
|
sl@0
|
395 |
|
sl@0
|
396 |
length = get_be_u16 (bits);
|
sl@0
|
397 |
OIL_DEBUG ("length=%d", length);
|
sl@0
|
398 |
|
sl@0
|
399 |
dec->restart_interval = get_be_u16 (bits);
|
sl@0
|
400 |
OIL_DEBUG ("restart_interval=%d", dec->restart_interval);
|
sl@0
|
401 |
|
sl@0
|
402 |
return length;
|
sl@0
|
403 |
}
|
sl@0
|
404 |
|
sl@0
|
405 |
int
|
sl@0
|
406 |
jpeg_decoder_restart (JpegDecoder * dec, JpegBits * bits)
|
sl@0
|
407 |
{
|
sl@0
|
408 |
OIL_DEBUG ("restart");
|
sl@0
|
409 |
|
sl@0
|
410 |
return 0;
|
sl@0
|
411 |
}
|
sl@0
|
412 |
|
sl@0
|
413 |
void
|
sl@0
|
414 |
jpeg_decoder_decode_entropy_segment (JpegDecoder * dec)
|
sl@0
|
415 |
{
|
sl@0
|
416 |
JpegBits * bits = &dec->bits;
|
sl@0
|
417 |
JpegBits b2, *bits2 = &b2;
|
sl@0
|
418 |
short block[64];
|
sl@0
|
419 |
short block2[64];
|
sl@0
|
420 |
unsigned char *newptr;
|
sl@0
|
421 |
int len;
|
sl@0
|
422 |
int j;
|
sl@0
|
423 |
int i;
|
sl@0
|
424 |
int go;
|
sl@0
|
425 |
int x, y;
|
sl@0
|
426 |
int n;
|
sl@0
|
427 |
int ret;
|
sl@0
|
428 |
|
sl@0
|
429 |
len = 0;
|
sl@0
|
430 |
j = 0;
|
sl@0
|
431 |
while (1) {
|
sl@0
|
432 |
if (bits->ptr[len] == 0xff && bits->ptr[len + 1] != 0x00) {
|
sl@0
|
433 |
break;
|
sl@0
|
434 |
}
|
sl@0
|
435 |
len++;
|
sl@0
|
436 |
}
|
sl@0
|
437 |
OIL_DEBUG ("entropy length = %d", len);
|
sl@0
|
438 |
|
sl@0
|
439 |
/* we allocate extra space, since the getbits() code can
|
sl@0
|
440 |
* potentially read past the end of the buffer */
|
sl@0
|
441 |
newptr = malloc (len + 2);
|
sl@0
|
442 |
for (i = 0; i < len; i++) {
|
sl@0
|
443 |
newptr[j] = bits->ptr[i];
|
sl@0
|
444 |
j++;
|
sl@0
|
445 |
if (bits->ptr[i] == 0xff)
|
sl@0
|
446 |
i++;
|
sl@0
|
447 |
}
|
sl@0
|
448 |
bits->ptr += len;
|
sl@0
|
449 |
|
sl@0
|
450 |
bits2->ptr = newptr;
|
sl@0
|
451 |
bits2->idx = 0;
|
sl@0
|
452 |
bits2->end = newptr + j;
|
sl@0
|
453 |
newptr[j] = 0;
|
sl@0
|
454 |
newptr[j + 1] = 0;
|
sl@0
|
455 |
|
sl@0
|
456 |
dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
|
sl@0
|
457 |
go = 1;
|
sl@0
|
458 |
x = dec->x;
|
sl@0
|
459 |
y = dec->y;
|
sl@0
|
460 |
n = dec->restart_interval;
|
sl@0
|
461 |
if (n == 0) n = INT_MAX;
|
sl@0
|
462 |
while (n-- > 0) {
|
sl@0
|
463 |
for (i = 0; i < dec->scan_list_length; i++) {
|
sl@0
|
464 |
int dc_table_index;
|
sl@0
|
465 |
int ac_table_index;
|
sl@0
|
466 |
int quant_index;
|
sl@0
|
467 |
unsigned char *ptr;
|
sl@0
|
468 |
int component_index;
|
sl@0
|
469 |
|
sl@0
|
470 |
OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
|
sl@0
|
471 |
x, y,
|
sl@0
|
472 |
dec->scan_list[i].component_index,
|
sl@0
|
473 |
dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
|
sl@0
|
474 |
|
sl@0
|
475 |
component_index = dec->scan_list[i].component_index;
|
sl@0
|
476 |
dc_table_index = dec->scan_list[i].dc_table;
|
sl@0
|
477 |
ac_table_index = dec->scan_list[i].ac_table;
|
sl@0
|
478 |
quant_index = dec->scan_list[i].quant_table;
|
sl@0
|
479 |
|
sl@0
|
480 |
ret = huffman_table_decode_macroblock (block,
|
sl@0
|
481 |
&dec->dc_huff_table[dc_table_index],
|
sl@0
|
482 |
&dec->ac_huff_table[ac_table_index], bits2);
|
sl@0
|
483 |
if (ret < 0) {
|
sl@0
|
484 |
OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
|
sl@0
|
485 |
x, y,
|
sl@0
|
486 |
dec->scan_list[i].component_index,
|
sl@0
|
487 |
dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
|
sl@0
|
488 |
n = 0;
|
sl@0
|
489 |
break;
|
sl@0
|
490 |
}
|
sl@0
|
491 |
|
sl@0
|
492 |
OIL_DEBUG ("using quant table %d", quant_index);
|
sl@0
|
493 |
oil_mult8x8_s16 (block2, block, dec->quant_tables[quant_index].quantizer,
|
sl@0
|
494 |
sizeof (short) * 8, sizeof(short) * 8, sizeof (short) * 8);
|
sl@0
|
495 |
dec->dc[component_index] += block2[0];
|
sl@0
|
496 |
block2[0] = dec->dc[component_index];
|
sl@0
|
497 |
oil_unzigzag8x8_s16 (block, sizeof (short) * 8, block2,
|
sl@0
|
498 |
sizeof (short) * 8);
|
sl@0
|
499 |
oil_idct8x8_s16 (block2, sizeof (short) * 8, block, sizeof (short) * 8);
|
sl@0
|
500 |
oil_trans8x8_s16 (block, sizeof (short) * 8, block2, sizeof (short) * 8);
|
sl@0
|
501 |
|
sl@0
|
502 |
ptr = dec->components[component_index].image +
|
sl@0
|
503 |
x * dec->components[component_index].h_sample +
|
sl@0
|
504 |
dec->scan_list[i].offset +
|
sl@0
|
505 |
dec->components[component_index].rowstride * y *
|
sl@0
|
506 |
dec->components[component_index].v_sample;
|
sl@0
|
507 |
|
sl@0
|
508 |
oil_clipconv8x8_u8_s16 (ptr,
|
sl@0
|
509 |
dec->components[component_index].rowstride,
|
sl@0
|
510 |
block, sizeof (short) * 8);
|
sl@0
|
511 |
}
|
sl@0
|
512 |
x += 8;
|
sl@0
|
513 |
if (x * dec->scan_h_subsample >= dec->width) {
|
sl@0
|
514 |
x = 0;
|
sl@0
|
515 |
y += 8;
|
sl@0
|
516 |
}
|
sl@0
|
517 |
if (y * dec->scan_v_subsample >= dec->height) {
|
sl@0
|
518 |
go = 0;
|
sl@0
|
519 |
}
|
sl@0
|
520 |
}
|
sl@0
|
521 |
dec->x = x;
|
sl@0
|
522 |
dec->y = y;
|
sl@0
|
523 |
free (newptr);
|
sl@0
|
524 |
}
|
sl@0
|
525 |
|
sl@0
|
526 |
|
sl@0
|
527 |
|
sl@0
|
528 |
JpegDecoder *
|
sl@0
|
529 |
jpeg_decoder_new (void)
|
sl@0
|
530 |
{
|
sl@0
|
531 |
JpegDecoder *dec;
|
sl@0
|
532 |
|
sl@0
|
533 |
oil_init ();
|
sl@0
|
534 |
|
sl@0
|
535 |
dec = malloc (sizeof(JpegDecoder));
|
sl@0
|
536 |
memset (dec, 0, sizeof(JpegDecoder));
|
sl@0
|
537 |
|
sl@0
|
538 |
huffman_table_load_std_jpeg (dec);
|
sl@0
|
539 |
|
sl@0
|
540 |
return dec;
|
sl@0
|
541 |
}
|
sl@0
|
542 |
|
sl@0
|
543 |
void
|
sl@0
|
544 |
jpeg_decoder_free (JpegDecoder * dec)
|
sl@0
|
545 |
{
|
sl@0
|
546 |
int i;
|
sl@0
|
547 |
|
sl@0
|
548 |
for (i = 0; i < JPEG_MAX_COMPONENTS; i++) {
|
sl@0
|
549 |
if (dec->components[i].image)
|
sl@0
|
550 |
free (dec->components[i].image);
|
sl@0
|
551 |
}
|
sl@0
|
552 |
|
sl@0
|
553 |
if (dec->data)
|
sl@0
|
554 |
free (dec->data);
|
sl@0
|
555 |
|
sl@0
|
556 |
free (dec);
|
sl@0
|
557 |
}
|
sl@0
|
558 |
|
sl@0
|
559 |
void
|
sl@0
|
560 |
jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...)
|
sl@0
|
561 |
{
|
sl@0
|
562 |
va_list varargs;
|
sl@0
|
563 |
|
sl@0
|
564 |
if (dec->error) return;
|
sl@0
|
565 |
|
sl@0
|
566 |
va_start (varargs, fmt);
|
sl@0
|
567 |
#if 0
|
sl@0
|
568 |
vasprintf(&dec->error_message, fmt, varargs);
|
sl@0
|
569 |
#else
|
sl@0
|
570 |
dec->error_message = malloc(100);
|
sl@0
|
571 |
vsnprintf(dec->error_message, 100, fmt, varargs);
|
sl@0
|
572 |
#endif
|
sl@0
|
573 |
va_end (varargs);
|
sl@0
|
574 |
|
sl@0
|
575 |
OIL_ERROR("decoder error: %s", dec->error_message);
|
sl@0
|
576 |
abort();
|
sl@0
|
577 |
dec->error = TRUE;
|
sl@0
|
578 |
}
|
sl@0
|
579 |
|
sl@0
|
580 |
int
|
sl@0
|
581 |
jpeg_decoder_get_marker (JpegDecoder *dec, int *marker)
|
sl@0
|
582 |
{
|
sl@0
|
583 |
int a,b;
|
sl@0
|
584 |
JpegBits *bits = &dec->bits;
|
sl@0
|
585 |
|
sl@0
|
586 |
if (jpeg_bits_available(bits) < 2) {
|
sl@0
|
587 |
return FALSE;
|
sl@0
|
588 |
}
|
sl@0
|
589 |
|
sl@0
|
590 |
a = jpeg_bits_get_u8(bits);
|
sl@0
|
591 |
if (a != 0xff) {
|
sl@0
|
592 |
jpeg_decoder_error(dec, "expected marker, not 0x%02x", a);
|
sl@0
|
593 |
return FALSE;
|
sl@0
|
594 |
}
|
sl@0
|
595 |
|
sl@0
|
596 |
do {
|
sl@0
|
597 |
b = jpeg_bits_get_u8 (bits);
|
sl@0
|
598 |
} while (b == 0xff && jpeg_bits_error(bits));
|
sl@0
|
599 |
|
sl@0
|
600 |
*marker = b;
|
sl@0
|
601 |
return TRUE;
|
sl@0
|
602 |
}
|
sl@0
|
603 |
|
sl@0
|
604 |
void
|
sl@0
|
605 |
jpeg_decoder_skip (JpegDecoder *dec)
|
sl@0
|
606 |
{
|
sl@0
|
607 |
int length;
|
sl@0
|
608 |
|
sl@0
|
609 |
length = jpeg_bits_get_u16_be (&dec->bits);
|
sl@0
|
610 |
jpeg_bits_skip (&dec->bits, length - 2);
|
sl@0
|
611 |
}
|
sl@0
|
612 |
|
sl@0
|
613 |
int
|
sl@0
|
614 |
jpeg_decoder_decode (JpegDecoder *dec)
|
sl@0
|
615 |
{
|
sl@0
|
616 |
JpegBits *bits;
|
sl@0
|
617 |
int marker;
|
sl@0
|
618 |
|
sl@0
|
619 |
dec->error = FALSE;
|
sl@0
|
620 |
|
sl@0
|
621 |
bits = &dec->bits;
|
sl@0
|
622 |
|
sl@0
|
623 |
/* Note: The spec is ambiguous as to whether fill bytes can preceed
|
sl@0
|
624 |
* the first marker. We'll assume yes. */
|
sl@0
|
625 |
if (!jpeg_decoder_get_marker (dec, &marker)) {
|
sl@0
|
626 |
return FALSE;
|
sl@0
|
627 |
}
|
sl@0
|
628 |
if (marker != JPEG_MARKER_SOI) {
|
sl@0
|
629 |
jpeg_decoder_error(dec, "not a JPEG image");
|
sl@0
|
630 |
return FALSE;
|
sl@0
|
631 |
}
|
sl@0
|
632 |
|
sl@0
|
633 |
/* Interpret markers up to the start of frame */
|
sl@0
|
634 |
while (!dec->error) {
|
sl@0
|
635 |
if (!jpeg_decoder_get_marker (dec, &marker)) {
|
sl@0
|
636 |
return FALSE;
|
sl@0
|
637 |
}
|
sl@0
|
638 |
|
sl@0
|
639 |
if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
|
sl@0
|
640 |
jpeg_decoder_define_huffman_tables (dec);
|
sl@0
|
641 |
} else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
|
sl@0
|
642 |
jpeg_decoder_define_arithmetic_conditioning (dec);
|
sl@0
|
643 |
} else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
|
sl@0
|
644 |
jpeg_decoder_define_quantization_tables (dec);
|
sl@0
|
645 |
} else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
|
sl@0
|
646 |
jpeg_decoder_define_restart_interval (dec);
|
sl@0
|
647 |
} else if (JPEG_MARKER_IS_APP(marker)) {
|
sl@0
|
648 |
/* FIXME decode app segment */
|
sl@0
|
649 |
jpeg_decoder_skip (dec);
|
sl@0
|
650 |
} else if (marker == JPEG_MARKER_COMMENT) {
|
sl@0
|
651 |
jpeg_decoder_skip (dec);
|
sl@0
|
652 |
} else if (JPEG_MARKER_IS_START_OF_FRAME(marker)) {
|
sl@0
|
653 |
break;
|
sl@0
|
654 |
} else {
|
sl@0
|
655 |
jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
|
sl@0
|
656 |
return FALSE;
|
sl@0
|
657 |
}
|
sl@0
|
658 |
}
|
sl@0
|
659 |
|
sl@0
|
660 |
jpeg_decoder_start_of_frame(dec, marker);
|
sl@0
|
661 |
|
sl@0
|
662 |
jpeg_decoder_verify_header (dec);
|
sl@0
|
663 |
if (dec->error) {
|
sl@0
|
664 |
return FALSE;
|
sl@0
|
665 |
}
|
sl@0
|
666 |
|
sl@0
|
667 |
jpeg_decoder_init_decoder (dec);
|
sl@0
|
668 |
if (dec->error) {
|
sl@0
|
669 |
return FALSE;
|
sl@0
|
670 |
}
|
sl@0
|
671 |
|
sl@0
|
672 |
/* In this section, we loop over parse units until we reach the end
|
sl@0
|
673 |
* of the image. */
|
sl@0
|
674 |
while (!dec->error) {
|
sl@0
|
675 |
if (!jpeg_decoder_get_marker (dec, &marker)) {
|
sl@0
|
676 |
return FALSE;
|
sl@0
|
677 |
}
|
sl@0
|
678 |
|
sl@0
|
679 |
if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
|
sl@0
|
680 |
jpeg_decoder_define_huffman_tables (dec);
|
sl@0
|
681 |
} else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
|
sl@0
|
682 |
jpeg_decoder_define_arithmetic_conditioning (dec);
|
sl@0
|
683 |
} else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
|
sl@0
|
684 |
jpeg_decoder_define_quantization_tables (dec);
|
sl@0
|
685 |
} else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
|
sl@0
|
686 |
jpeg_decoder_define_restart_interval (dec);
|
sl@0
|
687 |
} else if (JPEG_MARKER_IS_APP(marker)) {
|
sl@0
|
688 |
jpeg_decoder_skip (dec);
|
sl@0
|
689 |
} else if (marker == JPEG_MARKER_COMMENT) {
|
sl@0
|
690 |
jpeg_decoder_skip (dec);
|
sl@0
|
691 |
} else if (marker == JPEG_MARKER_SOS) {
|
sl@0
|
692 |
jpeg_decoder_start_of_scan (dec);
|
sl@0
|
693 |
jpeg_decoder_decode_entropy_segment (dec);
|
sl@0
|
694 |
} else if (JPEG_MARKER_IS_RESET(marker)) {
|
sl@0
|
695 |
jpeg_decoder_decode_entropy_segment (dec);
|
sl@0
|
696 |
} else if (marker == JPEG_MARKER_EOI) {
|
sl@0
|
697 |
break;
|
sl@0
|
698 |
} else {
|
sl@0
|
699 |
jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
|
sl@0
|
700 |
return FALSE;
|
sl@0
|
701 |
}
|
sl@0
|
702 |
}
|
sl@0
|
703 |
|
sl@0
|
704 |
return TRUE;
|
sl@0
|
705 |
}
|
sl@0
|
706 |
|
sl@0
|
707 |
/* handle markers */
|
sl@0
|
708 |
|
sl@0
|
709 |
void
|
sl@0
|
710 |
jpeg_decoder_define_huffman_tables (JpegDecoder * dec)
|
sl@0
|
711 |
{
|
sl@0
|
712 |
JpegBits *bits = &dec->bits;
|
sl@0
|
713 |
int length;
|
sl@0
|
714 |
int tc;
|
sl@0
|
715 |
int th;
|
sl@0
|
716 |
int x;
|
sl@0
|
717 |
HuffmanTable *hufftab;
|
sl@0
|
718 |
|
sl@0
|
719 |
OIL_DEBUG ("define huffman tables");
|
sl@0
|
720 |
|
sl@0
|
721 |
length = jpeg_bits_get_u16_be (bits);
|
sl@0
|
722 |
if (length < 2) {
|
sl@0
|
723 |
jpeg_decoder_error(dec, "length too short");
|
sl@0
|
724 |
return;
|
sl@0
|
725 |
}
|
sl@0
|
726 |
length -= 2;
|
sl@0
|
727 |
|
sl@0
|
728 |
while (length > 0) {
|
sl@0
|
729 |
x = jpeg_bits_get_u8 (bits);
|
sl@0
|
730 |
length--;
|
sl@0
|
731 |
|
sl@0
|
732 |
tc = x >> 4;
|
sl@0
|
733 |
th = x & 0xf;
|
sl@0
|
734 |
|
sl@0
|
735 |
OIL_DEBUG ("huff table type %d (%s) index %d", tc, tc ? "ac" : "dc", th);
|
sl@0
|
736 |
if (tc > 1 || th > 3) {
|
sl@0
|
737 |
jpeg_decoder_error(dec, "huffman table type or index out of range");
|
sl@0
|
738 |
return;
|
sl@0
|
739 |
}
|
sl@0
|
740 |
|
sl@0
|
741 |
if (tc) {
|
sl@0
|
742 |
hufftab = &dec->ac_huff_table[th];
|
sl@0
|
743 |
length -= huffman_table_init_jpeg (hufftab, bits);
|
sl@0
|
744 |
} else {
|
sl@0
|
745 |
hufftab = &dec->dc_huff_table[th];
|
sl@0
|
746 |
length -= huffman_table_init_jpeg (hufftab, bits);
|
sl@0
|
747 |
}
|
sl@0
|
748 |
}
|
sl@0
|
749 |
if (length < 0) {
|
sl@0
|
750 |
jpeg_decoder_error(dec, "huffman table overran available bytes");
|
sl@0
|
751 |
return;
|
sl@0
|
752 |
}
|
sl@0
|
753 |
}
|
sl@0
|
754 |
|
sl@0
|
755 |
void
|
sl@0
|
756 |
jpeg_decoder_define_quantization_tables (JpegDecoder *dec)
|
sl@0
|
757 |
{
|
sl@0
|
758 |
JpegBits *bits = &dec->bits;
|
sl@0
|
759 |
JpegQuantTable *table;
|
sl@0
|
760 |
int length;
|
sl@0
|
761 |
int pq;
|
sl@0
|
762 |
int tq;
|
sl@0
|
763 |
int i;
|
sl@0
|
764 |
|
sl@0
|
765 |
OIL_INFO ("define quantization table");
|
sl@0
|
766 |
|
sl@0
|
767 |
length = jpeg_bits_get_u16_be (bits);
|
sl@0
|
768 |
if (length < 2) {
|
sl@0
|
769 |
jpeg_decoder_error(dec, "length too short");
|
sl@0
|
770 |
return;
|
sl@0
|
771 |
}
|
sl@0
|
772 |
length -= 2;
|
sl@0
|
773 |
|
sl@0
|
774 |
while (length > 0) {
|
sl@0
|
775 |
int x;
|
sl@0
|
776 |
|
sl@0
|
777 |
x = jpeg_bits_get_u8 (bits);
|
sl@0
|
778 |
length--;
|
sl@0
|
779 |
pq = x >> 4;
|
sl@0
|
780 |
tq = x & 0xf;
|
sl@0
|
781 |
|
sl@0
|
782 |
if (pq > 1) {
|
sl@0
|
783 |
jpeg_decoder_error (dec, "bad pq value");
|
sl@0
|
784 |
return;
|
sl@0
|
785 |
}
|
sl@0
|
786 |
if (tq > 3) {
|
sl@0
|
787 |
jpeg_decoder_error (dec, "bad tq value");
|
sl@0
|
788 |
return;
|
sl@0
|
789 |
}
|
sl@0
|
790 |
|
sl@0
|
791 |
table = &dec->quant_tables[tq];
|
sl@0
|
792 |
if (pq) {
|
sl@0
|
793 |
for (i = 0; i < 64; i++) {
|
sl@0
|
794 |
table->quantizer[i] = jpeg_bits_get_u16_be (bits);
|
sl@0
|
795 |
length -= 2;
|
sl@0
|
796 |
}
|
sl@0
|
797 |
} else {
|
sl@0
|
798 |
for (i = 0; i < 64; i++) {
|
sl@0
|
799 |
table->quantizer[i] = jpeg_bits_get_u8 (bits);
|
sl@0
|
800 |
length -= 1;
|
sl@0
|
801 |
}
|
sl@0
|
802 |
}
|
sl@0
|
803 |
}
|
sl@0
|
804 |
if (length < 0) {
|
sl@0
|
805 |
jpeg_decoder_error(dec, "quantization table overran available bytes");
|
sl@0
|
806 |
return;
|
sl@0
|
807 |
}
|
sl@0
|
808 |
}
|
sl@0
|
809 |
|
sl@0
|
810 |
void
|
sl@0
|
811 |
jpeg_decoder_define_restart_interval (JpegDecoder *dec)
|
sl@0
|
812 |
{
|
sl@0
|
813 |
JpegBits *bits = &dec->bits;
|
sl@0
|
814 |
int length;
|
sl@0
|
815 |
|
sl@0
|
816 |
length = jpeg_bits_get_u16_be (bits);
|
sl@0
|
817 |
if (length != 4) {
|
sl@0
|
818 |
jpeg_decoder_error(dec, "length supposed to be 4 (%d)", length);
|
sl@0
|
819 |
return;
|
sl@0
|
820 |
}
|
sl@0
|
821 |
|
sl@0
|
822 |
/* FIXME this needs to be checked somewhere */
|
sl@0
|
823 |
dec->restart_interval = jpeg_bits_get_u16_be (bits);
|
sl@0
|
824 |
}
|
sl@0
|
825 |
|
sl@0
|
826 |
void
|
sl@0
|
827 |
jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec)
|
sl@0
|
828 |
{
|
sl@0
|
829 |
/* we don't handle arithmetic coding, so skip it */
|
sl@0
|
830 |
jpeg_decoder_skip (dec);
|
sl@0
|
831 |
}
|
sl@0
|
832 |
|
sl@0
|
833 |
void
|
sl@0
|
834 |
jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker)
|
sl@0
|
835 |
{
|
sl@0
|
836 |
JpegBits *bits = &dec->bits;
|
sl@0
|
837 |
int i;
|
sl@0
|
838 |
int length;
|
sl@0
|
839 |
|
sl@0
|
840 |
OIL_INFO ("start of frame");
|
sl@0
|
841 |
|
sl@0
|
842 |
dec->sof_type = marker;
|
sl@0
|
843 |
|
sl@0
|
844 |
length = jpeg_bits_get_u16_be (bits);
|
sl@0
|
845 |
|
sl@0
|
846 |
if (jpeg_bits_available(bits) < length) {
|
sl@0
|
847 |
jpeg_decoder_error(dec, "not enough data for start_of_frame (%d < %d)",
|
sl@0
|
848 |
length, jpeg_bits_available(bits));
|
sl@0
|
849 |
return;
|
sl@0
|
850 |
}
|
sl@0
|
851 |
|
sl@0
|
852 |
dec->depth = jpeg_bits_get_u8 (bits);
|
sl@0
|
853 |
dec->height = jpeg_bits_get_u16_be (bits);
|
sl@0
|
854 |
dec->width = jpeg_bits_get_u16_be (bits);
|
sl@0
|
855 |
dec->n_components = jpeg_bits_get_u8 (bits);
|
sl@0
|
856 |
|
sl@0
|
857 |
OIL_DEBUG (
|
sl@0
|
858 |
"frame_length=%d depth=%d height=%d width=%d n_components=%d", length,
|
sl@0
|
859 |
dec->depth, dec->height, dec->width, dec->n_components);
|
sl@0
|
860 |
|
sl@0
|
861 |
if (dec->n_components * 3 + 8 != length) {
|
sl@0
|
862 |
jpeg_decoder_error(dec, "inconsistent header");
|
sl@0
|
863 |
return;
|
sl@0
|
864 |
}
|
sl@0
|
865 |
|
sl@0
|
866 |
for (i = 0; i < dec->n_components; i++) {
|
sl@0
|
867 |
dec->components[i].id = get_u8 (bits);
|
sl@0
|
868 |
dec->components[i].h_sample = getbits (bits, 4);
|
sl@0
|
869 |
dec->components[i].v_sample = getbits (bits, 4);
|
sl@0
|
870 |
dec->components[i].quant_table = get_u8 (bits);
|
sl@0
|
871 |
|
sl@0
|
872 |
OIL_DEBUG (
|
sl@0
|
873 |
"[%d] id=%d h_sample=%d v_sample=%d quant_table=%d", i,
|
sl@0
|
874 |
dec->components[i].id, dec->components[i].h_sample,
|
sl@0
|
875 |
dec->components[i].v_sample, dec->components[i].quant_table);
|
sl@0
|
876 |
}
|
sl@0
|
877 |
}
|
sl@0
|
878 |
|
sl@0
|
879 |
void
|
sl@0
|
880 |
jpeg_decoder_start_of_scan (JpegDecoder * dec)
|
sl@0
|
881 |
{
|
sl@0
|
882 |
JpegBits *bits = &dec->bits;
|
sl@0
|
883 |
int length;
|
sl@0
|
884 |
int i;
|
sl@0
|
885 |
int spectral_start;
|
sl@0
|
886 |
int spectral_end;
|
sl@0
|
887 |
int approx_high;
|
sl@0
|
888 |
int approx_low;
|
sl@0
|
889 |
int n;
|
sl@0
|
890 |
int tmp;
|
sl@0
|
891 |
int n_components;
|
sl@0
|
892 |
|
sl@0
|
893 |
OIL_DEBUG ("start of scan");
|
sl@0
|
894 |
|
sl@0
|
895 |
length = jpeg_bits_get_u16_be (bits);
|
sl@0
|
896 |
OIL_DEBUG ("length=%d", length);
|
sl@0
|
897 |
|
sl@0
|
898 |
n_components = jpeg_bits_get_u8 (bits);
|
sl@0
|
899 |
n = 0;
|
sl@0
|
900 |
dec->scan_h_subsample = 0;
|
sl@0
|
901 |
dec->scan_v_subsample = 0;
|
sl@0
|
902 |
for (i = 0; i < n_components; i++) {
|
sl@0
|
903 |
int component_id;
|
sl@0
|
904 |
int dc_table;
|
sl@0
|
905 |
int ac_table;
|
sl@0
|
906 |
int x;
|
sl@0
|
907 |
int y;
|
sl@0
|
908 |
int index;
|
sl@0
|
909 |
int h_subsample;
|
sl@0
|
910 |
int v_subsample;
|
sl@0
|
911 |
int quant_index;
|
sl@0
|
912 |
|
sl@0
|
913 |
component_id = jpeg_bits_get_u8 (bits);
|
sl@0
|
914 |
tmp = jpeg_bits_get_u8 (bits);
|
sl@0
|
915 |
dc_table = tmp >> 4;
|
sl@0
|
916 |
ac_table = tmp & 0xf;
|
sl@0
|
917 |
index = jpeg_decoder_find_component_by_id (dec, component_id);
|
sl@0
|
918 |
|
sl@0
|
919 |
h_subsample = dec->components[index].h_sample;
|
sl@0
|
920 |
v_subsample = dec->components[index].v_sample;
|
sl@0
|
921 |
quant_index = dec->components[index].quant_table;
|
sl@0
|
922 |
|
sl@0
|
923 |
for (y = 0; y < v_subsample; y++) {
|
sl@0
|
924 |
for (x = 0; x < h_subsample; x++) {
|
sl@0
|
925 |
dec->scan_list[n].component_index = index;
|
sl@0
|
926 |
dec->scan_list[n].dc_table = dc_table;
|
sl@0
|
927 |
dec->scan_list[n].ac_table = ac_table;
|
sl@0
|
928 |
dec->scan_list[n].quant_table = quant_index;
|
sl@0
|
929 |
dec->scan_list[n].x = x;
|
sl@0
|
930 |
dec->scan_list[n].y = y;
|
sl@0
|
931 |
dec->scan_list[n].offset =
|
sl@0
|
932 |
y * 8 * dec->components[index].rowstride + x * 8;
|
sl@0
|
933 |
n++;
|
sl@0
|
934 |
}
|
sl@0
|
935 |
}
|
sl@0
|
936 |
|
sl@0
|
937 |
dec->scan_h_subsample = MAX (dec->scan_h_subsample, h_subsample);
|
sl@0
|
938 |
dec->scan_v_subsample = MAX (dec->scan_v_subsample, v_subsample);
|
sl@0
|
939 |
|
sl@0
|
940 |
OIL_DEBUG ("component %d: index=%d dc_table=%d ac_table=%d n=%d",
|
sl@0
|
941 |
component_id, index, dc_table, ac_table, n);
|
sl@0
|
942 |
}
|
sl@0
|
943 |
dec->scan_list_length = n;
|
sl@0
|
944 |
|
sl@0
|
945 |
spectral_start = jpeg_bits_get_u8 (bits);
|
sl@0
|
946 |
spectral_end = jpeg_bits_get_u8 (bits);
|
sl@0
|
947 |
OIL_DEBUG ("spectral range [%d,%d]", spectral_start, spectral_end);
|
sl@0
|
948 |
tmp = jpeg_bits_get_u8 (bits);
|
sl@0
|
949 |
approx_high = tmp >> 4;
|
sl@0
|
950 |
approx_low = tmp & 0xf;
|
sl@0
|
951 |
OIL_DEBUG ("approx range [%d,%d]", approx_low, approx_high);
|
sl@0
|
952 |
|
sl@0
|
953 |
dec->x = 0;
|
sl@0
|
954 |
dec->y = 0;
|
sl@0
|
955 |
dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
|
sl@0
|
956 |
}
|
sl@0
|
957 |
|
sl@0
|
958 |
|
sl@0
|
959 |
|
sl@0
|
960 |
|
sl@0
|
961 |
|
sl@0
|
962 |
|
sl@0
|
963 |
|
sl@0
|
964 |
|
sl@0
|
965 |
|
sl@0
|
966 |
|
sl@0
|
967 |
|
sl@0
|
968 |
|
sl@0
|
969 |
int
|
sl@0
|
970 |
jpeg_decoder_addbits (JpegDecoder * dec, unsigned char *data, unsigned int len)
|
sl@0
|
971 |
{
|
sl@0
|
972 |
unsigned int offset;
|
sl@0
|
973 |
|
sl@0
|
974 |
offset = dec->bits.ptr - dec->data;
|
sl@0
|
975 |
|
sl@0
|
976 |
dec->data = realloc (dec->data, dec->data_len + len);
|
sl@0
|
977 |
memcpy (dec->data + dec->data_len, data, len);
|
sl@0
|
978 |
dec->data_len += len;
|
sl@0
|
979 |
|
sl@0
|
980 |
dec->bits.ptr = dec->data + offset;
|
sl@0
|
981 |
dec->bits.end = dec->data + dec->data_len;
|
sl@0
|
982 |
|
sl@0
|
983 |
return 0;
|
sl@0
|
984 |
}
|
sl@0
|
985 |
|
sl@0
|
986 |
int
|
sl@0
|
987 |
jpeg_decoder_get_image_size (JpegDecoder * dec, int *width, int *height)
|
sl@0
|
988 |
{
|
sl@0
|
989 |
if (width)
|
sl@0
|
990 |
*width = dec->width;
|
sl@0
|
991 |
if (height)
|
sl@0
|
992 |
*height = dec->height;
|
sl@0
|
993 |
|
sl@0
|
994 |
return 0;
|
sl@0
|
995 |
}
|
sl@0
|
996 |
|
sl@0
|
997 |
int
|
sl@0
|
998 |
jpeg_decoder_get_component_ptr (JpegDecoder * dec, int id,
|
sl@0
|
999 |
unsigned char **image, int *rowstride)
|
sl@0
|
1000 |
{
|
sl@0
|
1001 |
int i;
|
sl@0
|
1002 |
|
sl@0
|
1003 |
i = jpeg_decoder_find_component_by_id (dec, id);
|
sl@0
|
1004 |
if (image)
|
sl@0
|
1005 |
*image = dec->components[i].image;
|
sl@0
|
1006 |
if (rowstride)
|
sl@0
|
1007 |
*rowstride = dec->components[i].rowstride;
|
sl@0
|
1008 |
|
sl@0
|
1009 |
return 0;
|
sl@0
|
1010 |
}
|
sl@0
|
1011 |
|
sl@0
|
1012 |
int
|
sl@0
|
1013 |
jpeg_decoder_get_component_size (JpegDecoder * dec, int id,
|
sl@0
|
1014 |
int *width, int *height)
|
sl@0
|
1015 |
{
|
sl@0
|
1016 |
int i;
|
sl@0
|
1017 |
|
sl@0
|
1018 |
/* subsampling sizes are rounded up */
|
sl@0
|
1019 |
|
sl@0
|
1020 |
i = jpeg_decoder_find_component_by_id (dec, id);
|
sl@0
|
1021 |
if (width)
|
sl@0
|
1022 |
*width = (dec->width - 1) / dec->components[i].h_subsample + 1;
|
sl@0
|
1023 |
if (height)
|
sl@0
|
1024 |
*height = (dec->height - 1) / dec->components[i].v_subsample + 1;
|
sl@0
|
1025 |
|
sl@0
|
1026 |
return 0;
|
sl@0
|
1027 |
}
|
sl@0
|
1028 |
|
sl@0
|
1029 |
int
|
sl@0
|
1030 |
jpeg_decoder_get_component_subsampling (JpegDecoder * dec, int id,
|
sl@0
|
1031 |
int *h_subsample, int *v_subsample)
|
sl@0
|
1032 |
{
|
sl@0
|
1033 |
int i;
|
sl@0
|
1034 |
|
sl@0
|
1035 |
i = jpeg_decoder_find_component_by_id (dec, id);
|
sl@0
|
1036 |
if (h_subsample)
|
sl@0
|
1037 |
*h_subsample = dec->components[i].h_subsample;
|
sl@0
|
1038 |
if (v_subsample)
|
sl@0
|
1039 |
*v_subsample = dec->components[i].v_subsample;
|
sl@0
|
1040 |
|
sl@0
|
1041 |
return 0;
|
sl@0
|
1042 |
}
|
sl@0
|
1043 |
|
sl@0
|
1044 |
#if 0
|
sl@0
|
1045 |
int
|
sl@0
|
1046 |
jpeg_decoder_parse (JpegDecoder * dec)
|
sl@0
|
1047 |
{
|
sl@0
|
1048 |
JpegBits *bits = &dec->bits;
|
sl@0
|
1049 |
JpegBits b2;
|
sl@0
|
1050 |
unsigned int x;
|
sl@0
|
1051 |
unsigned int tag;
|
sl@0
|
1052 |
int i;
|
sl@0
|
1053 |
|
sl@0
|
1054 |
while (bits->ptr < bits->end) {
|
sl@0
|
1055 |
x = get_u8 (bits);
|
sl@0
|
1056 |
if (x != 0xff) {
|
sl@0
|
1057 |
int n = 0;
|
sl@0
|
1058 |
|
sl@0
|
1059 |
while (x != 0xff) {
|
sl@0
|
1060 |
x = get_u8 (bits);
|
sl@0
|
1061 |
n++;
|
sl@0
|
1062 |
}
|
sl@0
|
1063 |
OIL_DEBUG ("lost sync, skipped %d bytes", n);
|
sl@0
|
1064 |
}
|
sl@0
|
1065 |
while (x == 0xff) {
|
sl@0
|
1066 |
x = get_u8 (bits);
|
sl@0
|
1067 |
}
|
sl@0
|
1068 |
tag = x;
|
sl@0
|
1069 |
OIL_DEBUG ("tag %02x", tag);
|
sl@0
|
1070 |
|
sl@0
|
1071 |
b2 = *bits;
|
sl@0
|
1072 |
|
sl@0
|
1073 |
for (i = 0; i < n_jpeg_markers - 1; i++) {
|
sl@0
|
1074 |
if (tag == jpeg_markers[i].tag) {
|
sl@0
|
1075 |
break;
|
sl@0
|
1076 |
}
|
sl@0
|
1077 |
}
|
sl@0
|
1078 |
OIL_DEBUG ("tag: %s", jpeg_markers[i].name);
|
sl@0
|
1079 |
if (jpeg_markers[i].func) {
|
sl@0
|
1080 |
jpeg_markers[i].func (dec, &b2);
|
sl@0
|
1081 |
} else {
|
sl@0
|
1082 |
OIL_DEBUG ("unhandled or illegal JPEG marker (0x%02x)", tag);
|
sl@0
|
1083 |
dumpbits (&b2);
|
sl@0
|
1084 |
}
|
sl@0
|
1085 |
if (jpeg_markers[i].flags & JPEG_ENTROPY_SEGMENT) {
|
sl@0
|
1086 |
jpeg_decoder_decode_entropy_segment (dec, &b2);
|
sl@0
|
1087 |
}
|
sl@0
|
1088 |
syncbits (&b2);
|
sl@0
|
1089 |
bits->ptr = b2.ptr;
|
sl@0
|
1090 |
}
|
sl@0
|
1091 |
|
sl@0
|
1092 |
return 0;
|
sl@0
|
1093 |
}
|
sl@0
|
1094 |
#endif
|
sl@0
|
1095 |
|
sl@0
|
1096 |
|
sl@0
|
1097 |
/* misc helper functins */
|
sl@0
|
1098 |
|
sl@0
|
1099 |
static char *
|
sl@0
|
1100 |
sprintbits (char *str, unsigned int bits, int n)
|
sl@0
|
1101 |
{
|
sl@0
|
1102 |
int i;
|
sl@0
|
1103 |
int bit = 1 << (n - 1);
|
sl@0
|
1104 |
|
sl@0
|
1105 |
for (i = 0; i < n; i++) {
|
sl@0
|
1106 |
str[i] = (bits & bit) ? '1' : '0';
|
sl@0
|
1107 |
bit >>= 1;
|
sl@0
|
1108 |
}
|
sl@0
|
1109 |
str[i] = 0;
|
sl@0
|
1110 |
|
sl@0
|
1111 |
return str;
|
sl@0
|
1112 |
}
|
sl@0
|
1113 |
|
sl@0
|
1114 |
static void
|
sl@0
|
1115 |
huffman_table_load_std_jpeg (JpegDecoder * dec)
|
sl@0
|
1116 |
{
|
sl@0
|
1117 |
JpegBits b, *bits = &b;
|
sl@0
|
1118 |
|
sl@0
|
1119 |
bits->ptr = jpeg_standard_tables;
|
sl@0
|
1120 |
bits->idx = 0;
|
sl@0
|
1121 |
bits->end = jpeg_standard_tables + jpeg_standard_tables_size;
|
sl@0
|
1122 |
|
sl@0
|
1123 |
huffman_table_init_jpeg (&dec->dc_huff_table[0], bits);
|
sl@0
|
1124 |
huffman_table_init_jpeg (&dec->ac_huff_table[0], bits);
|
sl@0
|
1125 |
huffman_table_init_jpeg (&dec->dc_huff_table[1], bits);
|
sl@0
|
1126 |
huffman_table_init_jpeg (&dec->ac_huff_table[1], bits);
|
sl@0
|
1127 |
}
|
sl@0
|
1128 |
|
sl@0
|
1129 |
|
sl@0
|
1130 |
|