1 /* 2 * jdmarker.c 3 * 4 * This file was part of the Independent JPEG Group's software: 5 * Copyright (C) 1991-1998, Thomas G. Lane. 6 * libjpeg-turbo Modifications: 7 * Copyright (C) 2012, D. R. Commander. 8 * For conditions of distribution and use, see the accompanying README file. 9 * 10 * This file contains routines to decode JPEG datastream markers. 11 * Most of the complexity arises from our desire to support input 12 * suspension: if not all of the data for a marker is available, 13 * we must exit back to the application. On resumption, we reprocess 14 * the marker. 15 */ 16 17 #define JPEG_INTERNALS 18 #include "jinclude.h" 19 #include "jpeglib.h" 20 21 22 typedef enum { /* JPEG marker codes */ 23 M_SOF0 = 0xc0, 24 M_SOF1 = 0xc1, 25 M_SOF2 = 0xc2, 26 M_SOF3 = 0xc3, 27 28 M_SOF5 = 0xc5, 29 M_SOF6 = 0xc6, 30 M_SOF7 = 0xc7, 31 32 M_JPG = 0xc8, 33 M_SOF9 = 0xc9, 34 M_SOF10 = 0xca, 35 M_SOF11 = 0xcb, 36 37 M_SOF13 = 0xcd, 38 M_SOF14 = 0xce, 39 M_SOF15 = 0xcf, 40 41 M_DHT = 0xc4, 42 43 M_DAC = 0xcc, 44 45 M_RST0 = 0xd0, 46 M_RST1 = 0xd1, 47 M_RST2 = 0xd2, 48 M_RST3 = 0xd3, 49 M_RST4 = 0xd4, 50 M_RST5 = 0xd5, 51 M_RST6 = 0xd6, 52 M_RST7 = 0xd7, 53 54 M_SOI = 0xd8, 55 M_EOI = 0xd9, 56 M_SOS = 0xda, 57 M_DQT = 0xdb, 58 M_DNL = 0xdc, 59 M_DRI = 0xdd, 60 M_DHP = 0xde, 61 M_EXP = 0xdf, 62 63 M_APP0 = 0xe0, 64 M_APP1 = 0xe1, 65 M_APP2 = 0xe2, 66 M_APP3 = 0xe3, 67 M_APP4 = 0xe4, 68 M_APP5 = 0xe5, 69 M_APP6 = 0xe6, 70 M_APP7 = 0xe7, 71 M_APP8 = 0xe8, 72 M_APP9 = 0xe9, 73 M_APP10 = 0xea, 74 M_APP11 = 0xeb, 75 M_APP12 = 0xec, 76 M_APP13 = 0xed, 77 M_APP14 = 0xee, 78 M_APP15 = 0xef, 79 80 M_JPG0 = 0xf0, 81 M_JPG13 = 0xfd, 82 M_COM = 0xfe, 83 84 M_TEM = 0x01, 85 86 M_ERROR = 0x100 87 } JPEG_MARKER; 88 89 90 /* Private state */ 91 92 typedef struct { 93 struct jpeg_marker_reader pub; /* public fields */ 94 95 /* Application-overridable marker processing methods */ 96 jpeg_marker_parser_method process_COM; 97 jpeg_marker_parser_method process_APPn[16]; 98 99 /* Limit on marker data length to save for each marker type */ 100 unsigned int length_limit_COM; 101 unsigned int length_limit_APPn[16]; 102 103 /* Status of COM/APPn marker saving */ 104 jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ 105 unsigned int bytes_read; /* data bytes read so far in marker */ 106 /* Note: cur_marker is not linked into marker_list until it's all read. */ 107 } my_marker_reader; 108 109 typedef my_marker_reader * my_marker_ptr; 110 111 112 /* 113 * Macros for fetching data from the data source module. 114 * 115 * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect 116 * the current restart point; we update them only when we have reached a 117 * suitable place to restart if a suspension occurs. 118 */ 119 120 /* Declare and initialize local copies of input pointer/count */ 121 #define INPUT_VARS(cinfo) \ 122 struct jpeg_source_mgr * datasrc = (cinfo)->src; \ 123 const JOCTET * next_input_byte = datasrc->next_input_byte; \ 124 size_t bytes_in_buffer = datasrc->bytes_in_buffer 125 126 /* Unload the local copies --- do this only at a restart boundary */ 127 #define INPUT_SYNC(cinfo) \ 128 ( datasrc->next_input_byte = next_input_byte, \ 129 datasrc->bytes_in_buffer = bytes_in_buffer ) 130 131 /* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ 132 #define INPUT_RELOAD(cinfo) \ 133 ( next_input_byte = datasrc->next_input_byte, \ 134 bytes_in_buffer = datasrc->bytes_in_buffer ) 135 136 /* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. 137 * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, 138 * but we must reload the local copies after a successful fill. 139 */ 140 #define MAKE_BYTE_AVAIL(cinfo,action) \ 141 if (bytes_in_buffer == 0) { \ 142 if (! (*datasrc->fill_input_buffer) (cinfo)) \ 143 { action; } \ 144 INPUT_RELOAD(cinfo); \ 145 } 146 147 /* Read a byte into variable V. 148 * If must suspend, take the specified action (typically "return FALSE"). 149 */ 150 #define INPUT_BYTE(cinfo,V,action) \ 151 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ 152 bytes_in_buffer--; \ 153 V = GETJOCTET(*next_input_byte++); ) 154 155 /* As above, but read two bytes interpreted as an unsigned 16-bit integer. 156 * V should be declared unsigned int or perhaps INT32. 157 */ 158 #define INPUT_2BYTES(cinfo,V,action) \ 159 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ 160 bytes_in_buffer--; \ 161 V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ 162 MAKE_BYTE_AVAIL(cinfo,action); \ 163 bytes_in_buffer--; \ 164 V += GETJOCTET(*next_input_byte++); ) 165 166 167 /* 168 * Routines to process JPEG markers. 169 * 170 * Entry condition: JPEG marker itself has been read and its code saved 171 * in cinfo->unread_marker; input restart point is just after the marker. 172 * 173 * Exit: if return TRUE, have read and processed any parameters, and have 174 * updated the restart point to point after the parameters. 175 * If return FALSE, was forced to suspend before reaching end of 176 * marker parameters; restart point has not been moved. Same routine 177 * will be called again after application supplies more input data. 178 * 179 * This approach to suspension assumes that all of a marker's parameters 180 * can fit into a single input bufferload. This should hold for "normal" 181 * markers. Some COM/APPn markers might have large parameter segments 182 * that might not fit. If we are simply dropping such a marker, we use 183 * skip_input_data to get past it, and thereby put the problem on the 184 * source manager's shoulders. If we are saving the marker's contents 185 * into memory, we use a slightly different convention: when forced to 186 * suspend, the marker processor updates the restart point to the end of 187 * what it's consumed (ie, the end of the buffer) before returning FALSE. 188 * On resumption, cinfo->unread_marker still contains the marker code, 189 * but the data source will point to the next chunk of marker data. 190 * The marker processor must retain internal state to deal with this. 191 * 192 * Note that we don't bother to avoid duplicate trace messages if a 193 * suspension occurs within marker parameters. Other side effects 194 * require more care. 195 */ 196 197 198 LOCAL(boolean) 199 get_soi (j_decompress_ptr cinfo) 200 /* Process an SOI marker */ 201 { 202 int i; 203 204 TRACEMS(cinfo, 1, JTRC_SOI); 205 206 if (cinfo->marker->saw_SOI) 207 ERREXIT(cinfo, JERR_SOI_DUPLICATE); 208 209 /* Reset all parameters that are defined to be reset by SOI */ 210 211 for (i = 0; i < NUM_ARITH_TBLS; i++) { 212 cinfo->arith_dc_L[i] = 0; 213 cinfo->arith_dc_U[i] = 1; 214 cinfo->arith_ac_K[i] = 5; 215 } 216 cinfo->restart_interval = 0; 217 218 /* Set initial assumptions for colorspace etc */ 219 220 cinfo->jpeg_color_space = JCS_UNKNOWN; 221 cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ 222 223 cinfo->saw_JFIF_marker = FALSE; 224 cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ 225 cinfo->JFIF_minor_version = 1; 226 cinfo->density_unit = 0; 227 cinfo->X_density = 1; 228 cinfo->Y_density = 1; 229 cinfo->saw_Adobe_marker = FALSE; 230 cinfo->Adobe_transform = 0; 231 232 cinfo->marker->saw_SOI = TRUE; 233 234 return TRUE; 235 } 236 237 238 LOCAL(boolean) 239 get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) 240 /* Process a SOFn marker */ 241 { 242 INT32 length; 243 int c, ci; 244 jpeg_component_info * compptr; 245 INPUT_VARS(cinfo); 246 247 cinfo->progressive_mode = is_prog; 248 cinfo->arith_code = is_arith; 249 250 INPUT_2BYTES(cinfo, length, return FALSE); 251 252 INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); 253 INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); 254 INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); 255 INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); 256 257 length -= 8; 258 259 TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, 260 (int) cinfo->image_width, (int) cinfo->image_height, 261 cinfo->num_components); 262 263 if (cinfo->marker->saw_SOF) 264 ERREXIT(cinfo, JERR_SOF_DUPLICATE); 265 266 /* We don't support files in which the image height is initially specified */ 267 /* as 0 and is later redefined by DNL. As long as we have to check that, */ 268 /* might as well have a general sanity check. */ 269 if (cinfo->image_height <= 0 || cinfo->image_width <= 0 270 || cinfo->num_components <= 0) 271 ERREXIT(cinfo, JERR_EMPTY_IMAGE); 272 273 if (length != (cinfo->num_components * 3)) 274 ERREXIT(cinfo, JERR_BAD_LENGTH); 275 276 if (cinfo->comp_info == NULL) /* do only once, even if suspend */ 277 cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) 278 ((j_common_ptr) cinfo, JPOOL_IMAGE, 279 cinfo->num_components * SIZEOF(jpeg_component_info)); 280 281 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 282 ci++, compptr++) { 283 compptr->component_index = ci; 284 INPUT_BYTE(cinfo, compptr->component_id, return FALSE); 285 INPUT_BYTE(cinfo, c, return FALSE); 286 compptr->h_samp_factor = (c >> 4) & 15; 287 compptr->v_samp_factor = (c ) & 15; 288 INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); 289 290 TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, 291 compptr->component_id, compptr->h_samp_factor, 292 compptr->v_samp_factor, compptr->quant_tbl_no); 293 } 294 295 cinfo->marker->saw_SOF = TRUE; 296 297 INPUT_SYNC(cinfo); 298 return TRUE; 299 } 300 301 302 LOCAL(boolean) 303 get_sos (j_decompress_ptr cinfo) 304 /* Process a SOS marker */ 305 { 306 INT32 length; 307 int i, ci, n, c, cc, pi; 308 jpeg_component_info * compptr; 309 INPUT_VARS(cinfo); 310 311 if (! cinfo->marker->saw_SOF) 312 ERREXIT(cinfo, JERR_SOS_NO_SOF); 313 314 INPUT_2BYTES(cinfo, length, return FALSE); 315 316 INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ 317 318 TRACEMS1(cinfo, 1, JTRC_SOS, n); 319 320 if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) 321 ERREXIT(cinfo, JERR_BAD_LENGTH); 322 323 cinfo->comps_in_scan = n; 324 325 /* Collect the component-spec parameters */ 326 327 for (i = 0; i < MAX_COMPS_IN_SCAN; i++) 328 cinfo->cur_comp_info[i] = NULL; 329 330 for (i = 0; i < n; i++) { 331 INPUT_BYTE(cinfo, cc, return FALSE); 332 INPUT_BYTE(cinfo, c, return FALSE); 333 334 for (ci = 0, compptr = cinfo->comp_info; 335 ci < cinfo->num_components && ci < MAX_COMPS_IN_SCAN; 336 ci++, compptr++) { 337 if (cc == compptr->component_id && !cinfo->cur_comp_info[ci]) 338 goto id_found; 339 } 340 341 ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); 342 343 id_found: 344 345 cinfo->cur_comp_info[i] = compptr; 346 compptr->dc_tbl_no = (c >> 4) & 15; 347 compptr->ac_tbl_no = (c ) & 15; 348 349 TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, 350 compptr->dc_tbl_no, compptr->ac_tbl_no); 351 352 /* This CSi (cc) should differ from the previous CSi */ 353 for (pi = 0; pi < i; pi++) { 354 if (cinfo->cur_comp_info[pi] == compptr) { 355 ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); 356 } 357 } 358 } 359 360 /* Collect the additional scan parameters Ss, Se, Ah/Al. */ 361 INPUT_BYTE(cinfo, c, return FALSE); 362 cinfo->Ss = c; 363 INPUT_BYTE(cinfo, c, return FALSE); 364 cinfo->Se = c; 365 INPUT_BYTE(cinfo, c, return FALSE); 366 cinfo->Ah = (c >> 4) & 15; 367 cinfo->Al = (c ) & 15; 368 369 TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, 370 cinfo->Ah, cinfo->Al); 371 372 /* Prepare to scan data & restart markers */ 373 cinfo->marker->next_restart_num = 0; 374 375 /* Count another SOS marker */ 376 cinfo->input_scan_number++; 377 378 INPUT_SYNC(cinfo); 379 return TRUE; 380 } 381 382 383 #ifdef D_ARITH_CODING_SUPPORTED 384 385 LOCAL(boolean) 386 get_dac (j_decompress_ptr cinfo) 387 /* Process a DAC marker */ 388 { 389 INT32 length; 390 int index, val; 391 INPUT_VARS(cinfo); 392 393 INPUT_2BYTES(cinfo, length, return FALSE); 394 length -= 2; 395 396 while (length > 0) { 397 INPUT_BYTE(cinfo, index, return FALSE); 398 INPUT_BYTE(cinfo, val, return FALSE); 399 400 length -= 2; 401 402 TRACEMS2(cinfo, 1, JTRC_DAC, index, val); 403 404 if (index < 0 || index >= (2*NUM_ARITH_TBLS)) 405 ERREXIT1(cinfo, JERR_DAC_INDEX, index); 406 407 if (index >= NUM_ARITH_TBLS) { /* define AC table */ 408 cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; 409 } else { /* define DC table */ 410 cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); 411 cinfo->arith_dc_U[index] = (UINT8) (val >> 4); 412 if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) 413 ERREXIT1(cinfo, JERR_DAC_VALUE, val); 414 } 415 } 416 417 if (length != 0) 418 ERREXIT(cinfo, JERR_BAD_LENGTH); 419 420 INPUT_SYNC(cinfo); 421 return TRUE; 422 } 423 424 #else /* ! D_ARITH_CODING_SUPPORTED */ 425 426 #define get_dac(cinfo) skip_variable(cinfo) 427 428 #endif /* D_ARITH_CODING_SUPPORTED */ 429 430 431 LOCAL(boolean) 432 get_dht (j_decompress_ptr cinfo) 433 /* Process a DHT marker */ 434 { 435 INT32 length; 436 UINT8 bits[17]; 437 UINT8 huffval[256]; 438 int i, index, count; 439 JHUFF_TBL **htblptr; 440 INPUT_VARS(cinfo); 441 442 INPUT_2BYTES(cinfo, length, return FALSE); 443 length -= 2; 444 445 while (length > 16) { 446 INPUT_BYTE(cinfo, index, return FALSE); 447 448 TRACEMS1(cinfo, 1, JTRC_DHT, index); 449 450 bits[0] = 0; 451 count = 0; 452 for (i = 1; i <= 16; i++) { 453 INPUT_BYTE(cinfo, bits[i], return FALSE); 454 count += bits[i]; 455 } 456 457 length -= 1 + 16; 458 459 TRACEMS8(cinfo, 2, JTRC_HUFFBITS, 460 bits[1], bits[2], bits[3], bits[4], 461 bits[5], bits[6], bits[7], bits[8]); 462 TRACEMS8(cinfo, 2, JTRC_HUFFBITS, 463 bits[9], bits[10], bits[11], bits[12], 464 bits[13], bits[14], bits[15], bits[16]); 465 466 /* Here we just do minimal validation of the counts to avoid walking 467 * off the end of our table space. jdhuff.c will check more carefully. 468 */ 469 if (count > 256 || ((INT32) count) > length) 470 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); 471 472 for (i = 0; i < count; i++) 473 INPUT_BYTE(cinfo, huffval[i], return FALSE); 474 475 MEMZERO(&huffval[count], (256 - count) * SIZEOF(UINT8)); 476 477 length -= count; 478 479 if (index & 0x10) { /* AC table definition */ 480 index -= 0x10; 481 if (index < 0 || index >= NUM_HUFF_TBLS) 482 ERREXIT1(cinfo, JERR_DHT_INDEX, index); 483 htblptr = &cinfo->ac_huff_tbl_ptrs[index]; 484 } else { /* DC table definition */ 485 if (index < 0 || index >= NUM_HUFF_TBLS) 486 ERREXIT1(cinfo, JERR_DHT_INDEX, index); 487 htblptr = &cinfo->dc_huff_tbl_ptrs[index]; 488 } 489 490 if (*htblptr == NULL) 491 *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 492 493 MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); 494 MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); 495 } 496 497 if (length != 0) 498 ERREXIT(cinfo, JERR_BAD_LENGTH); 499 500 INPUT_SYNC(cinfo); 501 return TRUE; 502 } 503 504 505 LOCAL(boolean) 506 get_dqt (j_decompress_ptr cinfo) 507 /* Process a DQT marker */ 508 { 509 INT32 length; 510 int n, i, prec; 511 unsigned int tmp; 512 JQUANT_TBL *quant_ptr; 513 INPUT_VARS(cinfo); 514 515 INPUT_2BYTES(cinfo, length, return FALSE); 516 length -= 2; 517 518 while (length > 0) { 519 INPUT_BYTE(cinfo, n, return FALSE); 520 prec = n >> 4; 521 n &= 0x0F; 522 523 TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); 524 525 if (n >= NUM_QUANT_TBLS) 526 ERREXIT1(cinfo, JERR_DQT_INDEX, n); 527 528 if (cinfo->quant_tbl_ptrs[n] == NULL) 529 cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); 530 quant_ptr = cinfo->quant_tbl_ptrs[n]; 531 532 for (i = 0; i < DCTSIZE2; i++) { 533 if (prec) 534 INPUT_2BYTES(cinfo, tmp, return FALSE); 535 else 536 INPUT_BYTE(cinfo, tmp, return FALSE); 537 /* We convert the zigzag-order table to natural array order. */ 538 quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; 539 } 540 541 if (cinfo->err->trace_level >= 2) { 542 for (i = 0; i < DCTSIZE2; i += 8) { 543 TRACEMS8(cinfo, 2, JTRC_QUANTVALS, 544 quant_ptr->quantval[i], quant_ptr->quantval[i+1], 545 quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], 546 quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], 547 quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); 548 } 549 } 550 551 length -= DCTSIZE2+1; 552 if (prec) length -= DCTSIZE2; 553 } 554 555 if (length != 0) 556 ERREXIT(cinfo, JERR_BAD_LENGTH); 557 558 INPUT_SYNC(cinfo); 559 return TRUE; 560 } 561 562 563 LOCAL(boolean) 564 get_dri (j_decompress_ptr cinfo) 565 /* Process a DRI marker */ 566 { 567 INT32 length; 568 unsigned int tmp; 569 INPUT_VARS(cinfo); 570 571 INPUT_2BYTES(cinfo, length, return FALSE); 572 573 if (length != 4) 574 ERREXIT(cinfo, JERR_BAD_LENGTH); 575 576 INPUT_2BYTES(cinfo, tmp, return FALSE); 577 578 TRACEMS1(cinfo, 1, JTRC_DRI, tmp); 579 580 cinfo->restart_interval = tmp; 581 582 INPUT_SYNC(cinfo); 583 return TRUE; 584 } 585 586 587 /* 588 * Routines for processing APPn and COM markers. 589 * These are either saved in memory or discarded, per application request. 590 * APP0 and APP14 are specially checked to see if they are 591 * JFIF and Adobe markers, respectively. 592 */ 593 594 #define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ 595 #define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ 596 #define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ 597 598 599 LOCAL(void) 600 examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, 601 unsigned int datalen, INT32 remaining) 602 /* Examine first few bytes from an APP0. 603 * Take appropriate action if it is a JFIF marker. 604 * datalen is # of bytes at data[], remaining is length of rest of marker data. 605 */ 606 { 607 INT32 totallen = (INT32) datalen + remaining; 608 609 if (datalen >= APP0_DATA_LEN && 610 GETJOCTET(data[0]) == 0x4A && 611 GETJOCTET(data[1]) == 0x46 && 612 GETJOCTET(data[2]) == 0x49 && 613 GETJOCTET(data[3]) == 0x46 && 614 GETJOCTET(data[4]) == 0) { 615 /* Found JFIF APP0 marker: save info */ 616 cinfo->saw_JFIF_marker = TRUE; 617 cinfo->JFIF_major_version = GETJOCTET(data[5]); 618 cinfo->JFIF_minor_version = GETJOCTET(data[6]); 619 cinfo->density_unit = GETJOCTET(data[7]); 620 cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); 621 cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); 622 /* Check version. 623 * Major version must be 1, anything else signals an incompatible change. 624 * (We used to treat this as an error, but now it's a nonfatal warning, 625 * because some bozo at Hijaak couldn't read the spec.) 626 * Minor version should be 0..2, but process anyway if newer. 627 */ 628 if (cinfo->JFIF_major_version != 1) 629 WARNMS2(cinfo, JWRN_JFIF_MAJOR, 630 cinfo->JFIF_major_version, cinfo->JFIF_minor_version); 631 /* Generate trace messages */ 632 TRACEMS5(cinfo, 1, JTRC_JFIF, 633 cinfo->JFIF_major_version, cinfo->JFIF_minor_version, 634 cinfo->X_density, cinfo->Y_density, cinfo->density_unit); 635 /* Validate thumbnail dimensions and issue appropriate messages */ 636 if (GETJOCTET(data[12]) | GETJOCTET(data[13])) 637 TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, 638 GETJOCTET(data[12]), GETJOCTET(data[13])); 639 totallen -= APP0_DATA_LEN; 640 if (totallen != 641 ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) 642 TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); 643 } else if (datalen >= 6 && 644 GETJOCTET(data[0]) == 0x4A && 645 GETJOCTET(data[1]) == 0x46 && 646 GETJOCTET(data[2]) == 0x58 && 647 GETJOCTET(data[3]) == 0x58 && 648 GETJOCTET(data[4]) == 0) { 649 /* Found JFIF "JFXX" extension APP0 marker */ 650 /* The library doesn't actually do anything with these, 651 * but we try to produce a helpful trace message. 652 */ 653 switch (GETJOCTET(data[5])) { 654 case 0x10: 655 TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); 656 break; 657 case 0x11: 658 TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); 659 break; 660 case 0x13: 661 TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); 662 break; 663 default: 664 TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, 665 GETJOCTET(data[5]), (int) totallen); 666 break; 667 } 668 } else { 669 /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ 670 TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); 671 } 672 } 673 674 675 LOCAL(void) 676 examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, 677 unsigned int datalen, INT32 remaining) 678 /* Examine first few bytes from an APP14. 679 * Take appropriate action if it is an Adobe marker. 680 * datalen is # of bytes at data[], remaining is length of rest of marker data. 681 */ 682 { 683 unsigned int version, flags0, flags1, transform; 684 685 if (datalen >= APP14_DATA_LEN && 686 GETJOCTET(data[0]) == 0x41 && 687 GETJOCTET(data[1]) == 0x64 && 688 GETJOCTET(data[2]) == 0x6F && 689 GETJOCTET(data[3]) == 0x62 && 690 GETJOCTET(data[4]) == 0x65) { 691 /* Found Adobe APP14 marker */ 692 version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); 693 flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); 694 flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); 695 transform = GETJOCTET(data[11]); 696 TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); 697 cinfo->saw_Adobe_marker = TRUE; 698 cinfo->Adobe_transform = (UINT8) transform; 699 } else { 700 /* Start of APP14 does not match "Adobe", or too short */ 701 TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); 702 } 703 } 704 705 706 METHODDEF(boolean) 707 get_interesting_appn (j_decompress_ptr cinfo) 708 /* Process an APP0 or APP14 marker without saving it */ 709 { 710 INT32 length; 711 JOCTET b[APPN_DATA_LEN]; 712 unsigned int i, numtoread; 713 INPUT_VARS(cinfo); 714 715 INPUT_2BYTES(cinfo, length, return FALSE); 716 length -= 2; 717 718 /* get the interesting part of the marker data */ 719 if (length >= APPN_DATA_LEN) 720 numtoread = APPN_DATA_LEN; 721 else if (length > 0) 722 numtoread = (unsigned int) length; 723 else 724 numtoread = 0; 725 for (i = 0; i < numtoread; i++) 726 INPUT_BYTE(cinfo, b[i], return FALSE); 727 length -= numtoread; 728 729 /* process it */ 730 switch (cinfo->unread_marker) { 731 case M_APP0: 732 examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); 733 break; 734 case M_APP14: 735 examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); 736 break; 737 default: 738 /* can't get here unless jpeg_save_markers chooses wrong processor */ 739 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); 740 break; 741 } 742 743 /* skip any remaining data -- could be lots */ 744 INPUT_SYNC(cinfo); 745 if (length > 0) 746 (*cinfo->src->skip_input_data) (cinfo, (long) length); 747 748 return TRUE; 749 } 750 751 752 #ifdef SAVE_MARKERS_SUPPORTED 753 754 METHODDEF(boolean) 755 save_marker (j_decompress_ptr cinfo) 756 /* Save an APPn or COM marker into the marker list */ 757 { 758 my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 759 jpeg_saved_marker_ptr cur_marker = marker->cur_marker; 760 unsigned int bytes_read, data_length; 761 JOCTET FAR * data; 762 INT32 length = 0; 763 INPUT_VARS(cinfo); 764 765 if (cur_marker == NULL) { 766 /* begin reading a marker */ 767 INPUT_2BYTES(cinfo, length, return FALSE); 768 length -= 2; 769 if (length >= 0) { /* watch out for bogus length word */ 770 /* figure out how much we want to save */ 771 unsigned int limit; 772 if (cinfo->unread_marker == (int) M_COM) 773 limit = marker->length_limit_COM; 774 else 775 limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; 776 if ((unsigned int) length < limit) 777 limit = (unsigned int) length; 778 /* allocate and initialize the marker item */ 779 cur_marker = (jpeg_saved_marker_ptr) 780 (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 781 SIZEOF(struct jpeg_marker_struct) + limit); 782 cur_marker->next = NULL; 783 cur_marker->marker = (UINT8) cinfo->unread_marker; 784 cur_marker->original_length = (unsigned int) length; 785 cur_marker->data_length = limit; 786 /* data area is just beyond the jpeg_marker_struct */ 787 data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); 788 marker->cur_marker = cur_marker; 789 marker->bytes_read = 0; 790 bytes_read = 0; 791 data_length = limit; 792 } else { 793 /* deal with bogus length word */ 794 bytes_read = data_length = 0; 795 data = NULL; 796 } 797 } else { 798 /* resume reading a marker */ 799 bytes_read = marker->bytes_read; 800 data_length = cur_marker->data_length; 801 data = cur_marker->data + bytes_read; 802 } 803 804 while (bytes_read < data_length) { 805 INPUT_SYNC(cinfo); /* move the restart point to here */ 806 marker->bytes_read = bytes_read; 807 /* If there's not at least one byte in buffer, suspend */ 808 MAKE_BYTE_AVAIL(cinfo, return FALSE); 809 /* Copy bytes with reasonable rapidity */ 810 while (bytes_read < data_length && bytes_in_buffer > 0) { 811 *data++ = *next_input_byte++; 812 bytes_in_buffer--; 813 bytes_read++; 814 } 815 } 816 817 /* Done reading what we want to read */ 818 if (cur_marker != NULL) { /* will be NULL if bogus length word */ 819 /* Add new marker to end of list */ 820 if (cinfo->marker_list == NULL) { 821 cinfo->marker_list = cur_marker; 822 } else { 823 jpeg_saved_marker_ptr prev = cinfo->marker_list; 824 while (prev->next != NULL) 825 prev = prev->next; 826 prev->next = cur_marker; 827 } 828 /* Reset pointer & calc remaining data length */ 829 data = cur_marker->data; 830 length = cur_marker->original_length - data_length; 831 } 832 /* Reset to initial state for next marker */ 833 marker->cur_marker = NULL; 834 835 /* Process the marker if interesting; else just make a generic trace msg */ 836 switch (cinfo->unread_marker) { 837 case M_APP0: 838 examine_app0(cinfo, data, data_length, length); 839 break; 840 case M_APP14: 841 examine_app14(cinfo, data, data_length, length); 842 break; 843 default: 844 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, 845 (int) (data_length + length)); 846 break; 847 } 848 849 /* skip any remaining data -- could be lots */ 850 INPUT_SYNC(cinfo); /* do before skip_input_data */ 851 if (length > 0) 852 (*cinfo->src->skip_input_data) (cinfo, (long) length); 853 854 return TRUE; 855 } 856 857 #endif /* SAVE_MARKERS_SUPPORTED */ 858 859 860 METHODDEF(boolean) 861 skip_variable (j_decompress_ptr cinfo) 862 /* Skip over an unknown or uninteresting variable-length marker */ 863 { 864 INT32 length; 865 INPUT_VARS(cinfo); 866 867 INPUT_2BYTES(cinfo, length, return FALSE); 868 length -= 2; 869 870 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); 871 872 INPUT_SYNC(cinfo); /* do before skip_input_data */ 873 if (length > 0) 874 (*cinfo->src->skip_input_data) (cinfo, (long) length); 875 876 return TRUE; 877 } 878 879 880 /* 881 * Find the next JPEG marker, save it in cinfo->unread_marker. 882 * Returns FALSE if had to suspend before reaching a marker; 883 * in that case cinfo->unread_marker is unchanged. 884 * 885 * Note that the result might not be a valid marker code, 886 * but it will never be 0 or FF. 887 */ 888 889 LOCAL(boolean) 890 next_marker (j_decompress_ptr cinfo) 891 { 892 int c; 893 INPUT_VARS(cinfo); 894 895 for (;;) { 896 INPUT_BYTE(cinfo, c, return FALSE); 897 /* Skip any non-FF bytes. 898 * This may look a bit inefficient, but it will not occur in a valid file. 899 * We sync after each discarded byte so that a suspending data source 900 * can discard the byte from its buffer. 901 */ 902 while (c != 0xFF) { 903 cinfo->marker->discarded_bytes++; 904 INPUT_SYNC(cinfo); 905 INPUT_BYTE(cinfo, c, return FALSE); 906 } 907 /* This loop swallows any duplicate FF bytes. Extra FFs are legal as 908 * pad bytes, so don't count them in discarded_bytes. We assume there 909 * will not be so many consecutive FF bytes as to overflow a suspending 910 * data source's input buffer. 911 */ 912 do { 913 INPUT_BYTE(cinfo, c, return FALSE); 914 } while (c == 0xFF); 915 if (c != 0) 916 break; /* found a valid marker, exit loop */ 917 /* Reach here if we found a stuffed-zero data sequence (FF/00). 918 * Discard it and loop back to try again. 919 */ 920 cinfo->marker->discarded_bytes += 2; 921 INPUT_SYNC(cinfo); 922 } 923 924 if (cinfo->marker->discarded_bytes != 0) { 925 TRACEMS2(cinfo, 1, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); 926 cinfo->marker->discarded_bytes = 0; 927 } 928 929 cinfo->unread_marker = c; 930 931 INPUT_SYNC(cinfo); 932 return TRUE; 933 } 934 935 936 LOCAL(boolean) 937 first_marker (j_decompress_ptr cinfo) 938 /* Like next_marker, but used to obtain the initial SOI marker. */ 939 /* For this marker, we do not allow preceding garbage or fill; otherwise, 940 * we might well scan an entire input file before realizing it ain't JPEG. 941 * If an application wants to process non-JFIF files, it must seek to the 942 * SOI before calling the JPEG library. 943 */ 944 { 945 int c, c2; 946 INPUT_VARS(cinfo); 947 948 INPUT_BYTE(cinfo, c, return FALSE); 949 INPUT_BYTE(cinfo, c2, return FALSE); 950 if (c != 0xFF || c2 != (int) M_SOI) 951 ERREXIT2(cinfo, JERR_NO_SOI, c, c2); 952 953 cinfo->unread_marker = c2; 954 955 INPUT_SYNC(cinfo); 956 return TRUE; 957 } 958 959 #ifdef MOTION_JPEG_SUPPORTED 960 961 /* The default Huffman tables used by motion JPEG frames. When a motion JPEG 962 * frame does not have DHT tables, we should use the huffman tables suggested by 963 * the JPEG standard. Each of these tables represents a member of the JHUFF_TBLS 964 * struct so we can just copy it to the according JHUFF_TBLS member. 965 */ 966 /* DC table 0 */ 967 LOCAL(const unsigned char) mjpg_dc0_bits[] = { 968 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 969 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 970 }; 971 972 LOCAL(const unsigned char) mjpg_dc0_huffval[] = { 973 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 974 0x08, 0x09, 0x0A, 0x0B 975 }; 976 977 /* DC table 1 */ 978 LOCAL(const unsigned char) mjpg_dc1_bits[] = { 979 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 980 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 981 }; 982 983 LOCAL(const unsigned char) mjpg_dc1_huffval[] = { 984 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 985 0x08, 0x09, 0x0A, 0x0B 986 }; 987 988 /* AC table 0 */ 989 LOCAL(const unsigned char) mjpg_ac0_bits[] = { 990 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 991 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D 992 }; 993 994 LOCAL(const unsigned char) mjpg_ac0_huffval[] = { 995 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 996 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 997 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 998 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 999 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 1000 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 1001 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 1002 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 1003 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 1004 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 1005 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 1006 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 1007 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 1008 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 1009 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 1010 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 1011 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 1012 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 1013 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 1014 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 1015 0xF9, 0xFA 1016 }; 1017 1018 /* AC table 1 */ 1019 LOCAL(const unsigned char) mjpg_ac1_bits[] = { 1020 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 1021 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77 1022 }; 1023 1024 LOCAL(const unsigned char) mjpg_ac1_huffval[] = { 1025 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 1026 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 1027 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 1028 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 1029 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 1030 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 1031 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 1032 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 1033 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 1034 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 1035 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 1036 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 1037 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 1038 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 1039 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 1040 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 1041 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 1042 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 1043 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 1044 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 1045 0xF9, 0xFA 1046 }; 1047 1048 /* Loads the default Huffman tables used by motion JPEG frames. This function 1049 * just copies the huffman tables suggested in the JPEG standard when we have 1050 * not load them. 1051 */ 1052 LOCAL(void) 1053 mjpg_load_huff_tables (j_decompress_ptr cinfo) 1054 { 1055 JHUFF_TBL *htblptr; 1056 1057 if (! cinfo->dc_huff_tbl_ptrs[0]) { 1058 htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 1059 MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 1060 MEMCOPY(&htblptr->bits[1], mjpg_dc0_bits, SIZEOF(mjpg_dc0_bits)); 1061 MEMCOPY(&htblptr->huffval[0], mjpg_dc0_huffval, SIZEOF(mjpg_dc0_huffval)); 1062 cinfo->dc_huff_tbl_ptrs[0] = htblptr; 1063 } 1064 1065 if (! cinfo->dc_huff_tbl_ptrs[1]) { 1066 htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 1067 MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 1068 MEMCOPY(&htblptr->bits[1], mjpg_dc1_bits, SIZEOF(mjpg_dc1_bits)); 1069 MEMCOPY(&htblptr->huffval[0], mjpg_dc1_huffval, SIZEOF(mjpg_dc1_huffval)); 1070 cinfo->dc_huff_tbl_ptrs[1] = htblptr; 1071 } 1072 1073 if (! cinfo->ac_huff_tbl_ptrs[0]) { 1074 htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 1075 MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 1076 MEMCOPY(&htblptr->bits[1], mjpg_ac0_bits, SIZEOF(mjpg_ac0_bits)); 1077 MEMCOPY(&htblptr->huffval[0], mjpg_ac0_huffval, SIZEOF(mjpg_ac0_huffval)); 1078 cinfo->ac_huff_tbl_ptrs[0] = htblptr; 1079 } 1080 1081 if (! cinfo->ac_huff_tbl_ptrs[1]) { 1082 htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 1083 MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 1084 MEMCOPY(&htblptr->bits[1], mjpg_ac1_bits, SIZEOF(mjpg_ac1_bits)); 1085 MEMCOPY(&htblptr->huffval[0], mjpg_ac1_huffval, SIZEOF(mjpg_ac1_huffval)); 1086 cinfo->ac_huff_tbl_ptrs[1] = htblptr; 1087 } 1088 } 1089 1090 #else 1091 1092 #define mjpg_load_huff_tables(cinfo) 1093 1094 #endif /* MOTION_JPEG_SUPPORTED */ 1095 1096 1097 /* 1098 * Read markers until SOS or EOI. 1099 * 1100 * Returns same codes as are defined for jpeg_consume_input: 1101 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 1102 */ 1103 1104 METHODDEF(int) 1105 read_markers (j_decompress_ptr cinfo) 1106 { 1107 /* Outer loop repeats once for each marker. */ 1108 for (;;) { 1109 /* Collect the marker proper, unless we already did. */ 1110 /* NB: first_marker() enforces the requirement that SOI appear first. */ 1111 if (cinfo->unread_marker == 0) { 1112 if (! cinfo->marker->saw_SOI) { 1113 if (! first_marker(cinfo)) 1114 return JPEG_SUSPENDED; 1115 } else { 1116 if (! next_marker(cinfo)) 1117 return JPEG_SUSPENDED; 1118 } 1119 } 1120 /* At this point cinfo->unread_marker contains the marker code and the 1121 * input point is just past the marker proper, but before any parameters. 1122 * A suspension will cause us to return with this state still true. 1123 */ 1124 switch (cinfo->unread_marker) { 1125 case M_SOI: 1126 if (! get_soi(cinfo)) 1127 return JPEG_SUSPENDED; 1128 break; 1129 1130 case M_SOF0: /* Baseline */ 1131 case M_SOF1: /* Extended sequential, Huffman */ 1132 if (! get_sof(cinfo, FALSE, FALSE)) 1133 return JPEG_SUSPENDED; 1134 break; 1135 1136 case M_SOF2: /* Progressive, Huffman */ 1137 if (! get_sof(cinfo, TRUE, FALSE)) 1138 return JPEG_SUSPENDED; 1139 break; 1140 1141 case M_SOF9: /* Extended sequential, arithmetic */ 1142 if (! get_sof(cinfo, FALSE, TRUE)) 1143 return JPEG_SUSPENDED; 1144 break; 1145 1146 case M_SOF10: /* Progressive, arithmetic */ 1147 if (! get_sof(cinfo, TRUE, TRUE)) 1148 return JPEG_SUSPENDED; 1149 break; 1150 1151 /* Currently unsupported SOFn types */ 1152 case M_SOF3: /* Lossless, Huffman */ 1153 case M_SOF5: /* Differential sequential, Huffman */ 1154 case M_SOF6: /* Differential progressive, Huffman */ 1155 case M_SOF7: /* Differential lossless, Huffman */ 1156 case M_JPG: /* Reserved for JPEG extensions */ 1157 case M_SOF11: /* Lossless, arithmetic */ 1158 case M_SOF13: /* Differential sequential, arithmetic */ 1159 case M_SOF14: /* Differential progressive, arithmetic */ 1160 case M_SOF15: /* Differential lossless, arithmetic */ 1161 ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); 1162 break; 1163 1164 case M_SOS: 1165 mjpg_load_huff_tables(cinfo); 1166 if (! get_sos(cinfo)) 1167 return JPEG_SUSPENDED; 1168 cinfo->unread_marker = 0; /* processed the marker */ 1169 return JPEG_REACHED_SOS; 1170 1171 case M_EOI: 1172 TRACEMS(cinfo, 1, JTRC_EOI); 1173 cinfo->unread_marker = 0; /* processed the marker */ 1174 return JPEG_REACHED_EOI; 1175 1176 case M_DAC: 1177 if (! get_dac(cinfo)) 1178 return JPEG_SUSPENDED; 1179 break; 1180 1181 case M_DHT: 1182 if (! get_dht(cinfo)) 1183 return JPEG_SUSPENDED; 1184 break; 1185 1186 case M_DQT: 1187 if (! get_dqt(cinfo)) 1188 return JPEG_SUSPENDED; 1189 break; 1190 1191 case M_DRI: 1192 if (! get_dri(cinfo)) 1193 return JPEG_SUSPENDED; 1194 break; 1195 1196 case M_APP0: 1197 case M_APP1: 1198 case M_APP2: 1199 case M_APP3: 1200 case M_APP4: 1201 case M_APP5: 1202 case M_APP6: 1203 case M_APP7: 1204 case M_APP8: 1205 case M_APP9: 1206 case M_APP10: 1207 case M_APP11: 1208 case M_APP12: 1209 case M_APP13: 1210 case M_APP14: 1211 case M_APP15: 1212 if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ 1213 cinfo->unread_marker - (int) M_APP0]) (cinfo)) 1214 return JPEG_SUSPENDED; 1215 break; 1216 1217 case M_COM: 1218 if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) 1219 return JPEG_SUSPENDED; 1220 break; 1221 1222 case M_RST0: /* these are all parameterless */ 1223 case M_RST1: 1224 case M_RST2: 1225 case M_RST3: 1226 case M_RST4: 1227 case M_RST5: 1228 case M_RST6: 1229 case M_RST7: 1230 case M_TEM: 1231 TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); 1232 break; 1233 1234 case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ 1235 if (! skip_variable(cinfo)) 1236 return JPEG_SUSPENDED; 1237 break; 1238 1239 default: /* must be DHP, EXP, JPGn, or RESn */ 1240 /* For now, we treat the reserved markers as fatal errors since they are 1241 * likely to be used to signal incompatible JPEG Part 3 extensions. 1242 * Once the JPEG 3 version-number marker is well defined, this code 1243 * ought to change! 1244 */ 1245 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); 1246 break; 1247 } 1248 /* Successfully processed marker, so reset state variable */ 1249 cinfo->unread_marker = 0; 1250 } /* end loop */ 1251 } 1252 1253 1254 /* 1255 * Read a restart marker, which is expected to appear next in the datastream; 1256 * if the marker is not there, take appropriate recovery action. 1257 * Returns FALSE if suspension is required. 1258 * 1259 * This is called by the entropy decoder after it has read an appropriate 1260 * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder 1261 * has already read a marker from the data source. Under normal conditions 1262 * cinfo->unread_marker will be reset to 0 before returning; if not reset, 1263 * it holds a marker which the decoder will be unable to read past. 1264 */ 1265 1266 METHODDEF(boolean) 1267 read_restart_marker (j_decompress_ptr cinfo) 1268 { 1269 /* Obtain a marker unless we already did. */ 1270 /* Note that next_marker will complain if it skips any data. */ 1271 if (cinfo->unread_marker == 0) { 1272 if (! next_marker(cinfo)) 1273 return FALSE; 1274 } 1275 1276 if (cinfo->unread_marker == 1277 ((int) M_RST0 + cinfo->marker->next_restart_num)) { 1278 /* Normal case --- swallow the marker and let entropy decoder continue */ 1279 TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); 1280 cinfo->unread_marker = 0; 1281 } else { 1282 /* Uh-oh, the restart markers have been messed up. */ 1283 /* Let the data source manager determine how to resync. */ 1284 if (! (*cinfo->src->resync_to_restart) (cinfo, 1285 cinfo->marker->next_restart_num)) 1286 return FALSE; 1287 } 1288 1289 /* Update next-restart state */ 1290 cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; 1291 1292 return TRUE; 1293 } 1294 1295 1296 /* 1297 * This is the default resync_to_restart method for data source managers 1298 * to use if they don't have any better approach. Some data source managers 1299 * may be able to back up, or may have additional knowledge about the data 1300 * which permits a more intelligent recovery strategy; such managers would 1301 * presumably supply their own resync method. 1302 * 1303 * read_restart_marker calls resync_to_restart if it finds a marker other than 1304 * the restart marker it was expecting. (This code is *not* used unless 1305 * a nonzero restart interval has been declared.) cinfo->unread_marker is 1306 * the marker code actually found (might be anything, except 0 or FF). 1307 * The desired restart marker number (0..7) is passed as a parameter. 1308 * This routine is supposed to apply whatever error recovery strategy seems 1309 * appropriate in order to position the input stream to the next data segment. 1310 * Note that cinfo->unread_marker is treated as a marker appearing before 1311 * the current data-source input point; usually it should be reset to zero 1312 * before returning. 1313 * Returns FALSE if suspension is required. 1314 * 1315 * This implementation is substantially constrained by wanting to treat the 1316 * input as a data stream; this means we can't back up. Therefore, we have 1317 * only the following actions to work with: 1318 * 1. Simply discard the marker and let the entropy decoder resume at next 1319 * byte of file. 1320 * 2. Read forward until we find another marker, discarding intervening 1321 * data. (In theory we could look ahead within the current bufferload, 1322 * without having to discard data if we don't find the desired marker. 1323 * This idea is not implemented here, in part because it makes behavior 1324 * dependent on buffer size and chance buffer-boundary positions.) 1325 * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). 1326 * This will cause the entropy decoder to process an empty data segment, 1327 * inserting dummy zeroes, and then we will reprocess the marker. 1328 * 1329 * #2 is appropriate if we think the desired marker lies ahead, while #3 is 1330 * appropriate if the found marker is a future restart marker (indicating 1331 * that we have missed the desired restart marker, probably because it got 1332 * corrupted). 1333 * We apply #2 or #3 if the found marker is a restart marker no more than 1334 * two counts behind or ahead of the expected one. We also apply #2 if the 1335 * found marker is not a legal JPEG marker code (it's certainly bogus data). 1336 * If the found marker is a restart marker more than 2 counts away, we do #1 1337 * (too much risk that the marker is erroneous; with luck we will be able to 1338 * resync at some future point). 1339 * For any valid non-restart JPEG marker, we apply #3. This keeps us from 1340 * overrunning the end of a scan. An implementation limited to single-scan 1341 * files might find it better to apply #2 for markers other than EOI, since 1342 * any other marker would have to be bogus data in that case. 1343 */ 1344 1345 GLOBAL(boolean) 1346 jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) 1347 { 1348 int marker = cinfo->unread_marker; 1349 int action = 1; 1350 1351 /* Always put up a warning. */ 1352 WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); 1353 1354 /* Outer loop handles repeated decision after scanning forward. */ 1355 for (;;) { 1356 if (marker < (int) M_SOF0) 1357 action = 2; /* invalid marker */ 1358 else if (marker < (int) M_RST0 || marker > (int) M_RST7) 1359 action = 3; /* valid non-restart marker */ 1360 else { 1361 if (marker == ((int) M_RST0 + ((desired+1) & 7)) || 1362 marker == ((int) M_RST0 + ((desired+2) & 7))) 1363 action = 3; /* one of the next two expected restarts */ 1364 else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || 1365 marker == ((int) M_RST0 + ((desired-2) & 7))) 1366 action = 2; /* a prior restart, so advance */ 1367 else 1368 action = 1; /* desired restart or too far away */ 1369 } 1370 TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); 1371 switch (action) { 1372 case 1: 1373 /* Discard marker and let entropy decoder resume processing. */ 1374 cinfo->unread_marker = 0; 1375 return TRUE; 1376 case 2: 1377 /* Scan to the next marker, and repeat the decision loop. */ 1378 if (! next_marker(cinfo)) 1379 return FALSE; 1380 marker = cinfo->unread_marker; 1381 break; 1382 case 3: 1383 /* Return without advancing past this marker. */ 1384 /* Entropy decoder will be forced to process an empty segment. */ 1385 return TRUE; 1386 } 1387 } /* end loop */ 1388 } 1389 1390 1391 /* 1392 * Reset marker processing state to begin a fresh datastream. 1393 */ 1394 1395 METHODDEF(void) 1396 reset_marker_reader (j_decompress_ptr cinfo) 1397 { 1398 my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1399 1400 cinfo->comp_info = NULL; /* until allocated by get_sof */ 1401 cinfo->input_scan_number = 0; /* no SOS seen yet */ 1402 cinfo->unread_marker = 0; /* no pending marker */ 1403 marker->pub.saw_SOI = FALSE; /* set internal state too */ 1404 marker->pub.saw_SOF = FALSE; 1405 marker->pub.discarded_bytes = 0; 1406 marker->cur_marker = NULL; 1407 } 1408 1409 1410 /* 1411 * Initialize the marker reader module. 1412 * This is called only once, when the decompression object is created. 1413 */ 1414 1415 GLOBAL(void) 1416 jinit_marker_reader (j_decompress_ptr cinfo) 1417 { 1418 my_marker_ptr marker; 1419 int i; 1420 1421 /* Create subobject in permanent pool */ 1422 marker = (my_marker_ptr) 1423 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 1424 SIZEOF(my_marker_reader)); 1425 cinfo->marker = (struct jpeg_marker_reader *) marker; 1426 /* Initialize public method pointers */ 1427 marker->pub.reset_marker_reader = reset_marker_reader; 1428 marker->pub.read_markers = read_markers; 1429 marker->pub.read_restart_marker = read_restart_marker; 1430 /* Initialize COM/APPn processing. 1431 * By default, we examine and then discard APP0 and APP14, 1432 * but simply discard COM and all other APPn. 1433 */ 1434 marker->process_COM = skip_variable; 1435 marker->length_limit_COM = 0; 1436 for (i = 0; i < 16; i++) { 1437 marker->process_APPn[i] = skip_variable; 1438 marker->length_limit_APPn[i] = 0; 1439 } 1440 marker->process_APPn[0] = get_interesting_appn; 1441 marker->process_APPn[14] = get_interesting_appn; 1442 /* Reset marker processing state */ 1443 reset_marker_reader(cinfo); 1444 } 1445 1446 1447 /* 1448 * Control saving of COM and APPn markers into marker_list. 1449 */ 1450 1451 #ifdef SAVE_MARKERS_SUPPORTED 1452 1453 GLOBAL(void) 1454 jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, 1455 unsigned int length_limit) 1456 { 1457 my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1458 long maxlength; 1459 jpeg_marker_parser_method processor; 1460 1461 /* Length limit mustn't be larger than what we can allocate 1462 * (should only be a concern in a 16-bit environment). 1463 */ 1464 maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); 1465 if (((long) length_limit) > maxlength) 1466 length_limit = (unsigned int) maxlength; 1467 1468 /* Choose processor routine to use. 1469 * APP0/APP14 have special requirements. 1470 */ 1471 if (length_limit) { 1472 processor = save_marker; 1473 /* If saving APP0/APP14, save at least enough for our internal use. */ 1474 if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) 1475 length_limit = APP0_DATA_LEN; 1476 else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) 1477 length_limit = APP14_DATA_LEN; 1478 } else { 1479 processor = skip_variable; 1480 /* If discarding APP0/APP14, use our regular on-the-fly processor. */ 1481 if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) 1482 processor = get_interesting_appn; 1483 } 1484 1485 if (marker_code == (int) M_COM) { 1486 marker->process_COM = processor; 1487 marker->length_limit_COM = length_limit; 1488 } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { 1489 marker->process_APPn[marker_code - (int) M_APP0] = processor; 1490 marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; 1491 } else 1492 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); 1493 } 1494 1495 #endif /* SAVE_MARKERS_SUPPORTED */ 1496 1497 1498 /* 1499 * Install a special processing method for COM or APPn markers. 1500 */ 1501 1502 GLOBAL(void) 1503 jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, 1504 jpeg_marker_parser_method routine) 1505 { 1506 my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1507 1508 if (marker_code == (int) M_COM) 1509 marker->process_COM = routine; 1510 else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) 1511 marker->process_APPn[marker_code - (int) M_APP0] = routine; 1512 else 1513 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); 1514 } 1515