ReactOS 0.4.16-dev-2613-g9533ad7
jdapimin.c
Go to the documentation of this file.
1/*
2 * jdapimin.c
3 *
4 * Copyright (C) 1994-1998, Thomas G. Lane.
5 * Modified 2009-2020 by Guido Vollbeding.
6 * This file is part of the Independent JPEG Group's software.
7 * For conditions of distribution and use, see the accompanying README file.
8 *
9 * This file contains application interface code for the decompression half
10 * of the JPEG library. These are the "minimum" API routines that may be
11 * needed in either the normal full-decompression case or the
12 * transcoding-only case.
13 *
14 * Most of the routines intended to be called directly by an application
15 * are in this file or in jdapistd.c. But also see jcomapi.c for routines
16 * shared by compression and decompression, and jdtrans.c for the transcoding
17 * case.
18 */
19
20#define JPEG_INTERNALS
21#include "jinclude.h"
22#include "jpeglib.h"
23
24
25/*
26 * Initialization of a JPEG decompression object.
27 * The error manager must already be set up (in case memory manager fails).
28 */
29
30GLOBAL(void)
32{
33 int i;
34
35 /* Guard against version mismatches between library and caller. */
36 cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
38 ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
40 ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
41 (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
42
43 /* For debugging purposes, we zero the whole master structure.
44 * But the application has already set the err pointer, and may have set
45 * client_data, so we have to save and restore those fields.
46 * Note: if application hasn't set client_data, tools like Purify may
47 * complain here.
48 */
49 {
50 struct jpeg_error_mgr * err = cinfo->err;
51 void * client_data = cinfo->client_data; /* ignore Purify complaint here */
53 cinfo->err = err;
54 cinfo->client_data = client_data;
55 }
56 cinfo->is_decompressor = TRUE;
57
58 /* Initialize a memory manager instance for this object */
60
61 /* Zero out pointers to permanent structures. */
62 cinfo->progress = NULL;
63 cinfo->src = NULL;
64
65 for (i = 0; i < NUM_QUANT_TBLS; i++)
66 cinfo->quant_tbl_ptrs[i] = NULL;
67
68 for (i = 0; i < NUM_HUFF_TBLS; i++) {
69 cinfo->dc_huff_tbl_ptrs[i] = NULL;
70 cinfo->ac_huff_tbl_ptrs[i] = NULL;
71 }
72
73 /* Initialize marker processor so application can override methods
74 * for COM, APPn markers before calling jpeg_read_header.
75 */
76 cinfo->marker_list = NULL;
78
79 /* And initialize the overall input controller. */
81
82 /* OK, I'm ready */
83 cinfo->global_state = DSTATE_START;
84}
85
86
87/*
88 * Destruction of a JPEG decompression object
89 */
90
91GLOBAL(void)
93{
94 jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
95}
96
97
98/*
99 * Abort processing of a JPEG decompression operation,
100 * but don't destroy the object itself.
101 */
102
103GLOBAL(void)
105{
106 jpeg_abort((j_common_ptr) cinfo); /* use common routine */
107}
108
109
110/*
111 * Set default decompression parameters.
112 */
113
114LOCAL(void)
116{
117 int cid0, cid1, cid2, cid3;
118
119 /* Guess the input colorspace, and set output colorspace accordingly. */
120 /* Note application may override our guesses. */
121 switch (cinfo->num_components) {
122 case 1:
123 cinfo->jpeg_color_space = JCS_GRAYSCALE;
124 cinfo->out_color_space = JCS_GRAYSCALE;
125 break;
126
127 case 3:
128 cid0 = cinfo->comp_info[0].component_id;
129 cid1 = cinfo->comp_info[1].component_id;
130 cid2 = cinfo->comp_info[2].component_id;
131
132 /* For robust detection of standard colorspaces
133 * regardless of the presence of special markers,
134 * check component IDs from SOF marker first.
135 */
136 if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
137 cinfo->jpeg_color_space = JCS_YCbCr;
138 else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
139 cinfo->jpeg_color_space = JCS_BG_YCC;
140 else if (cid0 == 0x52 && cid1 == 0x47 && cid2 == 0x42)
141 cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
142 else if (cid0 == 0x72 && cid1 == 0x67 && cid2 == 0x62)
143 cinfo->jpeg_color_space = JCS_BG_RGB; /* ASCII 'r', 'g', 'b' */
144 else if (cinfo->saw_JFIF_marker)
145 cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
146 else if (cinfo->saw_Adobe_marker) {
147 switch (cinfo->Adobe_transform) {
148 case 0:
149 cinfo->jpeg_color_space = JCS_RGB;
150 break;
151 case 1:
152 cinfo->jpeg_color_space = JCS_YCbCr;
153 break;
154 default:
155 WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
156 cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
157 }
158 } else {
159 TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
160 cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
161 }
162 /* Always guess RGB is proper output colorspace. */
163 cinfo->out_color_space = JCS_RGB;
164 break;
165
166 case 4:
167 cid0 = cinfo->comp_info[0].component_id;
168 cid1 = cinfo->comp_info[1].component_id;
169 cid2 = cinfo->comp_info[2].component_id;
170 cid3 = cinfo->comp_info[3].component_id;
171
172 /* For robust detection of standard colorspaces
173 * regardless of the presence of special markers,
174 * check component IDs from SOF marker first.
175 */
176 if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03 && cid3 == 0x04)
177 cinfo->jpeg_color_space = JCS_YCCK;
178 else if (cid0 == 0x43 && cid1 == 0x4D && cid2 == 0x59 && cid3 == 0x4B)
179 cinfo->jpeg_color_space = JCS_CMYK; /* ASCII 'C', 'M', 'Y', 'K' */
180 else if (cinfo->saw_Adobe_marker) {
181 switch (cinfo->Adobe_transform) {
182 case 0:
183 cinfo->jpeg_color_space = JCS_CMYK;
184 break;
185 case 2:
186 cinfo->jpeg_color_space = JCS_YCCK;
187 break;
188 default:
189 WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
190 cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
191 }
192 } else {
193 /* Unknown IDs and no special markers, assume straight CMYK. */
194 cinfo->jpeg_color_space = JCS_CMYK;
195 }
196 cinfo->out_color_space = JCS_CMYK;
197 break;
198
199 default:
200 cinfo->jpeg_color_space = JCS_UNKNOWN;
201 cinfo->out_color_space = JCS_UNKNOWN;
202 }
203
204 /* Set defaults for other decompression parameters. */
205 cinfo->scale_num = cinfo->block_size; /* 1:1 scaling */
206 cinfo->scale_denom = cinfo->block_size;
207 cinfo->output_gamma = 1.0;
208 cinfo->buffered_image = FALSE;
209 cinfo->raw_data_out = FALSE;
210 cinfo->dct_method = JDCT_DEFAULT;
211 cinfo->do_fancy_upsampling = TRUE;
212 cinfo->do_block_smoothing = TRUE;
213 cinfo->quantize_colors = FALSE;
214 /* We set these in case application only sets quantize_colors. */
215 cinfo->dither_mode = JDITHER_FS;
216#ifdef QUANT_2PASS_SUPPORTED
217 cinfo->two_pass_quantize = TRUE;
218#else
219 cinfo->two_pass_quantize = FALSE;
220#endif
221 cinfo->desired_number_of_colors = 256;
222 cinfo->colormap = NULL;
223 /* Initialize for no mode change in buffered-image mode. */
224 cinfo->enable_1pass_quant = FALSE;
225 cinfo->enable_external_quant = FALSE;
226 cinfo->enable_2pass_quant = FALSE;
227}
228
229
230/*
231 * Decompression startup: read start of JPEG datastream to see what's there.
232 * Need only initialize JPEG object and supply a data source before calling.
233 *
234 * This routine will read as far as the first SOS marker (ie, actual start of
235 * compressed data), and will save all tables and parameters in the JPEG
236 * object. It will also initialize the decompression parameters to default
237 * values, and finally return JPEG_HEADER_OK. On return, the application may
238 * adjust the decompression parameters and then call jpeg_start_decompress.
239 * (Or, if the application only wanted to determine the image parameters,
240 * the data need not be decompressed. In that case, call jpeg_abort or
241 * jpeg_destroy to release any temporary space.)
242 * If an abbreviated (tables only) datastream is presented, the routine will
243 * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then
244 * re-use the JPEG object to read the abbreviated image datastream(s).
245 * It is unnecessary (but OK) to call jpeg_abort in this case.
246 * The JPEG_SUSPENDED return code only occurs if the data source module
247 * requests suspension of the decompressor. In this case the application
248 * should load more source data and then re-call jpeg_read_header to resume
249 * processing.
250 * If a non-suspending data source is used and require_image is TRUE, then the
251 * return code need not be inspected since only JPEG_HEADER_OK is possible.
252 *
253 * This routine is now just a front end to jpeg_consume_input, with some
254 * extra error checking.
255 */
256
257GLOBAL(int)
259{
260 int retcode;
261
262 if (cinfo->global_state != DSTATE_START &&
263 cinfo->global_state != DSTATE_INHEADER)
264 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
265
266 retcode = jpeg_consume_input(cinfo);
267
268 switch (retcode) {
269 case JPEG_REACHED_SOS:
270 retcode = JPEG_HEADER_OK;
271 break;
272 case JPEG_REACHED_EOI:
273 if (require_image) /* Complain if application wanted an image */
274 ERREXIT(cinfo, JERR_NO_IMAGE);
275 /* Reset to start state; it would be safer to require the application to
276 * call jpeg_abort, but we can't change it now for compatibility reasons.
277 * A side effect is to free any temporary memory (there shouldn't be any).
278 */
279 jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
280 retcode = JPEG_HEADER_TABLES_ONLY;
281 break;
282 case JPEG_SUSPENDED:
283 /* no work */
284 break;
285 }
286
287 return retcode;
288}
289
290
291/*
292 * Consume data in advance of what the decompressor requires.
293 * This can be called at any time once the decompressor object has
294 * been created and a data source has been set up.
295 *
296 * This routine is essentially a state machine that handles a couple
297 * of critical state-transition actions, namely initial setup and
298 * transition from header scanning to ready-for-start_decompress.
299 * All the actual input is done via the input controller's consume_input
300 * method.
301 */
302
303GLOBAL(int)
305{
306 int retcode = JPEG_SUSPENDED;
307
308 /* NB: every possible DSTATE value should be listed in this switch */
309 switch (cinfo->global_state) {
310 case DSTATE_START:
311 /* Start-of-datastream actions: reset appropriate modules */
312 (*cinfo->inputctl->reset_input_controller) (cinfo);
313 /* Initialize application's data source module */
314 (*cinfo->src->init_source) (cinfo);
315 cinfo->global_state = DSTATE_INHEADER;
316 /*FALLTHROUGH*/
317 case DSTATE_INHEADER:
318 retcode = (*cinfo->inputctl->consume_input) (cinfo);
319 if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
320 /* Set up default parameters based on header data */
322 /* Set global state: ready for start_decompress */
323 cinfo->global_state = DSTATE_READY;
324 }
325 break;
326 case DSTATE_READY:
327 /* Can't advance past first SOS until start_decompress is called */
328 retcode = JPEG_REACHED_SOS;
329 break;
330 case DSTATE_PRELOAD:
331 case DSTATE_PRESCAN:
332 case DSTATE_SCANNING:
333 case DSTATE_RAW_OK:
334 case DSTATE_BUFIMAGE:
335 case DSTATE_BUFPOST:
336 case DSTATE_STOPPING:
337 retcode = (*cinfo->inputctl->consume_input) (cinfo);
338 break;
339 default:
340 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
341 }
342 return retcode;
343}
344
345
346/*
347 * Have we finished reading the input file?
348 */
349
350GLOBAL(boolean)
352{
353 /* Check for valid jpeg object */
354 if (cinfo->global_state < DSTATE_START ||
355 cinfo->global_state > DSTATE_STOPPING)
356 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
357 return cinfo->inputctl->eoi_reached;
358}
359
360
361/*
362 * Is there more than one scan?
363 */
364
365GLOBAL(boolean)
367{
368 /* Only valid after jpeg_read_header completes */
369 if (cinfo->global_state < DSTATE_READY ||
370 cinfo->global_state > DSTATE_STOPPING)
371 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
372 return cinfo->inputctl->has_multiple_scans;
373}
374
375
376/*
377 * Finish JPEG decompression.
378 *
379 * This will normally just verify the file trailer and release temp storage.
380 *
381 * Returns FALSE if suspended. The return value need be inspected only if
382 * a suspending data source is used.
383 */
384
385GLOBAL(boolean)
387{
388 if ((cinfo->global_state == DSTATE_SCANNING ||
389 cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
390 /* Terminate final pass of non-buffered mode */
391 if (cinfo->output_scanline < cinfo->output_height)
392 ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
393 (*cinfo->master->finish_output_pass) (cinfo);
394 cinfo->global_state = DSTATE_STOPPING;
395 } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
396 /* Finishing after a buffered-image operation */
397 cinfo->global_state = DSTATE_STOPPING;
398 } else if (cinfo->global_state != DSTATE_STOPPING) {
399 /* STOPPING = repeat call after a suspension, anything else is error */
400 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
401 }
402 /* Read until EOI */
403 while (! cinfo->inputctl->eoi_reached) {
404 if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
405 return FALSE; /* Suspend, come back later */
406 }
407 /* Do final cleanup */
408 (*cinfo->src->term_source) (cinfo);
409 /* We can use jpeg_abort to release memory and reset global_state */
410 jpeg_abort((j_common_ptr) cinfo);
411 return TRUE;
412}
#define SIZEOF(_ar)
Definition: calc.h:97
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR version[]
Definition: asmname.c:66
for(i=0;i< ARRAY_SIZE(offsets);i++)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
jpeg_abort(j_common_ptr cinfo)
Definition: jcomapi.c:30
jpeg_destroy(j_common_ptr cinfo)
Definition: jcomapi.c:70
jpeg_CreateDecompress(j_decompress_ptr cinfo, int version, size_t structsize)
Definition: jdapimin.c:31
default_decompress_parms(j_decompress_ptr cinfo)
Definition: jdapimin.c:115
jpeg_abort_decompress(j_decompress_ptr cinfo)
Definition: jdapimin.c:104
jpeg_consume_input(j_decompress_ptr cinfo)
Definition: jdapimin.c:304
jpeg_destroy_decompress(j_decompress_ptr cinfo)
Definition: jdapimin.c:92
jpeg_has_multiple_scans(j_decompress_ptr cinfo)
Definition: jdapimin.c:366
jpeg_finish_decompress(j_decompress_ptr cinfo)
Definition: jdapimin.c:386
jpeg_read_header(j_decompress_ptr cinfo, boolean require_image)
Definition: jdapimin.c:258
jpeg_input_complete(j_decompress_ptr cinfo)
Definition: jdapimin.c:351
jinit_input_controller(j_decompress_ptr cinfo)
Definition: jdinput.c:638
jinit_marker_reader(j_decompress_ptr cinfo)
Definition: jdmarker.c:1408
#define WARNMS1(cinfo, code, p1)
Definition: jerror.h:254
#define ERREXIT1(cinfo, code, p1)
Definition: jerror.h:212
#define ERREXIT2(cinfo, code, p1, p2)
Definition: jerror.h:216
#define TRACEMS3(cinfo, lvl, code, p1, p2, p3)
Definition: jerror.h:277
jinit_memory_mgr(j_common_ptr cinfo)
Definition: jmemmgr.c:1025
#define LOCAL(type)
Definition: jmorecfg.h:325
#define GLOBAL(type)
Definition: jmorecfg.h:327
#define DSTATE_BUFIMAGE
Definition: jpegint.h:37
#define DSTATE_INHEADER
Definition: jpegint.h:31
#define DSTATE_READY
Definition: jpegint.h:32
#define DSTATE_START
Definition: jpegint.h:30
#define DSTATE_PRELOAD
Definition: jpegint.h:33
#define DSTATE_PRESCAN
Definition: jpegint.h:34
#define DSTATE_SCANNING
Definition: jpegint.h:35
#define DSTATE_RAW_OK
Definition: jpegint.h:36
#define DSTATE_BUFPOST
Definition: jpegint.h:38
#define DSTATE_STOPPING
Definition: jpegint.h:40
#define JPEG_HEADER_TABLES_ONLY
Definition: jpeglib.h:1049
#define JDCT_DEFAULT
Definition: jpeglib.h:247
@ JDITHER_FS
Definition: jpeglib.h:258
#define JPEG_REACHED_SOS
Definition: jpeglib.h:1078
#define NUM_HUFF_TBLS
Definition: jpeglib.h:53
@ JCS_YCCK
Definition: jpeglib.h:226
@ JCS_BG_RGB
Definition: jpeglib.h:227
@ JCS_BG_YCC
Definition: jpeglib.h:228
@ JCS_UNKNOWN
Definition: jpeglib.h:221
@ JCS_YCbCr
Definition: jpeglib.h:224
@ JCS_CMYK
Definition: jpeglib.h:225
@ JCS_GRAYSCALE
Definition: jpeglib.h:222
@ JCS_RGB
Definition: jpeglib.h:223
int size_t structsize
Definition: jpeglib.h:968
boolean require_image
Definition: jpeglib.h:1045
#define JPEG_REACHED_EOI
Definition: jpeglib.h:1079
#define NUM_QUANT_TBLS
Definition: jpeglib.h:52
#define JPEG_LIB_VERSION
Definition: jpeglib.h:40
#define JPEG_HEADER_OK
Definition: jpeglib.h:1048
#define JPEG_SUSPENDED
Definition: jpeglib.h:1047
#define ERREXIT(msg)
Definition: rdjpgcom.c:72
#define err(...)
#define MEMZERO(addr, type, size)
Definition: svc_dg.c:324