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.
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
17 #define JPEG_INTERNALS
22 typedef enum { /* JPEG marker codes */
93 struct jpeg_marker_reader pub; /* public fields */
95 /* Application-overridable marker processing methods */
96 jpeg_marker_parser_method process_COM;
97 jpeg_marker_parser_method process_APPn[16];
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];
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. */
109 typedef my_marker_reader * my_marker_ptr;
113 * Macros for fetching data from the data source module.
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.
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
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 )
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 )
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.
140 #define MAKE_BYTE_AVAIL(cinfo,action) \
141 if (bytes_in_buffer == 0) { \
142 if (! (*datasrc->fill_input_buffer) (cinfo)) \
144 INPUT_RELOAD(cinfo); \
147 /* Read a byte into variable V.
148 * If must suspend, take the specified action (typically "return FALSE").
150 #define INPUT_BYTE(cinfo,V,action) \
151 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
153 V = GETJOCTET(*next_input_byte++); )
155 /* As above, but read two bytes interpreted as an unsigned 16-bit integer.
156 * V should be declared unsigned int or perhaps INT32.
158 #define INPUT_2BYTES(cinfo,V,action) \
159 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
161 V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
162 MAKE_BYTE_AVAIL(cinfo,action); \
164 V += GETJOCTET(*next_input_byte++); )
168 * Routines to process JPEG markers.
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.
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.
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.
192 * Note that we don't bother to avoid duplicate trace messages if a
193 * suspension occurs within marker parameters. Other side effects
199 get_soi (j_decompress_ptr cinfo)
200 /* Process an SOI marker */
204 TRACEMS(cinfo, 1, JTRC_SOI);
206 if (cinfo->marker->saw_SOI)
207 ERREXIT(cinfo, JERR_SOI_DUPLICATE);
209 /* Reset all parameters that are defined to be reset by SOI */
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;
216 cinfo->restart_interval = 0;
218 /* Set initial assumptions for colorspace etc */
220 cinfo->jpeg_color_space = JCS_UNKNOWN;
221 cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
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;
232 cinfo->marker->saw_SOI = TRUE;
239 get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
240 /* Process a SOFn marker */
244 jpeg_component_info * compptr;
247 cinfo->progressive_mode = is_prog;
248 cinfo->arith_code = is_arith;
250 INPUT_2BYTES(cinfo, length, return FALSE);
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);
259 TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
260 (int) cinfo->image_width, (int) cinfo->image_height,
261 cinfo->num_components);
263 if (cinfo->marker->saw_SOF)
264 ERREXIT(cinfo, JERR_SOF_DUPLICATE);
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);
273 if (length != (cinfo->num_components * 3))
274 ERREXIT(cinfo, JERR_BAD_LENGTH);
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));
281 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
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);
290 TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
291 compptr->component_id, compptr->h_samp_factor,
292 compptr->v_samp_factor, compptr->quant_tbl_no);
295 cinfo->marker->saw_SOF = TRUE;
303 get_sos (j_decompress_ptr cinfo)
304 /* Process a SOS marker */
307 int i, ci, n, c, cc, pi;
308 jpeg_component_info * compptr;
311 if (! cinfo->marker->saw_SOF)
312 ERREXIT(cinfo, JERR_SOS_NO_SOF);
314 INPUT_2BYTES(cinfo, length, return FALSE);
316 INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
318 TRACEMS1(cinfo, 1, JTRC_SOS, n);
320 if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
321 ERREXIT(cinfo, JERR_BAD_LENGTH);
323 cinfo->comps_in_scan = n;
325 /* Collect the component-spec parameters */
327 for (i = 0; i < MAX_COMPS_IN_SCAN; i++)
328 cinfo->cur_comp_info[i] = NULL;
330 for (i = 0; i < n; i++) {
331 INPUT_BYTE(cinfo, cc, return FALSE);
332 INPUT_BYTE(cinfo, c, return FALSE);
334 for (ci = 0, compptr = cinfo->comp_info;
335 ci < cinfo->num_components && ci < MAX_COMPS_IN_SCAN;
337 if (cc == compptr->component_id && !cinfo->cur_comp_info[ci])
341 ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
345 cinfo->cur_comp_info[i] = compptr;
346 compptr->dc_tbl_no = (c >> 4) & 15;
347 compptr->ac_tbl_no = (c ) & 15;
349 TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
350 compptr->dc_tbl_no, compptr->ac_tbl_no);
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);
360 /* Collect the additional scan parameters Ss, Se, Ah/Al. */
361 INPUT_BYTE(cinfo, c, return FALSE);
363 INPUT_BYTE(cinfo, c, return FALSE);
365 INPUT_BYTE(cinfo, c, return FALSE);
366 cinfo->Ah = (c >> 4) & 15;
367 cinfo->Al = (c ) & 15;
369 TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
370 cinfo->Ah, cinfo->Al);
372 /* Prepare to scan data & restart markers */
373 cinfo->marker->next_restart_num = 0;
375 /* Count another SOS marker */
376 cinfo->input_scan_number++;
383 #ifdef D_ARITH_CODING_SUPPORTED
386 get_dac (j_decompress_ptr cinfo)
387 /* Process a DAC marker */
393 INPUT_2BYTES(cinfo, length, return FALSE);
397 INPUT_BYTE(cinfo, index, return FALSE);
398 INPUT_BYTE(cinfo, val, return FALSE);
402 TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
404 if (index < 0 || index >= (2*NUM_ARITH_TBLS))
405 ERREXIT1(cinfo, JERR_DAC_INDEX, index);
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);
418 ERREXIT(cinfo, JERR_BAD_LENGTH);
424 #else /* ! D_ARITH_CODING_SUPPORTED */
426 #define get_dac(cinfo) skip_variable(cinfo)
428 #endif /* D_ARITH_CODING_SUPPORTED */
432 get_dht (j_decompress_ptr cinfo)
433 /* Process a DHT marker */
442 INPUT_2BYTES(cinfo, length, return FALSE);
445 while (length > 16) {
446 INPUT_BYTE(cinfo, index, return FALSE);
448 TRACEMS1(cinfo, 1, JTRC_DHT, index);
452 for (i = 1; i <= 16; i++) {
453 INPUT_BYTE(cinfo, bits[i], return FALSE);
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]);
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.
469 if (count > 256 || ((INT32) count) > length)
470 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
472 for (i = 0; i < count; i++)
473 INPUT_BYTE(cinfo, huffval[i], return FALSE);
475 MEMZERO(&huffval[count], (256 - count) * SIZEOF(UINT8));
479 if (index & 0x10) { /* AC table definition */
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];
490 if (*htblptr == NULL)
491 *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
493 MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
494 MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
498 ERREXIT(cinfo, JERR_BAD_LENGTH);
506 get_dqt (j_decompress_ptr cinfo)
507 /* Process a DQT marker */
512 JQUANT_TBL *quant_ptr;
515 INPUT_2BYTES(cinfo, length, return FALSE);
519 INPUT_BYTE(cinfo, n, return FALSE);
523 TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
525 if (n >= NUM_QUANT_TBLS)
526 ERREXIT1(cinfo, JERR_DQT_INDEX, n);
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];
532 for (i = 0; i < DCTSIZE2; i++) {
534 INPUT_2BYTES(cinfo, tmp, return FALSE);
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;
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]);
551 length -= DCTSIZE2+1;
552 if (prec) length -= DCTSIZE2;
556 ERREXIT(cinfo, JERR_BAD_LENGTH);
564 get_dri (j_decompress_ptr cinfo)
565 /* Process a DRI marker */
571 INPUT_2BYTES(cinfo, length, return FALSE);
574 ERREXIT(cinfo, JERR_BAD_LENGTH);
576 INPUT_2BYTES(cinfo, tmp, return FALSE);
578 TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
580 cinfo->restart_interval = tmp;
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.
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!! */
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.
607 INT32 totallen = (INT32) datalen + remaining;
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]);
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.
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;
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.
653 switch (GETJOCTET(data[5])) {
655 TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
658 TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
661 TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
664 TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
665 GETJOCTET(data[5]), (int) totallen);
669 /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
670 TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
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.
683 unsigned int version, flags0, flags1, transform;
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;
700 /* Start of APP14 does not match "Adobe", or too short */
701 TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
707 get_interesting_appn (j_decompress_ptr cinfo)
708 /* Process an APP0 or APP14 marker without saving it */
711 JOCTET b[APPN_DATA_LEN];
712 unsigned int i, numtoread;
715 INPUT_2BYTES(cinfo, length, return FALSE);
718 /* get the interesting part of the marker data */
719 if (length >= APPN_DATA_LEN)
720 numtoread = APPN_DATA_LEN;
722 numtoread = (unsigned int) length;
725 for (i = 0; i < numtoread; i++)
726 INPUT_BYTE(cinfo, b[i], return FALSE);
730 switch (cinfo->unread_marker) {
732 examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
735 examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
738 /* can't get here unless jpeg_save_markers chooses wrong processor */
739 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
743 /* skip any remaining data -- could be lots */
746 (*cinfo->src->skip_input_data) (cinfo, (long) length);
752 #ifdef SAVE_MARKERS_SUPPORTED
755 save_marker (j_decompress_ptr cinfo)
756 /* Save an APPn or COM marker into the marker list */
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;
765 if (cur_marker == NULL) {
766 /* begin reading a marker */
767 INPUT_2BYTES(cinfo, length, return FALSE);
769 if (length >= 0) { /* watch out for bogus length word */
770 /* figure out how much we want to save */
772 if (cinfo->unread_marker == (int) M_COM)
773 limit = marker->length_limit_COM;
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;
793 /* deal with bogus length word */
794 bytes_read = data_length = 0;
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;
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++;
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;
823 jpeg_saved_marker_ptr prev = cinfo->marker_list;
824 while (prev->next != NULL)
826 prev->next = cur_marker;
828 /* Reset pointer & calc remaining data length */
829 data = cur_marker->data;
830 length = cur_marker->original_length - data_length;
832 /* Reset to initial state for next marker */
833 marker->cur_marker = NULL;
835 /* Process the marker if interesting; else just make a generic trace msg */
836 switch (cinfo->unread_marker) {
838 examine_app0(cinfo, data, data_length, length);
841 examine_app14(cinfo, data, data_length, length);
844 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
845 (int) (data_length + length));
849 /* skip any remaining data -- could be lots */
850 INPUT_SYNC(cinfo); /* do before skip_input_data */
852 (*cinfo->src->skip_input_data) (cinfo, (long) length);
857 #endif /* SAVE_MARKERS_SUPPORTED */
861 skip_variable (j_decompress_ptr cinfo)
862 /* Skip over an unknown or uninteresting variable-length marker */
867 INPUT_2BYTES(cinfo, length, return FALSE);
870 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
872 INPUT_SYNC(cinfo); /* do before skip_input_data */
874 (*cinfo->src->skip_input_data) (cinfo, (long) length);
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.
885 * Note that the result might not be a valid marker code,
886 * but it will never be 0 or FF.
890 next_marker (j_decompress_ptr cinfo)
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.
903 cinfo->marker->discarded_bytes++;
905 INPUT_BYTE(cinfo, c, return FALSE);
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.
913 INPUT_BYTE(cinfo, c, return FALSE);
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.
920 cinfo->marker->discarded_bytes += 2;
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;
929 cinfo->unread_marker = c;
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.
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);
953 cinfo->unread_marker = c2;
959 #ifdef MOTION_JPEG_SUPPORTED
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.
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
972 LOCAL(const unsigned char) mjpg_dc0_huffval[] = {
973 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
974 0x08, 0x09, 0x0A, 0x0B
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
983 LOCAL(const unsigned char) mjpg_dc1_huffval[] = {
984 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
985 0x08, 0x09, 0x0A, 0x0B
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
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,
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
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,
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
1053 mjpg_load_huff_tables (j_decompress_ptr cinfo)
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;
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;
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;
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;
1092 #define mjpg_load_huff_tables(cinfo)
1094 #endif /* MOTION_JPEG_SUPPORTED */
1098 * Read markers until SOS or EOI.
1100 * Returns same codes as are defined for jpeg_consume_input:
1101 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
1105 read_markers (j_decompress_ptr cinfo)
1107 /* Outer loop repeats once for each marker. */
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;
1116 if (! next_marker(cinfo))
1117 return JPEG_SUSPENDED;
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.
1124 switch (cinfo->unread_marker) {
1126 if (! get_soi(cinfo))
1127 return JPEG_SUSPENDED;
1130 case M_SOF0: /* Baseline */
1131 case M_SOF1: /* Extended sequential, Huffman */
1132 if (! get_sof(cinfo, FALSE, FALSE))
1133 return JPEG_SUSPENDED;
1136 case M_SOF2: /* Progressive, Huffman */
1137 if (! get_sof(cinfo, TRUE, FALSE))
1138 return JPEG_SUSPENDED;
1141 case M_SOF9: /* Extended sequential, arithmetic */
1142 if (! get_sof(cinfo, FALSE, TRUE))
1143 return JPEG_SUSPENDED;
1146 case M_SOF10: /* Progressive, arithmetic */
1147 if (! get_sof(cinfo, TRUE, TRUE))
1148 return JPEG_SUSPENDED;
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);
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;
1172 TRACEMS(cinfo, 1, JTRC_EOI);
1173 cinfo->unread_marker = 0; /* processed the marker */
1174 return JPEG_REACHED_EOI;
1177 if (! get_dac(cinfo))
1178 return JPEG_SUSPENDED;
1182 if (! get_dht(cinfo))
1183 return JPEG_SUSPENDED;
1187 if (! get_dqt(cinfo))
1188 return JPEG_SUSPENDED;
1192 if (! get_dri(cinfo))
1193 return JPEG_SUSPENDED;
1212 if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
1213 cinfo->unread_marker - (int) M_APP0]) (cinfo))
1214 return JPEG_SUSPENDED;
1218 if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
1219 return JPEG_SUSPENDED;
1222 case M_RST0: /* these are all parameterless */
1231 TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
1234 case M_DNL: /* Ignore DNL ... perhaps the wrong thing */
1235 if (! skip_variable(cinfo))
1236 return JPEG_SUSPENDED;
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
1245 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
1248 /* Successfully processed marker, so reset state variable */
1249 cinfo->unread_marker = 0;
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.
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.
1267 read_restart_marker (j_decompress_ptr cinfo)
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))
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;
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))
1289 /* Update next-restart state */
1290 cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
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.
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
1313 * Returns FALSE if suspension is required.
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
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.
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
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.
1346 jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
1348 int marker = cinfo->unread_marker;
1351 /* Always put up a warning. */
1352 WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
1354 /* Outer loop handles repeated decision after scanning forward. */
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 */
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 */
1368 action = 1; /* desired restart or too far away */
1370 TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
1373 /* Discard marker and let entropy decoder resume processing. */
1374 cinfo->unread_marker = 0;
1377 /* Scan to the next marker, and repeat the decision loop. */
1378 if (! next_marker(cinfo))
1380 marker = cinfo->unread_marker;
1383 /* Return without advancing past this marker. */
1384 /* Entropy decoder will be forced to process an empty segment. */
1392 * Reset marker processing state to begin a fresh datastream.
1396 reset_marker_reader (j_decompress_ptr cinfo)
1398 my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
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;
1411 * Initialize the marker reader module.
1412 * This is called only once, when the decompression object is created.
1416 jinit_marker_reader (j_decompress_ptr cinfo)
1418 my_marker_ptr marker;
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.
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;
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);
1448 * Control saving of COM and APPn markers into marker_list.
1451 #ifdef SAVE_MARKERS_SUPPORTED
1454 jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
1455 unsigned int length_limit)
1457 my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
1459 jpeg_marker_parser_method processor;
1461 /* Length limit mustn't be larger than what we can allocate
1462 * (should only be a concern in a 16-bit environment).
1464 maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
1465 if (((long) length_limit) > maxlength)
1466 length_limit = (unsigned int) maxlength;
1468 /* Choose processor routine to use.
1469 * APP0/APP14 have special requirements.
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;
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;
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;
1492 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
1495 #endif /* SAVE_MARKERS_SUPPORTED */
1499 * Install a special processing method for COM or APPn markers.
1503 jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
1504 jpeg_marker_parser_method routine)
1506 my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
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;
1513 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);