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