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