jdatasrc.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /*
  2. * jdatasrc.c
  3. *
  4. * This file was part of the Independent JPEG Group's software:
  5. * Copyright (C) 1994-1996, Thomas G. Lane.
  6. * Modified 2009-2011 by Guido Vollbeding.
  7. * libjpeg-turbo Modifications:
  8. * Copyright (C) 2013, D. R. Commander.
  9. * For conditions of distribution and use, see the accompanying README file.
  10. *
  11. * 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. * While these routines are sufficient for most applications,
  14. * some will want to use a different source manager.
  15. * 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. * than 8 bits on your machine, you may need to do some tweaking.
  18. */
  19. /* this is not a core library module, so it doesn't define JPEG_INTERNALS */
  20. #include "jinclude.h"
  21. #include "jpeglib.h"
  22. #include "jerror.h"
  23. /* Expanded data source object for stdio input */
  24. typedef struct {
  25. struct jpeg_source_mgr pub; /* public fields */
  26. FILE * infile; /* source stream */
  27. JOCTET * buffer; /* start of buffer */
  28. boolean start_of_file; /* have we gotten any data yet? */
  29. } my_source_mgr;
  30. typedef my_source_mgr * my_src_ptr;
  31. #define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */
  32. /*
  33. * Initialize source --- called by jpeg_read_header
  34. * before any data is actually read.
  35. */
  36. METHODDEF(void)
  37. init_source (j_decompress_ptr cinfo)
  38. {
  39. my_src_ptr src = (my_src_ptr) cinfo->src;
  40. /* We reset the empty-input-file flag for each image,
  41. * but we don't clear the input buffer.
  42. * This is correct behavior for reading a series of images from one source.
  43. */
  44. src->start_of_file = TRUE;
  45. }
  46. #if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
  47. METHODDEF(void)
  48. init_mem_source (j_decompress_ptr cinfo)
  49. {
  50. /* no work necessary here */
  51. }
  52. #endif
  53. /*
  54. * Fill the input buffer --- called whenever buffer is emptied.
  55. *
  56. * In typical applications, this should read fresh data into the buffer
  57. * (ignoring the current state of next_input_byte & bytes_in_buffer),
  58. * reset the pointer & count to the start of the buffer, and return TRUE
  59. * indicating that the buffer has been reloaded. It is not necessary to
  60. * fill the buffer entirely, only to obtain at least one more byte.
  61. *
  62. * There is no such thing as an EOF return. If the end of the file has been
  63. * reached, the routine has a choice of ERREXIT() or inserting fake data into
  64. * the buffer. In most cases, generating a warning message and inserting a
  65. * fake EOI marker is the best course of action --- this will allow the
  66. * decompressor to output however much of the image is there. However,
  67. * the resulting error message is misleading if the real problem is an empty
  68. * input file, so we handle that case specially.
  69. *
  70. * In applications that need to be able to suspend compression due to input
  71. * not being available yet, a FALSE return indicates that no more data can be
  72. * obtained right now, but more may be forthcoming later. In this situation,
  73. * the decompressor will return to its caller (with an indication of the
  74. * number of scanlines it has read, if any). The application should resume
  75. * decompression after it has loaded more data into the input buffer. Note
  76. * that there are substantial restrictions on the use of suspension --- see
  77. * the documentation.
  78. *
  79. * When suspending, the decompressor will back up to a convenient restart point
  80. * (typically the start of the current MCU). next_input_byte & bytes_in_buffer
  81. * indicate where the restart point will be if the current call returns FALSE.
  82. * Data beyond this point must be rescanned after resumption, so move it to
  83. * the front of the buffer rather than discarding it.
  84. */
  85. METHODDEF(boolean)
  86. fill_input_buffer (j_decompress_ptr cinfo)
  87. {
  88. my_src_ptr src = (my_src_ptr) cinfo->src;
  89. size_t nbytes;
  90. nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);
  91. if (nbytes <= 0) {
  92. if (src->start_of_file) /* Treat empty input file as fatal error */
  93. ERREXIT(cinfo, JERR_INPUT_EMPTY);
  94. WARNMS(cinfo, JWRN_JPEG_EOF);
  95. /* Insert a fake EOI marker */
  96. src->buffer[0] = (JOCTET) 0xFF;
  97. src->buffer[1] = (JOCTET) JPEG_EOI;
  98. nbytes = 2;
  99. }
  100. src->pub.next_input_byte = src->buffer;
  101. src->pub.bytes_in_buffer = nbytes;
  102. src->start_of_file = FALSE;
  103. return TRUE;
  104. }
  105. #if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
  106. METHODDEF(boolean)
  107. fill_mem_input_buffer (j_decompress_ptr cinfo)
  108. {
  109. static const JOCTET mybuffer[4] = {
  110. (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
  111. };
  112. /* The whole JPEG data is expected to reside in the supplied memory
  113. * buffer, so any request for more data beyond the given buffer size
  114. * is treated as an error.
  115. */
  116. WARNMS(cinfo, JWRN_JPEG_EOF);
  117. /* Insert a fake EOI marker */
  118. cinfo->src->next_input_byte = mybuffer;
  119. cinfo->src->bytes_in_buffer = 2;
  120. return TRUE;
  121. }
  122. #endif
  123. /*
  124. * Skip data --- used to skip over a potentially large amount of
  125. * uninteresting data (such as an APPn marker).
  126. *
  127. * Writers of suspendable-input applications must note that skip_input_data
  128. * is not granted the right to give a suspension return. If the skip extends
  129. * beyond the data currently in the buffer, the buffer can be marked empty so
  130. * that the next read will cause a fill_input_buffer call that can suspend.
  131. * Arranging for additional bytes to be discarded before reloading the input
  132. * buffer is the application writer's problem.
  133. */
  134. METHODDEF(void)
  135. skip_input_data (j_decompress_ptr cinfo, long num_bytes)
  136. {
  137. struct jpeg_source_mgr * src = cinfo->src;
  138. /* Just a dumb implementation for now. Could use fseek() except
  139. * it doesn't work on pipes. Not clear that being smart is worth
  140. * any trouble anyway --- large skips are infrequent.
  141. */
  142. if (num_bytes > 0) {
  143. while (num_bytes > (long) src->bytes_in_buffer) {
  144. num_bytes -= (long) src->bytes_in_buffer;
  145. (void) (*src->fill_input_buffer) (cinfo);
  146. /* note we assume that fill_input_buffer will never return FALSE,
  147. * so suspension need not be handled.
  148. */
  149. }
  150. src->next_input_byte += (size_t) num_bytes;
  151. src->bytes_in_buffer -= (size_t) num_bytes;
  152. }
  153. }
  154. /*
  155. * An additional method that can be provided by data source modules is the
  156. * resync_to_restart method for error recovery in the presence of RST markers.
  157. * For the moment, this source module just uses the default resync method
  158. * provided by the JPEG library. That method assumes that no backtracking
  159. * is possible.
  160. */
  161. /*
  162. * Terminate source --- called by jpeg_finish_decompress
  163. * after all data has been read. Often a no-op.
  164. *
  165. * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding
  166. * application must deal with any cleanup that should happen even
  167. * for error exit.
  168. */
  169. METHODDEF(void)
  170. term_source (j_decompress_ptr cinfo)
  171. {
  172. /* no work necessary here */
  173. }
  174. /*
  175. * Prepare for input from a stdio stream.
  176. * The caller must have already opened the stream, and is responsible
  177. * for closing it after finishing decompression.
  178. */
  179. GLOBAL(void)
  180. jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
  181. {
  182. my_src_ptr src;
  183. /* The source object and input buffer are made permanent so that a series
  184. * of JPEG images can be read from the same file by calling jpeg_stdio_src
  185. * only before the first one. (If we discarded the buffer at the end of
  186. * one image, we'd likely lose the start of the next one.)
  187. * This makes it unsafe to use this manager and a different source
  188. * manager serially with the same JPEG object. Caveat programmer.
  189. */
  190. if (cinfo->src == NULL) { /* first time for this JPEG object? */
  191. cinfo->src = (struct jpeg_source_mgr *)
  192. (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
  193. SIZEOF(my_source_mgr));
  194. src = (my_src_ptr) cinfo->src;
  195. src->buffer = (JOCTET *)
  196. (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
  197. INPUT_BUF_SIZE * SIZEOF(JOCTET));
  198. }
  199. src = (my_src_ptr) cinfo->src;
  200. src->pub.init_source = init_source;
  201. src->pub.fill_input_buffer = fill_input_buffer;
  202. src->pub.skip_input_data = skip_input_data;
  203. src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
  204. src->pub.term_source = term_source;
  205. src->infile = infile;
  206. src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
  207. src->pub.next_input_byte = NULL; /* until buffer loaded */
  208. }
  209. #if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
  210. /*
  211. * Prepare for input from a supplied memory buffer.
  212. * The buffer must contain the whole JPEG data.
  213. */
  214. GLOBAL(void)
  215. jpeg_mem_src (j_decompress_ptr cinfo,
  216. unsigned char * inbuffer, unsigned long insize)
  217. {
  218. struct jpeg_source_mgr * src;
  219. if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */
  220. ERREXIT(cinfo, JERR_INPUT_EMPTY);
  221. /* The source object is made permanent so that a series of JPEG images
  222. * can be read from the same buffer by calling jpeg_mem_src only before
  223. * the first one.
  224. */
  225. if (cinfo->src == NULL) { /* first time for this JPEG object? */
  226. cinfo->src = (struct jpeg_source_mgr *)
  227. (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
  228. SIZEOF(struct jpeg_source_mgr));
  229. }
  230. src = cinfo->src;
  231. src->init_source = init_mem_source;
  232. src->fill_input_buffer = fill_mem_input_buffer;
  233. src->skip_input_data = skip_input_data;
  234. src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
  235. src->term_source = term_source;
  236. src->bytes_in_buffer = (size_t) insize;
  237. src->next_input_byte = (JOCTET *) inbuffer;
  238. }
  239. #endif