jdinput.c revision 3147fbe7688fc353e6ae03825a37cf101a4ee01d
1/* 2 * jdinput.c 3 * 4 * Copyright (C) 1991-1997, Thomas G. Lane. 5 * This file is part of the Independent JPEG Group's software. 6 * For conditions of distribution and use, see the accompanying README file. 7 * 8 * This file contains input control logic for the JPEG decompressor. 9 * These routines are concerned with controlling the decompressor's input 10 * processing (marker reading and coefficient decoding). The actual input 11 * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. 12 */ 13 14#define JPEG_INTERNALS 15#include "jinclude.h" 16#include "jpeglib.h" 17 18 19/* Private state */ 20 21typedef struct { 22 struct jpeg_input_controller pub; /* public fields */ 23 24 boolean inheaders; /* TRUE until first SOS is reached */ 25} my_input_controller; 26 27typedef my_input_controller * my_inputctl_ptr; 28 29 30/* Forward declarations */ 31METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); 32METHODDEF(int) consume_markers_with_huffman_index JPP((j_decompress_ptr cinfo, 33 huffman_index *index)); 34 35 36/* 37 * Routines to calculate various quantities related to the size of the image. 38 */ 39 40LOCAL(void) 41initial_setup (j_decompress_ptr cinfo) 42/* Called once, when first SOS marker is reached */ 43{ 44 int ci; 45 jpeg_component_info *compptr; 46 47 /* Make sure image isn't bigger than I can handle */ 48 if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || 49 (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) 50 ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); 51 52 /* For now, precision must match compiled-in value... */ 53 if (cinfo->data_precision != BITS_IN_JSAMPLE) 54 ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); 55 56 /* Check that number of components won't exceed internal array sizes */ 57 if (cinfo->num_components > MAX_COMPONENTS) 58 ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, 59 MAX_COMPONENTS); 60 61 /* Compute maximum sampling factors; check factor validity */ 62 cinfo->max_h_samp_factor = 1; 63 cinfo->max_v_samp_factor = 1; 64 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 65 ci++, compptr++) { 66 if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || 67 compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) 68 ERREXIT(cinfo, JERR_BAD_SAMPLING); 69 cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, 70 compptr->h_samp_factor); 71 cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, 72 compptr->v_samp_factor); 73 } 74 75 /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. 76 * In the full decompressor, this will be overridden by jdmaster.c; 77 * but in the transcoder, jdmaster.c is not used, so we must do it here. 78 */ 79 cinfo->min_DCT_scaled_size = DCTSIZE; 80 81 /* Compute dimensions of components */ 82 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 83 ci++, compptr++) { 84 compptr->DCT_scaled_size = DCTSIZE; 85 /* Size in DCT blocks */ 86 compptr->width_in_blocks = (JDIMENSION) 87 jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, 88 (long) (cinfo->max_h_samp_factor * DCTSIZE)); 89 compptr->height_in_blocks = (JDIMENSION) 90 jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, 91 (long) (cinfo->max_v_samp_factor * DCTSIZE)); 92 /* downsampled_width and downsampled_height will also be overridden by 93 * jdmaster.c if we are doing full decompression. The transcoder library 94 * doesn't use these values, but the calling application might. 95 */ 96 /* Size in samples */ 97 compptr->downsampled_width = (JDIMENSION) 98 jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, 99 (long) cinfo->max_h_samp_factor); 100 compptr->downsampled_height = (JDIMENSION) 101 jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, 102 (long) cinfo->max_v_samp_factor); 103 /* Mark component needed, until color conversion says otherwise */ 104 compptr->component_needed = TRUE; 105 /* Mark no quantization table yet saved for component */ 106 compptr->quant_table = NULL; 107 } 108 109 /* Compute number of fully interleaved MCU rows. */ 110 cinfo->total_iMCU_rows = (JDIMENSION) 111 jdiv_round_up((long) cinfo->image_height, 112 (long) (cinfo->max_v_samp_factor*DCTSIZE)); 113 114 /* Decide whether file contains multiple scans */ 115 if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) 116 cinfo->inputctl->has_multiple_scans = TRUE; 117 else 118 cinfo->inputctl->has_multiple_scans = FALSE; 119} 120 121LOCAL(void) 122per_scan_setup (j_decompress_ptr cinfo) 123/* Do computations that are needed before processing a JPEG scan */ 124/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ 125{ 126 int ci, mcublks, tmp; 127 jpeg_component_info *compptr; 128 129 if (cinfo->comps_in_scan == 1) { 130 131 /* Noninterleaved (single-component) scan */ 132 compptr = cinfo->cur_comp_info[0]; 133 134 /* Overall image size in MCUs */ 135 cinfo->MCUs_per_row = compptr->width_in_blocks; 136 cinfo->MCU_rows_in_scan = compptr->height_in_blocks; 137 138 /* For noninterleaved scan, always one block per MCU */ 139 compptr->MCU_width = 1; 140 compptr->MCU_height = 1; 141 compptr->MCU_blocks = 1; 142 compptr->MCU_sample_width = compptr->DCT_scaled_size; 143 compptr->last_col_width = 1; 144 /* For noninterleaved scans, it is convenient to define last_row_height 145 * as the number of block rows present in the last iMCU row. 146 */ 147 tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 148 if (tmp == 0) tmp = compptr->v_samp_factor; 149 compptr->last_row_height = tmp; 150 151 /* Prepare array describing MCU composition */ 152 cinfo->blocks_in_MCU = 1; 153 cinfo->MCU_membership[0] = 0; 154 155 } else { 156 157 /* Interleaved (multi-component) scan */ 158 if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) 159 ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, 160 MAX_COMPS_IN_SCAN); 161 162 /* Overall image size in MCUs */ 163 cinfo->MCUs_per_row = (JDIMENSION) 164 jdiv_round_up((long) cinfo->image_width, 165 (long) (cinfo->max_h_samp_factor*DCTSIZE)); 166 cinfo->MCU_rows_in_scan = (JDIMENSION) 167 jdiv_round_up((long) cinfo->image_height, 168 (long) (cinfo->max_v_samp_factor*DCTSIZE)); 169 170 cinfo->blocks_in_MCU = 0; 171 172 for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 173 compptr = cinfo->cur_comp_info[ci]; 174 /* Sampling factors give # of blocks of component in each MCU */ 175 compptr->MCU_width = compptr->h_samp_factor; 176 compptr->MCU_height = compptr->v_samp_factor; 177 compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; 178 compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; 179 /* Figure number of non-dummy blocks in last MCU column & row */ 180 tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); 181 if (tmp == 0) tmp = compptr->MCU_width; 182 compptr->last_col_width = tmp; 183 tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); 184 if (tmp == 0) tmp = compptr->MCU_height; 185 compptr->last_row_height = tmp; 186 /* Prepare array describing MCU composition */ 187 mcublks = compptr->MCU_blocks; 188 if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) 189 ERREXIT(cinfo, JERR_BAD_MCU_SIZE); 190 while (mcublks-- > 0) { 191 cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; 192 } 193 } 194 195 } 196} 197 198GLOBAL(void) 199jpeg_decompress_per_scan_setup(j_decompress_ptr cinfo) 200{ 201 per_scan_setup(cinfo); 202} 203 204 205 206/* 207 * Save away a copy of the Q-table referenced by each component present 208 * in the current scan, unless already saved during a prior scan. 209 * 210 * In a multiple-scan JPEG file, the encoder could assign different components 211 * the same Q-table slot number, but change table definitions between scans 212 * so that each component uses a different Q-table. (The IJG encoder is not 213 * currently capable of doing this, but other encoders might.) Since we want 214 * to be able to dequantize all the components at the end of the file, this 215 * means that we have to save away the table actually used for each component. 216 * We do this by copying the table at the start of the first scan containing 217 * the component. 218 * The JPEG spec prohibits the encoder from changing the contents of a Q-table 219 * slot between scans of a component using that slot. If the encoder does so 220 * anyway, this decoder will simply use the Q-table values that were current 221 * at the start of the first scan for the component. 222 * 223 * The decompressor output side looks only at the saved quant tables, 224 * not at the current Q-table slots. 225 */ 226 227LOCAL(void) 228latch_quant_tables (j_decompress_ptr cinfo) 229{ 230 int ci, qtblno; 231 jpeg_component_info *compptr; 232 JQUANT_TBL * qtbl; 233 234 for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 235 compptr = cinfo->cur_comp_info[ci]; 236 /* No work if we already saved Q-table for this component */ 237 if (compptr->quant_table != NULL) 238 continue; 239 /* Make sure specified quantization table is present */ 240 qtblno = compptr->quant_tbl_no; 241 if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || 242 cinfo->quant_tbl_ptrs[qtblno] == NULL) 243 ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); 244 /* OK, save away the quantization table */ 245 qtbl = (JQUANT_TBL *) 246 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 247 SIZEOF(JQUANT_TBL)); 248 MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); 249 compptr->quant_table = qtbl; 250 } 251} 252 253 254/* 255 * Initialize the input modules to read a scan of compressed data. 256 * The first call to this is done by jdmaster.c after initializing 257 * the entire decompressor (during jpeg_start_decompress). 258 * Subsequent calls come from consume_markers, below. 259 */ 260 261METHODDEF(void) 262start_input_pass (j_decompress_ptr cinfo) 263{ 264 per_scan_setup(cinfo); 265 latch_quant_tables(cinfo); 266 (*cinfo->entropy->start_pass) (cinfo); 267 (*cinfo->coef->start_input_pass) (cinfo); 268 cinfo->inputctl->consume_input = cinfo->coef->consume_data; 269 cinfo->inputctl->consume_input_with_huffman_index = cinfo->coef->consume_data_with_huffman_index; 270} 271 272 273/* 274 * Finish up after inputting a compressed-data scan. 275 * This is called by the coefficient controller after it's read all 276 * the expected data of the scan. 277 */ 278 279METHODDEF(void) 280finish_input_pass (j_decompress_ptr cinfo) 281{ 282 cinfo->inputctl->consume_input = consume_markers; 283 cinfo->inputctl->consume_input_with_huffman_index = consume_markers_with_huffman_index; 284} 285 286 287METHODDEF(int) 288consume_markers_with_huffman_index (j_decompress_ptr cinfo, huffman_index *index) 289{ 290 return consume_markers(cinfo); 291} 292/* 293 * Read JPEG markers before, between, or after compressed-data scans. 294 * Change state as necessary when a new scan is reached. 295 * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 296 * 297 * The consume_input method pointer points either here or to the 298 * coefficient controller's consume_data routine, depending on whether 299 * we are reading a compressed data segment or inter-segment markers. 300 */ 301 302METHODDEF(int) 303consume_markers (j_decompress_ptr cinfo) 304{ 305 my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; 306 int val; 307 308 if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ 309 return JPEG_REACHED_EOI; 310 311 val = (*cinfo->marker->read_markers) (cinfo); 312 313 switch (val) { 314 case JPEG_REACHED_SOS: /* Found SOS */ 315 if (inputctl->inheaders) { /* 1st SOS */ 316 initial_setup(cinfo); 317 inputctl->inheaders = FALSE; 318 /* Note: start_input_pass must be called by jdmaster.c 319 * before any more input can be consumed. jdapimin.c is 320 * responsible for enforcing this sequencing. 321 */ 322 } else { /* 2nd or later SOS marker */ 323 if (! inputctl->pub.has_multiple_scans) 324 ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ 325 start_input_pass(cinfo); 326 } 327 break; 328 case JPEG_REACHED_EOI: /* Found EOI */ 329 inputctl->pub.eoi_reached = TRUE; 330 if (inputctl->inheaders) { /* Tables-only datastream, apparently */ 331 if (cinfo->marker->saw_SOF) 332 ERREXIT(cinfo, JERR_SOF_NO_SOS); 333 } else { 334 /* Prevent infinite loop in coef ctlr's decompress_data routine 335 * if user set output_scan_number larger than number of scans. 336 */ 337 if (cinfo->output_scan_number > cinfo->input_scan_number) 338 cinfo->output_scan_number = cinfo->input_scan_number; 339 } 340 break; 341 case JPEG_SUSPENDED: 342 break; 343 } 344 345 return val; 346} 347 348 349/* 350 * Reset state to begin a fresh datastream. 351 */ 352 353METHODDEF(void) 354reset_input_controller (j_decompress_ptr cinfo) 355{ 356 my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; 357 358 inputctl->pub.consume_input = consume_markers; 359 inputctl->pub.consume_input_with_huffman_index = consume_markers_with_huffman_index; 360 inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ 361 inputctl->pub.eoi_reached = FALSE; 362 inputctl->inheaders = TRUE; 363 /* Reset other modules */ 364 (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); 365 (*cinfo->marker->reset_marker_reader) (cinfo); 366 /* Reset progression state -- would be cleaner if entropy decoder did this */ 367 cinfo->coef_bits = NULL; 368} 369 370 371/* 372 * Initialize the input controller module. 373 * This is called only once, when the decompression object is created. 374 */ 375 376GLOBAL(void) 377jinit_input_controller (j_decompress_ptr cinfo) 378{ 379 my_inputctl_ptr inputctl; 380 381 /* Create subobject in permanent pool */ 382 inputctl = (my_inputctl_ptr) 383 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 384 SIZEOF(my_input_controller)); 385 cinfo->inputctl = (struct jpeg_input_controller *) inputctl; 386 /* Initialize method pointers */ 387 inputctl->pub.consume_input = consume_markers; 388 inputctl->pub.reset_input_controller = reset_input_controller; 389 inputctl->pub.start_input_pass = start_input_pass; 390 inputctl->pub.finish_input_pass = finish_input_pass; 391 392 inputctl->pub.consume_input_with_huffman_index = consume_markers_with_huffman_index; 393 /* Initialize state: can't use reset_input_controller since we don't 394 * want to try to reset other modules yet. 395 */ 396 inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ 397 inputctl->pub.eoi_reached = FALSE; 398 inputctl->inheaders = TRUE; 399} 400