| OLD | NEW |
| 1 /* | 1 /* |
| 2 * jdatasrc.c | 2 * jdatasrc.c |
| 3 * | 3 * |
| 4 * Copyright (C) 1994-1996, Thomas G. Lane. | 4 * Copyright (C) 1994-1996, Thomas G. Lane. |
| 5 * Modified 2009-2010 by Guido Vollbeding. |
| 5 * This file is part of the Independent JPEG Group's software. | 6 * This file is part of the Independent JPEG Group's software. |
| 6 * For conditions of distribution and use, see the accompanying README file. | 7 * For conditions of distribution and use, see the accompanying README file. |
| 7 * | 8 * |
| 8 * This file contains decompression data source routines for the case of | 9 * This file contains decompression data source routines for the case of |
| 9 * reading JPEG data from a file (or any stdio stream). While these routines | 10 * reading JPEG data from memory or from a file (or any stdio stream). |
| 10 * are sufficient for most applications, some will want to use a different | 11 * While these routines are sufficient for most applications, |
| 11 * source manager. | 12 * some will want to use a different source manager. |
| 12 * IMPORTANT: we assume that fread() will correctly transcribe an array of | 13 * IMPORTANT: we assume that fread() will correctly transcribe an array of |
| 13 * JOCTETs from 8-bit-wide elements on external storage. If char is wider | 14 * JOCTETs from 8-bit-wide elements on external storage. If char is wider |
| 14 * than 8 bits on your machine, you may need to do some tweaking. | 15 * than 8 bits on your machine, you may need to do some tweaking. |
| 15 */ | 16 */ |
| 16 | 17 |
| 17 /* this is not a core library module, so it doesn't define JPEG_INTERNALS */ | 18 /* this is not a core library module, so it doesn't define JPEG_INTERNALS */ |
| 18 #include "jinclude.h" | 19 #include "jinclude.h" |
| 19 #include "jpeglib.h" | 20 #include "jpeglib.h" |
| 20 #include "jerror.h" | 21 #include "jerror.h" |
| 21 | 22 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 45 { | 46 { |
| 46 my_src_ptr src = (my_src_ptr) cinfo->src; | 47 my_src_ptr src = (my_src_ptr) cinfo->src; |
| 47 | 48 |
| 48 /* We reset the empty-input-file flag for each image, | 49 /* We reset the empty-input-file flag for each image, |
| 49 * but we don't clear the input buffer. | 50 * but we don't clear the input buffer. |
| 50 * This is correct behavior for reading a series of images from one source. | 51 * This is correct behavior for reading a series of images from one source. |
| 51 */ | 52 */ |
| 52 src->start_of_file = TRUE; | 53 src->start_of_file = TRUE; |
| 53 } | 54 } |
| 54 | 55 |
| 56 #if JPEG_LIB_VERSION >= 80 |
| 57 METHODDEF(void) |
| 58 init_mem_source (j_decompress_ptr cinfo) |
| 59 { |
| 60 /* no work necessary here */ |
| 61 } |
| 62 #endif |
| 63 |
| 55 | 64 |
| 56 /* | 65 /* |
| 57 * Fill the input buffer --- called whenever buffer is emptied. | 66 * Fill the input buffer --- called whenever buffer is emptied. |
| 58 * | 67 * |
| 59 * In typical applications, this should read fresh data into the buffer | 68 * In typical applications, this should read fresh data into the buffer |
| 60 * (ignoring the current state of next_input_byte & bytes_in_buffer), | 69 * (ignoring the current state of next_input_byte & bytes_in_buffer), |
| 61 * reset the pointer & count to the start of the buffer, and return TRUE | 70 * reset the pointer & count to the start of the buffer, and return TRUE |
| 62 * indicating that the buffer has been reloaded. It is not necessary to | 71 * indicating that the buffer has been reloaded. It is not necessary to |
| 63 * fill the buffer entirely, only to obtain at least one more byte. | 72 * fill the buffer entirely, only to obtain at least one more byte. |
| 64 * | 73 * |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 nbytes = 2; | 113 nbytes = 2; |
| 105 } | 114 } |
| 106 | 115 |
| 107 src->pub.next_input_byte = src->buffer; | 116 src->pub.next_input_byte = src->buffer; |
| 108 src->pub.bytes_in_buffer = nbytes; | 117 src->pub.bytes_in_buffer = nbytes; |
| 109 src->start_of_file = FALSE; | 118 src->start_of_file = FALSE; |
| 110 | 119 |
| 111 return TRUE; | 120 return TRUE; |
| 112 } | 121 } |
| 113 | 122 |
| 123 #if JPEG_LIB_VERSION >= 80 |
| 124 METHODDEF(boolean) |
| 125 fill_mem_input_buffer (j_decompress_ptr cinfo) |
| 126 { |
| 127 static JOCTET mybuffer[4]; |
| 128 |
| 129 /* The whole JPEG data is expected to reside in the supplied memory |
| 130 * buffer, so any request for more data beyond the given buffer size |
| 131 * is treated as an error. |
| 132 */ |
| 133 WARNMS(cinfo, JWRN_JPEG_EOF); |
| 134 /* Insert a fake EOI marker */ |
| 135 mybuffer[0] = (JOCTET) 0xFF; |
| 136 mybuffer[1] = (JOCTET) JPEG_EOI; |
| 137 |
| 138 cinfo->src->next_input_byte = mybuffer; |
| 139 cinfo->src->bytes_in_buffer = 2; |
| 140 |
| 141 return TRUE; |
| 142 } |
| 143 #endif |
| 144 |
| 114 | 145 |
| 115 /* | 146 /* |
| 116 * Skip data --- used to skip over a potentially large amount of | 147 * Skip data --- used to skip over a potentially large amount of |
| 117 * uninteresting data (such as an APPn marker). | 148 * uninteresting data (such as an APPn marker). |
| 118 * | 149 * |
| 119 * Writers of suspendable-input applications must note that skip_input_data | 150 * Writers of suspendable-input applications must note that skip_input_data |
| 120 * is not granted the right to give a suspension return. If the skip extends | 151 * is not granted the right to give a suspension return. If the skip extends |
| 121 * beyond the data currently in the buffer, the buffer can be marked empty so | 152 * beyond the data currently in the buffer, the buffer can be marked empty so |
| 122 * that the next read will cause a fill_input_buffer call that can suspend. | 153 * that the next read will cause a fill_input_buffer call that can suspend. |
| 123 * Arranging for additional bytes to be discarded before reloading the input | 154 * Arranging for additional bytes to be discarded before reloading the input |
| 124 * buffer is the application writer's problem. | 155 * buffer is the application writer's problem. |
| 125 */ | 156 */ |
| 126 | 157 |
| 127 METHODDEF(void) | 158 METHODDEF(void) |
| 128 skip_input_data (j_decompress_ptr cinfo, long num_bytes) | 159 skip_input_data (j_decompress_ptr cinfo, long num_bytes) |
| 129 { | 160 { |
| 130 my_src_ptr src = (my_src_ptr) cinfo->src; | 161 struct jpeg_source_mgr * src = cinfo->src; |
| 131 | 162 |
| 132 /* Just a dumb implementation for now. Could use fseek() except | 163 /* Just a dumb implementation for now. Could use fseek() except |
| 133 * it doesn't work on pipes. Not clear that being smart is worth | 164 * it doesn't work on pipes. Not clear that being smart is worth |
| 134 * any trouble anyway --- large skips are infrequent. | 165 * any trouble anyway --- large skips are infrequent. |
| 135 */ | 166 */ |
| 136 if (num_bytes > 0) { | 167 if (num_bytes > 0) { |
| 137 while (num_bytes > (long) src->pub.bytes_in_buffer) { | 168 while (num_bytes > (long) src->bytes_in_buffer) { |
| 138 num_bytes -= (long) src->pub.bytes_in_buffer; | 169 num_bytes -= (long) src->bytes_in_buffer; |
| 139 (void) fill_input_buffer(cinfo); | 170 (void) (*src->fill_input_buffer) (cinfo); |
| 140 /* note we assume that fill_input_buffer will never return FALSE, | 171 /* note we assume that fill_input_buffer will never return FALSE, |
| 141 * so suspension need not be handled. | 172 * so suspension need not be handled. |
| 142 */ | 173 */ |
| 143 } | 174 } |
| 144 src->pub.next_input_byte += (size_t) num_bytes; | 175 src->next_input_byte += (size_t) num_bytes; |
| 145 src->pub.bytes_in_buffer -= (size_t) num_bytes; | 176 src->bytes_in_buffer -= (size_t) num_bytes; |
| 146 } | 177 } |
| 147 } | 178 } |
| 148 | 179 |
| 149 | 180 |
| 150 /* | 181 /* |
| 151 * An additional method that can be provided by data source modules is the | 182 * An additional method that can be provided by data source modules is the |
| 152 * resync_to_restart method for error recovery in the presence of RST markers. | 183 * resync_to_restart method for error recovery in the presence of RST markers. |
| 153 * For the moment, this source module just uses the default resync method | 184 * For the moment, this source module just uses the default resync method |
| 154 * provided by the JPEG library. That method assumes that no backtracking | 185 * provided by the JPEG library. That method assumes that no backtracking |
| 155 * is possible. | 186 * is possible. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 src = (my_src_ptr) cinfo->src; | 234 src = (my_src_ptr) cinfo->src; |
| 204 src->pub.init_source = init_source; | 235 src->pub.init_source = init_source; |
| 205 src->pub.fill_input_buffer = fill_input_buffer; | 236 src->pub.fill_input_buffer = fill_input_buffer; |
| 206 src->pub.skip_input_data = skip_input_data; | 237 src->pub.skip_input_data = skip_input_data; |
| 207 src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ | 238 src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ |
| 208 src->pub.term_source = term_source; | 239 src->pub.term_source = term_source; |
| 209 src->infile = infile; | 240 src->infile = infile; |
| 210 src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ | 241 src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ |
| 211 src->pub.next_input_byte = NULL; /* until buffer loaded */ | 242 src->pub.next_input_byte = NULL; /* until buffer loaded */ |
| 212 } | 243 } |
| 244 |
| 245 |
| 246 #if JPEG_LIB_VERSION >= 80 |
| 247 /* |
| 248 * Prepare for input from a supplied memory buffer. |
| 249 * The buffer must contain the whole JPEG data. |
| 250 */ |
| 251 |
| 252 GLOBAL(void) |
| 253 jpeg_mem_src (j_decompress_ptr cinfo, |
| 254 unsigned char * inbuffer, unsigned long insize) |
| 255 { |
| 256 struct jpeg_source_mgr * src; |
| 257 |
| 258 if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ |
| 259 ERREXIT(cinfo, JERR_INPUT_EMPTY); |
| 260 |
| 261 /* The source object is made permanent so that a series of JPEG images |
| 262 * can be read from the same buffer by calling jpeg_mem_src only before |
| 263 * the first one. |
| 264 */ |
| 265 if (cinfo->src == NULL) { /* first time for this JPEG object? */ |
| 266 cinfo->src = (struct jpeg_source_mgr *) |
| 267 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, |
| 268 SIZEOF(struct jpeg_source_mgr)); |
| 269 } |
| 270 |
| 271 src = cinfo->src; |
| 272 src->init_source = init_mem_source; |
| 273 src->fill_input_buffer = fill_mem_input_buffer; |
| 274 src->skip_input_data = skip_input_data; |
| 275 src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ |
| 276 src->term_source = term_source; |
| 277 src->bytes_in_buffer = (size_t) insize; |
| 278 src->next_input_byte = (JOCTET *) inbuffer; |
| 279 } |
| 280 #endif |
| OLD | NEW |