Home | History | Annotate | Download | only in libtiff
      1 /* $Id: tif_ojpeg.c,v 1.60 2015-05-31 00:38:46 bfriesen Exp $ */
      2 
      3 /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0
      4    specification is now totally obsolete and deprecated for new applications and
      5    images. This file was was created solely in order to read unconverted images
      6    still present on some users' computer systems. It will never be extended
      7    to write such files. Writing new-style JPEG compressed TIFFs is implemented
      8    in tif_jpeg.c.
      9 
     10    The code is carefully crafted to robustly read all gathered JPEG-in-TIFF
     11    testfiles, and anticipate as much as possible all other... But still, it may
     12    fail on some. If you encounter problems, please report them on the TIFF
     13    mailing list and/or to Joris Van Damme <info (at) awaresystems.be>.
     14 
     15    Please read the file called "TIFF Technical Note #2" if you need to be
     16    convinced this compression scheme is bad and breaks TIFF. That document
     17    is linked to from the LibTiff site <http://www.remotesensing.org/libtiff/>
     18    and from AWare Systems' TIFF section
     19    <http://www.awaresystems.be/imaging/tiff.html>. It is also absorbed
     20    in Adobe's specification supplements, marked "draft" up to this day, but
     21    supported by the TIFF community.
     22 
     23    This file interfaces with Release 6B of the JPEG Library written by the
     24    Independent JPEG Group. Previous versions of this file required a hack inside
     25    the LibJpeg library. This version no longer requires that. Remember to
     26    remove the hack if you update from the old version.
     27 
     28    Copyright (c) Joris Van Damme <info (at) awaresystems.be>
     29    Copyright (c) AWare Systems <http://www.awaresystems.be/>
     30 
     31    The licence agreement for this file is the same as the rest of the LibTiff
     32    library.
     33 
     34    IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR
     35    ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
     36    OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
     37    WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
     38    LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     39    OF THIS SOFTWARE.
     40 
     41    Joris Van Damme and/or AWare Systems may be available for custom
     42    development. If you like what you see, and need anything similar or related,
     43    contact <info (at) awaresystems.be>.
     44 */
     45 
     46 /* What is what, and what is not?
     47 
     48    This decoder starts with an input stream, that is essentially the JpegInterchangeFormat
     49    stream, if any, followed by the strile data, if any. This stream is read in
     50    OJPEGReadByte and related functions.
     51 
     52    It analyzes the start of this stream, until it encounters non-marker data, i.e.
     53    compressed image data. Some of the header markers it sees have no actual content,
     54    like the SOI marker, and APP/COM markers that really shouldn't even be there. Some
     55    other markers do have content, and the valuable bits and pieces of information
     56    in these markers are saved, checking all to verify that the stream is more or
     57    less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx
     58    functions.
     59 
     60    Some OJPEG imagery contains no valid JPEG header markers. This situation is picked
     61    up on if we've seen no SOF marker when we're at the start of the compressed image
     62    data. In this case, the tables are read from JpegXxxTables tags, and the other
     63    bits and pieces of information is initialized to its most basic value. This is
     64    implemented in the OJPEGReadHeaderInfoSecTablesXxx functions.
     65 
     66    When this is complete, a good and valid JPEG header can be assembled, and this is
     67    passed through to LibJpeg. When that's done, the remainder of the input stream, i.e.
     68    the compressed image data, can be passed through unchanged. This is done in
     69    OJPEGWriteStream functions.
     70 
     71    LibTiff rightly expects to know the subsampling values before decompression. Just like
     72    in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling
     73    tag is notoriously unreliable. To correct these tag values with the ones inside
     74    the JPEG stream, the first part of the input stream is pre-scanned in
     75    OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings
     76    or errors, up to the point where either these values are read, or it's clear they
     77    aren't there. This means that some of the data is read twice, but we feel speed
     78    in correcting these values is important enough to warrant this sacrifice. Allthough
     79    there is currently no define or other configuration mechanism to disable this behaviour,
     80    the actual header scanning is build to robustly respond with error report if it
     81    should encounter an uncorrected mismatch of subsampling values. See
     82    OJPEGReadHeaderInfoSecStreamSof.
     83 
     84    The restart interval and restart markers are the most tricky part... The restart
     85    interval can be specified in a tag. It can also be set inside the input JPEG stream.
     86    It can be used inside the input JPEG stream. If reading from strile data, we've
     87    consistenly discovered the need to insert restart markers in between the different
     88    striles, as is also probably the most likely interpretation of the original TIFF 6.0
     89    specification. With all this setting of interval, and actual use of markers that is not
     90    predictable at the time of valid JPEG header assembly, the restart thing may turn
     91    out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors
     92    succeed in reading back what they write, which may be the reason why we've been able
     93    to discover ways that seem to work.
     94 
     95    Some special provision is made for planarconfig separate OJPEG files. These seem
     96    to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS,
     97    and plane. This may or may not be a valid JPEG configuration, we don't know and don't
     98    care. We want LibTiff to be able to access the planes individually, without huge
     99    buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this
    100    case, that allow us to pass a single plane such that LibJpeg sees a valid
    101    single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent
    102    planes, is done inside OJPEGReadSecondarySos.
    103 
    104    The benefit of the scheme is... that it works, basically. We know of no other that
    105    does. It works without checking software tag, or otherwise going about things in an
    106    OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases
    107    with and without JpegInterchangeFormat, with and without striles, with part of
    108    the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving
    109    and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out
    110    of the data.
    111 
    112    Another nice side-effect is that a complete JPEG single valid stream is build if
    113    planarconfig is not separate (vast majority). We may one day use that to build
    114    converters to JPEG, and/or to new-style JPEG compression inside TIFF.
    115 
    116    A dissadvantage is the lack of random access to the individual striles. This is the
    117    reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode.
    118    Applications would do well accessing all striles in order, as this will result in
    119    a single sequential scan of the input stream, and no restarting of LibJpeg decoding
    120    session.
    121 */
    122 
    123 #define WIN32_LEAN_AND_MEAN
    124 #define VC_EXTRALEAN
    125 
    126 #include "tiffiop.h"
    127 #ifdef OJPEG_SUPPORT
    128 
    129 /* Configuration defines here are:
    130  * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments,
    131  * 	like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to
    132  * 	libjpeg, with longjump stuff, are encapsulated in dedicated functions. When
    133  * 	JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external
    134  * 	to this unit, and can be defined elsewhere to use stuff other then longjump.
    135  * 	The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators
    136  * 	here, internally, with normal longjump.
    137  * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is
    138  * 	conviniently available, but still it may be worthwhile to use _setjmp or sigsetjmp
    139  * 	in place of plain setjmp. These macros will make it easier. It is useless
    140  * 	to fiddle with these if you define JPEG_ENCAP_EXTERNAL.
    141  * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee
    142  * 	instant processing, optimal streaming and optimal use of processor cache, but also big
    143  * 	enough so as to not result in significant call overhead. It should be at least a few
    144  * 	bytes to accommodate some structures (this is verified in asserts), but it would not be
    145  * 	sensible to make it this small anyway, and it should be at most 64K since it is indexed
    146  * 	with uint16. We recommend 2K.
    147  * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has
    148  * 	absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly.
    149  */
    150 
    151 /* define LIBJPEG_ENCAP_EXTERNAL */
    152 #define SETJMP(jbuf) setjmp(jbuf)
    153 #define LONGJMP(jbuf,code) longjmp(jbuf,code)
    154 #define JMP_BUF jmp_buf
    155 #define OJPEG_BUFFER 2048
    156 /* define EGYPTIANWALK */
    157 
    158 #define JPEG_MARKER_SOF0 0xC0
    159 #define JPEG_MARKER_SOF1 0xC1
    160 #define JPEG_MARKER_SOF3 0xC3
    161 #define JPEG_MARKER_DHT 0xC4
    162 #define JPEG_MARKER_RST0 0XD0
    163 #define JPEG_MARKER_SOI 0xD8
    164 #define JPEG_MARKER_EOI 0xD9
    165 #define JPEG_MARKER_SOS 0xDA
    166 #define JPEG_MARKER_DQT 0xDB
    167 #define JPEG_MARKER_DRI 0xDD
    168 #define JPEG_MARKER_APP0 0xE0
    169 #define JPEG_MARKER_COM 0xFE
    170 
    171 #define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0)
    172 #define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1)
    173 #define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2)
    174 #define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3)
    175 #define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4)
    176 #define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5)
    177 #define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6)
    178 
    179 static const TIFFField ojpegFields[] = {
    180 	{TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NULL},
    181 	{TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength",NULL},
    182 	{TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables",NULL},
    183 	{TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables",NULL},
    184 	{TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables",NULL},
    185 	{TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL},
    186 	{TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval",NULL},
    187 };
    188 
    189 #ifndef LIBJPEG_ENCAP_EXTERNAL
    190 #include <setjmp.h>
    191 #endif
    192 
    193 /* We undefine FAR to avoid conflict with JPEG definition */
    194 
    195 #ifdef FAR
    196 #undef FAR
    197 #endif
    198 
    199 /*
    200   Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is
    201   not defined.  Unfortunately, the MinGW and Borland compilers include
    202   a typedef for INT32, which causes a conflict.  MSVC does not include
    203   a conficting typedef given the headers which are included.
    204 */
    205 #if defined(__BORLANDC__) || defined(__MINGW32__)
    206 # define XMD_H 1
    207 #endif
    208 
    209 /* Define "boolean" as unsigned char, not int, per Windows custom. */
    210 #if defined(__WIN32__) && !defined(__MINGW32__)
    211 # ifndef __RPCNDR_H__            /* don't conflict if rpcndr.h already read */
    212    typedef unsigned char boolean;
    213 # endif
    214 # define HAVE_BOOLEAN            /* prevent jmorecfg.h from redefining it */
    215 #endif
    216 
    217 #if defined(USE_SYSTEM_LIBJPEG)
    218 #include <jerror.h>
    219 #include <jpeglib.h>
    220 #elif defined(USE_LIBJPEG_TURBO)
    221 #include "third_party/libjpeg_turbo/jerror.h"
    222 #include "third_party/libjpeg_turbo/jpeglib.h"
    223 #else
    224 #include "third_party/libjpeg/jerror.h"
    225 #include "third_party/libjpeg/jpeglib.h"
    226 #endif
    227 
    228 
    229 typedef struct jpeg_error_mgr jpeg_error_mgr;
    230 typedef struct jpeg_common_struct jpeg_common_struct;
    231 typedef struct jpeg_decompress_struct jpeg_decompress_struct;
    232 typedef struct jpeg_source_mgr jpeg_source_mgr;
    233 
    234 typedef enum {
    235 	osibsNotSetYet,
    236 	osibsJpegInterchangeFormat,
    237 	osibsStrile,
    238 	osibsEof
    239 } OJPEGStateInBufferSource;
    240 
    241 typedef enum {
    242 	ososSoi,
    243 	ososQTable0,ososQTable1,ososQTable2,ososQTable3,
    244 	ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
    245 	ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
    246 	ososDri,
    247 	ososSof,
    248 	ososSos,
    249 	ososCompressed,
    250 	ososRst,
    251 	ososEoi
    252 } OJPEGStateOutState;
    253 
    254 typedef struct {
    255 	TIFF* tif;
    256 	#ifndef LIBJPEG_ENCAP_EXTERNAL
    257 	JMP_BUF exit_jmpbuf;
    258 	#endif
    259 	TIFFVGetMethod vgetparent;
    260 	TIFFVSetMethod vsetparent;
    261 	TIFFPrintMethod printdir;
    262 	uint64 file_size;
    263 	uint32 image_width;
    264 	uint32 image_length;
    265 	uint32 strile_width;
    266 	uint32 strile_length;
    267 	uint32 strile_length_total;
    268 	uint8 samples_per_pixel;
    269 	uint8 plane_sample_offset;
    270 	uint8 samples_per_pixel_per_plane;
    271 	uint64 jpeg_interchange_format;
    272 	uint64 jpeg_interchange_format_length;
    273 	uint8 jpeg_proc;
    274 	uint8 subsamplingcorrect;
    275 	uint8 subsamplingcorrect_done;
    276 	uint8 subsampling_tag;
    277 	uint8 subsampling_hor;
    278 	uint8 subsampling_ver;
    279 	uint8 subsampling_force_desubsampling_inside_decompression;
    280 	uint8 qtable_offset_count;
    281 	uint8 dctable_offset_count;
    282 	uint8 actable_offset_count;
    283 	uint64 qtable_offset[3];
    284 	uint64 dctable_offset[3];
    285 	uint64 actable_offset[3];
    286 	uint8* qtable[4];
    287 	uint8* dctable[4];
    288 	uint8* actable[4];
    289 	uint16 restart_interval;
    290 	uint8 restart_index;
    291 	uint8 sof_log;
    292 	uint8 sof_marker_id;
    293 	uint32 sof_x;
    294 	uint32 sof_y;
    295 	uint8 sof_c[3];
    296 	uint8 sof_hv[3];
    297 	uint8 sof_tq[3];
    298 	uint8 sos_cs[3];
    299 	uint8 sos_tda[3];
    300 	struct {
    301 		uint8 log;
    302 		OJPEGStateInBufferSource in_buffer_source;
    303 		uint32 in_buffer_next_strile;
    304 		uint64 in_buffer_file_pos;
    305 		uint64 in_buffer_file_togo;
    306 	} sos_end[3];
    307 	uint8 readheader_done;
    308 	uint8 writeheader_done;
    309 	uint16 write_cursample;
    310 	uint32 write_curstrile;
    311 	uint8 libjpeg_session_active;
    312 	uint8 libjpeg_jpeg_query_style;
    313 	jpeg_error_mgr libjpeg_jpeg_error_mgr;
    314 	jpeg_decompress_struct libjpeg_jpeg_decompress_struct;
    315 	jpeg_source_mgr libjpeg_jpeg_source_mgr;
    316 	uint8 subsampling_convert_log;
    317 	uint32 subsampling_convert_ylinelen;
    318 	uint32 subsampling_convert_ylines;
    319 	uint32 subsampling_convert_clinelen;
    320 	uint32 subsampling_convert_clines;
    321 	uint32 subsampling_convert_ybuflen;
    322 	uint32 subsampling_convert_cbuflen;
    323 	uint32 subsampling_convert_ycbcrbuflen;
    324 	uint8* subsampling_convert_ycbcrbuf;
    325 	uint8* subsampling_convert_ybuf;
    326 	uint8* subsampling_convert_cbbuf;
    327 	uint8* subsampling_convert_crbuf;
    328 	uint32 subsampling_convert_ycbcrimagelen;
    329 	uint8** subsampling_convert_ycbcrimage;
    330 	uint32 subsampling_convert_clinelenout;
    331 	uint32 subsampling_convert_state;
    332 	uint32 bytes_per_line;   /* if the codec outputs subsampled data, a 'line' in bytes_per_line */
    333 	uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows     */
    334 	OJPEGStateInBufferSource in_buffer_source;
    335 	uint32 in_buffer_next_strile;
    336 	uint32 in_buffer_strile_count;
    337 	uint64 in_buffer_file_pos;
    338 	uint8 in_buffer_file_pos_log;
    339 	uint64 in_buffer_file_togo;
    340 	uint16 in_buffer_togo;
    341 	uint8* in_buffer_cur;
    342 	uint8 in_buffer[OJPEG_BUFFER];
    343 	OJPEGStateOutState out_state;
    344 	uint8 out_buffer[OJPEG_BUFFER];
    345 	uint8* skip_buffer;
    346 } OJPEGState;
    347 
    348 static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap);
    349 static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap);
    350 static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags);
    351 
    352 static int OJPEGFixupTags(TIFF* tif);
    353 static int OJPEGSetupDecode(TIFF* tif);
    354 static int OJPEGPreDecode(TIFF* tif, uint16 s);
    355 static int OJPEGPreDecodeSkipRaw(TIFF* tif);
    356 static int OJPEGPreDecodeSkipScanlines(TIFF* tif);
    357 static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
    358 static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc);
    359 static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc);
    360 static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
    361 static int OJPEGSetupEncode(TIFF* tif);
    362 static int OJPEGPreEncode(TIFF* tif, uint16 s);
    363 static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
    364 static int OJPEGPostEncode(TIFF* tif);
    365 static void OJPEGCleanup(TIFF* tif);
    366 
    367 static void OJPEGSubsamplingCorrect(TIFF* tif);
    368 static int OJPEGReadHeaderInfo(TIFF* tif);
    369 static int OJPEGReadSecondarySos(TIFF* tif, uint16 s);
    370 static int OJPEGWriteHeaderInfo(TIFF* tif);
    371 static void OJPEGLibjpegSessionAbort(TIFF* tif);
    372 
    373 static int OJPEGReadHeaderInfoSec(TIFF* tif);
    374 static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif);
    375 static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif);
    376 static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif);
    377 static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id);
    378 static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif);
    379 static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif);
    380 static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif);
    381 static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif);
    382 
    383 static int OJPEGReadBufferFill(OJPEGState* sp);
    384 static int OJPEGReadByte(OJPEGState* sp, uint8* byte);
    385 static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte);
    386 static void OJPEGReadByteAdvance(OJPEGState* sp);
    387 static int OJPEGReadWord(OJPEGState* sp, uint16* word);
    388 static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem);
    389 static void OJPEGReadSkip(OJPEGState* sp, uint16 len);
    390 
    391 static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len);
    392 static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len);
    393 static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
    394 static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
    395 static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
    396 static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len);
    397 static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len);
    398 static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len);
    399 static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len);
    400 static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len);
    401 static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len);
    402 
    403 #ifdef LIBJPEG_ENCAP_EXTERNAL
    404 extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
    405 extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
    406 extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
    407 extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
    408 extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
    409 extern void jpeg_encap_unwind(TIFF* tif);
    410 #else
    411 static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j);
    412 static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
    413 static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
    414 static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
    415 static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
    416 static void jpeg_encap_unwind(TIFF* tif);
    417 #endif
    418 
    419 static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo);
    420 static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo);
    421 static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo);
    422 static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo);
    423 static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes);
    424 static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired);
    425 static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo);
    426 
    427 int
    428 TIFFInitOJPEG(TIFF* tif, int scheme)
    429 {
    430 	static const char module[]="TIFFInitOJPEG";
    431 	OJPEGState* sp;
    432 
    433 	assert(scheme==COMPRESSION_OJPEG);
    434 
    435         /*
    436 	 * Merge codec-specific tag information.
    437 	 */
    438 	if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) {
    439 		TIFFErrorExt(tif->tif_clientdata, module,
    440 		    "Merging Old JPEG codec-specific tags failed");
    441 		return 0;
    442 	}
    443 
    444 	/* state block */
    445 	sp=_TIFFmalloc(sizeof(OJPEGState));
    446 	if (sp==NULL)
    447 	{
    448 		TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block");
    449 		return(0);
    450 	}
    451 	_TIFFmemset(sp,0,sizeof(OJPEGState));
    452 	sp->tif=tif;
    453 	sp->jpeg_proc=1;
    454 	sp->subsampling_hor=2;
    455 	sp->subsampling_ver=2;
    456 	TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2);
    457 	/* tif codec methods */
    458 	tif->tif_fixuptags=OJPEGFixupTags;
    459 	tif->tif_setupdecode=OJPEGSetupDecode;
    460 	tif->tif_predecode=OJPEGPreDecode;
    461 	tif->tif_postdecode=OJPEGPostDecode;
    462 	tif->tif_decoderow=OJPEGDecode;
    463 	tif->tif_decodestrip=OJPEGDecode;
    464 	tif->tif_decodetile=OJPEGDecode;
    465 	tif->tif_setupencode=OJPEGSetupEncode;
    466 	tif->tif_preencode=OJPEGPreEncode;
    467 	tif->tif_postencode=OJPEGPostEncode;
    468 	tif->tif_encoderow=OJPEGEncode;
    469 	tif->tif_encodestrip=OJPEGEncode;
    470 	tif->tif_encodetile=OJPEGEncode;
    471 	tif->tif_cleanup=OJPEGCleanup;
    472 	tif->tif_data=(uint8*)sp;
    473 	/* tif tag methods */
    474 	sp->vgetparent=tif->tif_tagmethods.vgetfield;
    475 	tif->tif_tagmethods.vgetfield=OJPEGVGetField;
    476 	sp->vsetparent=tif->tif_tagmethods.vsetfield;
    477 	tif->tif_tagmethods.vsetfield=OJPEGVSetField;
    478 	sp->printdir=tif->tif_tagmethods.printdir;
    479 	tif->tif_tagmethods.printdir=OJPEGPrintDir;
    480 	/* Some OJPEG files don't have strip or tile offsets or bytecounts tags.
    481 	   Some others do, but have totally meaningless or corrupt values
    482 	   in these tags. In these cases, the JpegInterchangeFormat stream is
    483 	   reliable. In any case, this decoder reads the compressed data itself,
    484 	   from the most reliable locations, and we need to notify encapsulating
    485 	   LibTiff not to read raw strips or tiles for us. */
    486 	tif->tif_flags|=TIFF_NOREADRAW;
    487 	return(1);
    488 }
    489 
    490 static int
    491 OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
    492 {
    493 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    494 	switch(tag)
    495 	{
    496 		case TIFFTAG_JPEGIFOFFSET:
    497 			*va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format;
    498 			break;
    499 		case TIFFTAG_JPEGIFBYTECOUNT:
    500 			*va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_length;
    501 			break;
    502 		case TIFFTAG_YCBCRSUBSAMPLING:
    503 			if (sp->subsamplingcorrect_done==0)
    504 				OJPEGSubsamplingCorrect(tif);
    505 			*va_arg(ap,uint16*)=(uint16)sp->subsampling_hor;
    506 			*va_arg(ap,uint16*)=(uint16)sp->subsampling_ver;
    507 			break;
    508 		case TIFFTAG_JPEGQTABLES:
    509 			*va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count;
    510 			*va_arg(ap,void**)=(void*)sp->qtable_offset;
    511 			break;
    512 		case TIFFTAG_JPEGDCTABLES:
    513 			*va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count;
    514 			*va_arg(ap,void**)=(void*)sp->dctable_offset;
    515 			break;
    516 		case TIFFTAG_JPEGACTABLES:
    517 			*va_arg(ap,uint32*)=(uint32)sp->actable_offset_count;
    518 			*va_arg(ap,void**)=(void*)sp->actable_offset;
    519 			break;
    520 		case TIFFTAG_JPEGPROC:
    521 			*va_arg(ap,uint16*)=(uint16)sp->jpeg_proc;
    522 			break;
    523 		case TIFFTAG_JPEGRESTARTINTERVAL:
    524 			*va_arg(ap,uint16*)=sp->restart_interval;
    525 			break;
    526 		default:
    527 			return (*sp->vgetparent)(tif,tag,ap);
    528 	}
    529 	return (1);
    530 }
    531 
    532 static int
    533 OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
    534 {
    535 	static const char module[]="OJPEGVSetField";
    536 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    537 	uint32 ma;
    538 	uint64* mb;
    539 	uint32 n;
    540 	const TIFFField* fip;
    541 
    542 	switch(tag)
    543 	{
    544 		case TIFFTAG_JPEGIFOFFSET:
    545 			sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64);
    546 			break;
    547 		case TIFFTAG_JPEGIFBYTECOUNT:
    548 			sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uint64);
    549 			break;
    550 		case TIFFTAG_YCBCRSUBSAMPLING:
    551 			sp->subsampling_tag=1;
    552 			sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap);
    553 			sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap);
    554 			tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor;
    555 			tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver;
    556 			break;
    557 		case TIFFTAG_JPEGQTABLES:
    558 			ma=(uint32)va_arg(ap,uint32);
    559 			if (ma!=0)
    560 			{
    561 				if (ma>3)
    562 				{
    563 					TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count");
    564 					return(0);
    565 				}
    566 				sp->qtable_offset_count=(uint8)ma;
    567 				mb=(uint64*)va_arg(ap,uint64*);
    568 				for (n=0; n<ma; n++)
    569 					sp->qtable_offset[n]=mb[n];
    570 			}
    571 			break;
    572 		case TIFFTAG_JPEGDCTABLES:
    573 			ma=(uint32)va_arg(ap,uint32);
    574 			if (ma!=0)
    575 			{
    576 				if (ma>3)
    577 				{
    578 					TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count");
    579 					return(0);
    580 				}
    581 				sp->dctable_offset_count=(uint8)ma;
    582 				mb=(uint64*)va_arg(ap,uint64*);
    583 				for (n=0; n<ma; n++)
    584 					sp->dctable_offset[n]=mb[n];
    585 			}
    586 			break;
    587 		case TIFFTAG_JPEGACTABLES:
    588 			ma=(uint32)va_arg(ap,uint32);
    589 			if (ma!=0)
    590 			{
    591 				if (ma>3)
    592 				{
    593 					TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count");
    594 					return(0);
    595 				}
    596 				sp->actable_offset_count=(uint8)ma;
    597 				mb=(uint64*)va_arg(ap,uint64*);
    598 				for (n=0; n<ma; n++)
    599 					sp->actable_offset[n]=mb[n];
    600 			}
    601 			break;
    602 		case TIFFTAG_JPEGPROC:
    603 			sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap);
    604 			break;
    605 		case TIFFTAG_JPEGRESTARTINTERVAL:
    606 			sp->restart_interval=(uint16)va_arg(ap,uint16_vap);
    607 			break;
    608 		default:
    609 			return (*sp->vsetparent)(tif,tag,ap);
    610 	}
    611 	fip = TIFFFieldWithTag(tif,tag);
    612 	if( fip == NULL ) /* shouldn't happen */
    613 	    return(0);
    614 	TIFFSetFieldBit(tif,fip->field_bit);
    615 	tif->tif_flags|=TIFF_DIRTYDIRECT;
    616 	return(1);
    617 }
    618 
    619 static void
    620 OJPEGPrintDir(TIFF* tif, FILE* fd, long flags)
    621 {
    622 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    623 	uint8 m;
    624 	(void)flags;
    625 	assert(sp!=NULL);
    626 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
    627 		fprintf(fd,"  JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format);
    628 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
    629 		fprintf(fd,"  JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length);
    630 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES))
    631 	{
    632 		fprintf(fd,"  JpegQTables:");
    633 		for (m=0; m<sp->qtable_offset_count; m++)
    634 			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qtable_offset[m]);
    635 		fprintf(fd,"\n");
    636 	}
    637 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES))
    638 	{
    639 		fprintf(fd,"  JpegDcTables:");
    640 		for (m=0; m<sp->dctable_offset_count; m++)
    641 			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dctable_offset[m]);
    642 		fprintf(fd,"\n");
    643 	}
    644 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES))
    645 	{
    646 		fprintf(fd,"  JpegAcTables:");
    647 		for (m=0; m<sp->actable_offset_count; m++)
    648 			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->actable_offset[m]);
    649 		fprintf(fd,"\n");
    650 	}
    651 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC))
    652 		fprintf(fd,"  JpegProc: %u\n",(unsigned int)sp->jpeg_proc);
    653 	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL))
    654 		fprintf(fd,"  JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval);
    655 	if (sp->printdir)
    656 		(*sp->printdir)(tif, fd, flags);
    657 }
    658 
    659 static int
    660 OJPEGFixupTags(TIFF* tif)
    661 {
    662 	(void) tif;
    663 	return(1);
    664 }
    665 
    666 static int
    667 OJPEGSetupDecode(TIFF* tif)
    668 {
    669 	static const char module[]="OJPEGSetupDecode";
    670 	TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software");
    671 	return(1);
    672 }
    673 
    674 static int
    675 OJPEGPreDecode(TIFF* tif, uint16 s)
    676 {
    677 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    678 	uint32 m;
    679 	if (sp->subsamplingcorrect_done==0)
    680 		OJPEGSubsamplingCorrect(tif);
    681 	if (sp->readheader_done==0)
    682 	{
    683 		if (OJPEGReadHeaderInfo(tif)==0)
    684 			return(0);
    685 	}
    686 	if (sp->sos_end[s].log==0)
    687 	{
    688 		if (OJPEGReadSecondarySos(tif,s)==0)
    689 			return(0);
    690 	}
    691 	if isTiled(tif)
    692 		m=tif->tif_curtile;
    693 	else
    694 		m=tif->tif_curstrip;
    695 	if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m)))
    696 	{
    697 		if (sp->libjpeg_session_active!=0)
    698 			OJPEGLibjpegSessionAbort(tif);
    699 		sp->writeheader_done=0;
    700 	}
    701 	if (sp->writeheader_done==0)
    702 	{
    703 		sp->plane_sample_offset=(uint8)s;
    704 		sp->write_cursample=s;
    705 		sp->write_curstrile=s*tif->tif_dir.td_stripsperimage;
    706 		if ((sp->in_buffer_file_pos_log==0) ||
    707 		    (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos))
    708 		{
    709 			sp->in_buffer_source=sp->sos_end[s].in_buffer_source;
    710 			sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile;
    711 			sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos;
    712 			sp->in_buffer_file_pos_log=0;
    713 			sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo;
    714 			sp->in_buffer_togo=0;
    715 			sp->in_buffer_cur=0;
    716 		}
    717 		if (OJPEGWriteHeaderInfo(tif)==0)
    718 			return(0);
    719 	}
    720 	while (sp->write_curstrile<m)
    721 	{
    722 		if (sp->libjpeg_jpeg_query_style==0)
    723 		{
    724 			if (OJPEGPreDecodeSkipRaw(tif)==0)
    725 				return(0);
    726 		}
    727 		else
    728 		{
    729 			if (OJPEGPreDecodeSkipScanlines(tif)==0)
    730 				return(0);
    731 		}
    732 		sp->write_curstrile++;
    733 	}
    734 	return(1);
    735 }
    736 
    737 static int
    738 OJPEGPreDecodeSkipRaw(TIFF* tif)
    739 {
    740 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    741 	uint32 m;
    742 	m=sp->lines_per_strile;
    743 	if (sp->subsampling_convert_state!=0)
    744 	{
    745 		if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m)
    746 		{
    747 			sp->subsampling_convert_state+=m;
    748 			if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
    749 				sp->subsampling_convert_state=0;
    750 			return(1);
    751 		}
    752 		m-=sp->subsampling_convert_clines-sp->subsampling_convert_state;
    753 		sp->subsampling_convert_state=0;
    754 	}
    755 	while (m>=sp->subsampling_convert_clines)
    756 	{
    757 		if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
    758 			return(0);
    759 		m-=sp->subsampling_convert_clines;
    760 	}
    761 	if (m>0)
    762 	{
    763 		if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
    764 			return(0);
    765 		sp->subsampling_convert_state=m;
    766 	}
    767 	return(1);
    768 }
    769 
    770 static int
    771 OJPEGPreDecodeSkipScanlines(TIFF* tif)
    772 {
    773 	static const char module[]="OJPEGPreDecodeSkipScanlines";
    774 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    775 	uint32 m;
    776 	if (sp->skip_buffer==NULL)
    777 	{
    778 		sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line);
    779 		if (sp->skip_buffer==NULL)
    780 		{
    781 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
    782 			return(0);
    783 		}
    784 	}
    785 	for (m=0; m<sp->lines_per_strile; m++)
    786 	{
    787 		if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0)
    788 			return(0);
    789 	}
    790 	return(1);
    791 }
    792 
    793 static int
    794 OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
    795 {
    796 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    797 	(void)s;
    798 	if (sp->libjpeg_jpeg_query_style==0)
    799 	{
    800 		if (OJPEGDecodeRaw(tif,buf,cc)==0)
    801 			return(0);
    802 	}
    803 	else
    804 	{
    805 		if (OJPEGDecodeScanlines(tif,buf,cc)==0)
    806 			return(0);
    807 	}
    808 	return(1);
    809 }
    810 
    811 static int
    812 OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc)
    813 {
    814 	static const char module[]="OJPEGDecodeRaw";
    815 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    816 	uint8* m;
    817 	tmsize_t n;
    818 	uint8* oy;
    819 	uint8* ocb;
    820 	uint8* ocr;
    821 	uint8* p;
    822 	uint32 q;
    823 	uint8* r;
    824 	uint8 sx,sy;
    825 	if (cc%sp->bytes_per_line!=0)
    826 	{
    827 		TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
    828 		return(0);
    829 	}
    830 	assert(cc>0);
    831 	m=buf;
    832 	n=cc;
    833 	do
    834 	{
    835 		if (sp->subsampling_convert_state==0)
    836 		{
    837 			if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
    838 				return(0);
    839 		}
    840 		oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen;
    841 		ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
    842 		ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
    843 		p=m;
    844 		for (q=0; q<sp->subsampling_convert_clinelenout; q++)
    845 		{
    846 			r=oy;
    847 			for (sy=0; sy<sp->subsampling_ver; sy++)
    848 			{
    849 				for (sx=0; sx<sp->subsampling_hor; sx++)
    850 					*p++=*r++;
    851 				r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor;
    852 			}
    853 			oy+=sp->subsampling_hor;
    854 			*p++=*ocb++;
    855 			*p++=*ocr++;
    856 		}
    857 		sp->subsampling_convert_state++;
    858 		if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
    859 			sp->subsampling_convert_state=0;
    860 		m+=sp->bytes_per_line;
    861 		n-=sp->bytes_per_line;
    862 	} while(n>0);
    863 	return(1);
    864 }
    865 
    866 static int
    867 OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc)
    868 {
    869 	static const char module[]="OJPEGDecodeScanlines";
    870 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    871 	uint8* m;
    872 	tmsize_t n;
    873 	if (cc%sp->bytes_per_line!=0)
    874 	{
    875 		TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
    876 		return(0);
    877 	}
    878 	assert(cc>0);
    879 	m=buf;
    880 	n=cc;
    881 	do
    882 	{
    883 		if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0)
    884 			return(0);
    885 		m+=sp->bytes_per_line;
    886 		n-=sp->bytes_per_line;
    887 	} while(n>0);
    888 	return(1);
    889 }
    890 
    891 static void
    892 OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
    893 {
    894 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    895 	(void)buf;
    896 	(void)cc;
    897 	sp->write_curstrile++;
    898 	if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0)
    899 	{
    900 		assert(sp->libjpeg_session_active!=0);
    901 		OJPEGLibjpegSessionAbort(tif);
    902 		sp->writeheader_done=0;
    903 	}
    904 }
    905 
    906 static int
    907 OJPEGSetupEncode(TIFF* tif)
    908 {
    909 	static const char module[]="OJPEGSetupEncode";
    910 	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
    911 	return(0);
    912 }
    913 
    914 static int
    915 OJPEGPreEncode(TIFF* tif, uint16 s)
    916 {
    917 	static const char module[]="OJPEGPreEncode";
    918 	(void)s;
    919 	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
    920 	return(0);
    921 }
    922 
    923 static int
    924 OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
    925 {
    926 	static const char module[]="OJPEGEncode";
    927 	(void)buf;
    928 	(void)cc;
    929 	(void)s;
    930 	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
    931 	return(0);
    932 }
    933 
    934 static int
    935 OJPEGPostEncode(TIFF* tif)
    936 {
    937 	static const char module[]="OJPEGPostEncode";
    938 	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
    939 	return(0);
    940 }
    941 
    942 static void
    943 OJPEGCleanup(TIFF* tif)
    944 {
    945 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    946 	if (sp!=0)
    947 	{
    948 		tif->tif_tagmethods.vgetfield=sp->vgetparent;
    949 		tif->tif_tagmethods.vsetfield=sp->vsetparent;
    950 		tif->tif_tagmethods.printdir=sp->printdir;
    951 		if (sp->qtable[0]!=0)
    952 			_TIFFfree(sp->qtable[0]);
    953 		if (sp->qtable[1]!=0)
    954 			_TIFFfree(sp->qtable[1]);
    955 		if (sp->qtable[2]!=0)
    956 			_TIFFfree(sp->qtable[2]);
    957 		if (sp->qtable[3]!=0)
    958 			_TIFFfree(sp->qtable[3]);
    959 		if (sp->dctable[0]!=0)
    960 			_TIFFfree(sp->dctable[0]);
    961 		if (sp->dctable[1]!=0)
    962 			_TIFFfree(sp->dctable[1]);
    963 		if (sp->dctable[2]!=0)
    964 			_TIFFfree(sp->dctable[2]);
    965 		if (sp->dctable[3]!=0)
    966 			_TIFFfree(sp->dctable[3]);
    967 		if (sp->actable[0]!=0)
    968 			_TIFFfree(sp->actable[0]);
    969 		if (sp->actable[1]!=0)
    970 			_TIFFfree(sp->actable[1]);
    971 		if (sp->actable[2]!=0)
    972 			_TIFFfree(sp->actable[2]);
    973 		if (sp->actable[3]!=0)
    974 			_TIFFfree(sp->actable[3]);
    975 		if (sp->libjpeg_session_active!=0)
    976 			OJPEGLibjpegSessionAbort(tif);
    977 		if (sp->subsampling_convert_ycbcrbuf!=0)
    978 			_TIFFfree(sp->subsampling_convert_ycbcrbuf);
    979 		if (sp->subsampling_convert_ycbcrimage!=0)
    980 			_TIFFfree(sp->subsampling_convert_ycbcrimage);
    981 		if (sp->skip_buffer!=0)
    982 			_TIFFfree(sp->skip_buffer);
    983 		_TIFFfree(sp);
    984 		tif->tif_data=NULL;
    985 		_TIFFSetDefaultCompressionState(tif);
    986 	}
    987 }
    988 
    989 static void
    990 OJPEGSubsamplingCorrect(TIFF* tif)
    991 {
    992 	static const char module[]="OJPEGSubsamplingCorrect";
    993 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
    994 	uint8 mh;
    995 	uint8 mv;
    996         _TIFFFillStriles( tif );
    997 
    998 	assert(sp->subsamplingcorrect_done==0);
    999 	if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) &&
   1000 	    (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB)))
   1001 	{
   1002 		if (sp->subsampling_tag!=0)
   1003 			TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel");
   1004 		sp->subsampling_hor=1;
   1005 		sp->subsampling_ver=1;
   1006 		sp->subsampling_force_desubsampling_inside_decompression=0;
   1007 	}
   1008 	else
   1009 	{
   1010 		sp->subsamplingcorrect_done=1;
   1011 		mh=sp->subsampling_hor;
   1012 		mv=sp->subsampling_ver;
   1013 		sp->subsamplingcorrect=1;
   1014 		OJPEGReadHeaderInfoSec(tif);
   1015 		if (sp->subsampling_force_desubsampling_inside_decompression!=0)
   1016 		{
   1017 			sp->subsampling_hor=1;
   1018 			sp->subsampling_ver=1;
   1019 		}
   1020 		sp->subsamplingcorrect=0;
   1021 		if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0))
   1022 		{
   1023 			if (sp->subsampling_tag==0)
   1024 				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver);
   1025 			else
   1026 				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver,mh,mv);
   1027 		}
   1028 		if (sp->subsampling_force_desubsampling_inside_decompression!=0)
   1029 		{
   1030 			if (sp->subsampling_tag==0)
   1031 				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression");
   1032 			else
   1033 				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv);
   1034 		}
   1035 		if (sp->subsampling_force_desubsampling_inside_decompression==0)
   1036 		{
   1037 			if (sp->subsampling_hor<sp->subsampling_ver)
   1038 				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver);
   1039 		}
   1040 	}
   1041 	sp->subsamplingcorrect_done=1;
   1042 }
   1043 
   1044 static int
   1045 OJPEGReadHeaderInfo(TIFF* tif)
   1046 {
   1047 	static const char module[]="OJPEGReadHeaderInfo";
   1048 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1049 	assert(sp->readheader_done==0);
   1050 	sp->image_width=tif->tif_dir.td_imagewidth;
   1051 	sp->image_length=tif->tif_dir.td_imagelength;
   1052 	if isTiled(tif)
   1053 	{
   1054 		sp->strile_width=tif->tif_dir.td_tilewidth;
   1055 		sp->strile_length=tif->tif_dir.td_tilelength;
   1056 		sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length;
   1057 	}
   1058 	else
   1059 	{
   1060 		sp->strile_width=sp->image_width;
   1061 		sp->strile_length=tif->tif_dir.td_rowsperstrip;
   1062 		sp->strile_length_total=sp->image_length;
   1063 	}
   1064 	if (tif->tif_dir.td_samplesperpixel==1)
   1065 	{
   1066 		sp->samples_per_pixel=1;
   1067 		sp->plane_sample_offset=0;
   1068 		sp->samples_per_pixel_per_plane=sp->samples_per_pixel;
   1069 		sp->subsampling_hor=1;
   1070 		sp->subsampling_ver=1;
   1071 	}
   1072 	else
   1073 	{
   1074 		if (tif->tif_dir.td_samplesperpixel!=3)
   1075 		{
   1076 			TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel);
   1077 			return(0);
   1078 		}
   1079 		sp->samples_per_pixel=3;
   1080 		sp->plane_sample_offset=0;
   1081 		if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)
   1082 			sp->samples_per_pixel_per_plane=3;
   1083 		else
   1084 			sp->samples_per_pixel_per_plane=1;
   1085 	}
   1086 	if (sp->strile_length<sp->image_length)
   1087 	{
   1088 		if (sp->strile_length%(sp->subsampling_ver*8)!=0)
   1089 		{
   1090 			TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length");
   1091 			return(0);
   1092 		}
   1093 		sp->restart_interval=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8));
   1094 	}
   1095 	if (OJPEGReadHeaderInfoSec(tif)==0)
   1096 		return(0);
   1097 	sp->sos_end[0].log=1;
   1098 	sp->sos_end[0].in_buffer_source=sp->in_buffer_source;
   1099 	sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile;
   1100 	sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
   1101 	sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
   1102 	sp->readheader_done=1;
   1103 	return(1);
   1104 }
   1105 
   1106 static int
   1107 OJPEGReadSecondarySos(TIFF* tif, uint16 s)
   1108 {
   1109 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1110 	uint8 m;
   1111 	assert(s>0);
   1112 	assert(s<3);
   1113 	assert(sp->sos_end[0].log!=0);
   1114 	assert(sp->sos_end[s].log==0);
   1115 	sp->plane_sample_offset=s-1;
   1116 	while(sp->sos_end[sp->plane_sample_offset].log==0)
   1117 		sp->plane_sample_offset--;
   1118 	sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source;
   1119 	sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile;
   1120 	sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos;
   1121 	sp->in_buffer_file_pos_log=0;
   1122 	sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo;
   1123 	sp->in_buffer_togo=0;
   1124 	sp->in_buffer_cur=0;
   1125 	while(sp->plane_sample_offset<s)
   1126 	{
   1127 		do
   1128 		{
   1129 			if (OJPEGReadByte(sp,&m)==0)
   1130 				return(0);
   1131 			if (m==255)
   1132 			{
   1133 				do
   1134 				{
   1135 					if (OJPEGReadByte(sp,&m)==0)
   1136 						return(0);
   1137 					if (m!=255)
   1138 						break;
   1139 				} while(1);
   1140 				if (m==JPEG_MARKER_SOS)
   1141 					break;
   1142 			}
   1143 		} while(1);
   1144 		sp->plane_sample_offset++;
   1145 		if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
   1146 			return(0);
   1147 		sp->sos_end[sp->plane_sample_offset].log=1;
   1148 		sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source;
   1149 		sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile;
   1150 		sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
   1151 		sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
   1152 	}
   1153 	return(1);
   1154 }
   1155 
   1156 static int
   1157 OJPEGWriteHeaderInfo(TIFF* tif)
   1158 {
   1159 	static const char module[]="OJPEGWriteHeaderInfo";
   1160 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1161 	uint8** m;
   1162 	uint32 n;
   1163 	/* if a previous attempt failed, don't try again */
   1164 	if (sp->libjpeg_session_active != 0)
   1165 		return 0;
   1166 	sp->out_state=ososSoi;
   1167 	sp->restart_index=0;
   1168 	jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr));
   1169 	sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
   1170 	sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
   1171 	sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr);
   1172 	sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif;
   1173 	if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
   1174 		return(0);
   1175 	sp->libjpeg_session_active=1;
   1176 	sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0;
   1177 	sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource;
   1178 	sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer;
   1179 	sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData;
   1180 	sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart;
   1181 	sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource;
   1182 	sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr);
   1183 	if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0)
   1184 		return(0);
   1185 	if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1))
   1186 	{
   1187 		sp->libjpeg_jpeg_decompress_struct.raw_data_out=1;
   1188 #if JPEG_LIB_VERSION >= 70
   1189 		sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE;
   1190 #endif
   1191 		sp->libjpeg_jpeg_query_style=0;
   1192 		if (sp->subsampling_convert_log==0)
   1193 		{
   1194 			assert(sp->subsampling_convert_ycbcrbuf==0);
   1195 			assert(sp->subsampling_convert_ycbcrimage==0);
   1196 			sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8);
   1197 			sp->subsampling_convert_ylines=sp->subsampling_ver*8;
   1198 			sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor;
   1199 			sp->subsampling_convert_clines=8;
   1200 			sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines;
   1201 			sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines;
   1202 			sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen;
   1203 			sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen);
   1204 			if (sp->subsampling_convert_ycbcrbuf==0)
   1205 			{
   1206 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1207 				return(0);
   1208 			}
   1209 			sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf;
   1210 			sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen;
   1211 			sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen;
   1212 			sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines;
   1213 			sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*));
   1214 			if (sp->subsampling_convert_ycbcrimage==0)
   1215 			{
   1216 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1217 				return(0);
   1218 			}
   1219 			m=sp->subsampling_convert_ycbcrimage;
   1220 			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3);
   1221 			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines);
   1222 			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines);
   1223 			for (n=0; n<sp->subsampling_convert_ylines; n++)
   1224 				*m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen;
   1225 			for (n=0; n<sp->subsampling_convert_clines; n++)
   1226 				*m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen;
   1227 			for (n=0; n<sp->subsampling_convert_clines; n++)
   1228 				*m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen;
   1229 			sp->subsampling_convert_clinelenout=((sp->strile_width+sp->subsampling_hor-1)/sp->subsampling_hor);
   1230 			sp->subsampling_convert_state=0;
   1231 			sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2);
   1232 			sp->lines_per_strile=((sp->strile_length+sp->subsampling_ver-1)/sp->subsampling_ver);
   1233 			sp->subsampling_convert_log=1;
   1234 		}
   1235 	}
   1236 	else
   1237 	{
   1238 		sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN;
   1239 		sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN;
   1240 		sp->libjpeg_jpeg_query_style=1;
   1241 		sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width;
   1242 		sp->lines_per_strile=sp->strile_length;
   1243 	}
   1244 	if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
   1245 		return(0);
   1246 	sp->writeheader_done=1;
   1247 	return(1);
   1248 }
   1249 
   1250 static void
   1251 OJPEGLibjpegSessionAbort(TIFF* tif)
   1252 {
   1253 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1254 	assert(sp->libjpeg_session_active!=0);
   1255 	jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct)));
   1256 	sp->libjpeg_session_active=0;
   1257 }
   1258 
   1259 static int
   1260 OJPEGReadHeaderInfoSec(TIFF* tif)
   1261 {
   1262 	static const char module[]="OJPEGReadHeaderInfoSec";
   1263 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1264 	uint8 m;
   1265 	uint16 n;
   1266 	uint8 o;
   1267 	if (sp->file_size==0)
   1268 		sp->file_size=TIFFGetFileSize(tif);
   1269 	if (sp->jpeg_interchange_format!=0)
   1270 	{
   1271 		if (sp->jpeg_interchange_format>=sp->file_size)
   1272 		{
   1273 			sp->jpeg_interchange_format=0;
   1274 			sp->jpeg_interchange_format_length=0;
   1275 		}
   1276 		else
   1277 		{
   1278 			if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size))
   1279 				sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format;
   1280 		}
   1281 	}
   1282 	sp->in_buffer_source=osibsNotSetYet;
   1283 	sp->in_buffer_next_strile=0;
   1284 	sp->in_buffer_strile_count=tif->tif_dir.td_nstrips;
   1285 	sp->in_buffer_file_togo=0;
   1286 	sp->in_buffer_togo=0;
   1287 	do
   1288 	{
   1289 		if (OJPEGReadBytePeek(sp,&m)==0)
   1290 			return(0);
   1291 		if (m!=255)
   1292 			break;
   1293 		OJPEGReadByteAdvance(sp);
   1294 		do
   1295 		{
   1296 			if (OJPEGReadByte(sp,&m)==0)
   1297 				return(0);
   1298 		} while(m==255);
   1299 		switch(m)
   1300 		{
   1301 			case JPEG_MARKER_SOI:
   1302 				/* this type of marker has no data, and should be skipped */
   1303 				break;
   1304 			case JPEG_MARKER_COM:
   1305 			case JPEG_MARKER_APP0:
   1306 			case JPEG_MARKER_APP0+1:
   1307 			case JPEG_MARKER_APP0+2:
   1308 			case JPEG_MARKER_APP0+3:
   1309 			case JPEG_MARKER_APP0+4:
   1310 			case JPEG_MARKER_APP0+5:
   1311 			case JPEG_MARKER_APP0+6:
   1312 			case JPEG_MARKER_APP0+7:
   1313 			case JPEG_MARKER_APP0+8:
   1314 			case JPEG_MARKER_APP0+9:
   1315 			case JPEG_MARKER_APP0+10:
   1316 			case JPEG_MARKER_APP0+11:
   1317 			case JPEG_MARKER_APP0+12:
   1318 			case JPEG_MARKER_APP0+13:
   1319 			case JPEG_MARKER_APP0+14:
   1320 			case JPEG_MARKER_APP0+15:
   1321 				/* this type of marker has data, but it has no use to us (and no place here) and should be skipped */
   1322 				if (OJPEGReadWord(sp,&n)==0)
   1323 					return(0);
   1324 				if (n<2)
   1325 				{
   1326 					if (sp->subsamplingcorrect==0)
   1327 						TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
   1328 					return(0);
   1329 				}
   1330 				if (n>2)
   1331 					OJPEGReadSkip(sp,n-2);
   1332 				break;
   1333 			case JPEG_MARKER_DRI:
   1334 				if (OJPEGReadHeaderInfoSecStreamDri(tif)==0)
   1335 					return(0);
   1336 				break;
   1337 			case JPEG_MARKER_DQT:
   1338 				if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0)
   1339 					return(0);
   1340 				break;
   1341 			case JPEG_MARKER_DHT:
   1342 				if (OJPEGReadHeaderInfoSecStreamDht(tif)==0)
   1343 					return(0);
   1344 				break;
   1345 			case JPEG_MARKER_SOF0:
   1346 			case JPEG_MARKER_SOF1:
   1347 			case JPEG_MARKER_SOF3:
   1348 				if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0)
   1349 					return(0);
   1350 				if (sp->subsamplingcorrect!=0)
   1351 					return(1);
   1352 				break;
   1353 			case JPEG_MARKER_SOS:
   1354 				if (sp->subsamplingcorrect!=0)
   1355 					return(1);
   1356 				assert(sp->plane_sample_offset==0);
   1357 				if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
   1358 					return(0);
   1359 				break;
   1360 			default:
   1361 				TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m);
   1362 				return(0);
   1363 		}
   1364 	} while(m!=JPEG_MARKER_SOS);
   1365 	if (sp->subsamplingcorrect)
   1366 		return(1);
   1367 	if (sp->sof_log==0)
   1368 	{
   1369 		if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0)
   1370 			return(0);
   1371 		sp->sof_marker_id=JPEG_MARKER_SOF0;
   1372 		for (o=0; o<sp->samples_per_pixel; o++)
   1373 			sp->sof_c[o]=o;
   1374 		sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver);
   1375 		for (o=1; o<sp->samples_per_pixel; o++)
   1376 			sp->sof_hv[o]=17;
   1377 		sp->sof_x=sp->strile_width;
   1378 		sp->sof_y=sp->strile_length_total;
   1379 		sp->sof_log=1;
   1380 		if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0)
   1381 			return(0);
   1382 		if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0)
   1383 			return(0);
   1384 		for (o=1; o<sp->samples_per_pixel; o++)
   1385 			sp->sos_cs[o]=o;
   1386 	}
   1387 	return(1);
   1388 }
   1389 
   1390 static int
   1391 OJPEGReadHeaderInfoSecStreamDri(TIFF* tif)
   1392 {
   1393 	/* this could easilly cause trouble in some cases... but no such cases have occured sofar */
   1394 	static const char module[]="OJPEGReadHeaderInfoSecStreamDri";
   1395 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1396 	uint16 m;
   1397 	if (OJPEGReadWord(sp,&m)==0)
   1398 		return(0);
   1399 	if (m!=4)
   1400 	{
   1401 		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data");
   1402 		return(0);
   1403 	}
   1404 	if (OJPEGReadWord(sp,&m)==0)
   1405 		return(0);
   1406 	sp->restart_interval=m;
   1407 	return(1);
   1408 }
   1409 
   1410 static int
   1411 OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif)
   1412 {
   1413 	/* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
   1414 	static const char module[]="OJPEGReadHeaderInfoSecStreamDqt";
   1415 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1416 	uint16 m;
   1417 	uint32 na;
   1418 	uint8* nb;
   1419 	uint8 o;
   1420 	if (OJPEGReadWord(sp,&m)==0)
   1421 		return(0);
   1422 	if (m<=2)
   1423 	{
   1424 		if (sp->subsamplingcorrect==0)
   1425 			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
   1426 		return(0);
   1427 	}
   1428 	if (sp->subsamplingcorrect!=0)
   1429 		OJPEGReadSkip(sp,m-2);
   1430 	else
   1431 	{
   1432 		m-=2;
   1433 		do
   1434 		{
   1435 			if (m<65)
   1436 			{
   1437 				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
   1438 				return(0);
   1439 			}
   1440 			na=sizeof(uint32)+69;
   1441 			nb=_TIFFmalloc(na);
   1442 			if (nb==0)
   1443 			{
   1444 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1445 				return(0);
   1446 			}
   1447 			*(uint32*)nb=na;
   1448 			nb[sizeof(uint32)]=255;
   1449 			nb[sizeof(uint32)+1]=JPEG_MARKER_DQT;
   1450 			nb[sizeof(uint32)+2]=0;
   1451 			nb[sizeof(uint32)+3]=67;
   1452 			if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) {
   1453 				_TIFFfree(nb);
   1454 				return(0);
   1455 			}
   1456 			o=nb[sizeof(uint32)+4]&15;
   1457 			if (3<o)
   1458 			{
   1459 				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
   1460 				_TIFFfree(nb);
   1461 				return(0);
   1462 			}
   1463 			if (sp->qtable[o]!=0)
   1464 				_TIFFfree(sp->qtable[o]);
   1465 			sp->qtable[o]=nb;
   1466 			m-=65;
   1467 		} while(m>0);
   1468 	}
   1469 	return(1);
   1470 }
   1471 
   1472 static int
   1473 OJPEGReadHeaderInfoSecStreamDht(TIFF* tif)
   1474 {
   1475 	/* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
   1476 	/* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */
   1477 	static const char module[]="OJPEGReadHeaderInfoSecStreamDht";
   1478 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1479 	uint16 m;
   1480 	uint32 na;
   1481 	uint8* nb;
   1482 	uint8 o;
   1483 	if (OJPEGReadWord(sp,&m)==0)
   1484 		return(0);
   1485 	if (m<=2)
   1486 	{
   1487 		if (sp->subsamplingcorrect==0)
   1488 			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
   1489 		return(0);
   1490 	}
   1491 	if (sp->subsamplingcorrect!=0)
   1492 	{
   1493 		OJPEGReadSkip(sp,m-2);
   1494 	}
   1495 	else
   1496 	{
   1497 		na=sizeof(uint32)+2+m;
   1498 		nb=_TIFFmalloc(na);
   1499 		if (nb==0)
   1500 		{
   1501 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1502 			return(0);
   1503 		}
   1504 		*(uint32*)nb=na;
   1505 		nb[sizeof(uint32)]=255;
   1506 		nb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
   1507 		nb[sizeof(uint32)+2]=(m>>8);
   1508 		nb[sizeof(uint32)+3]=(m&255);
   1509 		if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) {
   1510                         _TIFFfree(nb);
   1511 			return(0);
   1512                 }
   1513 		o=nb[sizeof(uint32)+4];
   1514 		if ((o&240)==0)
   1515 		{
   1516 			if (3<o)
   1517 			{
   1518 				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
   1519                                 _TIFFfree(nb);
   1520 				return(0);
   1521 			}
   1522 			if (sp->dctable[o]!=0)
   1523 				_TIFFfree(sp->dctable[o]);
   1524 			sp->dctable[o]=nb;
   1525 		}
   1526 		else
   1527 		{
   1528 			if ((o&240)!=16)
   1529 			{
   1530 				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
   1531                                 _TIFFfree(nb);
   1532 				return(0);
   1533 			}
   1534 			o&=15;
   1535 			if (3<o)
   1536 			{
   1537 				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
   1538                                 _TIFFfree(nb);
   1539 				return(0);
   1540 			}
   1541 			if (sp->actable[o]!=0)
   1542 				_TIFFfree(sp->actable[o]);
   1543 			sp->actable[o]=nb;
   1544 		}
   1545 	}
   1546 	return(1);
   1547 }
   1548 
   1549 static int
   1550 OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id)
   1551 {
   1552 	/* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
   1553 	static const char module[]="OJPEGReadHeaderInfoSecStreamSof";
   1554 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1555 	uint16 m;
   1556 	uint16 n;
   1557 	uint8 o;
   1558 	uint16 p;
   1559 	uint16 q;
   1560 	if (sp->sof_log!=0)
   1561 	{
   1562 		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
   1563 		return(0);
   1564 	}
   1565 	if (sp->subsamplingcorrect==0)
   1566 		sp->sof_marker_id=marker_id;
   1567 	/* Lf: data length */
   1568 	if (OJPEGReadWord(sp,&m)==0)
   1569 		return(0);
   1570 	if (m<11)
   1571 	{
   1572 		if (sp->subsamplingcorrect==0)
   1573 			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
   1574 		return(0);
   1575 	}
   1576 	m-=8;
   1577 	if (m%3!=0)
   1578 	{
   1579 		if (sp->subsamplingcorrect==0)
   1580 			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
   1581 		return(0);
   1582 	}
   1583 	n=m/3;
   1584 	if (sp->subsamplingcorrect==0)
   1585 	{
   1586 		if (n!=sp->samples_per_pixel)
   1587 		{
   1588 			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples");
   1589 			return(0);
   1590 		}
   1591 	}
   1592 	/* P: Sample precision */
   1593 	if (OJPEGReadByte(sp,&o)==0)
   1594 		return(0);
   1595 	if (o!=8)
   1596 	{
   1597 		if (sp->subsamplingcorrect==0)
   1598 			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample");
   1599 		return(0);
   1600 	}
   1601 	/* Y: Number of lines, X: Number of samples per line */
   1602 	if (sp->subsamplingcorrect)
   1603 		OJPEGReadSkip(sp,4);
   1604 	else
   1605 	{
   1606 		/* Y: Number of lines */
   1607 		if (OJPEGReadWord(sp,&p)==0)
   1608 			return(0);
   1609 		if (((uint32)p<sp->image_length) && ((uint32)p<sp->strile_length_total))
   1610 		{
   1611 			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height");
   1612 			return(0);
   1613 		}
   1614 		sp->sof_y=p;
   1615 		/* X: Number of samples per line */
   1616 		if (OJPEGReadWord(sp,&p)==0)
   1617 			return(0);
   1618 		if (((uint32)p<sp->image_width) && ((uint32)p<sp->strile_width))
   1619 		{
   1620 			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width");
   1621 			return(0);
   1622 		}
   1623 		if ((uint32)p>sp->strile_width)
   1624 		{
   1625 			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data image width exceeds expected image width");
   1626 			return(0);
   1627 		}
   1628 		sp->sof_x=p;
   1629 	}
   1630 	/* Nf: Number of image components in frame */
   1631 	if (OJPEGReadByte(sp,&o)==0)
   1632 		return(0);
   1633 	if (o!=n)
   1634 	{
   1635 		if (sp->subsamplingcorrect==0)
   1636 			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
   1637 		return(0);
   1638 	}
   1639 	/* per component stuff */
   1640 	/* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */
   1641 	for (q=0; q<n; q++)
   1642 	{
   1643 		/* C: Component identifier */
   1644 		if (OJPEGReadByte(sp,&o)==0)
   1645 			return(0);
   1646 		if (sp->subsamplingcorrect==0)
   1647 			sp->sof_c[q]=o;
   1648 		/* H: Horizontal sampling factor, and V: Vertical sampling factor */
   1649 		if (OJPEGReadByte(sp,&o)==0)
   1650 			return(0);
   1651 		if (sp->subsamplingcorrect!=0)
   1652 		{
   1653 			if (q==0)
   1654 			{
   1655 				sp->subsampling_hor=(o>>4);
   1656 				sp->subsampling_ver=(o&15);
   1657 				if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) ||
   1658 					((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4)))
   1659 					sp->subsampling_force_desubsampling_inside_decompression=1;
   1660 			}
   1661 			else
   1662 			{
   1663 				if (o!=17)
   1664 					sp->subsampling_force_desubsampling_inside_decompression=1;
   1665 			}
   1666 		}
   1667 		else
   1668 		{
   1669 			sp->sof_hv[q]=o;
   1670 			if (sp->subsampling_force_desubsampling_inside_decompression==0)
   1671 			{
   1672 				if (q==0)
   1673 				{
   1674 					if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver))
   1675 					{
   1676 						TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
   1677 						return(0);
   1678 					}
   1679 				}
   1680 				else
   1681 				{
   1682 					if (o!=17)
   1683 					{
   1684 						TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
   1685 						return(0);
   1686 					}
   1687 				}
   1688 			}
   1689 		}
   1690 		/* Tq: Quantization table destination selector */
   1691 		if (OJPEGReadByte(sp,&o)==0)
   1692 			return(0);
   1693 		if (sp->subsamplingcorrect==0)
   1694 			sp->sof_tq[q]=o;
   1695 	}
   1696 	if (sp->subsamplingcorrect==0)
   1697 		sp->sof_log=1;
   1698 	return(1);
   1699 }
   1700 
   1701 static int
   1702 OJPEGReadHeaderInfoSecStreamSos(TIFF* tif)
   1703 {
   1704 	/* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
   1705 	static const char module[]="OJPEGReadHeaderInfoSecStreamSos";
   1706 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1707 	uint16 m;
   1708 	uint8 n;
   1709 	uint8 o;
   1710 	assert(sp->subsamplingcorrect==0);
   1711 	if (sp->sof_log==0)
   1712 	{
   1713 		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
   1714 		return(0);
   1715 	}
   1716 	/* Ls */
   1717 	if (OJPEGReadWord(sp,&m)==0)
   1718 		return(0);
   1719 	if (m!=6+sp->samples_per_pixel_per_plane*2)
   1720 	{
   1721 		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
   1722 		return(0);
   1723 	}
   1724 	/* Ns */
   1725 	if (OJPEGReadByte(sp,&n)==0)
   1726 		return(0);
   1727 	if (n!=sp->samples_per_pixel_per_plane)
   1728 	{
   1729 		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
   1730 		return(0);
   1731 	}
   1732 	/* Cs, Td, and Ta */
   1733 	for (o=0; o<sp->samples_per_pixel_per_plane; o++)
   1734 	{
   1735 		/* Cs */
   1736 		if (OJPEGReadByte(sp,&n)==0)
   1737 			return(0);
   1738 		sp->sos_cs[sp->plane_sample_offset+o]=n;
   1739 		/* Td and Ta */
   1740 		if (OJPEGReadByte(sp,&n)==0)
   1741 			return(0);
   1742 		sp->sos_tda[sp->plane_sample_offset+o]=n;
   1743 	}
   1744 	/* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */
   1745 	OJPEGReadSkip(sp,3);
   1746 	return(1);
   1747 }
   1748 
   1749 static int
   1750 OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif)
   1751 {
   1752 	static const char module[]="OJPEGReadHeaderInfoSecTablesQTable";
   1753 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1754 	uint8 m;
   1755 	uint8 n;
   1756 	uint32 oa;
   1757 	uint8* ob;
   1758 	uint32 p;
   1759 	if (sp->qtable_offset[0]==0)
   1760 	{
   1761 		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
   1762 		return(0);
   1763 	}
   1764 	sp->in_buffer_file_pos_log=0;
   1765 	for (m=0; m<sp->samples_per_pixel; m++)
   1766 	{
   1767 		if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1])))
   1768 		{
   1769 			for (n=0; n<m-1; n++)
   1770 			{
   1771 				if (sp->qtable_offset[m]==sp->qtable_offset[n])
   1772 				{
   1773 					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value");
   1774 					return(0);
   1775 				}
   1776 			}
   1777 			oa=sizeof(uint32)+69;
   1778 			ob=_TIFFmalloc(oa);
   1779 			if (ob==0)
   1780 			{
   1781 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1782 				return(0);
   1783 			}
   1784 			*(uint32*)ob=oa;
   1785 			ob[sizeof(uint32)]=255;
   1786 			ob[sizeof(uint32)+1]=JPEG_MARKER_DQT;
   1787 			ob[sizeof(uint32)+2]=0;
   1788 			ob[sizeof(uint32)+3]=67;
   1789 			ob[sizeof(uint32)+4]=m;
   1790 			TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET);
   1791 			p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64);
   1792 			if (p!=64)
   1793 			{
   1794 				_TIFFfree(ob);
   1795 				return(0);
   1796 			}
   1797 			if (sp->qtable[m]!=0)
   1798 				_TIFFfree(sp->qtable[m]);
   1799 			sp->qtable[m]=ob;
   1800 			sp->sof_tq[m]=m;
   1801 		}
   1802 		else
   1803 			sp->sof_tq[m]=sp->sof_tq[m-1];
   1804 	}
   1805 	return(1);
   1806 }
   1807 
   1808 static int
   1809 OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif)
   1810 {
   1811 	static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable";
   1812 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1813 	uint8 m;
   1814 	uint8 n;
   1815 	uint8 o[16];
   1816 	uint32 p;
   1817 	uint32 q;
   1818 	uint32 ra;
   1819 	uint8* rb;
   1820 	if (sp->dctable_offset[0]==0)
   1821 	{
   1822 		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
   1823 		return(0);
   1824 	}
   1825 	sp->in_buffer_file_pos_log=0;
   1826 	for (m=0; m<sp->samples_per_pixel; m++)
   1827 	{
   1828 		if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1])))
   1829 		{
   1830 			for (n=0; n<m-1; n++)
   1831 			{
   1832 				if (sp->dctable_offset[m]==sp->dctable_offset[n])
   1833 				{
   1834 					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value");
   1835 					return(0);
   1836 				}
   1837 			}
   1838 			TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET);
   1839 			p=TIFFReadFile(tif,o,16);
   1840 			if (p!=16)
   1841 				return(0);
   1842 			q=0;
   1843 			for (n=0; n<16; n++)
   1844 				q+=o[n];
   1845 			ra=sizeof(uint32)+21+q;
   1846 			rb=_TIFFmalloc(ra);
   1847 			if (rb==0)
   1848 			{
   1849 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1850 				return(0);
   1851 			}
   1852 			*(uint32*)rb=ra;
   1853 			rb[sizeof(uint32)]=255;
   1854 			rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
   1855 			rb[sizeof(uint32)+2]=((19+q)>>8);
   1856 			rb[sizeof(uint32)+3]=((19+q)&255);
   1857 			rb[sizeof(uint32)+4]=m;
   1858 			for (n=0; n<16; n++)
   1859 				rb[sizeof(uint32)+5+n]=o[n];
   1860 			p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
   1861 			if (p!=q)
   1862 			{
   1863 				_TIFFfree(rb);
   1864 				return(0);
   1865 			}
   1866 			if (sp->dctable[m]!=0)
   1867 				_TIFFfree(sp->dctable[m]);
   1868 			sp->dctable[m]=rb;
   1869 			sp->sos_tda[m]=(m<<4);
   1870 		}
   1871 		else
   1872 			sp->sos_tda[m]=sp->sos_tda[m-1];
   1873 	}
   1874 	return(1);
   1875 }
   1876 
   1877 static int
   1878 OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif)
   1879 {
   1880 	static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable";
   1881 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   1882 	uint8 m;
   1883 	uint8 n;
   1884 	uint8 o[16];
   1885 	uint32 p;
   1886 	uint32 q;
   1887 	uint32 ra;
   1888 	uint8* rb;
   1889 	if (sp->actable_offset[0]==0)
   1890 	{
   1891 		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
   1892 		return(0);
   1893 	}
   1894 	sp->in_buffer_file_pos_log=0;
   1895 	for (m=0; m<sp->samples_per_pixel; m++)
   1896 	{
   1897 		if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1])))
   1898 		{
   1899 			for (n=0; n<m-1; n++)
   1900 			{
   1901 				if (sp->actable_offset[m]==sp->actable_offset[n])
   1902 				{
   1903 					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value");
   1904 					return(0);
   1905 				}
   1906 			}
   1907 			TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET);
   1908 			p=TIFFReadFile(tif,o,16);
   1909 			if (p!=16)
   1910 				return(0);
   1911 			q=0;
   1912 			for (n=0; n<16; n++)
   1913 				q+=o[n];
   1914 			ra=sizeof(uint32)+21+q;
   1915 			rb=_TIFFmalloc(ra);
   1916 			if (rb==0)
   1917 			{
   1918 				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
   1919 				return(0);
   1920 			}
   1921 			*(uint32*)rb=ra;
   1922 			rb[sizeof(uint32)]=255;
   1923 			rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
   1924 			rb[sizeof(uint32)+2]=((19+q)>>8);
   1925 			rb[sizeof(uint32)+3]=((19+q)&255);
   1926 			rb[sizeof(uint32)+4]=(16|m);
   1927 			for (n=0; n<16; n++)
   1928 				rb[sizeof(uint32)+5+n]=o[n];
   1929 			p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
   1930 			if (p!=q)
   1931 			{
   1932 				_TIFFfree(rb);
   1933 				return(0);
   1934 			}
   1935 			if (sp->actable[m])
   1936 				_TIFFfree(sp->actable[m]);
   1937 			sp->actable[m]=rb;
   1938 			sp->sos_tda[m]=(sp->sos_tda[m]|m);
   1939 		}
   1940 		else
   1941 			sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15));
   1942 	}
   1943 	return(1);
   1944 }
   1945 
   1946 static int
   1947 OJPEGReadBufferFill(OJPEGState* sp)
   1948 {
   1949 	uint16 m;
   1950 	tmsize_t n;
   1951 	/* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made
   1952 	 * in any other case, seek or read errors should be passed through */
   1953 	do
   1954 	{
   1955 		if (sp->in_buffer_file_togo!=0)
   1956 		{
   1957 			if (sp->in_buffer_file_pos_log==0)
   1958 			{
   1959 				TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET);
   1960 				sp->in_buffer_file_pos_log=1;
   1961 			}
   1962 			m=OJPEG_BUFFER;
   1963 			if ((uint64)m>sp->in_buffer_file_togo)
   1964 				m=(uint16)sp->in_buffer_file_togo;
   1965 			n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m);
   1966 			if (n==0)
   1967 				return(0);
   1968 			assert(n>0);
   1969 			assert(n<=OJPEG_BUFFER);
   1970 			assert(n<65536);
   1971 			assert((uint64)n<=sp->in_buffer_file_togo);
   1972 			m=(uint16)n;
   1973 			sp->in_buffer_togo=m;
   1974 			sp->in_buffer_cur=sp->in_buffer;
   1975 			sp->in_buffer_file_togo-=m;
   1976 			sp->in_buffer_file_pos+=m;
   1977 			break;
   1978 		}
   1979 		sp->in_buffer_file_pos_log=0;
   1980 		switch(sp->in_buffer_source)
   1981 		{
   1982 			case osibsNotSetYet:
   1983 				if (sp->jpeg_interchange_format!=0)
   1984 				{
   1985 					sp->in_buffer_file_pos=sp->jpeg_interchange_format;
   1986 					sp->in_buffer_file_togo=sp->jpeg_interchange_format_length;
   1987 				}
   1988 				sp->in_buffer_source=osibsJpegInterchangeFormat;
   1989 				break;
   1990 			case osibsJpegInterchangeFormat:
   1991 				sp->in_buffer_source=osibsStrile;
   1992                                 break;
   1993 			case osibsStrile:
   1994 				if (!_TIFFFillStriles( sp->tif )
   1995 				    || sp->tif->tif_dir.td_stripoffset == NULL
   1996 				    || sp->tif->tif_dir.td_stripbytecount == NULL)
   1997 					return 0;
   1998 
   1999 				if (sp->in_buffer_next_strile==sp->in_buffer_strile_count)
   2000 					sp->in_buffer_source=osibsEof;
   2001 				else
   2002 				{
   2003 					sp->in_buffer_file_pos=sp->tif->tif_dir.td_stripoffset[sp->in_buffer_next_strile];
   2004 					if (sp->in_buffer_file_pos!=0)
   2005 					{
   2006 						if (sp->in_buffer_file_pos>=sp->file_size)
   2007 							sp->in_buffer_file_pos=0;
   2008 						else if (sp->tif->tif_dir.td_stripbytecount==NULL)
   2009 							sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
   2010 						else
   2011 						{
   2012 							if (sp->tif->tif_dir.td_stripbytecount == 0) {
   2013 								TIFFErrorExt(sp->tif->tif_clientdata,sp->tif->tif_name,"Strip byte counts are missing");
   2014 								return(0);
   2015 							}
   2016 							sp->in_buffer_file_togo=sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile];
   2017 							if (sp->in_buffer_file_togo==0)
   2018 								sp->in_buffer_file_pos=0;
   2019 							else if (sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size)
   2020 								sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
   2021 						}
   2022 					}
   2023 					sp->in_buffer_next_strile++;
   2024 				}
   2025 				break;
   2026 			default:
   2027 				return(0);
   2028 		}
   2029 	} while (1);
   2030 	return(1);
   2031 }
   2032 
   2033 static int
   2034 OJPEGReadByte(OJPEGState* sp, uint8* byte)
   2035 {
   2036 	if (sp->in_buffer_togo==0)
   2037 	{
   2038 		if (OJPEGReadBufferFill(sp)==0)
   2039 			return(0);
   2040 		assert(sp->in_buffer_togo>0);
   2041 	}
   2042 	*byte=*(sp->in_buffer_cur);
   2043 	sp->in_buffer_cur++;
   2044 	sp->in_buffer_togo--;
   2045 	return(1);
   2046 }
   2047 
   2048 static int
   2049 OJPEGReadBytePeek(OJPEGState* sp, uint8* byte)
   2050 {
   2051 	if (sp->in_buffer_togo==0)
   2052 	{
   2053 		if (OJPEGReadBufferFill(sp)==0)
   2054 			return(0);
   2055 		assert(sp->in_buffer_togo>0);
   2056 	}
   2057 	*byte=*(sp->in_buffer_cur);
   2058 	return(1);
   2059 }
   2060 
   2061 static void
   2062 OJPEGReadByteAdvance(OJPEGState* sp)
   2063 {
   2064 	assert(sp->in_buffer_togo>0);
   2065 	sp->in_buffer_cur++;
   2066 	sp->in_buffer_togo--;
   2067 }
   2068 
   2069 static int
   2070 OJPEGReadWord(OJPEGState* sp, uint16* word)
   2071 {
   2072 	uint8 m;
   2073 	if (OJPEGReadByte(sp,&m)==0)
   2074 		return(0);
   2075 	*word=(m<<8);
   2076 	if (OJPEGReadByte(sp,&m)==0)
   2077 		return(0);
   2078 	*word|=m;
   2079 	return(1);
   2080 }
   2081 
   2082 static int
   2083 OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem)
   2084 {
   2085 	uint16 mlen;
   2086 	uint8* mmem;
   2087 	uint16 n;
   2088 	assert(len>0);
   2089 	mlen=len;
   2090 	mmem=mem;
   2091 	do
   2092 	{
   2093 		if (sp->in_buffer_togo==0)
   2094 		{
   2095 			if (OJPEGReadBufferFill(sp)==0)
   2096 				return(0);
   2097 			assert(sp->in_buffer_togo>0);
   2098 		}
   2099 		n=mlen;
   2100 		if (n>sp->in_buffer_togo)
   2101 			n=sp->in_buffer_togo;
   2102 		_TIFFmemcpy(mmem,sp->in_buffer_cur,n);
   2103 		sp->in_buffer_cur+=n;
   2104 		sp->in_buffer_togo-=n;
   2105 		mlen-=n;
   2106 		mmem+=n;
   2107 	} while(mlen>0);
   2108 	return(1);
   2109 }
   2110 
   2111 static void
   2112 OJPEGReadSkip(OJPEGState* sp, uint16 len)
   2113 {
   2114 	uint16 m;
   2115 	uint16 n;
   2116 	m=len;
   2117 	n=m;
   2118 	if (n>sp->in_buffer_togo)
   2119 		n=sp->in_buffer_togo;
   2120 	sp->in_buffer_cur+=n;
   2121 	sp->in_buffer_togo-=n;
   2122 	m-=n;
   2123 	if (m>0)
   2124 	{
   2125 		assert(sp->in_buffer_togo==0);
   2126 		n=m;
   2127 		if ((uint64)n>sp->in_buffer_file_togo)
   2128 			n=(uint16)sp->in_buffer_file_togo;
   2129 		sp->in_buffer_file_pos+=n;
   2130 		sp->in_buffer_file_togo-=n;
   2131 		sp->in_buffer_file_pos_log=0;
   2132 		/* we don't skip past jpeginterchangeformat/strile block...
   2133 		 * if that is asked from us, we're dealing with totally bazurk
   2134 		 * data anyway, and we've not seen this happening on any
   2135 		 * testfile, so we might as well likely cause some other
   2136 		 * meaningless error to be passed at some later time
   2137 		 */
   2138 	}
   2139 }
   2140 
   2141 static int
   2142 OJPEGWriteStream(TIFF* tif, void** mem, uint32* len)
   2143 {
   2144 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2145 	*len=0;
   2146 	do
   2147 	{
   2148 		assert(sp->out_state<=ososEoi);
   2149 		switch(sp->out_state)
   2150 		{
   2151 			case ososSoi:
   2152 				OJPEGWriteStreamSoi(tif,mem,len);
   2153 				break;
   2154 			case ososQTable0:
   2155 				OJPEGWriteStreamQTable(tif,0,mem,len);
   2156 				break;
   2157 			case ososQTable1:
   2158 				OJPEGWriteStreamQTable(tif,1,mem,len);
   2159 				break;
   2160 			case ososQTable2:
   2161 				OJPEGWriteStreamQTable(tif,2,mem,len);
   2162 				break;
   2163 			case ososQTable3:
   2164 				OJPEGWriteStreamQTable(tif,3,mem,len);
   2165 				break;
   2166 			case ososDcTable0:
   2167 				OJPEGWriteStreamDcTable(tif,0,mem,len);
   2168 				break;
   2169 			case ososDcTable1:
   2170 				OJPEGWriteStreamDcTable(tif,1,mem,len);
   2171 				break;
   2172 			case ososDcTable2:
   2173 				OJPEGWriteStreamDcTable(tif,2,mem,len);
   2174 				break;
   2175 			case ososDcTable3:
   2176 				OJPEGWriteStreamDcTable(tif,3,mem,len);
   2177 				break;
   2178 			case ososAcTable0:
   2179 				OJPEGWriteStreamAcTable(tif,0,mem,len);
   2180 				break;
   2181 			case ososAcTable1:
   2182 				OJPEGWriteStreamAcTable(tif,1,mem,len);
   2183 				break;
   2184 			case ososAcTable2:
   2185 				OJPEGWriteStreamAcTable(tif,2,mem,len);
   2186 				break;
   2187 			case ososAcTable3:
   2188 				OJPEGWriteStreamAcTable(tif,3,mem,len);
   2189 				break;
   2190 			case ososDri:
   2191 				OJPEGWriteStreamDri(tif,mem,len);
   2192 				break;
   2193 			case ososSof:
   2194 				OJPEGWriteStreamSof(tif,mem,len);
   2195 				break;
   2196 			case ososSos:
   2197 				OJPEGWriteStreamSos(tif,mem,len);
   2198 				break;
   2199 			case ososCompressed:
   2200 				if (OJPEGWriteStreamCompressed(tif,mem,len)==0)
   2201 					return(0);
   2202 				break;
   2203 			case ososRst:
   2204 				OJPEGWriteStreamRst(tif,mem,len);
   2205 				break;
   2206 			case ososEoi:
   2207 				OJPEGWriteStreamEoi(tif,mem,len);
   2208 				break;
   2209 		}
   2210 	} while (*len==0);
   2211 	return(1);
   2212 }
   2213 
   2214 static void
   2215 OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len)
   2216 {
   2217 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2218 	assert(OJPEG_BUFFER>=2);
   2219 	sp->out_buffer[0]=255;
   2220 	sp->out_buffer[1]=JPEG_MARKER_SOI;
   2221 	*len=2;
   2222 	*mem=(void*)sp->out_buffer;
   2223 	sp->out_state++;
   2224 }
   2225 
   2226 static void
   2227 OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
   2228 {
   2229 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2230 	if (sp->qtable[table_index]!=0)
   2231 	{
   2232 		*mem=(void*)(sp->qtable[table_index]+sizeof(uint32));
   2233 		*len=*((uint32*)sp->qtable[table_index])-sizeof(uint32);
   2234 	}
   2235 	sp->out_state++;
   2236 }
   2237 
   2238 static void
   2239 OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
   2240 {
   2241 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2242 	if (sp->dctable[table_index]!=0)
   2243 	{
   2244 		*mem=(void*)(sp->dctable[table_index]+sizeof(uint32));
   2245 		*len=*((uint32*)sp->dctable[table_index])-sizeof(uint32);
   2246 	}
   2247 	sp->out_state++;
   2248 }
   2249 
   2250 static void
   2251 OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
   2252 {
   2253 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2254 	if (sp->actable[table_index]!=0)
   2255 	{
   2256 		*mem=(void*)(sp->actable[table_index]+sizeof(uint32));
   2257 		*len=*((uint32*)sp->actable[table_index])-sizeof(uint32);
   2258 	}
   2259 	sp->out_state++;
   2260 }
   2261 
   2262 static void
   2263 OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len)
   2264 {
   2265 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2266 	assert(OJPEG_BUFFER>=6);
   2267 	if (sp->restart_interval!=0)
   2268 	{
   2269 		sp->out_buffer[0]=255;
   2270 		sp->out_buffer[1]=JPEG_MARKER_DRI;
   2271 		sp->out_buffer[2]=0;
   2272 		sp->out_buffer[3]=4;
   2273 		sp->out_buffer[4]=(sp->restart_interval>>8);
   2274 		sp->out_buffer[5]=(sp->restart_interval&255);
   2275 		*len=6;
   2276 		*mem=(void*)sp->out_buffer;
   2277 	}
   2278 	sp->out_state++;
   2279 }
   2280 
   2281 static void
   2282 OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len)
   2283 {
   2284 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2285 	uint8 m;
   2286 	assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3);
   2287 	assert(255>=8+sp->samples_per_pixel_per_plane*3);
   2288 	sp->out_buffer[0]=255;
   2289 	sp->out_buffer[1]=sp->sof_marker_id;
   2290 	/* Lf */
   2291 	sp->out_buffer[2]=0;
   2292 	sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3;
   2293 	/* P */
   2294 	sp->out_buffer[4]=8;
   2295 	/* Y */
   2296 	sp->out_buffer[5]=(sp->sof_y>>8);
   2297 	sp->out_buffer[6]=(sp->sof_y&255);
   2298 	/* X */
   2299 	sp->out_buffer[7]=(sp->sof_x>>8);
   2300 	sp->out_buffer[8]=(sp->sof_x&255);
   2301 	/* Nf */
   2302 	sp->out_buffer[9]=sp->samples_per_pixel_per_plane;
   2303 	for (m=0; m<sp->samples_per_pixel_per_plane; m++)
   2304 	{
   2305 		/* C */
   2306 		sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m];
   2307 		/* H and V */
   2308 		sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m];
   2309 		/* Tq */
   2310 		sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m];
   2311 	}
   2312 	*len=10+sp->samples_per_pixel_per_plane*3;
   2313 	*mem=(void*)sp->out_buffer;
   2314 	sp->out_state++;
   2315 }
   2316 
   2317 static void
   2318 OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len)
   2319 {
   2320 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2321 	uint8 m;
   2322 	assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2);
   2323 	assert(255>=6+sp->samples_per_pixel_per_plane*2);
   2324 	sp->out_buffer[0]=255;
   2325 	sp->out_buffer[1]=JPEG_MARKER_SOS;
   2326 	/* Ls */
   2327 	sp->out_buffer[2]=0;
   2328 	sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2;
   2329 	/* Ns */
   2330 	sp->out_buffer[4]=sp->samples_per_pixel_per_plane;
   2331 	for (m=0; m<sp->samples_per_pixel_per_plane; m++)
   2332 	{
   2333 		/* Cs */
   2334 		sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m];
   2335 		/* Td and Ta */
   2336 		sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m];
   2337 	}
   2338 	/* Ss */
   2339 	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0;
   2340 	/* Se */
   2341 	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63;
   2342 	/* Ah and Al */
   2343 	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0;
   2344 	*len=8+sp->samples_per_pixel_per_plane*2;
   2345 	*mem=(void*)sp->out_buffer;
   2346 	sp->out_state++;
   2347 }
   2348 
   2349 static int
   2350 OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len)
   2351 {
   2352 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2353 	if (sp->in_buffer_togo==0)
   2354 	{
   2355 		if (OJPEGReadBufferFill(sp)==0)
   2356 			return(0);
   2357 		assert(sp->in_buffer_togo>0);
   2358 	}
   2359 	*len=sp->in_buffer_togo;
   2360 	*mem=(void*)sp->in_buffer_cur;
   2361 	sp->in_buffer_togo=0;
   2362 	if (sp->in_buffer_file_togo==0)
   2363 	{
   2364 		switch(sp->in_buffer_source)
   2365 		{
   2366 			case osibsStrile:
   2367 				if (sp->in_buffer_next_strile<sp->in_buffer_strile_count)
   2368 					sp->out_state=ososRst;
   2369 				else
   2370 					sp->out_state=ososEoi;
   2371 				break;
   2372 			case osibsEof:
   2373 				sp->out_state=ososEoi;
   2374 				break;
   2375 			default:
   2376 				break;
   2377 		}
   2378 	}
   2379 	return(1);
   2380 }
   2381 
   2382 static void
   2383 OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len)
   2384 {
   2385 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2386 	assert(OJPEG_BUFFER>=2);
   2387 	sp->out_buffer[0]=255;
   2388 	sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index;
   2389 	sp->restart_index++;
   2390 	if (sp->restart_index==8)
   2391 		sp->restart_index=0;
   2392 	*len=2;
   2393 	*mem=(void*)sp->out_buffer;
   2394 	sp->out_state=ososCompressed;
   2395 }
   2396 
   2397 static void
   2398 OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len)
   2399 {
   2400 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2401 	assert(OJPEG_BUFFER>=2);
   2402 	sp->out_buffer[0]=255;
   2403 	sp->out_buffer[1]=JPEG_MARKER_EOI;
   2404 	*len=2;
   2405 	*mem=(void*)sp->out_buffer;
   2406 }
   2407 
   2408 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2409 static int
   2410 jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
   2411 {
   2412 	return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_create_decompress(cinfo),1));
   2413 }
   2414 #endif
   2415 
   2416 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2417 static int
   2418 jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image)
   2419 {
   2420 	return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_header(cinfo,require_image),1));
   2421 }
   2422 #endif
   2423 
   2424 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2425 static int
   2426 jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
   2427 {
   2428 	return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_start_decompress(cinfo),1));
   2429 }
   2430 #endif
   2431 
   2432 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2433 static int
   2434 jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines)
   2435 {
   2436 	return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_scanlines(cinfo,scanlines,max_lines),1));
   2437 }
   2438 #endif
   2439 
   2440 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2441 static int
   2442 jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines)
   2443 {
   2444 	return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_raw_data(cinfo,data,max_lines),1));
   2445 }
   2446 #endif
   2447 
   2448 #ifndef LIBJPEG_ENCAP_EXTERNAL
   2449 static void
   2450 jpeg_encap_unwind(TIFF* tif)
   2451 {
   2452 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2453 	LONGJMP(sp->exit_jmpbuf,1);
   2454 }
   2455 #endif
   2456 
   2457 static void
   2458 OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo)
   2459 {
   2460 	char buffer[JMSG_LENGTH_MAX];
   2461 	(*cinfo->err->format_message)(cinfo,buffer);
   2462 	TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
   2463 }
   2464 
   2465 static void
   2466 OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo)
   2467 {
   2468 	char buffer[JMSG_LENGTH_MAX];
   2469 	(*cinfo->err->format_message)(cinfo,buffer);
   2470 	TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
   2471 	jpeg_encap_unwind((TIFF*)(cinfo->client_data));
   2472 }
   2473 
   2474 static void
   2475 OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo)
   2476 {
   2477 	(void)cinfo;
   2478 }
   2479 
   2480 static boolean
   2481 OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
   2482 {
   2483 	TIFF* tif=(TIFF*)cinfo->client_data;
   2484 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
   2485 	void* mem=0;
   2486 	uint32 len=0U;
   2487 	if (OJPEGWriteStream(tif,&mem,&len)==0)
   2488 	{
   2489 		TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data");
   2490 		jpeg_encap_unwind(tif);
   2491 	}
   2492 	sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len;
   2493 	sp->libjpeg_jpeg_source_mgr.next_input_byte=mem;
   2494 	return(1);
   2495 }
   2496 
   2497 static void
   2498 OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes)
   2499 {
   2500 	TIFF* tif=(TIFF*)cinfo->client_data;
   2501 	(void)num_bytes;
   2502 	TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
   2503 	jpeg_encap_unwind(tif);
   2504 }
   2505 
   2506 static boolean
   2507 OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired)
   2508 {
   2509 	TIFF* tif=(TIFF*)cinfo->client_data;
   2510 	(void)desired;
   2511 	TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
   2512 	jpeg_encap_unwind(tif);
   2513 	return(0);
   2514 }
   2515 
   2516 static void
   2517 OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo)
   2518 {
   2519 	(void)cinfo;
   2520 }
   2521 
   2522 #endif
   2523 
   2524 
   2525 /*
   2526  * Local Variables:
   2527  * mode: c
   2528  * c-basic-offset: 8
   2529  * fill-column: 78
   2530  * End:
   2531  */
   2532