/*1* jdatasrc.c2*3* Copyright (C) 1994-1996, Thomas G. Lane.4* Modified 2009-2015 by Guido Vollbeding.5* This file is part of the Independent JPEG Group's software.6* For conditions of distribution and use, see the accompanying README file.7*8* This file contains decompression data source routines for the case of9* reading JPEG data from memory or from a file (or any stdio stream).10* While these routines are sufficient for most applications,11* some will want to use a different source manager.12* IMPORTANT: we assume that fread() will correctly transcribe an array of13* JOCTETs from 8-bit-wide elements on external storage. If char is wider14* than 8 bits on your machine, you may need to do some tweaking.15*/1617/* this is not a core library module, so it doesn't define JPEG_INTERNALS */18#include "jinclude.h"19#include "jpeglib.h"20#include "jerror.h"212223/* Expanded data source object for stdio input */2425typedef struct {26struct jpeg_source_mgr pub; /* public fields */2728FILE * infile; /* source stream */29JOCTET * buffer; /* start of buffer */30boolean start_of_file; /* have we gotten any data yet? */31} my_source_mgr;3233typedef my_source_mgr * my_src_ptr;3435#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */363738/*39* Initialize source --- called by jpeg_read_header40* before any data is actually read.41*/4243METHODDEF(void)44init_source (j_decompress_ptr cinfo)45{46my_src_ptr src = (my_src_ptr) cinfo->src;4748/* We reset the empty-input-file flag for each image,49* but we don't clear the input buffer.50* This is correct behavior for reading a series of images from one source.51*/52src->start_of_file = TRUE;53}5455METHODDEF(void)56init_mem_source (j_decompress_ptr cinfo)57{58/* no work necessary here */59}606162/*63* Fill the input buffer --- called whenever buffer is emptied.64*65* In typical applications, this should read fresh data into the buffer66* (ignoring the current state of next_input_byte & bytes_in_buffer),67* reset the pointer & count to the start of the buffer, and return TRUE68* indicating that the buffer has been reloaded. It is not necessary to69* fill the buffer entirely, only to obtain at least one more byte.70*71* There is no such thing as an EOF return. If the end of the file has been72* reached, the routine has a choice of ERREXIT() or inserting fake data into73* the buffer. In most cases, generating a warning message and inserting a74* fake EOI marker is the best course of action --- this will allow the75* decompressor to output however much of the image is there. However,76* the resulting error message is misleading if the real problem is an empty77* input file, so we handle that case specially.78*79* In applications that need to be able to suspend compression due to input80* not being available yet, a FALSE return indicates that no more data can be81* obtained right now, but more may be forthcoming later. In this situation,82* the decompressor will return to its caller (with an indication of the83* number of scanlines it has read, if any). The application should resume84* decompression after it has loaded more data into the input buffer. Note85* that there are substantial restrictions on the use of suspension --- see86* the documentation.87*88* When suspending, the decompressor will back up to a convenient restart point89* (typically the start of the current MCU). next_input_byte & bytes_in_buffer90* indicate where the restart point will be if the current call returns FALSE.91* Data beyond this point must be rescanned after resumption, so move it to92* the front of the buffer rather than discarding it.93*/9495METHODDEF(boolean)96fill_input_buffer (j_decompress_ptr cinfo)97{98my_src_ptr src = (my_src_ptr) cinfo->src;99size_t nbytes;100101nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);102103if (nbytes <= 0) {104if (src->start_of_file) /* Treat empty input file as fatal error */105ERREXIT(cinfo, JERR_INPUT_EMPTY);106WARNMS(cinfo, JWRN_JPEG_EOF);107/* Insert a fake EOI marker */108src->buffer[0] = (JOCTET) 0xFF;109src->buffer[1] = (JOCTET) JPEG_EOI;110nbytes = 2;111}112113src->pub.next_input_byte = src->buffer;114src->pub.bytes_in_buffer = nbytes;115src->start_of_file = FALSE;116117return TRUE;118}119120METHODDEF(boolean)121fill_mem_input_buffer (j_decompress_ptr cinfo)122{123static const JOCTET mybuffer[4] = {124(JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0125};126127/* The whole JPEG data is expected to reside in the supplied memory128* buffer, so any request for more data beyond the given buffer size129* is treated as an error.130*/131WARNMS(cinfo, JWRN_JPEG_EOF);132133/* Insert a fake EOI marker */134135cinfo->src->next_input_byte = mybuffer;136cinfo->src->bytes_in_buffer = 2;137138return TRUE;139}140141142/*143* Skip data --- used to skip over a potentially large amount of144* uninteresting data (such as an APPn marker).145*146* Writers of suspendable-input applications must note that skip_input_data147* is not granted the right to give a suspension return. If the skip extends148* beyond the data currently in the buffer, the buffer can be marked empty so149* that the next read will cause a fill_input_buffer call that can suspend.150* Arranging for additional bytes to be discarded before reloading the input151* buffer is the application writer's problem.152*/153154METHODDEF(void)155skip_input_data (j_decompress_ptr cinfo, long num_bytes)156{157struct jpeg_source_mgr * src = cinfo->src;158159/* Just a dumb implementation for now. Could use fseek() except160* it doesn't work on pipes. Not clear that being smart is worth161* any trouble anyway --- large skips are infrequent.162*/163if (num_bytes > 0) {164while (num_bytes > (long) src->bytes_in_buffer) {165num_bytes -= (long) src->bytes_in_buffer;166(void) (*src->fill_input_buffer) (cinfo);167/* note we assume that fill_input_buffer will never return FALSE,168* so suspension need not be handled.169*/170}171src->next_input_byte += (size_t) num_bytes;172src->bytes_in_buffer -= (size_t) num_bytes;173}174}175176177/*178* An additional method that can be provided by data source modules is the179* resync_to_restart method for error recovery in the presence of RST markers.180* For the moment, this source module just uses the default resync method181* provided by the JPEG library. That method assumes that no backtracking182* is possible.183*/184185186/*187* Terminate source --- called by jpeg_finish_decompress188* after all data has been read. Often a no-op.189*190* NB: *not* called by jpeg_abort or jpeg_destroy; surrounding191* application must deal with any cleanup that should happen even192* for error exit.193*/194195METHODDEF(void)196term_source (j_decompress_ptr cinfo)197{198/* no work necessary here */199}200201202/*203* Prepare for input from a stdio stream.204* The caller must have already opened the stream, and is responsible205* for closing it after finishing decompression.206*/207208GLOBAL(void)209jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)210{211my_src_ptr src;212213/* The source object and input buffer are made permanent so that a series214* of JPEG images can be read from the same file by calling jpeg_stdio_src215* only before the first one. (If we discarded the buffer at the end of216* one image, we'd likely lose the start of the next one.)217* This makes it unsafe to use this manager and a different source218* manager serially with the same JPEG object. Caveat programmer.219*/220if (cinfo->src == NULL) { /* first time for this JPEG object? */221cinfo->src = (struct jpeg_source_mgr *)222(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,223SIZEOF(my_source_mgr));224src = (my_src_ptr) cinfo->src;225src->buffer = (JOCTET *)226(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,227INPUT_BUF_SIZE * SIZEOF(JOCTET));228}229230src = (my_src_ptr) cinfo->src;231src->pub.init_source = init_source;232src->pub.fill_input_buffer = fill_input_buffer;233src->pub.skip_input_data = skip_input_data;234src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */235src->pub.term_source = term_source;236src->infile = infile;237src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */238src->pub.next_input_byte = NULL; /* until buffer loaded */239}240241242/*243* Prepare for input from a supplied memory buffer.244* The buffer must contain the whole JPEG data.245*/246247GLOBAL(void)248jpeg_mem_src (j_decompress_ptr cinfo,249const unsigned char * inbuffer, unsigned long insize)250{251struct jpeg_source_mgr * src;252253if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */254ERREXIT(cinfo, JERR_INPUT_EMPTY);255256/* The source object is made permanent so that a series of JPEG images257* can be read from the same buffer by calling jpeg_mem_src only before258* the first one.259*/260if (cinfo->src == NULL) { /* first time for this JPEG object? */261cinfo->src = (struct jpeg_source_mgr *)262(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,263SIZEOF(struct jpeg_source_mgr));264}265266src = cinfo->src;267src->init_source = init_mem_source;268src->fill_input_buffer = fill_mem_input_buffer;269src->skip_input_data = skip_input_data;270src->resync_to_restart = jpeg_resync_to_restart; /* use default method */271src->term_source = term_source;272src->bytes_in_buffer = (size_t) insize;273src->next_input_byte = (const JOCTET *) inbuffer;274}275276277