c8cf9a46559d4dbdd8d15f8f719dd3c197b2125a
[platform/framework/web/crosswalk.git] / src / third_party / libjpeg_turbo / jdmarker.c
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 }