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 |