1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * jdmaster.c 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (C) 1991-1997, Thomas G. Lane. 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file is part of the Independent JPEG Group's software. 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the accompanying README file. 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file contains master control logic for the JPEG decompressor. 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These routines are concerned with selecting the modules to be executed 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and with determining the number of passes and the work to be done in each 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * pass. 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define JPEG_INTERNALS 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jinclude.h" 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jpeglib.h" 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Private state */ 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef struct { 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov struct jpeg_decomp_master pub; /* public fields */ 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int pass_number; /* # of passes completed */ 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Saved references to initialized quantizer modules, 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * in case we need to switch modes. 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov struct jpeg_color_quantizer * quantizer_1pass; 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov struct jpeg_color_quantizer * quantizer_2pass; 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} my_decomp_master; 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef my_decomp_master * my_master_ptr; 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Determine whether merged upsample/color conversion should be used. 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * CRUCIAL: this must match the actual capabilities of jdmerge.c! 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovLOCAL(boolean) 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovuse_merged_upsample (j_decompress_ptr cinfo) 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef UPSAMPLE_MERGING_SUPPORTED 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Merging is the equivalent of plain box-filter upsampling */ 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* jdmerge.c only supports YCC=>RGB color conversion */ 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_space != JCS_RGB || 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components != RGB_PIXELSIZE) 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* and it only handles 2h1v or 2h2v sampling ratios */ 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->comp_info[0].h_samp_factor != 2 || 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[1].h_samp_factor != 1 || 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[2].h_samp_factor != 1 || 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[0].v_samp_factor > 2 || 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[1].v_samp_factor != 1 || 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[2].v_samp_factor != 1) 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* furthermore, it doesn't work if we've scaled the IDCTs differently */ 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* ??? also need to test for upsample-time rescaling, when & if supported */ 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; /* by golly, it'll work... */ 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Compute output image dimensions and related values. 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * NOTE: this is exported for possible use by application. 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Hence it mustn't do anything that can't be done twice. 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Also note that it may be called before the master module is initialized! 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(void) 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjpeg_calc_output_dimensions (j_decompress_ptr cinfo) 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Do computations that are needed before master selection phase */ 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef IDCT_SCALING_SUPPORTED 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int ci; 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jpeg_component_info *compptr; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Prevent application from calling me at wrong times */ 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->global_state != DSTATE_READY) 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef IDCT_SCALING_SUPPORTED 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Compute actual output image dimensions and DCT scaling choices. */ 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->scale_num * 8 <= cinfo->scale_denom) { 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Provide 1/8 scaling */ 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_width = (JDIMENSION) 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_width, 8L); 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_height = (JDIMENSION) 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_height, 8L); 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->min_DCT_scaled_size = 1; 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Provide 1/4 scaling */ 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_width = (JDIMENSION) 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_width, 4L); 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_height = (JDIMENSION) 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_height, 4L); 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->min_DCT_scaled_size = 2; 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Provide 1/2 scaling */ 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_width = (JDIMENSION) 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_width, 2L); 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_height = (JDIMENSION) 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_height, 2L); 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->min_DCT_scaled_size = 4; 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Provide 1/1 scaling */ 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_width = cinfo->image_width; 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_height = cinfo->image_height; 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->min_DCT_scaled_size = DCTSIZE; 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* In selecting the actual DCT scaling for each component, we try to 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * scale up the chroma components via IDCT scaling rather than upsampling. 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This saves time if the upsampler gets to use 1:1 scaling. 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Note this code assumes that the supported DCT scalings are powers of 2. 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ci++, compptr++) { 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int ssize = cinfo->min_DCT_scaled_size; 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (ssize < DCTSIZE && 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (compptr->h_samp_factor * ssize * 2 <= 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (compptr->v_samp_factor * ssize * 2 <= 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ssize = ssize * 2; 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov compptr->DCT_scaled_size = ssize; 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Recompute downsampled dimensions of components; 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * application needs to know these if using raw downsampled data. 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ci++, compptr++) { 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Size in samples, after IDCT scaling */ 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov compptr->downsampled_width = (JDIMENSION) 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_width * 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (long) (cinfo->max_h_samp_factor * DCTSIZE)); 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov compptr->downsampled_height = (JDIMENSION) 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jdiv_round_up((long) cinfo->image_height * 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (long) (cinfo->max_v_samp_factor * DCTSIZE)); 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else /* !IDCT_SCALING_SUPPORTED */ 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Hardwire it to "no scaling" */ 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_width = cinfo->image_width; 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_height = cinfo->image_height; 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and has computed unscaled downsampled_width and downsampled_height. 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* IDCT_SCALING_SUPPORTED */ 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Report number of components in selected colorspace. */ 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Probably this should be in the color conversion module... */ 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (cinfo->out_color_space) { 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JCS_GRAYSCALE: 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components = 1; 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JCS_RGB: 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if RGB_PIXELSIZE != 3 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components = RGB_PIXELSIZE; 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* else share code with YCbCr */ 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JCS_YCbCr: 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components = 3; 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JCS_CMYK: 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JCS_YCCK: 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components = 4; 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: /* else must be same colorspace as in file */ 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components = cinfo->num_components; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->output_components = (cinfo->quantize_colors ? 1 : 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->out_color_components); 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* See if upsampler will want to emit more than one row at a time */ 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (use_merged_upsample(cinfo)) 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->rec_outbuf_height = 1; 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Several decompression processes need to range-limit values to the range 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 0..MAXJSAMPLE; the input value may fall somewhat outside this range 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * due to noise introduced by quantization, roundoff error, etc. These 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * processes are inner loops and need to be as fast as possible. On most 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * machines, particularly CPUs with pipelines or instruction prefetch, 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * a (subscript-check-less) C table lookup 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * x = sample_range_limit[x]; 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * is faster than explicit tests 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * if (x < 0) x = 0; 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These processes all use a common table prepared by the routine below. 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For most steps we can mathematically guarantee that the initial value 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * of x is within MAXJSAMPLE+1 of the legal range, so a table running from 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * limiting step (just after the IDCT), a wildly out-of-range value is 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * possible if the input data is corrupt. To avoid any chance of indexing 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * off the end of memory and getting a bad-pointer trap, we perform the 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * post-IDCT limiting thus: 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * x = range_limit[x & MASK]; 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * samples. Under normal circumstances this is more than enough range and 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * a correct output will be generated; with bogus input data the mask will 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * cause wraparound, and we will safely generate a bogus-but-in-range output. 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For the post-IDCT step, we want to convert the data from signed to unsigned 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * representation by adding CENTERJSAMPLE at the same time that we limit it. 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * So the post-IDCT limiting table ends up looking like this: 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 0,1,...,CENTERJSAMPLE-1 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Negative inputs select values from the upper half of the table after 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * masking. 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * We can save some space by overlapping the start of the post-IDCT table 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * with the simpler range limiting table. The post-IDCT table begins at 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * sample_range_limit + CENTERJSAMPLE. 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Note that the table is allocated in near data space on PCs; it's small 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * enough and used often enough to justify this. 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovLOCAL(void) 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovprepare_range_limit_table (j_decompress_ptr cinfo) 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Allocate and fill in the sample_range_limit table */ 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPLE * table; 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i; 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table = (JSAMPLE *) 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->sample_range_limit = table; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* First segment of "simple" table: limit[x] = 0 for x < 0 */ 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Main part of "simple" table: limit[x] = x */ 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i <= MAXJSAMPLE; i++) 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table[i] = (JSAMPLE) i; 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* End of simple table, rest of first half of post-IDCT table */ 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table[i] = MAXJSAMPLE; 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Second half of post-IDCT table */ 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov MEMZERO(table + (2 * (MAXJSAMPLE+1)), 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Master selection of decompression modules. 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is done once at jpeg_start_decompress time. We determine 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * which modules will be used and give them appropriate initialization calls. 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * We also initialize the decompressor input side to begin consuming data. 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Since jpeg_read_header has finished, we know what is in the SOF 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and (first) SOS markers. We also have all the application parameter 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * settings. 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovLOCAL(void) 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovmaster_selection (j_decompress_ptr cinfo) 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_master_ptr master = (my_master_ptr) cinfo->master; 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov boolean use_c_buffer; 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov long samplesperrow; 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION jd_samplesperrow; 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Initialize dimensions and other stuff */ 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jpeg_calc_output_dimensions(cinfo); 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov prepare_range_limit_table(cinfo); 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Width of an output scanline must be representable as JDIMENSION. */ 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jd_samplesperrow = (JDIMENSION) samplesperrow; 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((long) jd_samplesperrow != samplesperrow) 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Initialize my private state */ 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pass_number = 0; 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->using_merged_upsample = use_merged_upsample(cinfo); 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Color quantizer selection */ 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->quantizer_1pass = NULL; 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->quantizer_2pass = NULL; 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* No mode changes if not using buffered-image mode. */ 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! cinfo->quantize_colors || ! cinfo->buffered_image) { 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_1pass_quant = FALSE; 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_external_quant = FALSE; 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_2pass_quant = FALSE; 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->quantize_colors) { 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->raw_data_out) 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOTIMPL); 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* 2-pass quantizer only works in 3-component color space. */ 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->out_color_components != 3) { 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_1pass_quant = TRUE; 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_external_quant = FALSE; 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_2pass_quant = FALSE; 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->colormap = NULL; 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cinfo->colormap != NULL) { 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_external_quant = TRUE; 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cinfo->two_pass_quantize) { 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_2pass_quant = TRUE; 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->enable_1pass_quant = TRUE; 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->enable_1pass_quant) { 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef QUANT_1PASS_SUPPORTED 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_1pass_quantizer(cinfo); 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->quantizer_1pass = cinfo->cquantize; 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* We use the 2-pass code to map to external colormaps. */ 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef QUANT_2PASS_SUPPORTED 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_2pass_quantizer(cinfo); 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->quantizer_2pass = cinfo->cquantize; 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If both quantizers are initialized, the 2-pass one is left active; 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * this is necessary for starting with quantization to an external map. 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Post-processing: in particular, color conversion first */ 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! cinfo->raw_data_out) { 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (master->using_merged_upsample) { 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef UPSAMPLE_MERGING_SUPPORTED 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_merged_upsampler(cinfo); /* does color conversion too */ 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_color_deconverter(cinfo); 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_upsampler(cinfo); 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Inverse DCT */ 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_inverse_dct(cinfo); 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Entropy decoding: either Huffman or arithmetic coding. */ 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->arith_code) { 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_ARITH_NOTIMPL); 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->progressive_mode) { 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef D_PROGRESSIVE_SUPPORTED 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_phuff_decoder(cinfo); 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_huff_decoder(cinfo); 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Initialize principal buffer controllers. */ 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_d_coef_controller(cinfo, use_c_buffer); 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! cinfo->raw_data_out) 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* We can now tell the memory manager to allocate virtual arrays. */ 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Initialize input side of decompressor to consume first scan. */ 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->inputctl->start_input_pass) (cinfo); 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If jpeg_start_decompress will read the whole file, initialize 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * progress monitoring appropriately. The input step is counted 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * as one pass. 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->progress != NULL && ! cinfo->buffered_image && 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->inputctl->has_multiple_scans) { 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int nscans; 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Estimate number of scans to set pass_limit. */ 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->progressive_mode) { 411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ 412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nscans = 2 + 3 * cinfo->num_components; 413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* For a nonprogressive multiscan file, estimate 1 scan per component. */ 415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nscans = cinfo->num_components; 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->pass_counter = 0L; 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->completed_passes = 0; 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Count the input pass as done */ 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pass_number++; 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* D_MULTISCAN_FILES_SUPPORTED */ 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Per-pass setup. 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is called at the beginning of each output pass. We determine which 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * modules will be active during this pass and give them appropriate 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * start_pass calls. We also set is_dummy_pass to indicate whether this 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * is a "real" output pass or a dummy pass for color quantization. 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (In the latter case, jdapistd.c will crank the pass to completion.) 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovprepare_for_output_pass (j_decompress_ptr cinfo) 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_master_ptr master = (my_master_ptr) cinfo->master; 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (master->pub.is_dummy_pass) { 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef QUANT_2PASS_SUPPORTED 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Final pass of 2-pass quantization */ 445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.is_dummy_pass = FALSE; 446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->cquantize->start_pass) (cinfo, FALSE); 447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); 448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* QUANT_2PASS_SUPPORTED */ 452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->quantize_colors && cinfo->colormap == NULL) { 454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Select new quantization method */ 455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->cquantize = master->quantizer_2pass; 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.is_dummy_pass = TRUE; 458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cinfo->enable_1pass_quant) { 459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->cquantize = master->quantizer_1pass; 460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_MODE_CHANGE); 462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->idct->start_pass) (cinfo); 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->coef->start_output_pass) (cinfo); 466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! cinfo->raw_data_out) { 467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! master->using_merged_upsample) 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->cconvert->start_pass) (cinfo); 469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->upsample->start_pass) (cinfo); 470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->quantize_colors) 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); 472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->post->start_pass) (cinfo, 473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); 474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); 475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Set up progress monitor's pass info if present */ 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->progress != NULL) { 480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->completed_passes = master->pass_number; 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->total_passes = master->pass_number + 482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (master->pub.is_dummy_pass ? 2 : 1); 483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* In buffered-image mode, we assume one more output pass if EOI not 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * yet reached, but no more passes if EOI has been reached. 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { 487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); 488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Finish up at end of an output pass. 495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovfinish_output_pass (j_decompress_ptr cinfo) 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_master_ptr master = (my_master_ptr) cinfo->master; 501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->quantize_colors) 503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->cquantize->finish_pass) (cinfo); 504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pass_number++; 505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Switch to a new external colormap between output passes. 512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(void) 515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjpeg_new_colormap (j_decompress_ptr cinfo) 516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_master_ptr master = (my_master_ptr) cinfo->master; 518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Prevent application from calling me at wrong times */ 520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->global_state != DSTATE_BUFIMAGE) 521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->quantize_colors && cinfo->enable_external_quant && 524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->colormap != NULL) { 525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Select 2-pass quantizer for external colormap use */ 526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->cquantize = master->quantizer_2pass; 527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Notify quantizer of colormap change */ 528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->cquantize->new_color_map) (cinfo); 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.is_dummy_pass = FALSE; /* just in case */ 530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else 531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ERREXIT(cinfo, JERR_MODE_CHANGE); 532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* D_MULTISCAN_FILES_SUPPORTED */ 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Initialize master decompression control and select active modules. 539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is performed at the start of jpeg_start_decompress. 540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(void) 543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjinit_master_decompress (j_decompress_ptr cinfo) 544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_master_ptr master; 546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master = (my_master_ptr) 548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SIZEOF(my_decomp_master)); 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->master = (struct jpeg_decomp_master *) master; 551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.prepare_for_output_pass = prepare_for_output_pass; 552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.finish_output_pass = finish_output_pass; 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master->pub.is_dummy_pass = FALSE; 555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov master_selection(cinfo); 557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 558