OLD | NEW |
1 /* | 1 /* |
2 * jdatasrc.c | 2 * jdatasrc.c |
3 * | 3 * |
4 * This file was part of the Independent JPEG Group's software: | 4 * This file was part of the Independent JPEG Group's software: |
5 * Copyright (C) 1994-1996, Thomas G. Lane. | 5 * Copyright (C) 1994-1996, Thomas G. Lane. |
6 * Modified 2009-2011 by Guido Vollbeding. | 6 * Modified 2009-2011 by Guido Vollbeding. |
7 * libjpeg-turbo Modifications: | 7 * libjpeg-turbo Modifications: |
8 * Copyright (C) 2013, D. R. Commander. | 8 * Copyright (C) 2013, D. R. Commander. |
9 * For conditions of distribution and use, see the accompanying README file. | 9 * For conditions of distribution and use, see the accompanying README.ijg |
| 10 * file. |
10 * | 11 * |
11 * This file contains decompression data source routines for the case of | 12 * This file contains decompression data source routines for the case of |
12 * reading JPEG data from memory or from a file (or any stdio stream). | 13 * reading JPEG data from memory or from a file (or any stdio stream). |
13 * While these routines are sufficient for most applications, | 14 * While these routines are sufficient for most applications, |
14 * some will want to use a different source manager. | 15 * some will want to use a different source manager. |
15 * IMPORTANT: we assume that fread() will correctly transcribe an array of | 16 * IMPORTANT: we assume that fread() will correctly transcribe an array of |
16 * JOCTETs from 8-bit-wide elements on external storage. If char is wider | 17 * JOCTETs from 8-bit-wide elements on external storage. If char is wider |
17 * than 8 bits on your machine, you may need to do some tweaking. | 18 * than 8 bits on your machine, you may need to do some tweaking. |
18 */ | 19 */ |
19 | 20 |
20 /* this is not a core library module, so it doesn't define JPEG_INTERNALS */ | 21 /* this is not a core library module, so it doesn't define JPEG_INTERNALS */ |
21 #include "jinclude.h" | 22 #include "jinclude.h" |
22 #include "jpeglib.h" | 23 #include "jpeglib.h" |
23 #include "jerror.h" | 24 #include "jerror.h" |
24 | 25 |
25 | 26 |
26 /* Expanded data source object for stdio input */ | 27 /* Expanded data source object for stdio input */ |
27 | 28 |
28 typedef struct { | 29 typedef struct { |
29 struct jpeg_source_mgr pub;» /* public fields */ | 30 struct jpeg_source_mgr pub; /* public fields */ |
30 | 31 |
31 FILE * infile;» » /* source stream */ | 32 FILE *infile; /* source stream */ |
32 JOCTET * buffer;» » /* start of buffer */ | 33 JOCTET *buffer; /* start of buffer */ |
33 boolean start_of_file;» /* have we gotten any data yet? */ | 34 boolean start_of_file; /* have we gotten any data yet? */ |
34 } my_source_mgr; | 35 } my_source_mgr; |
35 | 36 |
36 typedef my_source_mgr * my_src_ptr; | 37 typedef my_source_mgr *my_src_ptr; |
37 | 38 |
38 #define INPUT_BUF_SIZE 4096» /* choose an efficiently fread'able size */ | 39 #define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ |
39 | 40 |
40 | 41 |
41 /* | 42 /* |
42 * Initialize source --- called by jpeg_read_header | 43 * Initialize source --- called by jpeg_read_header |
43 * before any data is actually read. | 44 * before any data is actually read. |
44 */ | 45 */ |
45 | 46 |
46 METHODDEF(void) | 47 METHODDEF(void) |
47 init_source (j_decompress_ptr cinfo) | 48 init_source (j_decompress_ptr cinfo) |
48 { | 49 { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 | 100 |
100 METHODDEF(boolean) | 101 METHODDEF(boolean) |
101 fill_input_buffer (j_decompress_ptr cinfo) | 102 fill_input_buffer (j_decompress_ptr cinfo) |
102 { | 103 { |
103 my_src_ptr src = (my_src_ptr) cinfo->src; | 104 my_src_ptr src = (my_src_ptr) cinfo->src; |
104 size_t nbytes; | 105 size_t nbytes; |
105 | 106 |
106 nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); | 107 nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); |
107 | 108 |
108 if (nbytes <= 0) { | 109 if (nbytes <= 0) { |
109 if (src->start_of_file)» /* Treat empty input file as fatal error */ | 110 if (src->start_of_file) /* Treat empty input file as fatal error */ |
110 ERREXIT(cinfo, JERR_INPUT_EMPTY); | 111 ERREXIT(cinfo, JERR_INPUT_EMPTY); |
111 WARNMS(cinfo, JWRN_JPEG_EOF); | 112 WARNMS(cinfo, JWRN_JPEG_EOF); |
112 /* Insert a fake EOI marker */ | 113 /* Insert a fake EOI marker */ |
113 src->buffer[0] = (JOCTET) 0xFF; | 114 src->buffer[0] = (JOCTET) 0xFF; |
114 src->buffer[1] = (JOCTET) JPEG_EOI; | 115 src->buffer[1] = (JOCTET) JPEG_EOI; |
115 nbytes = 2; | 116 nbytes = 2; |
116 } | 117 } |
117 | 118 |
118 src->pub.next_input_byte = src->buffer; | 119 src->pub.next_input_byte = src->buffer; |
119 src->pub.bytes_in_buffer = nbytes; | 120 src->pub.bytes_in_buffer = nbytes; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 * is not granted the right to give a suspension return. If the skip extends | 155 * is not granted the right to give a suspension return. If the skip extends |
155 * beyond the data currently in the buffer, the buffer can be marked empty so | 156 * beyond the data currently in the buffer, the buffer can be marked empty so |
156 * that the next read will cause a fill_input_buffer call that can suspend. | 157 * that the next read will cause a fill_input_buffer call that can suspend. |
157 * Arranging for additional bytes to be discarded before reloading the input | 158 * Arranging for additional bytes to be discarded before reloading the input |
158 * buffer is the application writer's problem. | 159 * buffer is the application writer's problem. |
159 */ | 160 */ |
160 | 161 |
161 METHODDEF(void) | 162 METHODDEF(void) |
162 skip_input_data (j_decompress_ptr cinfo, long num_bytes) | 163 skip_input_data (j_decompress_ptr cinfo, long num_bytes) |
163 { | 164 { |
164 struct jpeg_source_mgr * src = cinfo->src; | 165 struct jpeg_source_mgr *src = cinfo->src; |
165 | 166 |
166 /* Just a dumb implementation for now. Could use fseek() except | 167 /* Just a dumb implementation for now. Could use fseek() except |
167 * it doesn't work on pipes. Not clear that being smart is worth | 168 * it doesn't work on pipes. Not clear that being smart is worth |
168 * any trouble anyway --- large skips are infrequent. | 169 * any trouble anyway --- large skips are infrequent. |
169 */ | 170 */ |
170 if (num_bytes > 0) { | 171 if (num_bytes > 0) { |
171 while (num_bytes > (long) src->bytes_in_buffer) { | 172 while (num_bytes > (long) src->bytes_in_buffer) { |
172 num_bytes -= (long) src->bytes_in_buffer; | 173 num_bytes -= (long) src->bytes_in_buffer; |
173 (void) (*src->fill_input_buffer) (cinfo); | 174 (void) (*src->fill_input_buffer) (cinfo); |
174 /* note we assume that fill_input_buffer will never return FALSE, | 175 /* note we assume that fill_input_buffer will never return FALSE, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 } | 207 } |
207 | 208 |
208 | 209 |
209 /* | 210 /* |
210 * Prepare for input from a stdio stream. | 211 * Prepare for input from a stdio stream. |
211 * The caller must have already opened the stream, and is responsible | 212 * The caller must have already opened the stream, and is responsible |
212 * for closing it after finishing decompression. | 213 * for closing it after finishing decompression. |
213 */ | 214 */ |
214 | 215 |
215 GLOBAL(void) | 216 GLOBAL(void) |
216 jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) | 217 jpeg_stdio_src (j_decompress_ptr cinfo, FILE *infile) |
217 { | 218 { |
218 my_src_ptr src; | 219 my_src_ptr src; |
219 | 220 |
220 /* The source object and input buffer are made permanent so that a series | 221 /* The source object and input buffer are made permanent so that a series |
221 * of JPEG images can be read from the same file by calling jpeg_stdio_src | 222 * of JPEG images can be read from the same file by calling jpeg_stdio_src |
222 * only before the first one. (If we discarded the buffer at the end of | 223 * only before the first one. (If we discarded the buffer at the end of |
223 * one image, we'd likely lose the start of the next one.) | 224 * one image, we'd likely lose the start of the next one.) |
224 * This makes it unsafe to use this manager and a different source | 225 * This makes it unsafe to use this manager and a different source |
225 * manager serially with the same JPEG object. Caveat programmer. | 226 * manager serially with the same JPEG object. Caveat programmer. |
226 */ | 227 */ |
227 if (cinfo->src == NULL) {» /* first time for this JPEG object? */ | 228 if (cinfo->src == NULL) { /* first time for this JPEG object? */ |
228 cinfo->src = (struct jpeg_source_mgr *) | 229 cinfo->src = (struct jpeg_source_mgr *) |
229 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, | 230 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, |
230 » » » » SIZEOF(my_source_mgr)); | 231 sizeof(my_source_mgr)); |
231 src = (my_src_ptr) cinfo->src; | 232 src = (my_src_ptr) cinfo->src; |
232 src->buffer = (JOCTET *) | 233 src->buffer = (JOCTET *) |
233 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, | 234 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, |
234 » » » » INPUT_BUF_SIZE * SIZEOF(JOCTET)); | 235 INPUT_BUF_SIZE * sizeof(JOCTET)); |
235 } | 236 } |
236 | 237 |
237 src = (my_src_ptr) cinfo->src; | 238 src = (my_src_ptr) cinfo->src; |
238 src->pub.init_source = init_source; | 239 src->pub.init_source = init_source; |
239 src->pub.fill_input_buffer = fill_input_buffer; | 240 src->pub.fill_input_buffer = fill_input_buffer; |
240 src->pub.skip_input_data = skip_input_data; | 241 src->pub.skip_input_data = skip_input_data; |
241 src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ | 242 src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ |
242 src->pub.term_source = term_source; | 243 src->pub.term_source = term_source; |
243 src->infile = infile; | 244 src->infile = infile; |
244 src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ | 245 src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ |
245 src->pub.next_input_byte = NULL; /* until buffer loaded */ | 246 src->pub.next_input_byte = NULL; /* until buffer loaded */ |
246 } | 247 } |
247 | 248 |
248 | 249 |
249 #if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) | 250 #if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) |
250 /* | 251 /* |
251 * Prepare for input from a supplied memory buffer. | 252 * Prepare for input from a supplied memory buffer. |
252 * The buffer must contain the whole JPEG data. | 253 * The buffer must contain the whole JPEG data. |
253 */ | 254 */ |
254 | 255 |
255 GLOBAL(void) | 256 GLOBAL(void) |
256 jpeg_mem_src (j_decompress_ptr cinfo, | 257 jpeg_mem_src (j_decompress_ptr cinfo, |
257 » unsigned char * inbuffer, unsigned long insize) | 258 const unsigned char *inbuffer, unsigned long insize) |
258 { | 259 { |
259 struct jpeg_source_mgr * src; | 260 struct jpeg_source_mgr *src; |
260 | 261 |
261 if (inbuffer == NULL || insize == 0)» /* Treat empty input as fatal error */ | 262 if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ |
262 ERREXIT(cinfo, JERR_INPUT_EMPTY); | 263 ERREXIT(cinfo, JERR_INPUT_EMPTY); |
263 | 264 |
264 /* The source object is made permanent so that a series of JPEG images | 265 /* The source object is made permanent so that a series of JPEG images |
265 * can be read from the same buffer by calling jpeg_mem_src only before | 266 * can be read from the same buffer by calling jpeg_mem_src only before |
266 * the first one. | 267 * the first one. |
267 */ | 268 */ |
268 if (cinfo->src == NULL) {» /* first time for this JPEG object? */ | 269 if (cinfo->src == NULL) { /* first time for this JPEG object? */ |
269 cinfo->src = (struct jpeg_source_mgr *) | 270 cinfo->src = (struct jpeg_source_mgr *) |
270 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, | 271 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, |
271 » » » » SIZEOF(struct jpeg_source_mgr)); | 272 sizeof(struct jpeg_source_mgr)); |
272 } | 273 } |
273 | 274 |
274 src = cinfo->src; | 275 src = cinfo->src; |
275 src->init_source = init_mem_source; | 276 src->init_source = init_mem_source; |
276 src->fill_input_buffer = fill_mem_input_buffer; | 277 src->fill_input_buffer = fill_mem_input_buffer; |
277 src->skip_input_data = skip_input_data; | 278 src->skip_input_data = skip_input_data; |
278 src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ | 279 src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ |
279 src->term_source = term_source; | 280 src->term_source = term_source; |
280 src->bytes_in_buffer = (size_t) insize; | 281 src->bytes_in_buffer = (size_t) insize; |
281 src->next_input_byte = (JOCTET *) inbuffer; | 282 src->next_input_byte = (const JOCTET *) inbuffer; |
282 } | 283 } |
283 #endif | 284 #endif |
OLD | NEW |