1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * jdmaster.c
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (C) 1991-1997, Thomas G. Lane.
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Modified 2002-2011 by Guido Vollbeding.
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file is part of the Independent JPEG Group's software.
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For conditions of distribution and use, see the accompanying README file.
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file contains master control logic for the JPEG decompressor.
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * These routines are concerned with selecting the modules to be executed
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and with determining the number of passes and the work to be done in each
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * pass.
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define JPEG_INTERNALS
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jinclude.h"
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jpeglib.h"
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Private state */
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct {
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  struct jpeg_decomp_master pub; /* public fields */
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int pass_number;		/* # of passes completed */
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Saved references to initialized quantizer modules,
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * in case we need to switch modes.
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   */
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  struct jpeg_color_quantizer * quantizer_1pass;
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  struct jpeg_color_quantizer * quantizer_2pass;
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} my_decomp_master;
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef my_decomp_master * my_master_ptr;
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Determine whether merged upsample/color conversion should be used.
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * CRUCIAL: this must match the actual capabilities of jdmerge.c!
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(boolean)
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presleruse_merged_upsample (j_decompress_ptr cinfo)
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef UPSAMPLE_MERGING_SUPPORTED
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Merging is the equivalent of plain box-filter upsampling */
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return FALSE;
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* jdmerge.c only supports YCC=>RGB color conversion */
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->out_color_space != JCS_RGB ||
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->out_color_components != RGB_PIXELSIZE)
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return FALSE;
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* and it only handles 2h1v or 2h2v sampling ratios */
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->comp_info[0].h_samp_factor != 2 ||
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[1].h_samp_factor != 1 ||
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[2].h_samp_factor != 1 ||
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[0].v_samp_factor >  2 ||
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[1].v_samp_factor != 1 ||
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[2].v_samp_factor != 1)
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return FALSE;
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* furthermore, it doesn't work if we've scaled the IDCTs differently */
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->comp_info[0].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size ||
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size ||
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size)
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return FALSE;
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* ??? also need to test for upsample-time rescaling, when & if supported */
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;			/* by golly, it'll work... */
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return FALSE;
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Compute output image dimensions and related values.
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * NOTE: this is exported for possible use by application.
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Hence it mustn't do anything that can't be done twice.
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Also note that it may be called before the master module is initialized!
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void)
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjpeg_calc_output_dimensions (j_decompress_ptr cinfo)
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Do computations that are needed before master selection phase.
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This function is used for full decompression.
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef IDCT_SCALING_SUPPORTED
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int ci;
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_component_info *compptr;
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Prevent application from calling me at wrong times */
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->global_state != DSTATE_READY)
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Compute core output image dimensions and DCT scaling choices. */
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_core_output_dimensions(cinfo);
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef IDCT_SCALING_SUPPORTED
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* In selecting the actual DCT scaling for each component, we try to
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * scale up the chroma components via IDCT scaling rather than upsampling.
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * This saves time if the upsampler gets to use 1:1 scaling.
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * Note this code adapts subsampling ratios which are powers of 2.
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   */
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       ci++, compptr++) {
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int ssize = 1;
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (cinfo->min_DCT_h_scaled_size * ssize <=
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ssize = ssize * 2;
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ssize = 1;
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (cinfo->min_DCT_v_scaled_size * ssize <=
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ssize = ssize * 2;
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* We don't support IDCT ratios larger than 2. */
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2)
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Recompute downsampled dimensions of components;
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * application needs to know these if using raw downsampled data.
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   */
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       ci++, compptr++) {
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Size in samples, after IDCT scaling */
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr->downsampled_width = (JDIMENSION)
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jdiv_round_up((long) cinfo->image_width *
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (long) (cinfo->max_h_samp_factor * cinfo->block_size));
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr->downsampled_height = (JDIMENSION)
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jdiv_round_up((long) cinfo->image_height *
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (long) (cinfo->max_v_samp_factor * cinfo->block_size));
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* IDCT_SCALING_SUPPORTED */
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Report number of components in selected colorspace. */
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Probably this should be in the color conversion module... */
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  switch (cinfo->out_color_space) {
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  case JCS_GRAYSCALE:
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->out_color_components = 1;
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    break;
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  case JCS_RGB:
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->out_color_components = RGB_PIXELSIZE;
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    break;
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  case JCS_YCbCr:
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->out_color_components = 3;
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    break;
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  case JCS_CMYK:
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  case JCS_YCCK:
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->out_color_components = 4;
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    break;
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  default:			/* else must be same colorspace as in file */
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->out_color_components = cinfo->num_components;
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    break;
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  cinfo->output_components = (cinfo->quantize_colors ? 1 :
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                              cinfo->out_color_components);
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* See if upsampler will want to emit more than one row at a time */
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (use_merged_upsample(cinfo))
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  else
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->rec_outbuf_height = 1;
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Several decompression processes need to range-limit values to the range
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * due to noise introduced by quantization, roundoff error, etc.  These
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * processes are inner loops and need to be as fast as possible.  On most
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * machines, particularly CPUs with pipelines or instruction prefetch,
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * a (subscript-check-less) C table lookup
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *		x = sample_range_limit[x];
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * is faster than explicit tests
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *		if (x < 0)  x = 0;
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *		else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * These processes all use a common table prepared by the routine below.
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For most steps we can mathematically guarantee that the initial value
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * limiting step (just after the IDCT), a wildly out-of-range value is
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * possible if the input data is corrupt.  To avoid any chance of indexing
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * off the end of memory and getting a bad-pointer trap, we perform the
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * post-IDCT limiting thus:
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *		x = range_limit[x & MASK];
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * samples.  Under normal circumstances this is more than enough range and
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * a correct output will be generated; with bogus input data the mask will
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * cause wraparound, and we will safely generate a bogus-but-in-range output.
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For the post-IDCT step, we want to convert the data from signed to unsigned
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * representation by adding CENTERJSAMPLE at the same time that we limit it.
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * So the post-IDCT limiting table ends up looking like this:
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   0,1,...,CENTERJSAMPLE-1
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Negative inputs select values from the upper half of the table after
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * masking.
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * We can save some space by overlapping the start of the post-IDCT table
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * with the simpler range limiting table.  The post-IDCT table begins at
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * sample_range_limit + CENTERJSAMPLE.
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Note that the table is allocated in near data space on PCs; it's small
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * enough and used often enough to justify this.
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void)
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprepare_range_limit_table (j_decompress_ptr cinfo)
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Allocate and fill in the sample_range_limit table */
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JSAMPLE * table;
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int i;
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  table = (JSAMPLE *)
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  table += (MAXJSAMPLE+1);	/* allow negative subscripts of simple table */
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  cinfo->sample_range_limit = table;
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* First segment of "simple" table: limit[x] = 0 for x < 0 */
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Main part of "simple" table: limit[x] = x */
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (i = 0; i <= MAXJSAMPLE; i++)
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    table[i] = (JSAMPLE) i;
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  table += CENTERJSAMPLE;	/* Point to where post-IDCT table starts */
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* End of simple table, rest of first half of post-IDCT table */
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    table[i] = MAXJSAMPLE;
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Second half of post-IDCT table */
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  MEMZERO(table + (2 * (MAXJSAMPLE+1)),
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Master selection of decompression modules.
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This is done once at jpeg_start_decompress time.  We determine
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * which modules will be used and give them appropriate initialization calls.
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * We also initialize the decompressor input side to begin consuming data.
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Since jpeg_read_header has finished, we know what is in the SOF
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and (first) SOS markers.  We also have all the application parameter
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * settings.
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void)
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslermaster_selection (j_decompress_ptr cinfo)
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  my_master_ptr master = (my_master_ptr) cinfo->master;
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  boolean use_c_buffer;
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  long samplesperrow;
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JDIMENSION jd_samplesperrow;
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize dimensions and other stuff */
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_calc_output_dimensions(cinfo);
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  prepare_range_limit_table(cinfo);
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Width of an output scanline must be representable as JDIMENSION. */
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jd_samplesperrow = (JDIMENSION) samplesperrow;
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if ((long) jd_samplesperrow != samplesperrow)
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize my private state */
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->pass_number = 0;
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->using_merged_upsample = use_merged_upsample(cinfo);
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Color quantizer selection */
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->quantizer_1pass = NULL;
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->quantizer_2pass = NULL;
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* No mode changes if not using buffered-image mode. */
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->enable_1pass_quant = FALSE;
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->enable_external_quant = FALSE;
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->enable_2pass_quant = FALSE;
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->quantize_colors) {
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->raw_data_out)
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT(cinfo, JERR_NOTIMPL);
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* 2-pass quantizer only works in 3-component color space. */
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->out_color_components != 3) {
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_1pass_quant = TRUE;
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_external_quant = FALSE;
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_2pass_quant = FALSE;
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->colormap = NULL;
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else if (cinfo->colormap != NULL) {
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_external_quant = TRUE;
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else if (cinfo->two_pass_quantize) {
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_2pass_quant = TRUE;
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->enable_1pass_quant = TRUE;
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->enable_1pass_quant) {
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef QUANT_1PASS_SUPPORTED
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jinit_1pass_quantizer(cinfo);
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      master->quantizer_1pass = cinfo->cquantize;
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT(cinfo, JERR_NOT_COMPILED);
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* We use the 2-pass code to map to external colormaps. */
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef QUANT_2PASS_SUPPORTED
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jinit_2pass_quantizer(cinfo);
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      master->quantizer_2pass = cinfo->cquantize;
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT(cinfo, JERR_NOT_COMPILED);
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* If both quantizers are initialized, the 2-pass one is left active;
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * this is necessary for starting with quantization to an external map.
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Post-processing: in particular, color conversion first */
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (! cinfo->raw_data_out) {
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (master->using_merged_upsample) {
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef UPSAMPLE_MERGING_SUPPORTED
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jinit_merged_upsampler(cinfo); /* does color conversion too */
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT(cinfo, JERR_NOT_COMPILED);
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jinit_color_deconverter(cinfo);
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      jinit_upsampler(cinfo);
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Inverse DCT */
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jinit_inverse_dct(cinfo);
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Entropy decoding: either Huffman or arithmetic coding. */
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->arith_code)
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    jinit_arith_decoder(cinfo);
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  else {
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    jinit_huff_decoder(cinfo);
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize principal buffer controllers. */
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jinit_d_coef_controller(cinfo, use_c_buffer);
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (! cinfo->raw_data_out)
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* We can now tell the memory manager to allocate virtual arrays. */
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize input side of decompressor to consume first scan. */
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  (*cinfo->inputctl->start_input_pass) (cinfo);
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef D_MULTISCAN_FILES_SUPPORTED
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* If jpeg_start_decompress will read the whole file, initialize
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * progress monitoring appropriately.  The input step is counted
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * as one pass.
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   */
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->progress != NULL && ! cinfo->buffered_image &&
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->inputctl->has_multiple_scans) {
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int nscans;
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Estimate number of scans to set pass_limit. */
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->progressive_mode) {
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      nscans = 2 + 3 * cinfo->num_components;
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      nscans = cinfo->num_components;
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->pass_counter = 0L;
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->completed_passes = 0;
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Count the input pass as done */
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    master->pass_number++;
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* D_MULTISCAN_FILES_SUPPORTED */
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Per-pass setup.
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This is called at the beginning of each output pass.  We determine which
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * modules will be active during this pass and give them appropriate
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * start_pass calls.  We also set is_dummy_pass to indicate whether this
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * is a "real" output pass or a dummy pass for color quantization.
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (In the latter case, jdapistd.c will crank the pass to completion.)
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void)
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprepare_for_output_pass (j_decompress_ptr cinfo)
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  my_master_ptr master = (my_master_ptr) cinfo->master;
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (master->pub.is_dummy_pass) {
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef QUANT_2PASS_SUPPORTED
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Final pass of 2-pass quantization */
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    master->pub.is_dummy_pass = FALSE;
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->cquantize->start_pass) (cinfo, FALSE);
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT(cinfo, JERR_NOT_COMPILED);
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* QUANT_2PASS_SUPPORTED */
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } else {
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->quantize_colors && cinfo->colormap == NULL) {
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Select new quantization method */
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cinfo->cquantize = master->quantizer_2pass;
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        master->pub.is_dummy_pass = TRUE;
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      } else if (cinfo->enable_1pass_quant) {
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cinfo->cquantize = master->quantizer_1pass;
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      } else {
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ERREXIT(cinfo, JERR_MODE_CHANGE);
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->idct->start_pass) (cinfo);
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->coef->start_output_pass) (cinfo);
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (! cinfo->raw_data_out) {
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (! master->using_merged_upsample)
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (*cinfo->cconvert->start_pass) (cinfo);
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*cinfo->upsample->start_pass) (cinfo);
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->quantize_colors)
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*cinfo->post->start_pass) (cinfo,
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Set up progress monitor's pass info if present */
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->progress != NULL) {
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->completed_passes = master->pass_number;
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->progress->total_passes = master->pass_number +
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    (master->pub.is_dummy_pass ? 2 : 1);
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* In buffered-image mode, we assume one more output pass if EOI not
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * yet reached, but no more passes if EOI has been reached.
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Finish up at end of an output pass.
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void)
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfinish_output_pass (j_decompress_ptr cinfo)
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  my_master_ptr master = (my_master_ptr) cinfo->master;
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->quantize_colors)
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->cquantize->finish_pass) (cinfo);
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->pass_number++;
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef D_MULTISCAN_FILES_SUPPORTED
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Switch to a new external colormap between output passes.
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void)
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjpeg_new_colormap (j_decompress_ptr cinfo)
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  my_master_ptr master = (my_master_ptr) cinfo->master;
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Prevent application from calling me at wrong times */
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->global_state != DSTATE_BUFIMAGE)
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->quantize_colors && cinfo->enable_external_quant &&
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      cinfo->colormap != NULL) {
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Select 2-pass quantizer for external colormap use */
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->cquantize = master->quantizer_2pass;
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Notify quantizer of colormap change */
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->cquantize->new_color_map) (cinfo);
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    master->pub.is_dummy_pass = FALSE; /* just in case */
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } else
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT(cinfo, JERR_MODE_CHANGE);
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* D_MULTISCAN_FILES_SUPPORTED */
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Initialize master decompression control and select active modules.
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This is performed at the start of jpeg_start_decompress.
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void)
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjinit_master_decompress (j_decompress_ptr cinfo)
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  my_master_ptr master;
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master = (my_master_ptr)
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                  SIZEOF(my_decomp_master));
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  cinfo->master = (struct jpeg_decomp_master *) master;
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->pub.prepare_for_output_pass = prepare_for_output_pass;
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->pub.finish_output_pass = finish_output_pass;
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master->pub.is_dummy_pass = FALSE;
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  master_selection(cinfo);
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
532