| 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 |