1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jdatasrc.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1994-1996, Thomas G. Lane. 63395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * Modified 2009-2011 by Guido Vollbeding. 73395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 83395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * Copyright (C) 2013, D. R. Commander. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains decompression data source routines for the case of 129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * reading JPEG data from memory or from a file (or any stdio stream). 139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * While these routines are sufficient for most applications, 149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * some will want to use a different source manager. 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * IMPORTANT: we assume that fread() will correctly transcribe an array of 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * JOCTETs from 8-bit-wide elements on external storage. If char is wider 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * than 8 bits on your machine, you may need to do some tweaking. 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jerror.h" 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Expanded data source object for stdio input */ 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct { 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_source_mgr pub; /* public fields */ 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org FILE * infile; /* source stream */ 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JOCTET * buffer; /* start of buffer */ 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean start_of_file; /* have we gotten any data yet? */ 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} my_source_mgr; 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef my_source_mgr * my_src_ptr; 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialize source --- called by jpeg_read_header 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * before any data is actually read. 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orginit_source (j_decompress_ptr cinfo) 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_src_ptr src = (my_src_ptr) cinfo->src; 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We reset the empty-input-file flag for each image, 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but we don't clear the input buffer. 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is correct behavior for reading a series of images from one source. 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->start_of_file = TRUE; 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 583395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) 599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(void) 609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orginit_mem_source (j_decompress_ptr cinfo) 619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{ 629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* no work necessary here */ 639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org} 649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Fill the input buffer --- called whenever buffer is emptied. 69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * In typical applications, this should read fresh data into the buffer 71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (ignoring the current state of next_input_byte & bytes_in_buffer), 72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * reset the pointer & count to the start of the buffer, and return TRUE 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * indicating that the buffer has been reloaded. It is not necessary to 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * fill the buffer entirely, only to obtain at least one more byte. 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * There is no such thing as an EOF return. If the end of the file has been 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * reached, the routine has a choice of ERREXIT() or inserting fake data into 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the buffer. In most cases, generating a warning message and inserting a 79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * fake EOI marker is the best course of action --- this will allow the 80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * decompressor to output however much of the image is there. However, 81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the resulting error message is misleading if the real problem is an empty 82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * input file, so we handle that case specially. 83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * In applications that need to be able to suspend compression due to input 85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * not being available yet, a FALSE return indicates that no more data can be 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * obtained right now, but more may be forthcoming later. In this situation, 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the decompressor will return to its caller (with an indication of the 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * number of scanlines it has read, if any). The application should resume 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * decompression after it has loaded more data into the input buffer. Note 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that there are substantial restrictions on the use of suspension --- see 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the documentation. 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * When suspending, the decompressor will back up to a convenient restart point 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (typically the start of the current MCU). next_input_byte & bytes_in_buffer 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * indicate where the restart point will be if the current call returns FALSE. 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Data beyond this point must be rescanned after resumption, so move it to 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the front of the buffer rather than discarding it. 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfill_input_buffer (j_decompress_ptr cinfo) 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_src_ptr src = (my_src_ptr) cinfo->src; 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org size_t nbytes; 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbytes <= 0) { 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (src->start_of_file) /* Treat empty input file as fatal error */ 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_INPUT_EMPTY); 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS(cinfo, JWRN_JPEG_EOF); 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Insert a fake EOI marker */ 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->buffer[0] = (JOCTET) 0xFF; 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->buffer[1] = (JOCTET) JPEG_EOI; 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbytes = 2; 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.next_input_byte = src->buffer; 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.bytes_in_buffer = nbytes; 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->start_of_file = FALSE; 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1253395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) 1269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean) 1279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgfill_mem_input_buffer (j_decompress_ptr cinfo) 1289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{ 1293395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org static const JOCTET mybuffer[4] = { 1303395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0 1313395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org }; 1329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 1339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* The whole JPEG data is expected to reside in the supplied memory 1349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * buffer, so any request for more data beyond the given buffer size 1359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * is treated as an error. 1369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */ 1379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org WARNMS(cinfo, JWRN_JPEG_EOF); 1383395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org 1399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* Insert a fake EOI marker */ 1409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 1419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->src->next_input_byte = mybuffer; 1429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->src->bytes_in_buffer = 2; 1439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 1449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org return TRUE; 1459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org} 1469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 1479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Skip data --- used to skip over a potentially large amount of 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * uninteresting data (such as an APPn marker). 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Writers of suspendable-input applications must note that skip_input_data 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is not granted the right to give a suspension return. If the skip extends 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * beyond the data currently in the buffer, the buffer can be marked empty so 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that the next read will cause a fill_input_buffer call that can suspend. 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Arranging for additional bytes to be discarded before reloading the input 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * buffer is the application writer's problem. 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgskip_input_data (j_decompress_ptr cinfo, long num_bytes) 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org struct jpeg_source_mgr * src = cinfo->src; 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Just a dumb implementation for now. Could use fseek() except 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * it doesn't work on pipes. Not clear that being smart is worth 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * any trouble anyway --- large skips are infrequent. 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (num_bytes > 0) { 1719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org while (num_bytes > (long) src->bytes_in_buffer) { 1729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org num_bytes -= (long) src->bytes_in_buffer; 1739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org (void) (*src->fill_input_buffer) (cinfo); 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* note we assume that fill_input_buffer will never return FALSE, 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * so suspension need not be handled. 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->next_input_byte += (size_t) num_bytes; 1799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->bytes_in_buffer -= (size_t) num_bytes; 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * An additional method that can be provided by data source modules is the 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * resync_to_restart method for error recovery in the presence of RST markers. 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For the moment, this source module just uses the default resync method 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * provided by the JPEG library. That method assumes that no backtracking 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is possible. 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Terminate source --- called by jpeg_finish_decompress 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * after all data has been read. Often a no-op. 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * application must deal with any cleanup that should happen even 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * for error exit. 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgterm_source (j_decompress_ptr cinfo) 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* no work necessary here */ 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Prepare for input from a stdio stream. 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The caller must have already opened the stream, and is responsible 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * for closing it after finishing decompression. 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_src_ptr src; 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* The source object and input buffer are made permanent so that a series 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * of JPEG images can be read from the same file by calling jpeg_stdio_src 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * only before the first one. (If we discarded the buffer at the end of 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * one image, we'd likely lose the start of the next one.) 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This makes it unsafe to use this manager and a different source 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * manager serially with the same JPEG object. Caveat programmer. 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->src == NULL) { /* first time for this JPEG object? */ 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->src = (struct jpeg_source_mgr *) 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SIZEOF(my_source_mgr)); 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src = (my_src_ptr) cinfo->src; 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->buffer = (JOCTET *) 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BUF_SIZE * SIZEOF(JOCTET)); 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src = (my_src_ptr) cinfo->src; 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.init_source = init_source; 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.fill_input_buffer = fill_input_buffer; 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.skip_input_data = skip_input_data; 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.term_source = term_source; 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->infile = infile; 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org src->pub.next_input_byte = NULL; /* until buffer loaded */ 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 2479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2493395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) 2509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* 2519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Prepare for input from a supplied memory buffer. 2529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * The buffer must contain the whole JPEG data. 2539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */ 2549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgGLOBAL(void) 2569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgjpeg_mem_src (j_decompress_ptr cinfo, 2579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org unsigned char * inbuffer, unsigned long insize) 2589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{ 2599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org struct jpeg_source_mgr * src; 2609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ 2629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org ERREXIT(cinfo, JERR_INPUT_EMPTY); 2639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* The source object is made permanent so that a series of JPEG images 2659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * can be read from the same buffer by calling jpeg_mem_src only before 2669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * the first one. 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->src == NULL) { /* first time for this JPEG object? */ 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->src = (struct jpeg_source_mgr *) 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 2719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org SIZEOF(struct jpeg_source_mgr)); 2729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org } 2739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 2749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src = cinfo->src; 2759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->init_source = init_mem_source; 2769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->fill_input_buffer = fill_mem_input_buffer; 2779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->skip_input_data = skip_input_data; 2789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ 2799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->term_source = term_source; 2809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->bytes_in_buffer = (size_t) insize; 2819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org src->next_input_byte = (JOCTET *) inbuffer; 2829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org} 2839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 284