17dd7cddfSDavid du Colombier /*
27dd7cddfSDavid du Colombier * jdapimin.c
37dd7cddfSDavid du Colombier *
4*593dc095SDavid du Colombier * Copyright (C) 1994-1998, Thomas G. Lane.
57dd7cddfSDavid du Colombier * This file is part of the Independent JPEG Group's software.
67dd7cddfSDavid du Colombier * For conditions of distribution and use, see the accompanying README file.
77dd7cddfSDavid du Colombier *
87dd7cddfSDavid du Colombier * This file contains application interface code for the decompression half
97dd7cddfSDavid du Colombier * of the JPEG library. These are the "minimum" API routines that may be
107dd7cddfSDavid du Colombier * needed in either the normal full-decompression case or the
117dd7cddfSDavid du Colombier * transcoding-only case.
127dd7cddfSDavid du Colombier *
137dd7cddfSDavid du Colombier * Most of the routines intended to be called directly by an application
147dd7cddfSDavid du Colombier * are in this file or in jdapistd.c. But also see jcomapi.c for routines
157dd7cddfSDavid du Colombier * shared by compression and decompression, and jdtrans.c for the transcoding
167dd7cddfSDavid du Colombier * case.
177dd7cddfSDavid du Colombier */
187dd7cddfSDavid du Colombier
197dd7cddfSDavid du Colombier #define JPEG_INTERNALS
207dd7cddfSDavid du Colombier #include "jinclude.h"
217dd7cddfSDavid du Colombier #include "jpeglib.h"
227dd7cddfSDavid du Colombier
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier /*
257dd7cddfSDavid du Colombier * Initialization of a JPEG decompression object.
267dd7cddfSDavid du Colombier * The error manager must already be set up (in case memory manager fails).
277dd7cddfSDavid du Colombier */
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier GLOBAL(void)
jpeg_CreateDecompress(j_decompress_ptr cinfo,int version,size_t structsize)307dd7cddfSDavid du Colombier jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
317dd7cddfSDavid du Colombier {
327dd7cddfSDavid du Colombier int i;
337dd7cddfSDavid du Colombier
347dd7cddfSDavid du Colombier /* Guard against version mismatches between library and caller. */
357dd7cddfSDavid du Colombier cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
367dd7cddfSDavid du Colombier if (version != JPEG_LIB_VERSION)
377dd7cddfSDavid du Colombier ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
387dd7cddfSDavid du Colombier if (structsize != SIZEOF(struct jpeg_decompress_struct))
397dd7cddfSDavid du Colombier ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
407dd7cddfSDavid du Colombier (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
417dd7cddfSDavid du Colombier
42*593dc095SDavid du Colombier /* For debugging purposes, we zero the whole master structure.
43*593dc095SDavid du Colombier * But the application has already set the err pointer, and may have set
44*593dc095SDavid du Colombier * client_data, so we have to save and restore those fields.
45*593dc095SDavid du Colombier * Note: if application hasn't set client_data, tools like Purify may
46*593dc095SDavid du Colombier * complain here.
477dd7cddfSDavid du Colombier */
487dd7cddfSDavid du Colombier {
497dd7cddfSDavid du Colombier struct jpeg_error_mgr * err = cinfo->err;
50*593dc095SDavid du Colombier void * client_data = cinfo->client_data; /* ignore Purify complaint here */
517dd7cddfSDavid du Colombier MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
527dd7cddfSDavid du Colombier cinfo->err = err;
53*593dc095SDavid du Colombier cinfo->client_data = client_data;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier cinfo->is_decompressor = TRUE;
567dd7cddfSDavid du Colombier
577dd7cddfSDavid du Colombier /* Initialize a memory manager instance for this object */
587dd7cddfSDavid du Colombier jinit_memory_mgr((j_common_ptr) cinfo);
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier /* Zero out pointers to permanent structures. */
617dd7cddfSDavid du Colombier cinfo->progress = NULL;
627dd7cddfSDavid du Colombier cinfo->src = NULL;
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier for (i = 0; i < NUM_QUANT_TBLS; i++)
657dd7cddfSDavid du Colombier cinfo->quant_tbl_ptrs[i] = NULL;
667dd7cddfSDavid du Colombier
677dd7cddfSDavid du Colombier for (i = 0; i < NUM_HUFF_TBLS; i++) {
687dd7cddfSDavid du Colombier cinfo->dc_huff_tbl_ptrs[i] = NULL;
697dd7cddfSDavid du Colombier cinfo->ac_huff_tbl_ptrs[i] = NULL;
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier
727dd7cddfSDavid du Colombier /* Initialize marker processor so application can override methods
737dd7cddfSDavid du Colombier * for COM, APPn markers before calling jpeg_read_header.
747dd7cddfSDavid du Colombier */
75*593dc095SDavid du Colombier cinfo->marker_list = NULL;
767dd7cddfSDavid du Colombier jinit_marker_reader(cinfo);
777dd7cddfSDavid du Colombier
787dd7cddfSDavid du Colombier /* And initialize the overall input controller. */
797dd7cddfSDavid du Colombier jinit_input_controller(cinfo);
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier /* OK, I'm ready */
827dd7cddfSDavid du Colombier cinfo->global_state = DSTATE_START;
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier
857dd7cddfSDavid du Colombier
867dd7cddfSDavid du Colombier /*
877dd7cddfSDavid du Colombier * Destruction of a JPEG decompression object
887dd7cddfSDavid du Colombier */
897dd7cddfSDavid du Colombier
907dd7cddfSDavid du Colombier GLOBAL(void)
jpeg_destroy_decompress(j_decompress_ptr cinfo)917dd7cddfSDavid du Colombier jpeg_destroy_decompress (j_decompress_ptr cinfo)
927dd7cddfSDavid du Colombier {
937dd7cddfSDavid du Colombier jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
947dd7cddfSDavid du Colombier }
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier
977dd7cddfSDavid du Colombier /*
987dd7cddfSDavid du Colombier * Abort processing of a JPEG decompression operation,
997dd7cddfSDavid du Colombier * but don't destroy the object itself.
1007dd7cddfSDavid du Colombier */
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier GLOBAL(void)
jpeg_abort_decompress(j_decompress_ptr cinfo)1037dd7cddfSDavid du Colombier jpeg_abort_decompress (j_decompress_ptr cinfo)
1047dd7cddfSDavid du Colombier {
1057dd7cddfSDavid du Colombier jpeg_abort((j_common_ptr) cinfo); /* use common routine */
1067dd7cddfSDavid du Colombier }
1077dd7cddfSDavid du Colombier
1087dd7cddfSDavid du Colombier
1097dd7cddfSDavid du Colombier /*
1107dd7cddfSDavid du Colombier * Set default decompression parameters.
1117dd7cddfSDavid du Colombier */
1127dd7cddfSDavid du Colombier
1137dd7cddfSDavid du Colombier LOCAL(void)
default_decompress_parms(j_decompress_ptr cinfo)1147dd7cddfSDavid du Colombier default_decompress_parms (j_decompress_ptr cinfo)
1157dd7cddfSDavid du Colombier {
1167dd7cddfSDavid du Colombier /* Guess the input colorspace, and set output colorspace accordingly. */
1177dd7cddfSDavid du Colombier /* (Wish JPEG committee had provided a real way to specify this...) */
1187dd7cddfSDavid du Colombier /* Note application may override our guesses. */
1197dd7cddfSDavid du Colombier switch (cinfo->num_components) {
1207dd7cddfSDavid du Colombier case 1:
1217dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_GRAYSCALE;
1227dd7cddfSDavid du Colombier cinfo->out_color_space = JCS_GRAYSCALE;
1237dd7cddfSDavid du Colombier break;
1247dd7cddfSDavid du Colombier
1257dd7cddfSDavid du Colombier case 3:
1267dd7cddfSDavid du Colombier if (cinfo->saw_JFIF_marker) {
1277dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
1287dd7cddfSDavid du Colombier } else if (cinfo->saw_Adobe_marker) {
1297dd7cddfSDavid du Colombier switch (cinfo->Adobe_transform) {
1307dd7cddfSDavid du Colombier case 0:
1317dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_RGB;
1327dd7cddfSDavid du Colombier break;
1337dd7cddfSDavid du Colombier case 1:
1347dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCbCr;
1357dd7cddfSDavid du Colombier break;
1367dd7cddfSDavid du Colombier default:
1377dd7cddfSDavid du Colombier WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
1387dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
1397dd7cddfSDavid du Colombier break;
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier } else {
1427dd7cddfSDavid du Colombier /* Saw no special markers, try to guess from the component IDs */
1437dd7cddfSDavid du Colombier int cid0 = cinfo->comp_info[0].component_id;
1447dd7cddfSDavid du Colombier int cid1 = cinfo->comp_info[1].component_id;
1457dd7cddfSDavid du Colombier int cid2 = cinfo->comp_info[2].component_id;
1467dd7cddfSDavid du Colombier
1477dd7cddfSDavid du Colombier if (cid0 == 1 && cid1 == 2 && cid2 == 3)
1487dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
1497dd7cddfSDavid du Colombier else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
1507dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
1517dd7cddfSDavid du Colombier else {
1527dd7cddfSDavid du Colombier TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
1537dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
1547dd7cddfSDavid du Colombier }
1557dd7cddfSDavid du Colombier }
1567dd7cddfSDavid du Colombier /* Always guess RGB is proper output colorspace. */
1577dd7cddfSDavid du Colombier cinfo->out_color_space = JCS_RGB;
1587dd7cddfSDavid du Colombier break;
1597dd7cddfSDavid du Colombier
1607dd7cddfSDavid du Colombier case 4:
1617dd7cddfSDavid du Colombier if (cinfo->saw_Adobe_marker) {
1627dd7cddfSDavid du Colombier switch (cinfo->Adobe_transform) {
1637dd7cddfSDavid du Colombier case 0:
1647dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_CMYK;
1657dd7cddfSDavid du Colombier break;
1667dd7cddfSDavid du Colombier case 2:
1677dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCCK;
1687dd7cddfSDavid du Colombier break;
1697dd7cddfSDavid du Colombier default:
1707dd7cddfSDavid du Colombier WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
1717dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
1727dd7cddfSDavid du Colombier break;
1737dd7cddfSDavid du Colombier }
1747dd7cddfSDavid du Colombier } else {
1757dd7cddfSDavid du Colombier /* No special markers, assume straight CMYK. */
1767dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_CMYK;
1777dd7cddfSDavid du Colombier }
1787dd7cddfSDavid du Colombier cinfo->out_color_space = JCS_CMYK;
1797dd7cddfSDavid du Colombier break;
1807dd7cddfSDavid du Colombier
1817dd7cddfSDavid du Colombier default:
1827dd7cddfSDavid du Colombier cinfo->jpeg_color_space = JCS_UNKNOWN;
1837dd7cddfSDavid du Colombier cinfo->out_color_space = JCS_UNKNOWN;
1847dd7cddfSDavid du Colombier break;
1857dd7cddfSDavid du Colombier }
1867dd7cddfSDavid du Colombier
1877dd7cddfSDavid du Colombier /* Set defaults for other decompression parameters. */
1887dd7cddfSDavid du Colombier cinfo->scale_num = 1; /* 1:1 scaling */
1897dd7cddfSDavid du Colombier cinfo->scale_denom = 1;
1907dd7cddfSDavid du Colombier cinfo->output_gamma = 1.0;
1917dd7cddfSDavid du Colombier cinfo->buffered_image = FALSE;
1927dd7cddfSDavid du Colombier cinfo->raw_data_out = FALSE;
1937dd7cddfSDavid du Colombier cinfo->dct_method = JDCT_DEFAULT;
1947dd7cddfSDavid du Colombier cinfo->do_fancy_upsampling = TRUE;
1957dd7cddfSDavid du Colombier cinfo->do_block_smoothing = TRUE;
1967dd7cddfSDavid du Colombier cinfo->quantize_colors = FALSE;
1977dd7cddfSDavid du Colombier /* We set these in case application only sets quantize_colors. */
1987dd7cddfSDavid du Colombier cinfo->dither_mode = JDITHER_FS;
1997dd7cddfSDavid du Colombier #ifdef QUANT_2PASS_SUPPORTED
2007dd7cddfSDavid du Colombier cinfo->two_pass_quantize = TRUE;
2017dd7cddfSDavid du Colombier #else
2027dd7cddfSDavid du Colombier cinfo->two_pass_quantize = FALSE;
2037dd7cddfSDavid du Colombier #endif
2047dd7cddfSDavid du Colombier cinfo->desired_number_of_colors = 256;
2057dd7cddfSDavid du Colombier cinfo->colormap = NULL;
2067dd7cddfSDavid du Colombier /* Initialize for no mode change in buffered-image mode. */
2077dd7cddfSDavid du Colombier cinfo->enable_1pass_quant = FALSE;
2087dd7cddfSDavid du Colombier cinfo->enable_external_quant = FALSE;
2097dd7cddfSDavid du Colombier cinfo->enable_2pass_quant = FALSE;
2107dd7cddfSDavid du Colombier }
2117dd7cddfSDavid du Colombier
2127dd7cddfSDavid du Colombier
2137dd7cddfSDavid du Colombier /*
2147dd7cddfSDavid du Colombier * Decompression startup: read start of JPEG datastream to see what's there.
2157dd7cddfSDavid du Colombier * Need only initialize JPEG object and supply a data source before calling.
2167dd7cddfSDavid du Colombier *
2177dd7cddfSDavid du Colombier * This routine will read as far as the first SOS marker (ie, actual start of
2187dd7cddfSDavid du Colombier * compressed data), and will save all tables and parameters in the JPEG
2197dd7cddfSDavid du Colombier * object. It will also initialize the decompression parameters to default
2207dd7cddfSDavid du Colombier * values, and finally return JPEG_HEADER_OK. On return, the application may
2217dd7cddfSDavid du Colombier * adjust the decompression parameters and then call jpeg_start_decompress.
2227dd7cddfSDavid du Colombier * (Or, if the application only wanted to determine the image parameters,
2237dd7cddfSDavid du Colombier * the data need not be decompressed. In that case, call jpeg_abort or
2247dd7cddfSDavid du Colombier * jpeg_destroy to release any temporary space.)
2257dd7cddfSDavid du Colombier * If an abbreviated (tables only) datastream is presented, the routine will
2267dd7cddfSDavid du Colombier * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then
2277dd7cddfSDavid du Colombier * re-use the JPEG object to read the abbreviated image datastream(s).
2287dd7cddfSDavid du Colombier * It is unnecessary (but OK) to call jpeg_abort in this case.
2297dd7cddfSDavid du Colombier * The JPEG_SUSPENDED return code only occurs if the data source module
2307dd7cddfSDavid du Colombier * requests suspension of the decompressor. In this case the application
2317dd7cddfSDavid du Colombier * should load more source data and then re-call jpeg_read_header to resume
2327dd7cddfSDavid du Colombier * processing.
2337dd7cddfSDavid du Colombier * If a non-suspending data source is used and require_image is TRUE, then the
2347dd7cddfSDavid du Colombier * return code need not be inspected since only JPEG_HEADER_OK is possible.
2357dd7cddfSDavid du Colombier *
2367dd7cddfSDavid du Colombier * This routine is now just a front end to jpeg_consume_input, with some
2377dd7cddfSDavid du Colombier * extra error checking.
2387dd7cddfSDavid du Colombier */
2397dd7cddfSDavid du Colombier
2407dd7cddfSDavid du Colombier GLOBAL(int)
jpeg_read_header(j_decompress_ptr cinfo,boolean require_image)2417dd7cddfSDavid du Colombier jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
2427dd7cddfSDavid du Colombier {
2437dd7cddfSDavid du Colombier int retcode;
2447dd7cddfSDavid du Colombier
2457dd7cddfSDavid du Colombier if (cinfo->global_state != DSTATE_START &&
2467dd7cddfSDavid du Colombier cinfo->global_state != DSTATE_INHEADER)
2477dd7cddfSDavid du Colombier ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
2487dd7cddfSDavid du Colombier
2497dd7cddfSDavid du Colombier retcode = jpeg_consume_input(cinfo);
2507dd7cddfSDavid du Colombier
2517dd7cddfSDavid du Colombier switch (retcode) {
2527dd7cddfSDavid du Colombier case JPEG_REACHED_SOS:
2537dd7cddfSDavid du Colombier retcode = JPEG_HEADER_OK;
2547dd7cddfSDavid du Colombier break;
2557dd7cddfSDavid du Colombier case JPEG_REACHED_EOI:
2567dd7cddfSDavid du Colombier if (require_image) /* Complain if application wanted an image */
2577dd7cddfSDavid du Colombier ERREXIT(cinfo, JERR_NO_IMAGE);
2587dd7cddfSDavid du Colombier /* Reset to start state; it would be safer to require the application to
2597dd7cddfSDavid du Colombier * call jpeg_abort, but we can't change it now for compatibility reasons.
2607dd7cddfSDavid du Colombier * A side effect is to free any temporary memory (there shouldn't be any).
2617dd7cddfSDavid du Colombier */
2627dd7cddfSDavid du Colombier jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
2637dd7cddfSDavid du Colombier retcode = JPEG_HEADER_TABLES_ONLY;
2647dd7cddfSDavid du Colombier break;
2657dd7cddfSDavid du Colombier case JPEG_SUSPENDED:
2667dd7cddfSDavid du Colombier /* no work */
2677dd7cddfSDavid du Colombier break;
2687dd7cddfSDavid du Colombier }
2697dd7cddfSDavid du Colombier
2707dd7cddfSDavid du Colombier return retcode;
2717dd7cddfSDavid du Colombier }
2727dd7cddfSDavid du Colombier
2737dd7cddfSDavid du Colombier
2747dd7cddfSDavid du Colombier /*
2757dd7cddfSDavid du Colombier * Consume data in advance of what the decompressor requires.
2767dd7cddfSDavid du Colombier * This can be called at any time once the decompressor object has
2777dd7cddfSDavid du Colombier * been created and a data source has been set up.
2787dd7cddfSDavid du Colombier *
2797dd7cddfSDavid du Colombier * This routine is essentially a state machine that handles a couple
2807dd7cddfSDavid du Colombier * of critical state-transition actions, namely initial setup and
2817dd7cddfSDavid du Colombier * transition from header scanning to ready-for-start_decompress.
2827dd7cddfSDavid du Colombier * All the actual input is done via the input controller's consume_input
2837dd7cddfSDavid du Colombier * method.
2847dd7cddfSDavid du Colombier */
2857dd7cddfSDavid du Colombier
2867dd7cddfSDavid du Colombier GLOBAL(int)
jpeg_consume_input(j_decompress_ptr cinfo)2877dd7cddfSDavid du Colombier jpeg_consume_input (j_decompress_ptr cinfo)
2887dd7cddfSDavid du Colombier {
2897dd7cddfSDavid du Colombier int retcode = JPEG_SUSPENDED;
2907dd7cddfSDavid du Colombier
2917dd7cddfSDavid du Colombier /* NB: every possible DSTATE value should be listed in this switch */
2927dd7cddfSDavid du Colombier switch (cinfo->global_state) {
2937dd7cddfSDavid du Colombier case DSTATE_START:
2947dd7cddfSDavid du Colombier /* Start-of-datastream actions: reset appropriate modules */
2957dd7cddfSDavid du Colombier (*cinfo->inputctl->reset_input_controller) (cinfo);
2967dd7cddfSDavid du Colombier /* Initialize application's data source module */
2977dd7cddfSDavid du Colombier (*cinfo->src->init_source) (cinfo);
2987dd7cddfSDavid du Colombier cinfo->global_state = DSTATE_INHEADER;
2997dd7cddfSDavid du Colombier /*FALLTHROUGH*/
3007dd7cddfSDavid du Colombier case DSTATE_INHEADER:
3017dd7cddfSDavid du Colombier retcode = (*cinfo->inputctl->consume_input) (cinfo);
3027dd7cddfSDavid du Colombier if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
3037dd7cddfSDavid du Colombier /* Set up default parameters based on header data */
3047dd7cddfSDavid du Colombier default_decompress_parms(cinfo);
3057dd7cddfSDavid du Colombier /* Set global state: ready for start_decompress */
3067dd7cddfSDavid du Colombier cinfo->global_state = DSTATE_READY;
3077dd7cddfSDavid du Colombier }
3087dd7cddfSDavid du Colombier break;
3097dd7cddfSDavid du Colombier case DSTATE_READY:
3107dd7cddfSDavid du Colombier /* Can't advance past first SOS until start_decompress is called */
3117dd7cddfSDavid du Colombier retcode = JPEG_REACHED_SOS;
3127dd7cddfSDavid du Colombier break;
3137dd7cddfSDavid du Colombier case DSTATE_PRELOAD:
3147dd7cddfSDavid du Colombier case DSTATE_PRESCAN:
3157dd7cddfSDavid du Colombier case DSTATE_SCANNING:
3167dd7cddfSDavid du Colombier case DSTATE_RAW_OK:
3177dd7cddfSDavid du Colombier case DSTATE_BUFIMAGE:
3187dd7cddfSDavid du Colombier case DSTATE_BUFPOST:
3197dd7cddfSDavid du Colombier case DSTATE_STOPPING:
3207dd7cddfSDavid du Colombier retcode = (*cinfo->inputctl->consume_input) (cinfo);
3217dd7cddfSDavid du Colombier break;
3227dd7cddfSDavid du Colombier default:
3237dd7cddfSDavid du Colombier ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
3247dd7cddfSDavid du Colombier }
3257dd7cddfSDavid du Colombier return retcode;
3267dd7cddfSDavid du Colombier }
3277dd7cddfSDavid du Colombier
3287dd7cddfSDavid du Colombier
3297dd7cddfSDavid du Colombier /*
3307dd7cddfSDavid du Colombier * Have we finished reading the input file?
3317dd7cddfSDavid du Colombier */
3327dd7cddfSDavid du Colombier
3337dd7cddfSDavid du Colombier GLOBAL(boolean)
jpeg_input_complete(j_decompress_ptr cinfo)3347dd7cddfSDavid du Colombier jpeg_input_complete (j_decompress_ptr cinfo)
3357dd7cddfSDavid du Colombier {
3367dd7cddfSDavid du Colombier /* Check for valid jpeg object */
3377dd7cddfSDavid du Colombier if (cinfo->global_state < DSTATE_START ||
3387dd7cddfSDavid du Colombier cinfo->global_state > DSTATE_STOPPING)
3397dd7cddfSDavid du Colombier ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
3407dd7cddfSDavid du Colombier return cinfo->inputctl->eoi_reached;
3417dd7cddfSDavid du Colombier }
3427dd7cddfSDavid du Colombier
3437dd7cddfSDavid du Colombier
3447dd7cddfSDavid du Colombier /*
3457dd7cddfSDavid du Colombier * Is there more than one scan?
3467dd7cddfSDavid du Colombier */
3477dd7cddfSDavid du Colombier
3487dd7cddfSDavid du Colombier GLOBAL(boolean)
jpeg_has_multiple_scans(j_decompress_ptr cinfo)3497dd7cddfSDavid du Colombier jpeg_has_multiple_scans (j_decompress_ptr cinfo)
3507dd7cddfSDavid du Colombier {
3517dd7cddfSDavid du Colombier /* Only valid after jpeg_read_header completes */
3527dd7cddfSDavid du Colombier if (cinfo->global_state < DSTATE_READY ||
3537dd7cddfSDavid du Colombier cinfo->global_state > DSTATE_STOPPING)
3547dd7cddfSDavid du Colombier ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
3557dd7cddfSDavid du Colombier return cinfo->inputctl->has_multiple_scans;
3567dd7cddfSDavid du Colombier }
3577dd7cddfSDavid du Colombier
3587dd7cddfSDavid du Colombier
3597dd7cddfSDavid du Colombier /*
3607dd7cddfSDavid du Colombier * Finish JPEG decompression.
3617dd7cddfSDavid du Colombier *
3627dd7cddfSDavid du Colombier * This will normally just verify the file trailer and release temp storage.
3637dd7cddfSDavid du Colombier *
3647dd7cddfSDavid du Colombier * Returns FALSE if suspended. The return value need be inspected only if
3657dd7cddfSDavid du Colombier * a suspending data source is used.
3667dd7cddfSDavid du Colombier */
3677dd7cddfSDavid du Colombier
3687dd7cddfSDavid du Colombier GLOBAL(boolean)
jpeg_finish_decompress(j_decompress_ptr cinfo)3697dd7cddfSDavid du Colombier jpeg_finish_decompress (j_decompress_ptr cinfo)
3707dd7cddfSDavid du Colombier {
3717dd7cddfSDavid du Colombier if ((cinfo->global_state == DSTATE_SCANNING ||
3727dd7cddfSDavid du Colombier cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
3737dd7cddfSDavid du Colombier /* Terminate final pass of non-buffered mode */
3747dd7cddfSDavid du Colombier if (cinfo->output_scanline < cinfo->output_height)
3757dd7cddfSDavid du Colombier ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
3767dd7cddfSDavid du Colombier (*cinfo->master->finish_output_pass) (cinfo);
3777dd7cddfSDavid du Colombier cinfo->global_state = DSTATE_STOPPING;
3787dd7cddfSDavid du Colombier } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
3797dd7cddfSDavid du Colombier /* Finishing after a buffered-image operation */
3807dd7cddfSDavid du Colombier cinfo->global_state = DSTATE_STOPPING;
3817dd7cddfSDavid du Colombier } else if (cinfo->global_state != DSTATE_STOPPING) {
3827dd7cddfSDavid du Colombier /* STOPPING = repeat call after a suspension, anything else is error */
3837dd7cddfSDavid du Colombier ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
3847dd7cddfSDavid du Colombier }
3857dd7cddfSDavid du Colombier /* Read until EOI */
3867dd7cddfSDavid du Colombier while (! cinfo->inputctl->eoi_reached) {
3877dd7cddfSDavid du Colombier if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
3887dd7cddfSDavid du Colombier return FALSE; /* Suspend, come back later */
3897dd7cddfSDavid du Colombier }
3907dd7cddfSDavid du Colombier /* Do final cleanup */
3917dd7cddfSDavid du Colombier (*cinfo->src->term_source) (cinfo);
3927dd7cddfSDavid du Colombier /* We can use jpeg_abort to release memory and reset global_state */
3937dd7cddfSDavid du Colombier jpeg_abort((j_common_ptr) cinfo);
3947dd7cddfSDavid du Colombier return TRUE;
3957dd7cddfSDavid du Colombier }
396