Changeset 846 for trunk/src/3rdparty/libjpeg/jdinput.c
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/3rdparty/libjpeg/jdinput.c
r2 r846 3 3 * 4 4 * Copyright (C) 1991-1997, Thomas G. Lane. 5 * Modified 2002-2009 by Guido Vollbeding. 5 6 * This file is part of the Independent JPEG Group's software. 6 7 * For conditions of distribution and use, see the accompanying README file. … … 9 10 * These routines are concerned with controlling the decompressor's input 10 11 * processing (marker reading and coefficient decoding). The actual input 11 * reading is done in jdmarker.c, jdhuff.c, and jd phuff.c.12 * reading is done in jdmarker.c, jdhuff.c, and jdarith.c. 12 13 */ 13 14 … … 22 23 struct jpeg_input_controller pub; /* public fields */ 23 24 24 boolean inheaders; /* TRUEuntil first SOS is reached */25 int inheaders; /* Nonzero until first SOS is reached */ 25 26 } my_input_controller; 26 27 … … 35 36 * Routines to calculate various quantities related to the size of the image. 36 37 */ 38 39 40 /* 41 * Compute output image dimensions and related values. 42 * NOTE: this is exported for possible use by application. 43 * Hence it mustn't do anything that can't be done twice. 44 */ 45 46 GLOBAL(void) 47 jpeg_core_output_dimensions (j_decompress_ptr cinfo) 48 /* Do computations that are needed before master selection phase. 49 * This function is used for transcoding and full decompression. 50 */ 51 { 52 #ifdef IDCT_SCALING_SUPPORTED 53 int ci; 54 jpeg_component_info *compptr; 55 56 /* Compute actual output image dimensions and DCT scaling choices. */ 57 if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { 58 /* Provide 1/block_size scaling */ 59 cinfo->output_width = (JDIMENSION) 60 jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); 61 cinfo->output_height = (JDIMENSION) 62 jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); 63 cinfo->min_DCT_h_scaled_size = 1; 64 cinfo->min_DCT_v_scaled_size = 1; 65 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { 66 /* Provide 2/block_size scaling */ 67 cinfo->output_width = (JDIMENSION) 68 jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); 69 cinfo->output_height = (JDIMENSION) 70 jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); 71 cinfo->min_DCT_h_scaled_size = 2; 72 cinfo->min_DCT_v_scaled_size = 2; 73 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) { 74 /* Provide 3/block_size scaling */ 75 cinfo->output_width = (JDIMENSION) 76 jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size); 77 cinfo->output_height = (JDIMENSION) 78 jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size); 79 cinfo->min_DCT_h_scaled_size = 3; 80 cinfo->min_DCT_v_scaled_size = 3; 81 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { 82 /* Provide 4/block_size scaling */ 83 cinfo->output_width = (JDIMENSION) 84 jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); 85 cinfo->output_height = (JDIMENSION) 86 jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); 87 cinfo->min_DCT_h_scaled_size = 4; 88 cinfo->min_DCT_v_scaled_size = 4; 89 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) { 90 /* Provide 5/block_size scaling */ 91 cinfo->output_width = (JDIMENSION) 92 jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size); 93 cinfo->output_height = (JDIMENSION) 94 jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size); 95 cinfo->min_DCT_h_scaled_size = 5; 96 cinfo->min_DCT_v_scaled_size = 5; 97 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) { 98 /* Provide 6/block_size scaling */ 99 cinfo->output_width = (JDIMENSION) 100 jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size); 101 cinfo->output_height = (JDIMENSION) 102 jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size); 103 cinfo->min_DCT_h_scaled_size = 6; 104 cinfo->min_DCT_v_scaled_size = 6; 105 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) { 106 /* Provide 7/block_size scaling */ 107 cinfo->output_width = (JDIMENSION) 108 jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size); 109 cinfo->output_height = (JDIMENSION) 110 jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size); 111 cinfo->min_DCT_h_scaled_size = 7; 112 cinfo->min_DCT_v_scaled_size = 7; 113 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { 114 /* Provide 8/block_size scaling */ 115 cinfo->output_width = (JDIMENSION) 116 jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); 117 cinfo->output_height = (JDIMENSION) 118 jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); 119 cinfo->min_DCT_h_scaled_size = 8; 120 cinfo->min_DCT_v_scaled_size = 8; 121 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) { 122 /* Provide 9/block_size scaling */ 123 cinfo->output_width = (JDIMENSION) 124 jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size); 125 cinfo->output_height = (JDIMENSION) 126 jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size); 127 cinfo->min_DCT_h_scaled_size = 9; 128 cinfo->min_DCT_v_scaled_size = 9; 129 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) { 130 /* Provide 10/block_size scaling */ 131 cinfo->output_width = (JDIMENSION) 132 jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size); 133 cinfo->output_height = (JDIMENSION) 134 jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size); 135 cinfo->min_DCT_h_scaled_size = 10; 136 cinfo->min_DCT_v_scaled_size = 10; 137 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) { 138 /* Provide 11/block_size scaling */ 139 cinfo->output_width = (JDIMENSION) 140 jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size); 141 cinfo->output_height = (JDIMENSION) 142 jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size); 143 cinfo->min_DCT_h_scaled_size = 11; 144 cinfo->min_DCT_v_scaled_size = 11; 145 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) { 146 /* Provide 12/block_size scaling */ 147 cinfo->output_width = (JDIMENSION) 148 jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size); 149 cinfo->output_height = (JDIMENSION) 150 jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size); 151 cinfo->min_DCT_h_scaled_size = 12; 152 cinfo->min_DCT_v_scaled_size = 12; 153 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) { 154 /* Provide 13/block_size scaling */ 155 cinfo->output_width = (JDIMENSION) 156 jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size); 157 cinfo->output_height = (JDIMENSION) 158 jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size); 159 cinfo->min_DCT_h_scaled_size = 13; 160 cinfo->min_DCT_v_scaled_size = 13; 161 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) { 162 /* Provide 14/block_size scaling */ 163 cinfo->output_width = (JDIMENSION) 164 jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size); 165 cinfo->output_height = (JDIMENSION) 166 jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size); 167 cinfo->min_DCT_h_scaled_size = 14; 168 cinfo->min_DCT_v_scaled_size = 14; 169 } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) { 170 /* Provide 15/block_size scaling */ 171 cinfo->output_width = (JDIMENSION) 172 jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size); 173 cinfo->output_height = (JDIMENSION) 174 jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size); 175 cinfo->min_DCT_h_scaled_size = 15; 176 cinfo->min_DCT_v_scaled_size = 15; 177 } else { 178 /* Provide 16/block_size scaling */ 179 cinfo->output_width = (JDIMENSION) 180 jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size); 181 cinfo->output_height = (JDIMENSION) 182 jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size); 183 cinfo->min_DCT_h_scaled_size = 16; 184 cinfo->min_DCT_v_scaled_size = 16; 185 } 186 187 /* Recompute dimensions of components */ 188 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 189 ci++, compptr++) { 190 compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; 191 compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; 192 } 193 194 #else /* !IDCT_SCALING_SUPPORTED */ 195 196 /* Hardwire it to "no scaling" */ 197 cinfo->output_width = cinfo->image_width; 198 cinfo->output_height = cinfo->image_height; 199 /* jdinput.c has already initialized DCT_scaled_size, 200 * and has computed unscaled downsampled_width and downsampled_height. 201 */ 202 203 #endif /* IDCT_SCALING_SUPPORTED */ 204 } 205 37 206 38 207 LOCAL(void) … … 71 240 } 72 241 73 /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. 74 * In the full decompressor, this will be overridden by jdmaster.c; 75 * but in the transcoder, jdmaster.c is not used, so we must do it here. 242 /* Derive block_size, natural_order, and lim_Se */ 243 if (cinfo->is_baseline || (cinfo->progressive_mode && 244 cinfo->comps_in_scan)) { /* no pseudo SOS marker */ 245 cinfo->block_size = DCTSIZE; 246 cinfo->natural_order = jpeg_natural_order; 247 cinfo->lim_Se = DCTSIZE2-1; 248 } else 249 switch (cinfo->Se) { 250 case (1*1-1): 251 cinfo->block_size = 1; 252 cinfo->natural_order = jpeg_natural_order; /* not needed */ 253 cinfo->lim_Se = cinfo->Se; 254 break; 255 case (2*2-1): 256 cinfo->block_size = 2; 257 cinfo->natural_order = jpeg_natural_order2; 258 cinfo->lim_Se = cinfo->Se; 259 break; 260 case (3*3-1): 261 cinfo->block_size = 3; 262 cinfo->natural_order = jpeg_natural_order3; 263 cinfo->lim_Se = cinfo->Se; 264 break; 265 case (4*4-1): 266 cinfo->block_size = 4; 267 cinfo->natural_order = jpeg_natural_order4; 268 cinfo->lim_Se = cinfo->Se; 269 break; 270 case (5*5-1): 271 cinfo->block_size = 5; 272 cinfo->natural_order = jpeg_natural_order5; 273 cinfo->lim_Se = cinfo->Se; 274 break; 275 case (6*6-1): 276 cinfo->block_size = 6; 277 cinfo->natural_order = jpeg_natural_order6; 278 cinfo->lim_Se = cinfo->Se; 279 break; 280 case (7*7-1): 281 cinfo->block_size = 7; 282 cinfo->natural_order = jpeg_natural_order7; 283 cinfo->lim_Se = cinfo->Se; 284 break; 285 case (8*8-1): 286 cinfo->block_size = 8; 287 cinfo->natural_order = jpeg_natural_order; 288 cinfo->lim_Se = DCTSIZE2-1; 289 break; 290 case (9*9-1): 291 cinfo->block_size = 9; 292 cinfo->natural_order = jpeg_natural_order; 293 cinfo->lim_Se = DCTSIZE2-1; 294 break; 295 case (10*10-1): 296 cinfo->block_size = 10; 297 cinfo->natural_order = jpeg_natural_order; 298 cinfo->lim_Se = DCTSIZE2-1; 299 break; 300 case (11*11-1): 301 cinfo->block_size = 11; 302 cinfo->natural_order = jpeg_natural_order; 303 cinfo->lim_Se = DCTSIZE2-1; 304 break; 305 case (12*12-1): 306 cinfo->block_size = 12; 307 cinfo->natural_order = jpeg_natural_order; 308 cinfo->lim_Se = DCTSIZE2-1; 309 break; 310 case (13*13-1): 311 cinfo->block_size = 13; 312 cinfo->natural_order = jpeg_natural_order; 313 cinfo->lim_Se = DCTSIZE2-1; 314 break; 315 case (14*14-1): 316 cinfo->block_size = 14; 317 cinfo->natural_order = jpeg_natural_order; 318 cinfo->lim_Se = DCTSIZE2-1; 319 break; 320 case (15*15-1): 321 cinfo->block_size = 15; 322 cinfo->natural_order = jpeg_natural_order; 323 cinfo->lim_Se = DCTSIZE2-1; 324 break; 325 case (16*16-1): 326 cinfo->block_size = 16; 327 cinfo->natural_order = jpeg_natural_order; 328 cinfo->lim_Se = DCTSIZE2-1; 329 break; 330 default: 331 ERREXIT4(cinfo, JERR_BAD_PROGRESSION, 332 cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); 333 break; 334 } 335 336 /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. 337 * In the full decompressor, 338 * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c; 339 * but in the transcoder, 340 * jpeg_calc_output_dimensions is not used, so we must do it here. 76 341 */ 77 cinfo->min_DCT_scaled_size = DCTSIZE; 342 cinfo->min_DCT_h_scaled_size = cinfo->block_size; 343 cinfo->min_DCT_v_scaled_size = cinfo->block_size; 78 344 79 345 /* Compute dimensions of components */ 80 346 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 81 347 ci++, compptr++) { 82 compptr->DCT_scaled_size = DCTSIZE; 348 compptr->DCT_h_scaled_size = cinfo->block_size; 349 compptr->DCT_v_scaled_size = cinfo->block_size; 83 350 /* Size in DCT blocks */ 84 351 compptr->width_in_blocks = (JDIMENSION) 85 352 jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, 86 (long) (cinfo->max_h_samp_factor * DCTSIZE));353 (long) (cinfo->max_h_samp_factor * cinfo->block_size)); 87 354 compptr->height_in_blocks = (JDIMENSION) 88 355 jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, 89 (long) (cinfo->max_v_samp_factor * DCTSIZE));356 (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 90 357 /* downsampled_width and downsampled_height will also be overridden by 91 358 * jdmaster.c if we are doing full decompression. The transcoder library … … 108 375 cinfo->total_iMCU_rows = (JDIMENSION) 109 376 jdiv_round_up((long) cinfo->image_height, 110 (long) (cinfo->max_v_samp_factor*DCTSIZE));377 (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 111 378 112 379 /* Decide whether file contains multiple scans */ … … 139 406 compptr->MCU_height = 1; 140 407 compptr->MCU_blocks = 1; 141 compptr->MCU_sample_width = compptr->DCT_ scaled_size;408 compptr->MCU_sample_width = compptr->DCT_h_scaled_size; 142 409 compptr->last_col_width = 1; 143 410 /* For noninterleaved scans, it is convenient to define last_row_height … … 162 429 cinfo->MCUs_per_row = (JDIMENSION) 163 430 jdiv_round_up((long) cinfo->image_width, 164 (long) (cinfo->max_h_samp_factor *DCTSIZE));431 (long) (cinfo->max_h_samp_factor * cinfo->block_size)); 165 432 cinfo->MCU_rows_in_scan = (JDIMENSION) 166 433 jdiv_round_up((long) cinfo->image_height, 167 (long) (cinfo->max_v_samp_factor *DCTSIZE));434 (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 168 435 169 436 cinfo->blocks_in_MCU = 0; … … 175 442 compptr->MCU_height = compptr->v_samp_factor; 176 443 compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; 177 compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_ scaled_size;444 compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; 178 445 /* Figure number of non-dummy blocks in last MCU column & row */ 179 446 tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); … … 283 550 * coefficient controller's consume_data routine, depending on whether 284 551 * we are reading a compressed data segment or inter-segment markers. 552 * 553 * Note: This function should NOT return a pseudo SOS marker (with zero 554 * component number) to the caller. A pseudo marker received by 555 * read_markers is processed and then skipped for other markers. 285 556 */ 286 557 … … 294 565 return JPEG_REACHED_EOI; 295 566 296 val = (*cinfo->marker->read_markers) (cinfo); 297 298 switch (val) { 299 case JPEG_REACHED_SOS: /* Found SOS */ 300 if (inputctl->inheaders) { /* 1st SOS */ 301 initial_setup(cinfo); 302 inputctl->inheaders = FALSE; 303 /* Note: start_input_pass must be called by jdmaster.c 304 * before any more input can be consumed. jdapimin.c is 305 * responsible for enforcing this sequencing. 306 */ 307 } else { /* 2nd or later SOS marker */ 308 if (! inputctl->pub.has_multiple_scans) 309 ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ 310 start_input_pass(cinfo); 567 for (;;) { /* Loop to pass pseudo SOS marker */ 568 val = (*cinfo->marker->read_markers) (cinfo); 569 570 switch (val) { 571 case JPEG_REACHED_SOS: /* Found SOS */ 572 if (inputctl->inheaders) { /* 1st SOS */ 573 if (inputctl->inheaders == 1) 574 initial_setup(cinfo); 575 if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */ 576 inputctl->inheaders = 2; 577 break; 578 } 579 inputctl->inheaders = 0; 580 /* Note: start_input_pass must be called by jdmaster.c 581 * before any more input can be consumed. jdapimin.c is 582 * responsible for enforcing this sequencing. 583 */ 584 } else { /* 2nd or later SOS marker */ 585 if (! inputctl->pub.has_multiple_scans) 586 ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ 587 if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */ 588 break; 589 start_input_pass(cinfo); 590 } 591 return val; 592 case JPEG_REACHED_EOI: /* Found EOI */ 593 inputctl->pub.eoi_reached = TRUE; 594 if (inputctl->inheaders) { /* Tables-only datastream, apparently */ 595 if (cinfo->marker->saw_SOF) 596 ERREXIT(cinfo, JERR_SOF_NO_SOS); 597 } else { 598 /* Prevent infinite loop in coef ctlr's decompress_data routine 599 * if user set output_scan_number larger than number of scans. 600 */ 601 if (cinfo->output_scan_number > cinfo->input_scan_number) 602 cinfo->output_scan_number = cinfo->input_scan_number; 603 } 604 return val; 605 case JPEG_SUSPENDED: 606 return val; 607 default: 608 return val; 311 609 } 312 break;313 case JPEG_REACHED_EOI: /* Found EOI */314 inputctl->pub.eoi_reached = TRUE;315 if (inputctl->inheaders) { /* Tables-only datastream, apparently */316 if (cinfo->marker->saw_SOF)317 ERREXIT(cinfo, JERR_SOF_NO_SOS);318 } else {319 /* Prevent infinite loop in coef ctlr's decompress_data routine320 * if user set output_scan_number larger than number of scans.321 */322 if (cinfo->output_scan_number > cinfo->input_scan_number)323 cinfo->output_scan_number = cinfo->input_scan_number;324 }325 break;326 case JPEG_SUSPENDED:327 break;328 610 } 329 330 return val;331 611 } 332 612 … … 344 624 inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ 345 625 inputctl->pub.eoi_reached = FALSE; 346 inputctl->inheaders = TRUE;626 inputctl->inheaders = 1; 347 627 /* Reset other modules */ 348 628 (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); … … 378 658 inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ 379 659 inputctl->pub.eoi_reached = FALSE; 380 inputctl->inheaders = TRUE;381 } 660 inputctl->inheaders = 1; 661 }
Note:
See TracChangeset
for help on using the changeset viewer.