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