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