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
22typedef 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
92typedef 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
109typedef 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
198LOCAL(boolean)
199get_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
238LOCAL(boolean)
239get_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
302LOCAL(boolean)
303get_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
385LOCAL(boolean)
386get_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
431LOCAL(boolean)
432get_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
505LOCAL(boolean)
506get_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
563LOCAL(boolean)
564get_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
599LOCAL(void)
600examine_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
675LOCAL(void)
676examine_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
706METHODDEF(boolean)
707get_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
754METHODDEF(boolean)
755save_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
860METHODDEF(boolean)
861skip_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
889LOCAL(boolean)
890next_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
936LOCAL(boolean)
937first_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 */
967LOCAL(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
972LOCAL(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 */
978LOCAL(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
983LOCAL(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 */
989LOCAL(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
994LOCAL(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 */
1019LOCAL(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
1024LOCAL(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 */
1052LOCAL(void)
1053mjpg_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
1104METHODDEF(int)
1105read_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
1266METHODDEF(boolean)
1267read_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
1345GLOBAL(boolean)
1346jpeg_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
1395METHODDEF(void)
1396reset_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
1415GLOBAL(void)
1416jinit_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
1453GLOBAL(void)
1454jpeg_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
1502GLOBAL(void)
1503jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
1504			   jpeg_marker_parser_method routine)
1505{
1506  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
1507
1508  if (marker_code == (int) M_COM)
1509    marker->process_COM = routine;
1510  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
1511    marker->process_APPn[marker_code - (int) M_APP0] = routine;
1512  else
1513    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
1514}
1515