Imported Upstream version 3.0.1
[platform/upstream/libjpeg-turbo.git] / jdmaster.c
1 /*
2  * jdmaster.c
3  *
4  * This file was part of the Independent JPEG Group's software:
5  * Copyright (C) 1991-1997, Thomas G. Lane.
6  * Modified 2002-2009 by Guido Vollbeding.
7  * Lossless JPEG Modifications:
8  * Copyright (C) 1999, Ken Murchison.
9  * libjpeg-turbo Modifications:
10  * Copyright (C) 2009-2011, 2016, 2019, 2022-2023, D. R. Commander.
11  * Copyright (C) 2013, Linaro Limited.
12  * Copyright (C) 2015, Google, Inc.
13  * For conditions of distribution and use, see the accompanying README.ijg
14  * file.
15  *
16  * This file contains master control logic for the JPEG decompressor.
17  * These routines are concerned with selecting the modules to be executed
18  * and with determining the number of passes and the work to be done in each
19  * pass.
20  */
21
22 #define JPEG_INTERNALS
23 #include "jinclude.h"
24 #include "jpeglib.h"
25 #include "jpegapicomp.h"
26 #include "jdmaster.h"
27
28
29 /*
30  * Determine whether merged upsample/color conversion should be used.
31  * CRUCIAL: this must match the actual capabilities of jdmerge.c!
32  */
33
34 LOCAL(boolean)
35 use_merged_upsample(j_decompress_ptr cinfo)
36 {
37 #ifdef UPSAMPLE_MERGING_SUPPORTED
38   /* Colorspace conversion is not supported with lossless JPEG images */
39   if (cinfo->master->lossless)
40     return FALSE;
41   /* Merging is the equivalent of plain box-filter upsampling */
42   if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
43     return FALSE;
44   /* jdmerge.c only supports YCC=>RGB and YCC=>RGB565 color conversion */
45   if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
46       (cinfo->out_color_space != JCS_RGB &&
47        cinfo->out_color_space != JCS_RGB565 &&
48        cinfo->out_color_space != JCS_EXT_RGB &&
49        cinfo->out_color_space != JCS_EXT_RGBX &&
50        cinfo->out_color_space != JCS_EXT_BGR &&
51        cinfo->out_color_space != JCS_EXT_BGRX &&
52        cinfo->out_color_space != JCS_EXT_XBGR &&
53        cinfo->out_color_space != JCS_EXT_XRGB &&
54        cinfo->out_color_space != JCS_EXT_RGBA &&
55        cinfo->out_color_space != JCS_EXT_BGRA &&
56        cinfo->out_color_space != JCS_EXT_ABGR &&
57        cinfo->out_color_space != JCS_EXT_ARGB))
58     return FALSE;
59   if ((cinfo->out_color_space == JCS_RGB565 &&
60        cinfo->out_color_components != 3) ||
61       (cinfo->out_color_space != JCS_RGB565 &&
62        cinfo->out_color_components != rgb_pixelsize[cinfo->out_color_space]))
63     return FALSE;
64   /* and it only handles 2h1v or 2h2v sampling ratios */
65   if (cinfo->comp_info[0].h_samp_factor != 2 ||
66       cinfo->comp_info[1].h_samp_factor != 1 ||
67       cinfo->comp_info[2].h_samp_factor != 1 ||
68       cinfo->comp_info[0].v_samp_factor >  2 ||
69       cinfo->comp_info[1].v_samp_factor != 1 ||
70       cinfo->comp_info[2].v_samp_factor != 1)
71     return FALSE;
72   /* furthermore, it doesn't work if we've scaled the IDCTs differently */
73   if (cinfo->comp_info[0]._DCT_scaled_size != cinfo->_min_DCT_scaled_size ||
74       cinfo->comp_info[1]._DCT_scaled_size != cinfo->_min_DCT_scaled_size ||
75       cinfo->comp_info[2]._DCT_scaled_size != cinfo->_min_DCT_scaled_size)
76     return FALSE;
77   /* ??? also need to test for upsample-time rescaling, when & if supported */
78   return TRUE;                  /* by golly, it'll work... */
79 #else
80   return FALSE;
81 #endif
82 }
83
84
85 /*
86  * Compute output image dimensions and related values.
87  * NOTE: this is exported for possible use by application.
88  * Hence it mustn't do anything that can't be done twice.
89  */
90
91 #if JPEG_LIB_VERSION >= 80
92 GLOBAL(void)
93 #else
94 LOCAL(void)
95 #endif
96 jpeg_core_output_dimensions(j_decompress_ptr cinfo)
97 /* Do computations that are needed before master selection phase.
98  * This function is used for transcoding and full decompression.
99  */
100 {
101 #ifdef IDCT_SCALING_SUPPORTED
102   int ci;
103   jpeg_component_info *compptr;
104
105   if (!cinfo->master->lossless) {
106     /* Compute actual output image dimensions and DCT scaling choices. */
107     if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom) {
108       /* Provide 1/block_size scaling */
109       cinfo->output_width = (JDIMENSION)
110         jdiv_round_up((long)cinfo->image_width, (long)DCTSIZE);
111       cinfo->output_height = (JDIMENSION)
112         jdiv_round_up((long)cinfo->image_height, (long)DCTSIZE);
113       cinfo->_min_DCT_h_scaled_size = 1;
114       cinfo->_min_DCT_v_scaled_size = 1;
115     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 2) {
116       /* Provide 2/block_size scaling */
117       cinfo->output_width = (JDIMENSION)
118         jdiv_round_up((long)cinfo->image_width * 2L, (long)DCTSIZE);
119       cinfo->output_height = (JDIMENSION)
120         jdiv_round_up((long)cinfo->image_height * 2L, (long)DCTSIZE);
121       cinfo->_min_DCT_h_scaled_size = 2;
122       cinfo->_min_DCT_v_scaled_size = 2;
123     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 3) {
124       /* Provide 3/block_size scaling */
125       cinfo->output_width = (JDIMENSION)
126         jdiv_round_up((long)cinfo->image_width * 3L, (long)DCTSIZE);
127       cinfo->output_height = (JDIMENSION)
128         jdiv_round_up((long)cinfo->image_height * 3L, (long)DCTSIZE);
129       cinfo->_min_DCT_h_scaled_size = 3;
130       cinfo->_min_DCT_v_scaled_size = 3;
131     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 4) {
132       /* Provide 4/block_size scaling */
133       cinfo->output_width = (JDIMENSION)
134         jdiv_round_up((long)cinfo->image_width * 4L, (long)DCTSIZE);
135       cinfo->output_height = (JDIMENSION)
136         jdiv_round_up((long)cinfo->image_height * 4L, (long)DCTSIZE);
137       cinfo->_min_DCT_h_scaled_size = 4;
138       cinfo->_min_DCT_v_scaled_size = 4;
139     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 5) {
140       /* Provide 5/block_size scaling */
141       cinfo->output_width = (JDIMENSION)
142         jdiv_round_up((long)cinfo->image_width * 5L, (long)DCTSIZE);
143       cinfo->output_height = (JDIMENSION)
144         jdiv_round_up((long)cinfo->image_height * 5L, (long)DCTSIZE);
145       cinfo->_min_DCT_h_scaled_size = 5;
146       cinfo->_min_DCT_v_scaled_size = 5;
147     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 6) {
148       /* Provide 6/block_size scaling */
149       cinfo->output_width = (JDIMENSION)
150         jdiv_round_up((long)cinfo->image_width * 6L, (long)DCTSIZE);
151       cinfo->output_height = (JDIMENSION)
152         jdiv_round_up((long)cinfo->image_height * 6L, (long)DCTSIZE);
153       cinfo->_min_DCT_h_scaled_size = 6;
154       cinfo->_min_DCT_v_scaled_size = 6;
155     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 7) {
156       /* Provide 7/block_size scaling */
157       cinfo->output_width = (JDIMENSION)
158         jdiv_round_up((long)cinfo->image_width * 7L, (long)DCTSIZE);
159       cinfo->output_height = (JDIMENSION)
160         jdiv_round_up((long)cinfo->image_height * 7L, (long)DCTSIZE);
161       cinfo->_min_DCT_h_scaled_size = 7;
162       cinfo->_min_DCT_v_scaled_size = 7;
163     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 8) {
164       /* Provide 8/block_size scaling */
165       cinfo->output_width = (JDIMENSION)
166         jdiv_round_up((long)cinfo->image_width * 8L, (long)DCTSIZE);
167       cinfo->output_height = (JDIMENSION)
168         jdiv_round_up((long)cinfo->image_height * 8L, (long)DCTSIZE);
169       cinfo->_min_DCT_h_scaled_size = 8;
170       cinfo->_min_DCT_v_scaled_size = 8;
171     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 9) {
172       /* Provide 9/block_size scaling */
173       cinfo->output_width = (JDIMENSION)
174         jdiv_round_up((long)cinfo->image_width * 9L, (long)DCTSIZE);
175       cinfo->output_height = (JDIMENSION)
176         jdiv_round_up((long)cinfo->image_height * 9L, (long)DCTSIZE);
177       cinfo->_min_DCT_h_scaled_size = 9;
178       cinfo->_min_DCT_v_scaled_size = 9;
179     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 10) {
180       /* Provide 10/block_size scaling */
181       cinfo->output_width = (JDIMENSION)
182         jdiv_round_up((long)cinfo->image_width * 10L, (long)DCTSIZE);
183       cinfo->output_height = (JDIMENSION)
184         jdiv_round_up((long)cinfo->image_height * 10L, (long)DCTSIZE);
185       cinfo->_min_DCT_h_scaled_size = 10;
186       cinfo->_min_DCT_v_scaled_size = 10;
187     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 11) {
188       /* Provide 11/block_size scaling */
189       cinfo->output_width = (JDIMENSION)
190         jdiv_round_up((long)cinfo->image_width * 11L, (long)DCTSIZE);
191       cinfo->output_height = (JDIMENSION)
192         jdiv_round_up((long)cinfo->image_height * 11L, (long)DCTSIZE);
193       cinfo->_min_DCT_h_scaled_size = 11;
194       cinfo->_min_DCT_v_scaled_size = 11;
195     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 12) {
196       /* Provide 12/block_size scaling */
197       cinfo->output_width = (JDIMENSION)
198         jdiv_round_up((long)cinfo->image_width * 12L, (long)DCTSIZE);
199       cinfo->output_height = (JDIMENSION)
200         jdiv_round_up((long)cinfo->image_height * 12L, (long)DCTSIZE);
201       cinfo->_min_DCT_h_scaled_size = 12;
202       cinfo->_min_DCT_v_scaled_size = 12;
203     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 13) {
204       /* Provide 13/block_size scaling */
205       cinfo->output_width = (JDIMENSION)
206         jdiv_round_up((long)cinfo->image_width * 13L, (long)DCTSIZE);
207       cinfo->output_height = (JDIMENSION)
208         jdiv_round_up((long)cinfo->image_height * 13L, (long)DCTSIZE);
209       cinfo->_min_DCT_h_scaled_size = 13;
210       cinfo->_min_DCT_v_scaled_size = 13;
211     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 14) {
212       /* Provide 14/block_size scaling */
213       cinfo->output_width = (JDIMENSION)
214         jdiv_round_up((long)cinfo->image_width * 14L, (long)DCTSIZE);
215       cinfo->output_height = (JDIMENSION)
216         jdiv_round_up((long)cinfo->image_height * 14L, (long)DCTSIZE);
217       cinfo->_min_DCT_h_scaled_size = 14;
218       cinfo->_min_DCT_v_scaled_size = 14;
219     } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 15) {
220       /* Provide 15/block_size scaling */
221       cinfo->output_width = (JDIMENSION)
222         jdiv_round_up((long)cinfo->image_width * 15L, (long)DCTSIZE);
223       cinfo->output_height = (JDIMENSION)
224         jdiv_round_up((long)cinfo->image_height * 15L, (long)DCTSIZE);
225       cinfo->_min_DCT_h_scaled_size = 15;
226       cinfo->_min_DCT_v_scaled_size = 15;
227     } else {
228       /* Provide 16/block_size scaling */
229       cinfo->output_width = (JDIMENSION)
230         jdiv_round_up((long)cinfo->image_width * 16L, (long)DCTSIZE);
231       cinfo->output_height = (JDIMENSION)
232         jdiv_round_up((long)cinfo->image_height * 16L, (long)DCTSIZE);
233       cinfo->_min_DCT_h_scaled_size = 16;
234       cinfo->_min_DCT_v_scaled_size = 16;
235     }
236
237     /* Recompute dimensions of components */
238     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
239          ci++, compptr++) {
240       compptr->_DCT_h_scaled_size = cinfo->_min_DCT_h_scaled_size;
241       compptr->_DCT_v_scaled_size = cinfo->_min_DCT_v_scaled_size;
242     }
243   } else
244 #endif /* !IDCT_SCALING_SUPPORTED */
245   {
246     /* Hardwire it to "no scaling" */
247     cinfo->output_width = cinfo->image_width;
248     cinfo->output_height = cinfo->image_height;
249     /* jdinput.c has already initialized DCT_scaled_size,
250      * and has computed unscaled downsampled_width and downsampled_height.
251      */
252   }
253 }
254
255
256 /*
257  * Compute output image dimensions and related values.
258  * NOTE: this is exported for possible use by application.
259  * Hence it mustn't do anything that can't be done twice.
260  * Also note that it may be called before the master module is initialized!
261  */
262
263 GLOBAL(void)
264 jpeg_calc_output_dimensions(j_decompress_ptr cinfo)
265 /* Do computations that are needed before master selection phase */
266 {
267 #ifdef IDCT_SCALING_SUPPORTED
268   int ci;
269   jpeg_component_info *compptr;
270 #endif
271
272   /* Prevent application from calling me at wrong times */
273   if (cinfo->global_state != DSTATE_READY)
274     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
275
276   /* Compute core output image dimensions and DCT scaling choices. */
277   jpeg_core_output_dimensions(cinfo);
278
279 #ifdef IDCT_SCALING_SUPPORTED
280
281   if (!cinfo->master->lossless) {
282     /* In selecting the actual DCT scaling for each component, we try to
283      * scale up the chroma components via IDCT scaling rather than upsampling.
284      * This saves time if the upsampler gets to use 1:1 scaling.
285      * Note this code adapts subsampling ratios which are powers of 2.
286      */
287     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
288          ci++, compptr++) {
289       int ssize = cinfo->_min_DCT_scaled_size;
290       while (ssize < DCTSIZE &&
291              ((cinfo->max_h_samp_factor * cinfo->_min_DCT_scaled_size) %
292               (compptr->h_samp_factor * ssize * 2) == 0) &&
293              ((cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size) %
294               (compptr->v_samp_factor * ssize * 2) == 0)) {
295         ssize = ssize * 2;
296       }
297 #if JPEG_LIB_VERSION >= 70
298       compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size = ssize;
299 #else
300       compptr->DCT_scaled_size = ssize;
301 #endif
302     }
303
304     /* Recompute downsampled dimensions of components;
305      * application needs to know these if using raw downsampled data.
306      */
307     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
308          ci++, compptr++) {
309       /* Size in samples, after IDCT scaling */
310       compptr->downsampled_width = (JDIMENSION)
311         jdiv_round_up((long)cinfo->image_width *
312                       (long)(compptr->h_samp_factor *
313                              compptr->_DCT_scaled_size),
314                       (long)(cinfo->max_h_samp_factor * DCTSIZE));
315       compptr->downsampled_height = (JDIMENSION)
316         jdiv_round_up((long)cinfo->image_height *
317                       (long)(compptr->v_samp_factor *
318                              compptr->_DCT_scaled_size),
319                       (long)(cinfo->max_v_samp_factor * DCTSIZE));
320     }
321   } else
322 #endif /* IDCT_SCALING_SUPPORTED */
323   {
324     /* Hardwire it to "no scaling" */
325     cinfo->output_width = cinfo->image_width;
326     cinfo->output_height = cinfo->image_height;
327     /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
328      * and has computed unscaled downsampled_width and downsampled_height.
329      */
330   }
331
332   /* Report number of components in selected colorspace. */
333   /* Probably this should be in the color conversion module... */
334   switch (cinfo->out_color_space) {
335   case JCS_GRAYSCALE:
336     cinfo->out_color_components = 1;
337     break;
338   case JCS_RGB:
339   case JCS_EXT_RGB:
340   case JCS_EXT_RGBX:
341   case JCS_EXT_BGR:
342   case JCS_EXT_BGRX:
343   case JCS_EXT_XBGR:
344   case JCS_EXT_XRGB:
345   case JCS_EXT_RGBA:
346   case JCS_EXT_BGRA:
347   case JCS_EXT_ABGR:
348   case JCS_EXT_ARGB:
349     cinfo->out_color_components = rgb_pixelsize[cinfo->out_color_space];
350     break;
351   case JCS_YCbCr:
352   case JCS_RGB565:
353     cinfo->out_color_components = 3;
354     break;
355   case JCS_CMYK:
356   case JCS_YCCK:
357     cinfo->out_color_components = 4;
358     break;
359   default:                      /* else must be same colorspace as in file */
360     cinfo->out_color_components = cinfo->num_components;
361     break;
362   }
363   cinfo->output_components = (cinfo->quantize_colors ? 1 :
364                               cinfo->out_color_components);
365
366   /* See if upsampler will want to emit more than one row at a time */
367   if (use_merged_upsample(cinfo))
368     cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
369   else
370     cinfo->rec_outbuf_height = 1;
371 }
372
373
374 /*
375  * Several decompression processes need to range-limit values to the range
376  * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
377  * due to noise introduced by quantization, roundoff error, etc.  These
378  * processes are inner loops and need to be as fast as possible.  On most
379  * machines, particularly CPUs with pipelines or instruction prefetch,
380  * a (subscript-check-less) C table lookup
381  *              x = sample_range_limit[x];
382  * is faster than explicit tests
383  *              if (x < 0)  x = 0;
384  *              else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
385  * These processes all use a common table prepared by the routine below.
386  *
387  * For most steps we can mathematically guarantee that the initial value
388  * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
389  * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
390  * limiting step (just after the IDCT), a wildly out-of-range value is
391  * possible if the input data is corrupt.  To avoid any chance of indexing
392  * off the end of memory and getting a bad-pointer trap, we perform the
393  * post-IDCT limiting thus:
394  *              x = range_limit[x & MASK];
395  * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
396  * samples.  Under normal circumstances this is more than enough range and
397  * a correct output will be generated; with bogus input data the mask will
398  * cause wraparound, and we will safely generate a bogus-but-in-range output.
399  * For the post-IDCT step, we want to convert the data from signed to unsigned
400  * representation by adding CENTERJSAMPLE at the same time that we limit it.
401  * So the post-IDCT limiting table ends up looking like this:
402  *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
403  *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
404  *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
405  *   0,1,...,CENTERJSAMPLE-1
406  * Negative inputs select values from the upper half of the table after
407  * masking.
408  *
409  * We can save some space by overlapping the start of the post-IDCT table
410  * with the simpler range limiting table.  The post-IDCT table begins at
411  * sample_range_limit + CENTERJSAMPLE.
412  */
413
414 LOCAL(void)
415 prepare_range_limit_table(j_decompress_ptr cinfo)
416 /* Allocate and fill in the sample_range_limit table */
417 {
418   JSAMPLE *table;
419   J12SAMPLE *table12;
420 #ifdef D_LOSSLESS_SUPPORTED
421   J16SAMPLE *table16;
422 #endif
423   int i;
424
425   if (cinfo->data_precision == 16) {
426 #ifdef D_LOSSLESS_SUPPORTED
427     table16 = (J16SAMPLE *)
428       (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
429                   (5 * (MAXJ16SAMPLE + 1) + CENTERJ16SAMPLE) *
430                   sizeof(J16SAMPLE));
431     table16 += (MAXJ16SAMPLE + 1);  /* allow negative subscripts of simple
432                                        table */
433     cinfo->sample_range_limit = (JSAMPLE *)table16;
434     /* First segment of "simple" table: limit[x] = 0 for x < 0 */
435     memset(table16 - (MAXJ16SAMPLE + 1), 0,
436            (MAXJ16SAMPLE + 1) * sizeof(J16SAMPLE));
437     /* Main part of "simple" table: limit[x] = x */
438     for (i = 0; i <= MAXJ16SAMPLE; i++)
439       table16[i] = (J16SAMPLE)i;
440     table16 += CENTERJ16SAMPLE; /* Point to where post-IDCT table starts */
441     /* End of simple table, rest of first half of post-IDCT table */
442     for (i = CENTERJ16SAMPLE; i < 2 * (MAXJ16SAMPLE + 1); i++)
443       table16[i] = MAXJ16SAMPLE;
444     /* Second half of post-IDCT table */
445     memset(table16 + (2 * (MAXJ16SAMPLE + 1)), 0,
446            (2 * (MAXJ16SAMPLE + 1) - CENTERJ16SAMPLE) * sizeof(J16SAMPLE));
447     memcpy(table16 + (4 * (MAXJ16SAMPLE + 1) - CENTERJ16SAMPLE),
448            cinfo->sample_range_limit, CENTERJ16SAMPLE * sizeof(J16SAMPLE));
449 #else
450     ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
451 #endif
452   } else if (cinfo->data_precision == 12) {
453     table12 = (J12SAMPLE *)
454       (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
455                   (5 * (MAXJ12SAMPLE + 1) + CENTERJ12SAMPLE) *
456                   sizeof(J12SAMPLE));
457     table12 += (MAXJ12SAMPLE + 1);  /* allow negative subscripts of simple
458                                        table */
459     cinfo->sample_range_limit = (JSAMPLE *)table12;
460     /* First segment of "simple" table: limit[x] = 0 for x < 0 */
461     memset(table12 - (MAXJ12SAMPLE + 1), 0,
462            (MAXJ12SAMPLE + 1) * sizeof(J12SAMPLE));
463     /* Main part of "simple" table: limit[x] = x */
464     for (i = 0; i <= MAXJ12SAMPLE; i++)
465       table12[i] = (J12SAMPLE)i;
466     table12 += CENTERJ12SAMPLE; /* Point to where post-IDCT table starts */
467     /* End of simple table, rest of first half of post-IDCT table */
468     for (i = CENTERJ12SAMPLE; i < 2 * (MAXJ12SAMPLE + 1); i++)
469       table12[i] = MAXJ12SAMPLE;
470     /* Second half of post-IDCT table */
471     memset(table12 + (2 * (MAXJ12SAMPLE + 1)), 0,
472            (2 * (MAXJ12SAMPLE + 1) - CENTERJ12SAMPLE) * sizeof(J12SAMPLE));
473     memcpy(table12 + (4 * (MAXJ12SAMPLE + 1) - CENTERJ12SAMPLE),
474            cinfo->sample_range_limit, CENTERJ12SAMPLE * sizeof(J12SAMPLE));
475   } else {
476     table = (JSAMPLE *)
477       (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
478                   (5 * (MAXJSAMPLE + 1) + CENTERJSAMPLE) * sizeof(JSAMPLE));
479     table += (MAXJSAMPLE + 1);  /* allow negative subscripts of simple table */
480     cinfo->sample_range_limit = table;
481     /* First segment of "simple" table: limit[x] = 0 for x < 0 */
482     memset(table - (MAXJSAMPLE + 1), 0, (MAXJSAMPLE + 1) * sizeof(JSAMPLE));
483     /* Main part of "simple" table: limit[x] = x */
484     for (i = 0; i <= MAXJSAMPLE; i++)
485       table[i] = (JSAMPLE)i;
486     table += CENTERJSAMPLE;     /* Point to where post-IDCT table starts */
487     /* End of simple table, rest of first half of post-IDCT table */
488     for (i = CENTERJSAMPLE; i < 2 * (MAXJSAMPLE + 1); i++)
489       table[i] = MAXJSAMPLE;
490     /* Second half of post-IDCT table */
491     memset(table + (2 * (MAXJSAMPLE + 1)), 0,
492            (2 * (MAXJSAMPLE + 1) - CENTERJSAMPLE) * sizeof(JSAMPLE));
493     memcpy(table + (4 * (MAXJSAMPLE + 1) - CENTERJSAMPLE),
494            cinfo->sample_range_limit, CENTERJSAMPLE * sizeof(JSAMPLE));
495   }
496 }
497
498
499 /*
500  * Master selection of decompression modules.
501  * This is done once at jpeg_start_decompress time.  We determine
502  * which modules will be used and give them appropriate initialization calls.
503  * We also initialize the decompressor input side to begin consuming data.
504  *
505  * Since jpeg_read_header has finished, we know what is in the SOF
506  * and (first) SOS markers.  We also have all the application parameter
507  * settings.
508  */
509
510 LOCAL(void)
511 master_selection(j_decompress_ptr cinfo)
512 {
513   my_master_ptr master = (my_master_ptr)cinfo->master;
514   boolean use_c_buffer;
515   long samplesperrow;
516   JDIMENSION jd_samplesperrow;
517
518   /* Disable IDCT scaling and raw (downsampled) data output in lossless mode.
519    * IDCT scaling is not useful in lossless mode, and it must be disabled in
520    * order to properly calculate the output dimensions.  Raw data output isn't
521    * particularly useful without subsampling and has not been tested in
522    * lossless mode.
523    */
524   if (cinfo->master->lossless) {
525     cinfo->raw_data_out = FALSE;
526     cinfo->scale_num = cinfo->scale_denom = 1;
527   }
528
529   /* Initialize dimensions and other stuff */
530   jpeg_calc_output_dimensions(cinfo);
531   prepare_range_limit_table(cinfo);
532
533   /* Width of an output scanline must be representable as JDIMENSION. */
534   samplesperrow = (long)cinfo->output_width *
535                   (long)cinfo->out_color_components;
536   jd_samplesperrow = (JDIMENSION)samplesperrow;
537   if ((long)jd_samplesperrow != samplesperrow)
538     ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
539
540   /* Initialize my private state */
541   master->pass_number = 0;
542   master->using_merged_upsample = use_merged_upsample(cinfo);
543
544   /* Color quantizer selection */
545   master->quantizer_1pass = NULL;
546   master->quantizer_2pass = NULL;
547   /* No mode changes if not using buffered-image mode. */
548   if (!cinfo->quantize_colors || !cinfo->buffered_image) {
549     cinfo->enable_1pass_quant = FALSE;
550     cinfo->enable_external_quant = FALSE;
551     cinfo->enable_2pass_quant = FALSE;
552   }
553   if (cinfo->quantize_colors) {
554     if (cinfo->raw_data_out)
555       ERREXIT(cinfo, JERR_NOTIMPL);
556     /* 2-pass quantizer only works in 3-component color space. */
557     if (cinfo->out_color_components != 3 ||
558         cinfo->out_color_space == JCS_RGB565) {
559       cinfo->enable_1pass_quant = TRUE;
560       cinfo->enable_external_quant = FALSE;
561       cinfo->enable_2pass_quant = FALSE;
562       cinfo->colormap = NULL;
563     } else if (cinfo->colormap != NULL) {
564       cinfo->enable_external_quant = TRUE;
565     } else if (cinfo->two_pass_quantize) {
566       cinfo->enable_2pass_quant = TRUE;
567     } else {
568       cinfo->enable_1pass_quant = TRUE;
569     }
570
571     if (cinfo->enable_1pass_quant) {
572 #ifdef QUANT_1PASS_SUPPORTED
573       if (cinfo->data_precision == 16)
574         ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
575       else if (cinfo->data_precision == 12)
576         j12init_1pass_quantizer(cinfo);
577       else
578         jinit_1pass_quantizer(cinfo);
579       master->quantizer_1pass = cinfo->cquantize;
580 #else
581       ERREXIT(cinfo, JERR_NOT_COMPILED);
582 #endif
583     }
584
585     /* We use the 2-pass code to map to external colormaps. */
586     if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
587 #ifdef QUANT_2PASS_SUPPORTED
588       if (cinfo->data_precision == 16)
589         ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
590       else if (cinfo->data_precision == 12)
591         j12init_2pass_quantizer(cinfo);
592       else
593         jinit_2pass_quantizer(cinfo);
594       master->quantizer_2pass = cinfo->cquantize;
595 #else
596       ERREXIT(cinfo, JERR_NOT_COMPILED);
597 #endif
598     }
599     /* If both quantizers are initialized, the 2-pass one is left active;
600      * this is necessary for starting with quantization to an external map.
601      */
602   }
603
604   /* Post-processing: in particular, color conversion first */
605   if (!cinfo->raw_data_out) {
606     if (master->using_merged_upsample) {
607 #ifdef UPSAMPLE_MERGING_SUPPORTED
608       if (cinfo->data_precision == 16)
609         ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
610       else if (cinfo->data_precision == 12)
611         j12init_merged_upsampler(cinfo); /* does color conversion too */
612       else
613         jinit_merged_upsampler(cinfo); /* does color conversion too */
614 #else
615       ERREXIT(cinfo, JERR_NOT_COMPILED);
616 #endif
617     } else {
618       if (cinfo->data_precision == 16) {
619 #ifdef D_LOSSLESS_SUPPORTED
620         j16init_color_deconverter(cinfo);
621         j16init_upsampler(cinfo);
622 #else
623         ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
624 #endif
625       } else if (cinfo->data_precision == 12) {
626         j12init_color_deconverter(cinfo);
627         j12init_upsampler(cinfo);
628       } else {
629         jinit_color_deconverter(cinfo);
630         jinit_upsampler(cinfo);
631       }
632     }
633     if (cinfo->data_precision == 16)
634 #ifdef D_LOSSLESS_SUPPORTED
635       j16init_d_post_controller(cinfo, cinfo->enable_2pass_quant);
636 #else
637       ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
638 #endif
639     else if (cinfo->data_precision == 12)
640       j12init_d_post_controller(cinfo, cinfo->enable_2pass_quant);
641     else
642       jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
643   }
644
645   if (cinfo->master->lossless) {
646 #ifdef D_LOSSLESS_SUPPORTED
647     /* Prediction, sample undifferencing, point transform, and sample size
648      * scaling
649      */
650     if (cinfo->data_precision == 16)
651       j16init_lossless_decompressor(cinfo);
652     else if (cinfo->data_precision == 12)
653       j12init_lossless_decompressor(cinfo);
654     else
655       jinit_lossless_decompressor(cinfo);
656     /* Entropy decoding: either Huffman or arithmetic coding. */
657     if (cinfo->arith_code) {
658       ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
659     } else {
660       jinit_lhuff_decoder(cinfo);
661     }
662
663     /* Initialize principal buffer controllers. */
664     use_c_buffer = cinfo->inputctl->has_multiple_scans ||
665                    cinfo->buffered_image;
666     if (cinfo->data_precision == 16)
667       j16init_d_diff_controller(cinfo, use_c_buffer);
668     else if (cinfo->data_precision == 12)
669       j12init_d_diff_controller(cinfo, use_c_buffer);
670     else
671       jinit_d_diff_controller(cinfo, use_c_buffer);
672 #else
673     ERREXIT(cinfo, JERR_NOT_COMPILED);
674 #endif
675   } else {
676     if (cinfo->data_precision == 16)
677       ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
678     /* Inverse DCT */
679     if (cinfo->data_precision == 12)
680       j12init_inverse_dct(cinfo);
681     else
682       jinit_inverse_dct(cinfo);
683     /* Entropy decoding: either Huffman or arithmetic coding. */
684     if (cinfo->arith_code) {
685 #ifdef D_ARITH_CODING_SUPPORTED
686       jinit_arith_decoder(cinfo);
687 #else
688       ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
689 #endif
690     } else {
691       if (cinfo->progressive_mode) {
692 #ifdef D_PROGRESSIVE_SUPPORTED
693         jinit_phuff_decoder(cinfo);
694 #else
695         ERREXIT(cinfo, JERR_NOT_COMPILED);
696 #endif
697       } else
698         jinit_huff_decoder(cinfo);
699     }
700
701     /* Initialize principal buffer controllers. */
702     use_c_buffer = cinfo->inputctl->has_multiple_scans ||
703                    cinfo->buffered_image;
704     if (cinfo->data_precision == 12)
705       j12init_d_coef_controller(cinfo, use_c_buffer);
706     else
707       jinit_d_coef_controller(cinfo, use_c_buffer);
708   }
709
710   if (!cinfo->raw_data_out) {
711     if (cinfo->data_precision == 16)
712 #ifdef D_LOSSLESS_SUPPORTED
713       j16init_d_main_controller(cinfo,
714                                 FALSE /* never need full buffer here */);
715 #else
716       ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
717 #endif
718     else if (cinfo->data_precision == 12)
719       j12init_d_main_controller(cinfo,
720                                 FALSE /* never need full buffer here */);
721     else
722       jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
723   }
724
725   /* We can now tell the memory manager to allocate virtual arrays. */
726   (*cinfo->mem->realize_virt_arrays) ((j_common_ptr)cinfo);
727
728   /* Initialize input side of decompressor to consume first scan. */
729   (*cinfo->inputctl->start_input_pass) (cinfo);
730
731   /* Set the first and last iMCU columns to decompress from single-scan images.
732    * By default, decompress all of the iMCU columns.
733    */
734   cinfo->master->first_iMCU_col = 0;
735   cinfo->master->last_iMCU_col = cinfo->MCUs_per_row - 1;
736   cinfo->master->last_good_iMCU_row = 0;
737
738 #ifdef D_MULTISCAN_FILES_SUPPORTED
739   /* If jpeg_start_decompress will read the whole file, initialize
740    * progress monitoring appropriately.  The input step is counted
741    * as one pass.
742    */
743   if (cinfo->progress != NULL && !cinfo->buffered_image &&
744       cinfo->inputctl->has_multiple_scans) {
745     int nscans;
746     /* Estimate number of scans to set pass_limit. */
747     if (cinfo->progressive_mode) {
748       /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
749       nscans = 2 + 3 * cinfo->num_components;
750     } else {
751       /* For a nonprogressive multiscan file, estimate 1 scan per component. */
752       nscans = cinfo->num_components;
753     }
754     cinfo->progress->pass_counter = 0L;
755     cinfo->progress->pass_limit = (long)cinfo->total_iMCU_rows * nscans;
756     cinfo->progress->completed_passes = 0;
757     cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
758     /* Count the input pass as done */
759     master->pass_number++;
760   }
761 #endif /* D_MULTISCAN_FILES_SUPPORTED */
762 }
763
764
765 /*
766  * Per-pass setup.
767  * This is called at the beginning of each output pass.  We determine which
768  * modules will be active during this pass and give them appropriate
769  * start_pass calls.  We also set is_dummy_pass to indicate whether this
770  * is a "real" output pass or a dummy pass for color quantization.
771  * (In the latter case, jdapistd.c will crank the pass to completion.)
772  */
773
774 METHODDEF(void)
775 prepare_for_output_pass(j_decompress_ptr cinfo)
776 {
777   my_master_ptr master = (my_master_ptr)cinfo->master;
778
779   if (master->pub.is_dummy_pass) {
780 #ifdef QUANT_2PASS_SUPPORTED
781     /* Final pass of 2-pass quantization */
782     master->pub.is_dummy_pass = FALSE;
783     (*cinfo->cquantize->start_pass) (cinfo, FALSE);
784     (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
785     (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
786 #else
787     ERREXIT(cinfo, JERR_NOT_COMPILED);
788 #endif /* QUANT_2PASS_SUPPORTED */
789   } else {
790     if (cinfo->quantize_colors && cinfo->colormap == NULL) {
791       /* Select new quantization method */
792       if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
793         cinfo->cquantize = master->quantizer_2pass;
794         master->pub.is_dummy_pass = TRUE;
795       } else if (cinfo->enable_1pass_quant) {
796         cinfo->cquantize = master->quantizer_1pass;
797       } else {
798         ERREXIT(cinfo, JERR_MODE_CHANGE);
799       }
800     }
801     (*cinfo->idct->start_pass) (cinfo);
802     (*cinfo->coef->start_output_pass) (cinfo);
803     if (!cinfo->raw_data_out) {
804       if (!master->using_merged_upsample)
805         (*cinfo->cconvert->start_pass) (cinfo);
806       (*cinfo->upsample->start_pass) (cinfo);
807       if (cinfo->quantize_colors)
808         (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
809       (*cinfo->post->start_pass) (cinfo,
810             (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
811       (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
812     }
813   }
814
815   /* Set up progress monitor's pass info if present */
816   if (cinfo->progress != NULL) {
817     cinfo->progress->completed_passes = master->pass_number;
818     cinfo->progress->total_passes = master->pass_number +
819                                     (master->pub.is_dummy_pass ? 2 : 1);
820     /* In buffered-image mode, we assume one more output pass if EOI not
821      * yet reached, but no more passes if EOI has been reached.
822      */
823     if (cinfo->buffered_image && !cinfo->inputctl->eoi_reached) {
824       cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
825     }
826   }
827 }
828
829
830 /*
831  * Finish up at end of an output pass.
832  */
833
834 METHODDEF(void)
835 finish_output_pass(j_decompress_ptr cinfo)
836 {
837   my_master_ptr master = (my_master_ptr)cinfo->master;
838
839   if (cinfo->quantize_colors)
840     (*cinfo->cquantize->finish_pass) (cinfo);
841   master->pass_number++;
842 }
843
844
845 #ifdef D_MULTISCAN_FILES_SUPPORTED
846
847 /*
848  * Switch to a new external colormap between output passes.
849  */
850
851 GLOBAL(void)
852 jpeg_new_colormap(j_decompress_ptr cinfo)
853 {
854   my_master_ptr master = (my_master_ptr)cinfo->master;
855
856   /* Prevent application from calling me at wrong times */
857   if (cinfo->global_state != DSTATE_BUFIMAGE)
858     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
859
860   if (cinfo->quantize_colors && cinfo->enable_external_quant &&
861       cinfo->colormap != NULL) {
862     /* Select 2-pass quantizer for external colormap use */
863     cinfo->cquantize = master->quantizer_2pass;
864     /* Notify quantizer of colormap change */
865     (*cinfo->cquantize->new_color_map) (cinfo);
866     master->pub.is_dummy_pass = FALSE; /* just in case */
867   } else
868     ERREXIT(cinfo, JERR_MODE_CHANGE);
869 }
870
871 #endif /* D_MULTISCAN_FILES_SUPPORTED */
872
873
874 /*
875  * Initialize master decompression control and select active modules.
876  * This is performed at the start of jpeg_start_decompress.
877  */
878
879 GLOBAL(void)
880 jinit_master_decompress(j_decompress_ptr cinfo)
881 {
882   my_master_ptr master = (my_master_ptr)cinfo->master;
883
884   master->pub.prepare_for_output_pass = prepare_for_output_pass;
885   master->pub.finish_output_pass = finish_output_pass;
886
887   master->pub.is_dummy_pass = FALSE;
888   master->pub.jinit_upsampler_no_alloc = FALSE;
889
890   master_selection(cinfo);
891 }