Blame libtiff/tif_ojpeg.c

Packit 7838c8
/* $Id: tif_ojpeg.c,v 1.69 2017-04-27 17:29:26 erouault Exp $ */
Packit 7838c8
Packit 7838c8
/* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0
Packit 7838c8
   specification is now totally obsolete and deprecated for new applications and
Packit 7838c8
   images. This file was was created solely in order to read unconverted images
Packit 7838c8
   still present on some users' computer systems. It will never be extended
Packit 7838c8
   to write such files. Writing new-style JPEG compressed TIFFs is implemented
Packit 7838c8
   in tif_jpeg.c.
Packit 7838c8
Packit 7838c8
   The code is carefully crafted to robustly read all gathered JPEG-in-TIFF
Packit 7838c8
   testfiles, and anticipate as much as possible all other... But still, it may
Packit 7838c8
   fail on some. If you encounter problems, please report them on the TIFF
Packit 7838c8
   mailing list and/or to Joris Van Damme <info@awaresystems.be>.
Packit 7838c8
Packit 7838c8
   Please read the file called "TIFF Technical Note #2" if you need to be
Packit 7838c8
   convinced this compression scheme is bad and breaks TIFF. That document
Packit 7838c8
   is linked to from the LibTiff site <http://www.remotesensing.org/libtiff/>
Packit 7838c8
   and from AWare Systems' TIFF section
Packit 7838c8
   <http://www.awaresystems.be/imaging/tiff.html>. It is also absorbed
Packit 7838c8
   in Adobe's specification supplements, marked "draft" up to this day, but
Packit 7838c8
   supported by the TIFF community.
Packit 7838c8
Packit 7838c8
   This file interfaces with Release 6B of the JPEG Library written by the
Packit 7838c8
   Independent JPEG Group. Previous versions of this file required a hack inside
Packit 7838c8
   the LibJpeg library. This version no longer requires that. Remember to
Packit 7838c8
   remove the hack if you update from the old version.
Packit 7838c8
Packit 7838c8
   Copyright (c) Joris Van Damme <info@awaresystems.be>
Packit 7838c8
   Copyright (c) AWare Systems <http://www.awaresystems.be/>
Packit 7838c8
Packit 7838c8
   The licence agreement for this file is the same as the rest of the LibTiff
Packit 7838c8
   library.
Packit 7838c8
Packit 7838c8
   IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR
Packit 7838c8
   ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit 7838c8
   OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 7838c8
   WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
Packit 7838c8
   LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit 7838c8
   OF THIS SOFTWARE.
Packit 7838c8
Packit 7838c8
   Joris Van Damme and/or AWare Systems may be available for custom
Packit 7838c8
   development. If you like what you see, and need anything similar or related,
Packit 7838c8
   contact <info@awaresystems.be>.
Packit 7838c8
*/
Packit 7838c8
Packit 7838c8
/* What is what, and what is not?
Packit 7838c8
Packit 7838c8
   This decoder starts with an input stream, that is essentially the JpegInterchangeFormat
Packit 7838c8
   stream, if any, followed by the strile data, if any. This stream is read in
Packit 7838c8
   OJPEGReadByte and related functions.
Packit 7838c8
Packit 7838c8
   It analyzes the start of this stream, until it encounters non-marker data, i.e.
Packit 7838c8
   compressed image data. Some of the header markers it sees have no actual content,
Packit 7838c8
   like the SOI marker, and APP/COM markers that really shouldn't even be there. Some
Packit 7838c8
   other markers do have content, and the valuable bits and pieces of information
Packit 7838c8
   in these markers are saved, checking all to verify that the stream is more or
Packit 7838c8
   less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx
Packit 7838c8
   functions.
Packit 7838c8
Packit 7838c8
   Some OJPEG imagery contains no valid JPEG header markers. This situation is picked
Packit 7838c8
   up on if we've seen no SOF marker when we're at the start of the compressed image
Packit 7838c8
   data. In this case, the tables are read from JpegXxxTables tags, and the other
Packit 7838c8
   bits and pieces of information is initialized to its most basic value. This is
Packit 7838c8
   implemented in the OJPEGReadHeaderInfoSecTablesXxx functions.
Packit 7838c8
Packit 7838c8
   When this is complete, a good and valid JPEG header can be assembled, and this is
Packit 7838c8
   passed through to LibJpeg. When that's done, the remainder of the input stream, i.e.
Packit 7838c8
   the compressed image data, can be passed through unchanged. This is done in
Packit 7838c8
   OJPEGWriteStream functions.
Packit 7838c8
Packit 7838c8
   LibTiff rightly expects to know the subsampling values before decompression. Just like
Packit 7838c8
   in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling
Packit 7838c8
   tag is notoriously unreliable. To correct these tag values with the ones inside
Packit 7838c8
   the JPEG stream, the first part of the input stream is pre-scanned in
Packit 7838c8
   OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings
Packit 7838c8
   or errors, up to the point where either these values are read, or it's clear they
Packit 7838c8
   aren't there. This means that some of the data is read twice, but we feel speed
Packit 7838c8
   in correcting these values is important enough to warrant this sacrifice. Although
Packit 7838c8
   there is currently no define or other configuration mechanism to disable this behaviour,
Packit 7838c8
   the actual header scanning is build to robustly respond with error report if it
Packit 7838c8
   should encounter an uncorrected mismatch of subsampling values. See
Packit 7838c8
   OJPEGReadHeaderInfoSecStreamSof.
Packit 7838c8
Packit 7838c8
   The restart interval and restart markers are the most tricky part... The restart
Packit 7838c8
   interval can be specified in a tag. It can also be set inside the input JPEG stream.
Packit 7838c8
   It can be used inside the input JPEG stream. If reading from strile data, we've
Packit 7838c8
   consistently discovered the need to insert restart markers in between the different
Packit 7838c8
   striles, as is also probably the most likely interpretation of the original TIFF 6.0
Packit 7838c8
   specification. With all this setting of interval, and actual use of markers that is not
Packit 7838c8
   predictable at the time of valid JPEG header assembly, the restart thing may turn
Packit 7838c8
   out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors
Packit 7838c8
   succeed in reading back what they write, which may be the reason why we've been able
Packit 7838c8
   to discover ways that seem to work.
Packit 7838c8
Packit 7838c8
   Some special provision is made for planarconfig separate OJPEG files. These seem
Packit 7838c8
   to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS,
Packit 7838c8
   and plane. This may or may not be a valid JPEG configuration, we don't know and don't
Packit 7838c8
   care. We want LibTiff to be able to access the planes individually, without huge
Packit 7838c8
   buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this
Packit 7838c8
   case, that allow us to pass a single plane such that LibJpeg sees a valid
Packit 7838c8
   single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent
Packit 7838c8
   planes, is done inside OJPEGReadSecondarySos.
Packit 7838c8
Packit 7838c8
   The benefit of the scheme is... that it works, basically. We know of no other that
Packit 7838c8
   does. It works without checking software tag, or otherwise going about things in an
Packit 7838c8
   OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases
Packit 7838c8
   with and without JpegInterchangeFormat, with and without striles, with part of
Packit 7838c8
   the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving
Packit 7838c8
   and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out
Packit 7838c8
   of the data.
Packit 7838c8
Packit 7838c8
   Another nice side-effect is that a complete JPEG single valid stream is build if
Packit 7838c8
   planarconfig is not separate (vast majority). We may one day use that to build
Packit 7838c8
   converters to JPEG, and/or to new-style JPEG compression inside TIFF.
Packit 7838c8
Packit 7838c8
   A disadvantage is the lack of random access to the individual striles. This is the
Packit 7838c8
   reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode.
Packit 7838c8
   Applications would do well accessing all striles in order, as this will result in
Packit 7838c8
   a single sequential scan of the input stream, and no restarting of LibJpeg decoding
Packit 7838c8
   session.
Packit 7838c8
*/
Packit 7838c8
Packit 7838c8
#define WIN32_LEAN_AND_MEAN
Packit 7838c8
#define VC_EXTRALEAN
Packit 7838c8
Packit 7838c8
#include "tiffiop.h"
Packit 7838c8
#ifdef OJPEG_SUPPORT
Packit 7838c8
Packit 7838c8
/* Configuration defines here are:
Packit 7838c8
 * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments,
Packit 7838c8
 * 	like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to
Packit 7838c8
 * 	libjpeg, with longjump stuff, are encapsulated in dedicated functions. When
Packit 7838c8
 * 	JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external
Packit 7838c8
 * 	to this unit, and can be defined elsewhere to use stuff other then longjump.
Packit 7838c8
 * 	The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators
Packit 7838c8
 * 	here, internally, with normal longjump.
Packit 7838c8
 * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is
Packit 7838c8
 * 	conveniently available, but still it may be worthwhile to use _setjmp or sigsetjmp
Packit 7838c8
 * 	in place of plain setjmp. These macros will make it easier. It is useless
Packit 7838c8
 * 	to fiddle with these if you define JPEG_ENCAP_EXTERNAL.
Packit 7838c8
 * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee
Packit 7838c8
 * 	instant processing, optimal streaming and optimal use of processor cache, but also big
Packit 7838c8
 * 	enough so as to not result in significant call overhead. It should be at least a few
Packit 7838c8
 * 	bytes to accommodate some structures (this is verified in asserts), but it would not be
Packit 7838c8
 * 	sensible to make it this small anyway, and it should be at most 64K since it is indexed
Packit 7838c8
 * 	with uint16. We recommend 2K.
Packit 7838c8
 * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has
Packit 7838c8
 * 	absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
/* define LIBJPEG_ENCAP_EXTERNAL */
Packit 7838c8
#define SETJMP(jbuf) setjmp(jbuf)
Packit 7838c8
#define LONGJMP(jbuf,code) longjmp(jbuf,code)
Packit 7838c8
#define JMP_BUF jmp_buf
Packit 7838c8
#define OJPEG_BUFFER 2048
Packit 7838c8
/* define EGYPTIANWALK */
Packit 7838c8
Packit 7838c8
#define JPEG_MARKER_SOF0 0xC0
Packit 7838c8
#define JPEG_MARKER_SOF1 0xC1
Packit 7838c8
#define JPEG_MARKER_SOF3 0xC3
Packit 7838c8
#define JPEG_MARKER_DHT 0xC4
Packit 7838c8
#define JPEG_MARKER_RST0 0XD0
Packit 7838c8
#define JPEG_MARKER_SOI 0xD8
Packit 7838c8
#define JPEG_MARKER_EOI 0xD9
Packit 7838c8
#define JPEG_MARKER_SOS 0xDA
Packit 7838c8
#define JPEG_MARKER_DQT 0xDB
Packit 7838c8
#define JPEG_MARKER_DRI 0xDD
Packit 7838c8
#define JPEG_MARKER_APP0 0xE0
Packit 7838c8
#define JPEG_MARKER_COM 0xFE
Packit 7838c8
Packit 7838c8
#define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0)
Packit 7838c8
#define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1)
Packit 7838c8
#define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2)
Packit 7838c8
#define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3)
Packit 7838c8
#define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4)
Packit 7838c8
#define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5)
Packit 7838c8
#define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6)
Packit 7838c8
Packit 7838c8
static const TIFFField ojpegFields[] = {
Packit 7838c8
	{TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NULL},
Packit 7838c8
	{TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength",NULL},
Packit 7838c8
	{TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables",NULL},
Packit 7838c8
	{TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables",NULL},
Packit 7838c8
	{TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables",NULL},
Packit 7838c8
	{TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL},
Packit 7838c8
	{TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval",NULL},
Packit 7838c8
};
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
#include <setjmp.h>
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
/* We undefine FAR to avoid conflict with JPEG definition */
Packit 7838c8
Packit 7838c8
#ifdef FAR
Packit 7838c8
#undef FAR
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
  Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is
Packit 7838c8
  not defined.  Unfortunately, the MinGW and Borland compilers include
Packit 7838c8
  a typedef for INT32, which causes a conflict.  MSVC does not include
Packit 7838c8
  a conflicting typedef given the headers which are included.
Packit 7838c8
*/
Packit 7838c8
#if defined(__BORLANDC__) || defined(__MINGW32__)
Packit 7838c8
# define XMD_H 1
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
/* Define "boolean" as unsigned char, not int, per Windows custom. */
Packit 7838c8
#if defined(__WIN32__) && !defined(__MINGW32__)
Packit 7838c8
# ifndef __RPCNDR_H__            /* don't conflict if rpcndr.h already read */
Packit 7838c8
   typedef unsigned char boolean;
Packit 7838c8
# endif
Packit 7838c8
# define HAVE_BOOLEAN            /* prevent jmorecfg.h from redefining it */
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#include "jpeglib.h"
Packit 7838c8
#include "jerror.h"
Packit 7838c8
Packit 7838c8
typedef struct jpeg_error_mgr jpeg_error_mgr;
Packit 7838c8
typedef struct jpeg_common_struct jpeg_common_struct;
Packit 7838c8
typedef struct jpeg_decompress_struct jpeg_decompress_struct;
Packit 7838c8
typedef struct jpeg_source_mgr jpeg_source_mgr;
Packit 7838c8
Packit 7838c8
typedef enum {
Packit 7838c8
	osibsNotSetYet,
Packit 7838c8
	osibsJpegInterchangeFormat,
Packit 7838c8
	osibsStrile,
Packit 7838c8
	osibsEof
Packit 7838c8
} OJPEGStateInBufferSource;
Packit 7838c8
Packit 7838c8
typedef enum {
Packit 7838c8
	ososSoi,
Packit 7838c8
	ososQTable0,ososQTable1,ososQTable2,ososQTable3,
Packit 7838c8
	ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
Packit 7838c8
	ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
Packit 7838c8
	ososDri,
Packit 7838c8
	ososSof,
Packit 7838c8
	ososSos,
Packit 7838c8
	ososCompressed,
Packit 7838c8
	ososRst,
Packit 7838c8
	ososEoi
Packit 7838c8
} OJPEGStateOutState;
Packit 7838c8
Packit 7838c8
typedef struct {
Packit 7838c8
	TIFF* tif;
Packit 7838c8
        int decoder_ok;
Packit 7838c8
	#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
	JMP_BUF exit_jmpbuf;
Packit 7838c8
	#endif
Packit 7838c8
	TIFFVGetMethod vgetparent;
Packit 7838c8
	TIFFVSetMethod vsetparent;
Packit 7838c8
	TIFFPrintMethod printdir;
Packit 7838c8
	uint64 file_size;
Packit 7838c8
	uint32 image_width;
Packit 7838c8
	uint32 image_length;
Packit 7838c8
	uint32 strile_width;
Packit 7838c8
	uint32 strile_length;
Packit 7838c8
	uint32 strile_length_total;
Packit 7838c8
	uint8 samples_per_pixel;
Packit 7838c8
	uint8 plane_sample_offset;
Packit 7838c8
	uint8 samples_per_pixel_per_plane;
Packit 7838c8
	uint64 jpeg_interchange_format;
Packit 7838c8
	uint64 jpeg_interchange_format_length;
Packit 7838c8
	uint8 jpeg_proc;
Packit 7838c8
	uint8 subsamplingcorrect;
Packit 7838c8
	uint8 subsamplingcorrect_done;
Packit 7838c8
	uint8 subsampling_tag;
Packit 7838c8
	uint8 subsampling_hor;
Packit 7838c8
	uint8 subsampling_ver;
Packit 7838c8
	uint8 subsampling_force_desubsampling_inside_decompression;
Packit 7838c8
	uint8 qtable_offset_count;
Packit 7838c8
	uint8 dctable_offset_count;
Packit 7838c8
	uint8 actable_offset_count;
Packit 7838c8
	uint64 qtable_offset[3];
Packit 7838c8
	uint64 dctable_offset[3];
Packit 7838c8
	uint64 actable_offset[3];
Packit 7838c8
	uint8* qtable[4];
Packit 7838c8
	uint8* dctable[4];
Packit 7838c8
	uint8* actable[4];
Packit 7838c8
	uint16 restart_interval;
Packit 7838c8
	uint8 restart_index;
Packit 7838c8
	uint8 sof_log;
Packit 7838c8
	uint8 sof_marker_id;
Packit 7838c8
	uint32 sof_x;
Packit 7838c8
	uint32 sof_y;
Packit 7838c8
	uint8 sof_c[3];
Packit 7838c8
	uint8 sof_hv[3];
Packit 7838c8
	uint8 sof_tq[3];
Packit 7838c8
	uint8 sos_cs[3];
Packit 7838c8
	uint8 sos_tda[3];
Packit 7838c8
	struct {
Packit 7838c8
		uint8 log;
Packit 7838c8
		OJPEGStateInBufferSource in_buffer_source;
Packit 7838c8
		uint32 in_buffer_next_strile;
Packit 7838c8
		uint64 in_buffer_file_pos;
Packit 7838c8
		uint64 in_buffer_file_togo;
Packit 7838c8
	} sos_end[3];
Packit 7838c8
	uint8 readheader_done;
Packit 7838c8
	uint8 writeheader_done;
Packit 7838c8
	uint16 write_cursample;
Packit 7838c8
	uint32 write_curstrile;
Packit 7838c8
	uint8 libjpeg_session_active;
Packit 7838c8
	uint8 libjpeg_jpeg_query_style;
Packit 7838c8
	jpeg_error_mgr libjpeg_jpeg_error_mgr;
Packit 7838c8
	jpeg_decompress_struct libjpeg_jpeg_decompress_struct;
Packit 7838c8
	jpeg_source_mgr libjpeg_jpeg_source_mgr;
Packit 7838c8
	uint8 subsampling_convert_log;
Packit 7838c8
	uint32 subsampling_convert_ylinelen;
Packit 7838c8
	uint32 subsampling_convert_ylines;
Packit 7838c8
	uint32 subsampling_convert_clinelen;
Packit 7838c8
	uint32 subsampling_convert_clines;
Packit 7838c8
	uint32 subsampling_convert_ybuflen;
Packit 7838c8
	uint32 subsampling_convert_cbuflen;
Packit 7838c8
	uint32 subsampling_convert_ycbcrbuflen;
Packit 7838c8
	uint8* subsampling_convert_ycbcrbuf;
Packit 7838c8
	uint8* subsampling_convert_ybuf;
Packit 7838c8
	uint8* subsampling_convert_cbbuf;
Packit 7838c8
	uint8* subsampling_convert_crbuf;
Packit 7838c8
	uint32 subsampling_convert_ycbcrimagelen;
Packit 7838c8
	uint8** subsampling_convert_ycbcrimage;
Packit 7838c8
	uint32 subsampling_convert_clinelenout;
Packit 7838c8
	uint32 subsampling_convert_state;
Packit 7838c8
	uint32 bytes_per_line;   /* if the codec outputs subsampled data, a 'line' in bytes_per_line */
Packit 7838c8
	uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows     */
Packit 7838c8
	OJPEGStateInBufferSource in_buffer_source;
Packit 7838c8
	uint32 in_buffer_next_strile;
Packit 7838c8
	uint32 in_buffer_strile_count;
Packit 7838c8
	uint64 in_buffer_file_pos;
Packit 7838c8
	uint8 in_buffer_file_pos_log;
Packit 7838c8
	uint64 in_buffer_file_togo;
Packit 7838c8
	uint16 in_buffer_togo;
Packit 7838c8
	uint8* in_buffer_cur;
Packit 7838c8
	uint8 in_buffer[OJPEG_BUFFER];
Packit 7838c8
	OJPEGStateOutState out_state;
Packit 7838c8
	uint8 out_buffer[OJPEG_BUFFER];
Packit 7838c8
	uint8* skip_buffer;
Packit 7838c8
} OJPEGState;
Packit 7838c8
Packit 7838c8
static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap);
Packit 7838c8
static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap);
Packit 7838c8
static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags);
Packit 7838c8
Packit 7838c8
static int OJPEGFixupTags(TIFF* tif);
Packit 7838c8
static int OJPEGSetupDecode(TIFF* tif);
Packit 7838c8
static int OJPEGPreDecode(TIFF* tif, uint16 s);
Packit 7838c8
static int OJPEGPreDecodeSkipRaw(TIFF* tif);
Packit 7838c8
static int OJPEGPreDecodeSkipScanlines(TIFF* tif);
Packit 7838c8
static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc);
Packit 7838c8
static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc);
Packit 7838c8
static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
Packit 7838c8
static int OJPEGSetupEncode(TIFF* tif);
Packit 7838c8
static int OJPEGPreEncode(TIFF* tif, uint16 s);
Packit 7838c8
static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int OJPEGPostEncode(TIFF* tif);
Packit 7838c8
static void OJPEGCleanup(TIFF* tif);
Packit 7838c8
Packit 7838c8
static void OJPEGSubsamplingCorrect(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfo(TIFF* tif);
Packit 7838c8
static int OJPEGReadSecondarySos(TIFF* tif, uint16 s);
Packit 7838c8
static int OJPEGWriteHeaderInfo(TIFF* tif);
Packit 7838c8
static void OJPEGLibjpegSessionAbort(TIFF* tif);
Packit 7838c8
Packit 7838c8
static int OJPEGReadHeaderInfoSec(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id);
Packit 7838c8
static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif);
Packit 7838c8
static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif);
Packit 7838c8
Packit 7838c8
static int OJPEGReadBufferFill(OJPEGState* sp);
Packit 7838c8
static int OJPEGReadByte(OJPEGState* sp, uint8* byte);
Packit 7838c8
static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte);
Packit 7838c8
static void OJPEGReadByteAdvance(OJPEGState* sp);
Packit 7838c8
static int OJPEGReadWord(OJPEGState* sp, uint16* word);
Packit 7838c8
static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem);
Packit 7838c8
static void OJPEGReadSkip(OJPEGState* sp, uint16 len);
Packit 7838c8
Packit 7838c8
static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len);
Packit 7838c8
Packit 7838c8
#ifdef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
Packit 7838c8
extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
Packit 7838c8
extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
Packit 7838c8
extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
Packit 7838c8
extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
Packit 7838c8
extern void jpeg_encap_unwind(TIFF* tif);
Packit 7838c8
#else
Packit 7838c8
static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j);
Packit 7838c8
static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
Packit 7838c8
static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
Packit 7838c8
static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
Packit 7838c8
static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
Packit 7838c8
static void jpeg_encap_unwind(TIFF* tif);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo);
Packit 7838c8
static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo);
Packit 7838c8
static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo);
Packit 7838c8
static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo);
Packit 7838c8
static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes);
Packit 7838c8
static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired);
Packit 7838c8
static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo);
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
TIFFInitOJPEG(TIFF* tif, int scheme)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="TIFFInitOJPEG";
Packit 7838c8
	OJPEGState* sp;
Packit 7838c8
Packit 7838c8
	assert(scheme==COMPRESSION_OJPEG);
Packit 7838c8
Packit 7838c8
        /*
Packit 7838c8
	 * Merge codec-specific tag information.
Packit 7838c8
	 */
Packit 7838c8
	if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
		    "Merging Old JPEG codec-specific tags failed");
Packit 7838c8
		return 0;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* state block */
Packit 7838c8
	sp=_TIFFmalloc(sizeof(OJPEGState));
Packit 7838c8
	if (sp==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	_TIFFmemset(sp,0,sizeof(OJPEGState));
Packit 7838c8
	sp->tif=tif;
Packit 7838c8
	sp->jpeg_proc=1;
Packit 7838c8
	sp->subsampling_hor=2;
Packit 7838c8
	sp->subsampling_ver=2;
Packit 7838c8
	TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2);
Packit 7838c8
	/* tif codec methods */
Packit 7838c8
	tif->tif_fixuptags=OJPEGFixupTags;  
Packit 7838c8
	tif->tif_setupdecode=OJPEGSetupDecode;
Packit 7838c8
	tif->tif_predecode=OJPEGPreDecode;
Packit 7838c8
	tif->tif_postdecode=OJPEGPostDecode;  
Packit 7838c8
	tif->tif_decoderow=OJPEGDecode;  
Packit 7838c8
	tif->tif_decodestrip=OJPEGDecode;  
Packit 7838c8
	tif->tif_decodetile=OJPEGDecode;  
Packit 7838c8
	tif->tif_setupencode=OJPEGSetupEncode;
Packit 7838c8
	tif->tif_preencode=OJPEGPreEncode;
Packit 7838c8
	tif->tif_postencode=OJPEGPostEncode;
Packit 7838c8
	tif->tif_encoderow=OJPEGEncode;  
Packit 7838c8
	tif->tif_encodestrip=OJPEGEncode;  
Packit 7838c8
	tif->tif_encodetile=OJPEGEncode;  
Packit 7838c8
	tif->tif_cleanup=OJPEGCleanup;
Packit 7838c8
	tif->tif_data=(uint8*)sp;
Packit 7838c8
	/* tif tag methods */
Packit 7838c8
	sp->vgetparent=tif->tif_tagmethods.vgetfield;
Packit 7838c8
	tif->tif_tagmethods.vgetfield=OJPEGVGetField;
Packit 7838c8
	sp->vsetparent=tif->tif_tagmethods.vsetfield;
Packit 7838c8
	tif->tif_tagmethods.vsetfield=OJPEGVSetField;
Packit 7838c8
	sp->printdir=tif->tif_tagmethods.printdir;
Packit 7838c8
	tif->tif_tagmethods.printdir=OJPEGPrintDir;
Packit 7838c8
	/* Some OJPEG files don't have strip or tile offsets or bytecounts tags.
Packit 7838c8
	   Some others do, but have totally meaningless or corrupt values
Packit 7838c8
	   in these tags. In these cases, the JpegInterchangeFormat stream is
Packit 7838c8
	   reliable. In any case, this decoder reads the compressed data itself,
Packit 7838c8
	   from the most reliable locations, and we need to notify encapsulating
Packit 7838c8
	   LibTiff not to read raw strips or tiles for us. */
Packit 7838c8
	tif->tif_flags|=TIFF_NOREADRAW;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	switch(tag)
Packit 7838c8
	{
Packit 7838c8
		case TIFFTAG_JPEGIFOFFSET:
Packit 7838c8
			*va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGIFBYTECOUNT:
Packit 7838c8
			*va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_length;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_YCBCRSUBSAMPLING:
Packit 7838c8
			if (sp->subsamplingcorrect_done==0)
Packit 7838c8
				OJPEGSubsamplingCorrect(tif);
Packit 7838c8
			*va_arg(ap,uint16*)=(uint16)sp->subsampling_hor;
Packit 7838c8
			*va_arg(ap,uint16*)=(uint16)sp->subsampling_ver;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGQTABLES:
Packit 7838c8
			*va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count;
Packit 7838c8
			*va_arg(ap,void**)=(void*)sp->qtable_offset; 
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGDCTABLES:
Packit 7838c8
			*va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count;
Packit 7838c8
			*va_arg(ap,void**)=(void*)sp->dctable_offset;  
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGACTABLES:
Packit 7838c8
			*va_arg(ap,uint32*)=(uint32)sp->actable_offset_count;
Packit 7838c8
			*va_arg(ap,void**)=(void*)sp->actable_offset;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGPROC:
Packit 7838c8
			*va_arg(ap,uint16*)=(uint16)sp->jpeg_proc;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGRESTARTINTERVAL:
Packit 7838c8
			*va_arg(ap,uint16*)=sp->restart_interval;
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return (*sp->vgetparent)(tif,tag,ap);
Packit 7838c8
	}
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGVSetField";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint32 ma;
Packit 7838c8
	uint64* mb;
Packit 7838c8
	uint32 n;
Packit 7838c8
	const TIFFField* fip;
Packit 7838c8
Packit 7838c8
	switch(tag)
Packit 7838c8
	{
Packit 7838c8
		case TIFFTAG_JPEGIFOFFSET:
Packit 7838c8
			sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64);
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGIFBYTECOUNT:
Packit 7838c8
			sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uint64);
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_YCBCRSUBSAMPLING:
Packit 7838c8
			sp->subsampling_tag=1;
Packit 7838c8
			sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap);
Packit 7838c8
			sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap);
Packit 7838c8
			tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor;
Packit 7838c8
			tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGQTABLES:
Packit 7838c8
			ma=(uint32)va_arg(ap,uint32);
Packit 7838c8
			if (ma!=0)
Packit 7838c8
			{
Packit 7838c8
				if (ma>3)
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
				sp->qtable_offset_count=(uint8)ma;
Packit 7838c8
				mb=(uint64*)va_arg(ap,uint64*);
Packit 7838c8
				for (n=0; n
Packit 7838c8
					sp->qtable_offset[n]=mb[n];
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGDCTABLES:
Packit 7838c8
			ma=(uint32)va_arg(ap,uint32);
Packit 7838c8
			if (ma!=0)
Packit 7838c8
			{
Packit 7838c8
				if (ma>3)
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
				sp->dctable_offset_count=(uint8)ma;
Packit 7838c8
				mb=(uint64*)va_arg(ap,uint64*);
Packit 7838c8
				for (n=0; n
Packit 7838c8
					sp->dctable_offset[n]=mb[n];
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGACTABLES:
Packit 7838c8
			ma=(uint32)va_arg(ap,uint32);
Packit 7838c8
			if (ma!=0)
Packit 7838c8
			{
Packit 7838c8
				if (ma>3)
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
				sp->actable_offset_count=(uint8)ma;
Packit 7838c8
				mb=(uint64*)va_arg(ap,uint64*);
Packit 7838c8
				for (n=0; n
Packit 7838c8
					sp->actable_offset[n]=mb[n];
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGPROC:
Packit 7838c8
			sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap);
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGRESTARTINTERVAL:
Packit 7838c8
			sp->restart_interval=(uint16)va_arg(ap,uint16_vap);
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return (*sp->vsetparent)(tif,tag,ap);
Packit 7838c8
	}
Packit 7838c8
	fip = TIFFFieldWithTag(tif,tag);
Packit 7838c8
	if( fip == NULL ) /* shouldn't happen */
Packit 7838c8
	    return(0);
Packit 7838c8
	TIFFSetFieldBit(tif,fip->field_bit);
Packit 7838c8
	tif->tif_flags|=TIFF_DIRTYDIRECT;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGPrintDir(TIFF* tif, FILE* fd, long flags)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	(void)flags;
Packit 7838c8
	assert(sp!=NULL);
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
Packit 7838c8
		fprintf(fd,"  JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format);  
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
Packit 7838c8
		fprintf(fd,"  JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length);  
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES))
Packit 7838c8
	{
Packit 7838c8
		fprintf(fd,"  JpegQTables:");
Packit 7838c8
		for (m=0; m<sp->qtable_offset_count; m++)
Packit 7838c8
			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qtable_offset[m]);
Packit 7838c8
		fprintf(fd,"\n");
Packit 7838c8
	}
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES))
Packit 7838c8
	{
Packit 7838c8
		fprintf(fd,"  JpegDcTables:");
Packit 7838c8
		for (m=0; m<sp->dctable_offset_count; m++)
Packit 7838c8
			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dctable_offset[m]);
Packit 7838c8
		fprintf(fd,"\n");
Packit 7838c8
	}
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES))
Packit 7838c8
	{
Packit 7838c8
		fprintf(fd,"  JpegAcTables:");
Packit 7838c8
		for (m=0; m<sp->actable_offset_count; m++)
Packit 7838c8
			fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->actable_offset[m]);
Packit 7838c8
		fprintf(fd,"\n");
Packit 7838c8
	}
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC))
Packit 7838c8
		fprintf(fd,"  JpegProc: %u\n",(unsigned int)sp->jpeg_proc);
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL))
Packit 7838c8
		fprintf(fd,"  JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval);
Packit 7838c8
	if (sp->printdir)
Packit 7838c8
		(*sp->printdir)(tif, fd, flags);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGFixupTags(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	(void) tif;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGSetupDecode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGSetupDecode";
Packit 7838c8
	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");
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGPreDecode(TIFF* tif, uint16 s)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint32 m;
Packit 7838c8
	if (sp->subsamplingcorrect_done==0)
Packit 7838c8
		OJPEGSubsamplingCorrect(tif);
Packit 7838c8
	if (sp->readheader_done==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadHeaderInfo(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	if (sp->sos_end[s].log==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadSecondarySos(tif,s)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	if isTiled(tif)
Packit 7838c8
		m=tif->tif_curtile;
Packit 7838c8
	else
Packit 7838c8
		m=tif->tif_curstrip;
Packit 7838c8
	if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m)))
Packit 7838c8
	{
Packit 7838c8
		if (sp->libjpeg_session_active!=0)
Packit 7838c8
			OJPEGLibjpegSessionAbort(tif);
Packit 7838c8
		sp->writeheader_done=0;
Packit 7838c8
	}
Packit 7838c8
	if (sp->writeheader_done==0)
Packit 7838c8
	{
Packit 7838c8
		sp->plane_sample_offset=(uint8)s;
Packit 7838c8
		sp->write_cursample=s;
Packit 7838c8
		sp->write_curstrile=s*tif->tif_dir.td_stripsperimage;
Packit 7838c8
		if ((sp->in_buffer_file_pos_log==0) ||
Packit 7838c8
		    (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos))
Packit 7838c8
		{
Packit 7838c8
			sp->in_buffer_source=sp->sos_end[s].in_buffer_source;
Packit 7838c8
			sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile;
Packit 7838c8
			sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos;
Packit 7838c8
			sp->in_buffer_file_pos_log=0;
Packit 7838c8
			sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo;
Packit 7838c8
			sp->in_buffer_togo=0;
Packit 7838c8
			sp->in_buffer_cur=0;
Packit 7838c8
		}
Packit 7838c8
		if (OJPEGWriteHeaderInfo(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	while (sp->write_curstrile
Packit 7838c8
	{
Packit 7838c8
		if (sp->libjpeg_jpeg_query_style==0)
Packit 7838c8
		{
Packit 7838c8
			if (OJPEGPreDecodeSkipRaw(tif)==0)
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			if (OJPEGPreDecodeSkipScanlines(tif)==0)
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
		sp->write_curstrile++;
Packit 7838c8
	}
Packit 7838c8
	sp->decoder_ok = 1;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGPreDecodeSkipRaw(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint32 m;
Packit 7838c8
	m=sp->lines_per_strile;
Packit 7838c8
	if (sp->subsampling_convert_state!=0)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m)
Packit 7838c8
		{
Packit 7838c8
			sp->subsampling_convert_state+=m;
Packit 7838c8
			if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
Packit 7838c8
				sp->subsampling_convert_state=0;
Packit 7838c8
			return(1);
Packit 7838c8
		}
Packit 7838c8
		m-=sp->subsampling_convert_clines-sp->subsampling_convert_state;
Packit 7838c8
		sp->subsampling_convert_state=0;
Packit 7838c8
	}
Packit 7838c8
	while (m>=sp->subsampling_convert_clines)
Packit 7838c8
	{
Packit 7838c8
		if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		m-=sp->subsampling_convert_clines;
Packit 7838c8
	}
Packit 7838c8
	if (m>0)
Packit 7838c8
	{
Packit 7838c8
		if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		sp->subsampling_convert_state=m;
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGPreDecodeSkipScanlines(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGPreDecodeSkipScanlines";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint32 m;
Packit 7838c8
	if (sp->skip_buffer==NULL)
Packit 7838c8
	{
Packit 7838c8
		sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line);
Packit 7838c8
		if (sp->skip_buffer==NULL)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	for (m=0; m<sp->lines_per_strile; m++)
Packit 7838c8
	{
Packit 7838c8
		if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
        static const char module[]="OJPEGDecode";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	(void)s;
Packit 7838c8
        if( !sp->decoder_ok )
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata,module,"Cannot decode: decoder not correctly initialized");
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
	if (sp->libjpeg_jpeg_query_style==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGDecodeRaw(tif,buf,cc)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGDecodeScanlines(tif,buf,cc)==0)
Packit 7838c8
			return(0);
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGDecodeRaw";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8* m;
Packit 7838c8
	tmsize_t n;
Packit 7838c8
	uint8* oy;
Packit 7838c8
	uint8* ocb;
Packit 7838c8
	uint8* ocr;
Packit 7838c8
	uint8* p;
Packit 7838c8
	uint32 q;
Packit 7838c8
	uint8* r;
Packit 7838c8
	uint8 sx,sy;
Packit 7838c8
	if (cc%sp->bytes_per_line!=0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	assert(cc>0);
Packit 7838c8
	m=buf;
Packit 7838c8
	n=cc;
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsampling_convert_state==0)
Packit 7838c8
		{
Packit 7838c8
			if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
		oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen;
Packit 7838c8
		ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
Packit 7838c8
		ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
Packit 7838c8
		p=m;
Packit 7838c8
		for (q=0; q<sp->subsampling_convert_clinelenout; q++)
Packit 7838c8
		{
Packit 7838c8
			r=oy;
Packit 7838c8
			for (sy=0; sy<sp->subsampling_ver; sy++)
Packit 7838c8
			{
Packit 7838c8
				for (sx=0; sx<sp->subsampling_hor; sx++)
Packit 7838c8
					*p++=*r++;
Packit 7838c8
				r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor;
Packit 7838c8
			}
Packit 7838c8
			oy+=sp->subsampling_hor;
Packit 7838c8
			*p++=*ocb++;
Packit 7838c8
			*p++=*ocr++;
Packit 7838c8
		}
Packit 7838c8
		sp->subsampling_convert_state++;
Packit 7838c8
		if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
Packit 7838c8
			sp->subsampling_convert_state=0;
Packit 7838c8
		m+=sp->bytes_per_line;
Packit 7838c8
		n-=sp->bytes_per_line;
Packit 7838c8
	} while(n>0);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGDecodeScanlines";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8* m;
Packit 7838c8
	tmsize_t n;
Packit 7838c8
	if (cc%sp->bytes_per_line!=0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	assert(cc>0);
Packit 7838c8
	m=buf;
Packit 7838c8
	n=cc;
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		m+=sp->bytes_per_line;
Packit 7838c8
		n-=sp->bytes_per_line;
Packit 7838c8
	} while(n>0);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	(void)buf;
Packit 7838c8
	(void)cc;
Packit 7838c8
	sp->write_curstrile++;
Packit 7838c8
	if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0)  
Packit 7838c8
	{
Packit 7838c8
		assert(sp->libjpeg_session_active!=0);
Packit 7838c8
		OJPEGLibjpegSessionAbort(tif);
Packit 7838c8
		sp->writeheader_done=0;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGSetupEncode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGSetupEncode";
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGPreEncode(TIFF* tif, uint16 s)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGPreEncode";
Packit 7838c8
	(void)s;
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGEncode";
Packit 7838c8
	(void)buf;
Packit 7838c8
	(void)cc;
Packit 7838c8
	(void)s;
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGPostEncode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGPostEncode";
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGCleanup(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	if (sp!=0)
Packit 7838c8
	{
Packit 7838c8
		tif->tif_tagmethods.vgetfield=sp->vgetparent;
Packit 7838c8
		tif->tif_tagmethods.vsetfield=sp->vsetparent;
Packit 7838c8
		tif->tif_tagmethods.printdir=sp->printdir;
Packit 7838c8
		if (sp->qtable[0]!=0)
Packit 7838c8
			_TIFFfree(sp->qtable[0]);
Packit 7838c8
		if (sp->qtable[1]!=0)
Packit 7838c8
			_TIFFfree(sp->qtable[1]);
Packit 7838c8
		if (sp->qtable[2]!=0)
Packit 7838c8
			_TIFFfree(sp->qtable[2]);
Packit 7838c8
		if (sp->qtable[3]!=0)
Packit 7838c8
			_TIFFfree(sp->qtable[3]);
Packit 7838c8
		if (sp->dctable[0]!=0)
Packit 7838c8
			_TIFFfree(sp->dctable[0]);
Packit 7838c8
		if (sp->dctable[1]!=0)
Packit 7838c8
			_TIFFfree(sp->dctable[1]);
Packit 7838c8
		if (sp->dctable[2]!=0)
Packit 7838c8
			_TIFFfree(sp->dctable[2]);
Packit 7838c8
		if (sp->dctable[3]!=0)
Packit 7838c8
			_TIFFfree(sp->dctable[3]);
Packit 7838c8
		if (sp->actable[0]!=0)
Packit 7838c8
			_TIFFfree(sp->actable[0]);
Packit 7838c8
		if (sp->actable[1]!=0)
Packit 7838c8
			_TIFFfree(sp->actable[1]);
Packit 7838c8
		if (sp->actable[2]!=0)
Packit 7838c8
			_TIFFfree(sp->actable[2]);
Packit 7838c8
		if (sp->actable[3]!=0)
Packit 7838c8
			_TIFFfree(sp->actable[3]);
Packit 7838c8
		if (sp->libjpeg_session_active!=0)
Packit 7838c8
			OJPEGLibjpegSessionAbort(tif);
Packit 7838c8
		if (sp->subsampling_convert_ycbcrbuf!=0)
Packit 7838c8
			_TIFFfree(sp->subsampling_convert_ycbcrbuf);
Packit 7838c8
		if (sp->subsampling_convert_ycbcrimage!=0)
Packit 7838c8
			_TIFFfree(sp->subsampling_convert_ycbcrimage);
Packit 7838c8
		if (sp->skip_buffer!=0)
Packit 7838c8
			_TIFFfree(sp->skip_buffer);
Packit 7838c8
		_TIFFfree(sp);
Packit 7838c8
		tif->tif_data=NULL;
Packit 7838c8
		_TIFFSetDefaultCompressionState(tif);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGSubsamplingCorrect(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGSubsamplingCorrect";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 mh;
Packit 7838c8
	uint8 mv;
Packit 7838c8
        _TIFFFillStriles( tif );
Packit 7838c8
        
Packit 7838c8
	assert(sp->subsamplingcorrect_done==0);
Packit 7838c8
	if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) &&
Packit 7838c8
	    (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB)))
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsampling_tag!=0)
Packit 7838c8
			TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel");
Packit 7838c8
		sp->subsampling_hor=1;
Packit 7838c8
		sp->subsampling_ver=1;
Packit 7838c8
		sp->subsampling_force_desubsampling_inside_decompression=0;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		sp->subsamplingcorrect_done=1;
Packit 7838c8
		mh=sp->subsampling_hor;
Packit 7838c8
		mv=sp->subsampling_ver;
Packit 7838c8
		sp->subsamplingcorrect=1;
Packit 7838c8
		OJPEGReadHeaderInfoSec(tif);
Packit 7838c8
		if (sp->subsampling_force_desubsampling_inside_decompression!=0)
Packit 7838c8
		{
Packit 7838c8
			sp->subsampling_hor=1;
Packit 7838c8
			sp->subsampling_ver=1;
Packit 7838c8
		}
Packit 7838c8
		sp->subsamplingcorrect=0;
Packit 7838c8
		if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0))
Packit 7838c8
		{
Packit 7838c8
			if (sp->subsampling_tag==0)
Packit 7838c8
				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);
Packit 7838c8
			else
Packit 7838c8
				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);
Packit 7838c8
		}
Packit 7838c8
		if (sp->subsampling_force_desubsampling_inside_decompression!=0)
Packit 7838c8
		{
Packit 7838c8
			if (sp->subsampling_tag==0)
Packit 7838c8
				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");
Packit 7838c8
			else
Packit 7838c8
				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);
Packit 7838c8
		}
Packit 7838c8
		if (sp->subsampling_force_desubsampling_inside_decompression==0)
Packit 7838c8
		{
Packit 7838c8
			if (sp->subsampling_hor<sp->subsampling_ver)
Packit 7838c8
				TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	sp->subsamplingcorrect_done=1;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfo(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfo";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(sp->readheader_done==0);
Packit 7838c8
	sp->image_width=tif->tif_dir.td_imagewidth;
Packit 7838c8
	sp->image_length=tif->tif_dir.td_imagelength;
Packit 7838c8
	if isTiled(tif)
Packit 7838c8
	{
Packit 7838c8
		sp->strile_width=tif->tif_dir.td_tilewidth;
Packit 7838c8
		sp->strile_length=tif->tif_dir.td_tilelength;
Packit 7838c8
		sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		sp->strile_width=sp->image_width;
Packit 7838c8
		sp->strile_length=tif->tif_dir.td_rowsperstrip;
Packit 7838c8
		sp->strile_length_total=sp->image_length;
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_dir.td_samplesperpixel==1)
Packit 7838c8
	{
Packit 7838c8
		sp->samples_per_pixel=1;
Packit 7838c8
		sp->plane_sample_offset=0;
Packit 7838c8
		sp->samples_per_pixel_per_plane=sp->samples_per_pixel;
Packit 7838c8
		sp->subsampling_hor=1;
Packit 7838c8
		sp->subsampling_ver=1;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		if (tif->tif_dir.td_samplesperpixel!=3)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel);
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		sp->samples_per_pixel=3;
Packit 7838c8
		sp->plane_sample_offset=0;
Packit 7838c8
		if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)
Packit 7838c8
			sp->samples_per_pixel_per_plane=3;
Packit 7838c8
		else
Packit 7838c8
			sp->samples_per_pixel_per_plane=1;
Packit 7838c8
	}
Packit 7838c8
	if (sp->strile_length<sp->image_length)
Packit 7838c8
	{
Packit 7838c8
		if (sp->strile_length%(sp->subsampling_ver*8)!=0)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		sp->restart_interval=(uint16)(((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8)));
Packit 7838c8
	}
Packit 7838c8
	if (OJPEGReadHeaderInfoSec(tif)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	sp->sos_end[0].log=1;
Packit 7838c8
	sp->sos_end[0].in_buffer_source=sp->in_buffer_source;
Packit 7838c8
	sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile;
Packit 7838c8
	sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
Packit 7838c8
	sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo; 
Packit 7838c8
	sp->readheader_done=1;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadSecondarySos(TIFF* tif, uint16 s)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	assert(s>0);
Packit 7838c8
	assert(s<3);
Packit 7838c8
	assert(sp->sos_end[0].log!=0);
Packit 7838c8
	assert(sp->sos_end[s].log==0);
Packit 7838c8
	sp->plane_sample_offset=(uint8)(s-1);
Packit 7838c8
	while(sp->sos_end[sp->plane_sample_offset].log==0)
Packit 7838c8
		sp->plane_sample_offset--;
Packit 7838c8
	sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source;
Packit 7838c8
	sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile;
Packit 7838c8
	sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos;
Packit 7838c8
	sp->in_buffer_file_pos_log=0;
Packit 7838c8
	sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo;
Packit 7838c8
	sp->in_buffer_togo=0;
Packit 7838c8
	sp->in_buffer_cur=0;
Packit 7838c8
	while(sp->plane_sample_offset
Packit 7838c8
	{
Packit 7838c8
		do
Packit 7838c8
		{
Packit 7838c8
			if (OJPEGReadByte(sp,&m)==0)
Packit 7838c8
				return(0);
Packit 7838c8
			if (m==255)
Packit 7838c8
			{
Packit 7838c8
				do
Packit 7838c8
				{
Packit 7838c8
					if (OJPEGReadByte(sp,&m)==0)
Packit 7838c8
						return(0);
Packit 7838c8
					if (m!=255)
Packit 7838c8
						break;
Packit 7838c8
				} while(1);
Packit 7838c8
				if (m==JPEG_MARKER_SOS)
Packit 7838c8
					break;
Packit 7838c8
			}
Packit 7838c8
		} while(1);
Packit 7838c8
		sp->plane_sample_offset++;
Packit 7838c8
		if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		sp->sos_end[sp->plane_sample_offset].log=1;
Packit 7838c8
		sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source;
Packit 7838c8
		sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile;
Packit 7838c8
		sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
Packit 7838c8
		sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGWriteHeaderInfo(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGWriteHeaderInfo";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8** m;
Packit 7838c8
	uint32 n;
Packit 7838c8
	/* if a previous attempt failed, don't try again */
Packit 7838c8
	if (sp->libjpeg_session_active != 0) 
Packit 7838c8
		return 0;
Packit 7838c8
	sp->out_state=ososSoi;
Packit 7838c8
	sp->restart_index=0;
Packit 7838c8
	jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr));
Packit 7838c8
	sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
Packit 7838c8
	sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
Packit 7838c8
	sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr);
Packit 7838c8
	sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif;
Packit 7838c8
	if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
Packit 7838c8
		return(0);
Packit 7838c8
	sp->libjpeg_session_active=1;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource;
Packit 7838c8
	sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr);
Packit 7838c8
	if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1))
Packit 7838c8
	{
Packit 7838c8
		sp->libjpeg_jpeg_decompress_struct.raw_data_out=1;
Packit 7838c8
#if JPEG_LIB_VERSION >= 70
Packit 7838c8
		sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE;
Packit 7838c8
#endif
Packit 7838c8
		sp->libjpeg_jpeg_query_style=0;
Packit 7838c8
		if (sp->subsampling_convert_log==0)
Packit 7838c8
		{
Packit 7838c8
			assert(sp->subsampling_convert_ycbcrbuf==0);
Packit 7838c8
			assert(sp->subsampling_convert_ycbcrimage==0);
Packit 7838c8
			sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8);
Packit 7838c8
			sp->subsampling_convert_ylines=sp->subsampling_ver*8;
Packit 7838c8
			sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor;
Packit 7838c8
			sp->subsampling_convert_clines=8;
Packit 7838c8
			sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines;
Packit 7838c8
			sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines;
Packit 7838c8
			sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen;
Packit 7838c8
			sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen);
Packit 7838c8
			if (sp->subsampling_convert_ycbcrbuf==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf;
Packit 7838c8
			sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen;
Packit 7838c8
			sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen;
Packit 7838c8
			sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines;
Packit 7838c8
			sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*));
Packit 7838c8
			if (sp->subsampling_convert_ycbcrimage==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			m=sp->subsampling_convert_ycbcrimage;
Packit 7838c8
			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3);
Packit 7838c8
			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines);
Packit 7838c8
			*m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines);
Packit 7838c8
			for (n=0; n<sp->subsampling_convert_ylines; n++)
Packit 7838c8
				*m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen;
Packit 7838c8
			for (n=0; n<sp->subsampling_convert_clines; n++)
Packit 7838c8
				*m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen;
Packit 7838c8
			for (n=0; n<sp->subsampling_convert_clines; n++)
Packit 7838c8
				*m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen;
Packit 7838c8
			sp->subsampling_convert_clinelenout=((sp->strile_width+sp->subsampling_hor-1)/sp->subsampling_hor);
Packit 7838c8
			sp->subsampling_convert_state=0;
Packit 7838c8
			sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2);
Packit 7838c8
			sp->lines_per_strile=((sp->strile_length+sp->subsampling_ver-1)/sp->subsampling_ver);
Packit 7838c8
			sp->subsampling_convert_log=1;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN;
Packit 7838c8
		sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN;
Packit 7838c8
		sp->libjpeg_jpeg_query_style=1;
Packit 7838c8
		sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width;
Packit 7838c8
		sp->lines_per_strile=sp->strile_length;
Packit 7838c8
	}
Packit 7838c8
	if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
Packit 7838c8
		return(0);
Packit 7838c8
	sp->writeheader_done=1;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegSessionAbort(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(sp->libjpeg_session_active!=0);
Packit 7838c8
	jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct)));
Packit 7838c8
	sp->libjpeg_session_active=0;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSec(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSec";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	uint16 n;
Packit 7838c8
	uint8 o;
Packit 7838c8
	if (sp->file_size==0)
Packit 7838c8
		sp->file_size=TIFFGetFileSize(tif);
Packit 7838c8
	if (sp->jpeg_interchange_format!=0)
Packit 7838c8
	{
Packit 7838c8
		if (sp->jpeg_interchange_format>=sp->file_size)
Packit 7838c8
		{
Packit 7838c8
			sp->jpeg_interchange_format=0;
Packit 7838c8
			sp->jpeg_interchange_format_length=0;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size))
Packit 7838c8
				sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	sp->in_buffer_source=osibsNotSetYet;
Packit 7838c8
	sp->in_buffer_next_strile=0;
Packit 7838c8
	sp->in_buffer_strile_count=tif->tif_dir.td_nstrips;
Packit 7838c8
	sp->in_buffer_file_togo=0;
Packit 7838c8
	sp->in_buffer_togo=0;
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadBytePeek(sp,&m)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (m!=255)
Packit 7838c8
			break;
Packit 7838c8
		OJPEGReadByteAdvance(sp);
Packit 7838c8
		do
Packit 7838c8
		{
Packit 7838c8
			if (OJPEGReadByte(sp,&m)==0)
Packit 7838c8
				return(0);
Packit 7838c8
		} while(m==255);
Packit 7838c8
		switch(m)
Packit 7838c8
		{
Packit 7838c8
			case JPEG_MARKER_SOI:
Packit 7838c8
				/* this type of marker has no data, and should be skipped */
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_COM:
Packit 7838c8
			case JPEG_MARKER_APP0:
Packit 7838c8
			case JPEG_MARKER_APP0+1:
Packit 7838c8
			case JPEG_MARKER_APP0+2:
Packit 7838c8
			case JPEG_MARKER_APP0+3:
Packit 7838c8
			case JPEG_MARKER_APP0+4:
Packit 7838c8
			case JPEG_MARKER_APP0+5:
Packit 7838c8
			case JPEG_MARKER_APP0+6:
Packit 7838c8
			case JPEG_MARKER_APP0+7:
Packit 7838c8
			case JPEG_MARKER_APP0+8:
Packit 7838c8
			case JPEG_MARKER_APP0+9:
Packit 7838c8
			case JPEG_MARKER_APP0+10:
Packit 7838c8
			case JPEG_MARKER_APP0+11:
Packit 7838c8
			case JPEG_MARKER_APP0+12:
Packit 7838c8
			case JPEG_MARKER_APP0+13:
Packit 7838c8
			case JPEG_MARKER_APP0+14:
Packit 7838c8
			case JPEG_MARKER_APP0+15:
Packit 7838c8
				/* this type of marker has data, but it has no use to us (and no place here) and should be skipped */
Packit 7838c8
				if (OJPEGReadWord(sp,&n)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				if (n<2)
Packit 7838c8
				{
Packit 7838c8
					if (sp->subsamplingcorrect==0)
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
				if (n>2)
Packit 7838c8
					OJPEGReadSkip(sp,n-2);
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_DRI:
Packit 7838c8
				if (OJPEGReadHeaderInfoSecStreamDri(tif)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_DQT:
Packit 7838c8
				if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_DHT:
Packit 7838c8
				if (OJPEGReadHeaderInfoSecStreamDht(tif)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_SOF0:
Packit 7838c8
			case JPEG_MARKER_SOF1:
Packit 7838c8
			case JPEG_MARKER_SOF3:
Packit 7838c8
				if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				if (sp->subsamplingcorrect!=0)
Packit 7838c8
					return(1);
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_SOS:
Packit 7838c8
				if (sp->subsamplingcorrect!=0)
Packit 7838c8
					return(1);
Packit 7838c8
				assert(sp->plane_sample_offset==0);
Packit 7838c8
				if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				break;
Packit 7838c8
			default:
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m);
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
	} while(m!=JPEG_MARKER_SOS);
Packit 7838c8
	if (sp->subsamplingcorrect)
Packit 7838c8
		return(1);
Packit 7838c8
	if (sp->sof_log==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		sp->sof_marker_id=JPEG_MARKER_SOF0;
Packit 7838c8
		for (o=0; o<sp->samples_per_pixel; o++)
Packit 7838c8
			sp->sof_c[o]=o;
Packit 7838c8
		sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver);
Packit 7838c8
		for (o=1; o<sp->samples_per_pixel; o++)
Packit 7838c8
			sp->sof_hv[o]=17;
Packit 7838c8
		sp->sof_x=sp->strile_width;
Packit 7838c8
		sp->sof_y=sp->strile_length_total;
Packit 7838c8
		sp->sof_log=1;
Packit 7838c8
		if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		for (o=1; o<sp->samples_per_pixel; o++)
Packit 7838c8
			sp->sos_cs[o]=o;
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecStreamDri(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	/* This could easily cause trouble in some cases... but no such cases have
Packit 7838c8
           occurred so far */
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecStreamDri";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint16 m;
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (m!=4)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	sp->restart_interval=m;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	/* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecStreamDqt";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint16 m;
Packit 7838c8
	uint32 na;
Packit 7838c8
	uint8* nb;
Packit 7838c8
	uint8 o;
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (m<=2)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (sp->subsamplingcorrect!=0)
Packit 7838c8
		OJPEGReadSkip(sp,m-2);
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		m-=2;
Packit 7838c8
		do
Packit 7838c8
		{
Packit 7838c8
			if (m<65)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			na=sizeof(uint32)+69;
Packit 7838c8
			nb=_TIFFmalloc(na);
Packit 7838c8
			if (nb==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			*(uint32*)nb=na;
Packit 7838c8
			nb[sizeof(uint32)]=255;
Packit 7838c8
			nb[sizeof(uint32)+1]=JPEG_MARKER_DQT;
Packit 7838c8
			nb[sizeof(uint32)+2]=0;
Packit 7838c8
			nb[sizeof(uint32)+3]=67;
Packit 7838c8
			if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) {
Packit 7838c8
				_TIFFfree(nb);
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			o=nb[sizeof(uint32)+4]&1;;
Packit 7838c8
			if (3
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
Packit 7838c8
				_TIFFfree(nb);
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			if (sp->qtable[o]!=0)
Packit 7838c8
				_TIFFfree(sp->qtable[o]);
Packit 7838c8
			sp->qtable[o]=nb;
Packit 7838c8
			m-=65;
Packit 7838c8
		} while(m>0);
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecStreamDht(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	/* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
Packit 7838c8
	/* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecStreamDht";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint16 m;
Packit 7838c8
	uint32 na;
Packit 7838c8
	uint8* nb;
Packit 7838c8
	uint8 o;
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (m<=2)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (sp->subsamplingcorrect!=0)
Packit 7838c8
	{
Packit 7838c8
		OJPEGReadSkip(sp,m-2);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		na=sizeof(uint32)+2+m;
Packit 7838c8
		nb=_TIFFmalloc(na);
Packit 7838c8
		if (nb==0)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		*(uint32*)nb=na;
Packit 7838c8
		nb[sizeof(uint32)]=255;
Packit 7838c8
		nb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
Packit 7838c8
		nb[sizeof(uint32)+2]=(m>>8);
Packit 7838c8
		nb[sizeof(uint32)+3]=(m&255);
Packit 7838c8
		if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) {
Packit 7838c8
                        _TIFFfree(nb);
Packit 7838c8
			return(0);
Packit 7838c8
                }
Packit 7838c8
		o=nb[sizeof(uint32)+4];
Packit 7838c8
		if ((o&240)==0)
Packit 7838c8
		{
Packit 7838c8
			if (3
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
Packit 7838c8
                                _TIFFfree(nb);
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			if (sp->dctable[o]!=0)
Packit 7838c8
				_TIFFfree(sp->dctable[o]);
Packit 7838c8
			sp->dctable[o]=nb;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			if ((o&240)!=16)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
Packit 7838c8
                                _TIFFfree(nb);
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			o&=15;
Packit 7838c8
			if (3
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
Packit 7838c8
                                _TIFFfree(nb);
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			if (sp->actable[o]!=0)
Packit 7838c8
				_TIFFfree(sp->actable[o]);
Packit 7838c8
			sp->actable[o]=nb;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id)
Packit 7838c8
{
Packit 7838c8
	/* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecStreamSof";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint16 m;
Packit 7838c8
	uint16 n;
Packit 7838c8
	uint8 o;
Packit 7838c8
	uint16 p;
Packit 7838c8
	uint16 q;
Packit 7838c8
	if (sp->sof_log!=0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (sp->subsamplingcorrect==0)
Packit 7838c8
		sp->sof_marker_id=marker_id;
Packit 7838c8
	/* Lf: data length */
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (m<11)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	m-=8;
Packit 7838c8
	if (m%3!=0)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	n=m/3;
Packit 7838c8
	if (sp->subsamplingcorrect==0)
Packit 7838c8
	{
Packit 7838c8
		if (n!=sp->samples_per_pixel)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	/* P: Sample precision */
Packit 7838c8
	if (OJPEGReadByte(sp,&o)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (o!=8)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	/* Y: Number of lines, X: Number of samples per line */
Packit 7838c8
	if (sp->subsamplingcorrect)
Packit 7838c8
		OJPEGReadSkip(sp,4);
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		/* Y: Number of lines */
Packit 7838c8
		if (OJPEGReadWord(sp,&p)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (((uint32)p<sp->image_length) && ((uint32)p<sp->strile_length_total))
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		sp->sof_y=p;
Packit 7838c8
		/* X: Number of samples per line */
Packit 7838c8
		if (OJPEGReadWord(sp,&p)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (((uint32)p<sp->image_width) && ((uint32)p<sp->strile_width))
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		if ((uint32)p>sp->strile_width)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data image width exceeds expected image width");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		sp->sof_x=p;
Packit 7838c8
	}
Packit 7838c8
	/* Nf: Number of image components in frame */
Packit 7838c8
	if (OJPEGReadByte(sp,&o)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (o!=n)
Packit 7838c8
	{
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	/* per component stuff */
Packit 7838c8
	/* 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 */
Packit 7838c8
	for (q=0; q
Packit 7838c8
	{
Packit 7838c8
		/* C: Component identifier */
Packit 7838c8
		if (OJPEGReadByte(sp,&o)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			sp->sof_c[q]=o;
Packit 7838c8
		/* H: Horizontal sampling factor, and V: Vertical sampling factor */
Packit 7838c8
		if (OJPEGReadByte(sp,&o)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (sp->subsamplingcorrect!=0)
Packit 7838c8
		{
Packit 7838c8
			if (q==0)
Packit 7838c8
			{
Packit 7838c8
				sp->subsampling_hor=(o>>4);
Packit 7838c8
				sp->subsampling_ver=(o&15);
Packit 7838c8
				if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) ||
Packit 7838c8
					((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4)))
Packit 7838c8
					sp->subsampling_force_desubsampling_inside_decompression=1;
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				if (o!=17)
Packit 7838c8
					sp->subsampling_force_desubsampling_inside_decompression=1;
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			sp->sof_hv[q]=o;
Packit 7838c8
			if (sp->subsampling_force_desubsampling_inside_decompression==0)
Packit 7838c8
			{
Packit 7838c8
				if (q==0)
Packit 7838c8
				{
Packit 7838c8
					if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver))
Packit 7838c8
					{
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
Packit 7838c8
						return(0);
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
				else
Packit 7838c8
				{
Packit 7838c8
					if (o!=17)
Packit 7838c8
					{
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
Packit 7838c8
						return(0);
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		/* Tq: Quantization table destination selector */
Packit 7838c8
		if (OJPEGReadByte(sp,&o)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (sp->subsamplingcorrect==0)
Packit 7838c8
			sp->sof_tq[q]=o;
Packit 7838c8
	}
Packit 7838c8
	if (sp->subsamplingcorrect==0)
Packit 7838c8
		sp->sof_log=1;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecStreamSos(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	/* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecStreamSos";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint16 m;
Packit 7838c8
	uint8 n;
Packit 7838c8
	uint8 o;
Packit 7838c8
	assert(sp->subsamplingcorrect==0);
Packit 7838c8
	if (sp->sof_log==0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	/* Ls */
Packit 7838c8
	if (OJPEGReadWord(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (m!=6+sp->samples_per_pixel_per_plane*2)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	/* Ns */
Packit 7838c8
	if (OJPEGReadByte(sp,&n)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	if (n!=sp->samples_per_pixel_per_plane)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	/* Cs, Td, and Ta */
Packit 7838c8
	for (o=0; o<sp->samples_per_pixel_per_plane; o++)
Packit 7838c8
	{
Packit 7838c8
		/* Cs */
Packit 7838c8
		if (OJPEGReadByte(sp,&n)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		sp->sos_cs[sp->plane_sample_offset+o]=n;
Packit 7838c8
		/* Td and Ta */
Packit 7838c8
		if (OJPEGReadByte(sp,&n)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		sp->sos_tda[sp->plane_sample_offset+o]=n;
Packit 7838c8
	}
Packit 7838c8
	/* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */
Packit 7838c8
	OJPEGReadSkip(sp,3);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecTablesQTable";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	uint8 n;
Packit 7838c8
	uint32 oa;
Packit 7838c8
	uint8* ob;
Packit 7838c8
	uint32 p;
Packit 7838c8
	if (sp->qtable_offset[0]==0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	sp->in_buffer_file_pos_log=0;
Packit 7838c8
	for (m=0; m<sp->samples_per_pixel; m++)
Packit 7838c8
	{
Packit 7838c8
		if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1])))
Packit 7838c8
		{
Packit 7838c8
			for (n=0; n
Packit 7838c8
			{
Packit 7838c8
				if (sp->qtable_offset[m]==sp->qtable_offset[n])
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			oa=sizeof(uint32)+69;
Packit 7838c8
			ob=_TIFFmalloc(oa);
Packit 7838c8
			if (ob==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			*(uint32*)ob=oa;
Packit 7838c8
			ob[sizeof(uint32)]=255;
Packit 7838c8
			ob[sizeof(uint32)+1]=JPEG_MARKER_DQT;
Packit 7838c8
			ob[sizeof(uint32)+2]=0;
Packit 7838c8
			ob[sizeof(uint32)+3]=67;
Packit 7838c8
			ob[sizeof(uint32)+4]=m;
Packit 7838c8
			TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); 
Packit 7838c8
			p=(uint32)TIFFReadFile(tif,&ob[sizeof(uint32)+5],64);
Packit 7838c8
			if (p!=64)
Packit 7838c8
                        {
Packit 7838c8
                                _TIFFfree(ob);
Packit 7838c8
				return(0);
Packit 7838c8
                        }
Packit 7838c8
			if (sp->qtable[m]!=0)
Packit 7838c8
				_TIFFfree(sp->qtable[m]);
Packit 7838c8
			sp->qtable[m]=ob;
Packit 7838c8
			sp->sof_tq[m]=m;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
			sp->sof_tq[m]=sp->sof_tq[m-1];
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	uint8 n;
Packit 7838c8
	uint8 o[16];
Packit 7838c8
	uint32 p;
Packit 7838c8
	uint32 q;
Packit 7838c8
	uint32 ra;
Packit 7838c8
	uint8* rb;
Packit 7838c8
	if (sp->dctable_offset[0]==0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	sp->in_buffer_file_pos_log=0;
Packit 7838c8
	for (m=0; m<sp->samples_per_pixel; m++)
Packit 7838c8
	{
Packit 7838c8
		if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1])))
Packit 7838c8
		{
Packit 7838c8
			for (n=0; n
Packit 7838c8
			{
Packit 7838c8
				if (sp->dctable_offset[m]==sp->dctable_offset[n])
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET);
Packit 7838c8
			p=(uint32)TIFFReadFile(tif,o,16);
Packit 7838c8
			if (p!=16)
Packit 7838c8
				return(0);
Packit 7838c8
			q=0;
Packit 7838c8
			for (n=0; n<16; n++)
Packit 7838c8
				q+=o[n];
Packit 7838c8
			ra=sizeof(uint32)+21+q;
Packit 7838c8
			rb=_TIFFmalloc(ra);
Packit 7838c8
			if (rb==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			*(uint32*)rb=ra;
Packit 7838c8
			rb[sizeof(uint32)]=255;
Packit 7838c8
			rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
Packit 7838c8
			rb[sizeof(uint32)+2]=(uint8)((19+q)>>8);
Packit 7838c8
			rb[sizeof(uint32)+3]=((19+q)&255);
Packit 7838c8
			rb[sizeof(uint32)+4]=m;
Packit 7838c8
			for (n=0; n<16; n++)
Packit 7838c8
				rb[sizeof(uint32)+5+n]=o[n];
Packit 7838c8
			p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
Packit 7838c8
			if (p!=q)
Packit 7838c8
                        {
Packit 7838c8
                                _TIFFfree(rb);
Packit 7838c8
				return(0);
Packit 7838c8
                        }
Packit 7838c8
			if (sp->dctable[m]!=0)
Packit 7838c8
				_TIFFfree(sp->dctable[m]);
Packit 7838c8
			sp->dctable[m]=rb;
Packit 7838c8
			sp->sos_tda[m]=(m<<4);
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
			sp->sos_tda[m]=sp->sos_tda[m-1];
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable";
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	uint8 n;
Packit 7838c8
	uint8 o[16];
Packit 7838c8
	uint32 p;
Packit 7838c8
	uint32 q;
Packit 7838c8
	uint32 ra;
Packit 7838c8
	uint8* rb;
Packit 7838c8
	if (sp->actable_offset[0]==0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	sp->in_buffer_file_pos_log=0;
Packit 7838c8
	for (m=0; m<sp->samples_per_pixel; m++)
Packit 7838c8
	{
Packit 7838c8
		if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1])))
Packit 7838c8
		{
Packit 7838c8
			for (n=0; n
Packit 7838c8
			{
Packit 7838c8
				if (sp->actable_offset[m]==sp->actable_offset[n])
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value");
Packit 7838c8
					return(0);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET);  
Packit 7838c8
			p=(uint32)TIFFReadFile(tif,o,16);
Packit 7838c8
			if (p!=16)
Packit 7838c8
				return(0);
Packit 7838c8
			q=0;
Packit 7838c8
			for (n=0; n<16; n++)
Packit 7838c8
				q+=o[n];
Packit 7838c8
			ra=sizeof(uint32)+21+q;
Packit 7838c8
			rb=_TIFFmalloc(ra);
Packit 7838c8
			if (rb==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
				return(0);
Packit 7838c8
			}
Packit 7838c8
			*(uint32*)rb=ra;
Packit 7838c8
			rb[sizeof(uint32)]=255;
Packit 7838c8
			rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
Packit 7838c8
			rb[sizeof(uint32)+2]=(uint8)((19+q)>>8);
Packit 7838c8
			rb[sizeof(uint32)+3]=((19+q)&255);
Packit 7838c8
			rb[sizeof(uint32)+4]=(16|m);
Packit 7838c8
			for (n=0; n<16; n++)
Packit 7838c8
				rb[sizeof(uint32)+5+n]=o[n];
Packit 7838c8
			p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
Packit 7838c8
			if (p!=q)
Packit 7838c8
                        {
Packit 7838c8
                                _TIFFfree(rb);
Packit 7838c8
				return(0);
Packit 7838c8
                        }
Packit 7838c8
			if (sp->actable[m]!=0)
Packit 7838c8
				_TIFFfree(sp->actable[m]);
Packit 7838c8
			sp->actable[m]=rb;
Packit 7838c8
			sp->sos_tda[m]=(sp->sos_tda[m]|m);
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
			sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15));
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadBufferFill(OJPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	uint16 m;
Packit 7838c8
	tmsize_t n;
Packit 7838c8
	/* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made
Packit 7838c8
	 * in any other case, seek or read errors should be passed through */
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		if (sp->in_buffer_file_togo!=0)
Packit 7838c8
		{
Packit 7838c8
			if (sp->in_buffer_file_pos_log==0)
Packit 7838c8
			{
Packit 7838c8
				TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET);
Packit 7838c8
				sp->in_buffer_file_pos_log=1;
Packit 7838c8
			}
Packit 7838c8
			m=OJPEG_BUFFER;
Packit 7838c8
			if ((uint64)m>sp->in_buffer_file_togo)
Packit 7838c8
				m=(uint16)sp->in_buffer_file_togo;
Packit 7838c8
			n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m);
Packit 7838c8
			if (n==0)
Packit 7838c8
				return(0);
Packit 7838c8
			assert(n>0);
Packit 7838c8
			assert(n<=OJPEG_BUFFER);
Packit 7838c8
			assert(n<65536);
Packit 7838c8
			assert((uint64)n<=sp->in_buffer_file_togo);
Packit 7838c8
			m=(uint16)n;
Packit 7838c8
			sp->in_buffer_togo=m;
Packit 7838c8
			sp->in_buffer_cur=sp->in_buffer;
Packit 7838c8
			sp->in_buffer_file_togo-=m;
Packit 7838c8
			sp->in_buffer_file_pos+=m;
Packit 7838c8
			break;
Packit 7838c8
		}
Packit 7838c8
		sp->in_buffer_file_pos_log=0;
Packit 7838c8
		switch(sp->in_buffer_source)
Packit 7838c8
		{
Packit 7838c8
			case osibsNotSetYet:
Packit 7838c8
				if (sp->jpeg_interchange_format!=0)
Packit 7838c8
				{
Packit 7838c8
					sp->in_buffer_file_pos=sp->jpeg_interchange_format;
Packit 7838c8
					sp->in_buffer_file_togo=sp->jpeg_interchange_format_length;
Packit 7838c8
				}
Packit 7838c8
				sp->in_buffer_source=osibsJpegInterchangeFormat;
Packit 7838c8
				break;
Packit 7838c8
			case osibsJpegInterchangeFormat:
Packit 7838c8
				sp->in_buffer_source=osibsStrile;
Packit 7838c8
                                break;
Packit 7838c8
			case osibsStrile:
Packit 7838c8
				if (!_TIFFFillStriles( sp->tif ) 
Packit 7838c8
				    || sp->tif->tif_dir.td_stripoffset == NULL
Packit 7838c8
				    || sp->tif->tif_dir.td_stripbytecount == NULL)
Packit 7838c8
					return 0;
Packit 7838c8
Packit 7838c8
				if (sp->in_buffer_next_strile==sp->in_buffer_strile_count)
Packit 7838c8
					sp->in_buffer_source=osibsEof;
Packit 7838c8
				else
Packit 7838c8
				{
Packit 7838c8
					sp->in_buffer_file_pos=sp->tif->tif_dir.td_stripoffset[sp->in_buffer_next_strile];
Packit 7838c8
					if (sp->in_buffer_file_pos!=0)
Packit 7838c8
					{
Packit 7838c8
						if (sp->in_buffer_file_pos>=sp->file_size)
Packit 7838c8
							sp->in_buffer_file_pos=0;
Packit 7838c8
						else if (sp->tif->tif_dir.td_stripbytecount==NULL)
Packit 7838c8
							sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
Packit 7838c8
						else
Packit 7838c8
						{
Packit 7838c8
							if (sp->tif->tif_dir.td_stripbytecount == 0) {
Packit 7838c8
								TIFFErrorExt(sp->tif->tif_clientdata,sp->tif->tif_name,"Strip byte counts are missing");
Packit 7838c8
								return(0);
Packit 7838c8
							}
Packit 7838c8
							sp->in_buffer_file_togo=sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile];
Packit 7838c8
							if (sp->in_buffer_file_togo==0)
Packit 7838c8
								sp->in_buffer_file_pos=0;
Packit 7838c8
							else if (sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size)
Packit 7838c8
								sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
Packit 7838c8
						}
Packit 7838c8
					}
Packit 7838c8
					sp->in_buffer_next_strile++;
Packit 7838c8
				}
Packit 7838c8
				break;
Packit 7838c8
			default:
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
	} while (1);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadByte(OJPEGState* sp, uint8* byte)
Packit 7838c8
{
Packit 7838c8
	if (sp->in_buffer_togo==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadBufferFill(sp)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		assert(sp->in_buffer_togo>0);
Packit 7838c8
	}
Packit 7838c8
	*byte=*(sp->in_buffer_cur);
Packit 7838c8
	sp->in_buffer_cur++;
Packit 7838c8
	sp->in_buffer_togo--;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadBytePeek(OJPEGState* sp, uint8* byte)
Packit 7838c8
{
Packit 7838c8
	if (sp->in_buffer_togo==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadBufferFill(sp)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		assert(sp->in_buffer_togo>0);
Packit 7838c8
	}
Packit 7838c8
	*byte=*(sp->in_buffer_cur);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGReadByteAdvance(OJPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	assert(sp->in_buffer_togo>0);
Packit 7838c8
	sp->in_buffer_cur++;
Packit 7838c8
	sp->in_buffer_togo--;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadWord(OJPEGState* sp, uint16* word)
Packit 7838c8
{
Packit 7838c8
	uint8 m;
Packit 7838c8
	if (OJPEGReadByte(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	*word=(m<<8);
Packit 7838c8
	if (OJPEGReadByte(sp,&m)==0)
Packit 7838c8
		return(0);
Packit 7838c8
	*word|=m;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem)
Packit 7838c8
{
Packit 7838c8
	uint16 mlen;
Packit 7838c8
	uint8* mmem;
Packit 7838c8
	uint16 n;
Packit 7838c8
	assert(len>0);
Packit 7838c8
	mlen=len;
Packit 7838c8
	mmem=mem;
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		if (sp->in_buffer_togo==0)
Packit 7838c8
		{
Packit 7838c8
			if (OJPEGReadBufferFill(sp)==0)
Packit 7838c8
				return(0);
Packit 7838c8
			assert(sp->in_buffer_togo>0);
Packit 7838c8
		}
Packit 7838c8
		n=mlen;
Packit 7838c8
		if (n>sp->in_buffer_togo)
Packit 7838c8
			n=sp->in_buffer_togo;
Packit 7838c8
		_TIFFmemcpy(mmem,sp->in_buffer_cur,n);
Packit 7838c8
		sp->in_buffer_cur+=n;
Packit 7838c8
		sp->in_buffer_togo-=n;
Packit 7838c8
		mlen-=n;
Packit 7838c8
		mmem+=n;
Packit 7838c8
	} while(mlen>0);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGReadSkip(OJPEGState* sp, uint16 len)
Packit 7838c8
{
Packit 7838c8
	uint16 m;
Packit 7838c8
	uint16 n;
Packit 7838c8
	m=len;
Packit 7838c8
	n=m;
Packit 7838c8
	if (n>sp->in_buffer_togo)
Packit 7838c8
		n=sp->in_buffer_togo;
Packit 7838c8
	sp->in_buffer_cur+=n;
Packit 7838c8
	sp->in_buffer_togo-=n;
Packit 7838c8
	m-=n;
Packit 7838c8
	if (m>0)
Packit 7838c8
	{
Packit 7838c8
		assert(sp->in_buffer_togo==0);
Packit 7838c8
		n=m;
Packit 7838c8
		if ((uint64)n>sp->in_buffer_file_togo)
Packit 7838c8
			n=(uint16)sp->in_buffer_file_togo;
Packit 7838c8
		sp->in_buffer_file_pos+=n;
Packit 7838c8
		sp->in_buffer_file_togo-=n;
Packit 7838c8
		sp->in_buffer_file_pos_log=0;
Packit 7838c8
		/* we don't skip past jpeginterchangeformat/strile block...
Packit 7838c8
		 * if that is asked from us, we're dealing with totally bazurk
Packit 7838c8
		 * data anyway, and we've not seen this happening on any
Packit 7838c8
		 * testfile, so we might as well likely cause some other
Packit 7838c8
		 * meaningless error to be passed at some later time
Packit 7838c8
		 */
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGWriteStream(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	*len=0;
Packit 7838c8
	do
Packit 7838c8
	{
Packit 7838c8
		assert(sp->out_state<=ososEoi);
Packit 7838c8
		switch(sp->out_state)
Packit 7838c8
		{
Packit 7838c8
			case ososSoi:
Packit 7838c8
				OJPEGWriteStreamSoi(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososQTable0:
Packit 7838c8
				OJPEGWriteStreamQTable(tif,0,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososQTable1:
Packit 7838c8
				OJPEGWriteStreamQTable(tif,1,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososQTable2:
Packit 7838c8
				OJPEGWriteStreamQTable(tif,2,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososQTable3:
Packit 7838c8
				OJPEGWriteStreamQTable(tif,3,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososDcTable0:
Packit 7838c8
				OJPEGWriteStreamDcTable(tif,0,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososDcTable1:
Packit 7838c8
				OJPEGWriteStreamDcTable(tif,1,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososDcTable2:
Packit 7838c8
				OJPEGWriteStreamDcTable(tif,2,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososDcTable3:
Packit 7838c8
				OJPEGWriteStreamDcTable(tif,3,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososAcTable0:
Packit 7838c8
				OJPEGWriteStreamAcTable(tif,0,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososAcTable1:
Packit 7838c8
				OJPEGWriteStreamAcTable(tif,1,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososAcTable2:
Packit 7838c8
				OJPEGWriteStreamAcTable(tif,2,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososAcTable3:
Packit 7838c8
				OJPEGWriteStreamAcTable(tif,3,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososDri:
Packit 7838c8
				OJPEGWriteStreamDri(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososSof:
Packit 7838c8
				OJPEGWriteStreamSof(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososSos:
Packit 7838c8
				OJPEGWriteStreamSos(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososCompressed:
Packit 7838c8
				if (OJPEGWriteStreamCompressed(tif,mem,len)==0)
Packit 7838c8
					return(0);
Packit 7838c8
				break;
Packit 7838c8
			case ososRst:
Packit 7838c8
				OJPEGWriteStreamRst(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
			case ososEoi:
Packit 7838c8
				OJPEGWriteStreamEoi(tif,mem,len);
Packit 7838c8
				break;
Packit 7838c8
		}
Packit 7838c8
	} while (*len==0);
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(OJPEG_BUFFER>=2);
Packit 7838c8
	sp->out_buffer[0]=255;
Packit 7838c8
	sp->out_buffer[1]=JPEG_MARKER_SOI;
Packit 7838c8
	*len=2;
Packit 7838c8
	*mem=(void*)sp->out_buffer;
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	if (sp->qtable[table_index]!=0)
Packit 7838c8
	{
Packit 7838c8
		*mem=(void*)(sp->qtable[table_index]+sizeof(uint32));
Packit 7838c8
		*len=*((uint32*)sp->qtable[table_index])-sizeof(uint32);
Packit 7838c8
	}
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	if (sp->dctable[table_index]!=0)
Packit 7838c8
	{
Packit 7838c8
		*mem=(void*)(sp->dctable[table_index]+sizeof(uint32));
Packit 7838c8
		*len=*((uint32*)sp->dctable[table_index])-sizeof(uint32);
Packit 7838c8
	}
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	if (sp->actable[table_index]!=0)
Packit 7838c8
	{
Packit 7838c8
		*mem=(void*)(sp->actable[table_index]+sizeof(uint32));
Packit 7838c8
		*len=*((uint32*)sp->actable[table_index])-sizeof(uint32);
Packit 7838c8
	}
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(OJPEG_BUFFER>=6);
Packit 7838c8
	if (sp->restart_interval!=0)
Packit 7838c8
	{
Packit 7838c8
		sp->out_buffer[0]=255;
Packit 7838c8
		sp->out_buffer[1]=JPEG_MARKER_DRI;
Packit 7838c8
		sp->out_buffer[2]=0;
Packit 7838c8
		sp->out_buffer[3]=4;
Packit 7838c8
		sp->out_buffer[4]=(sp->restart_interval>>8);
Packit 7838c8
		sp->out_buffer[5]=(sp->restart_interval&255);
Packit 7838c8
		*len=6;
Packit 7838c8
		*mem=(void*)sp->out_buffer;
Packit 7838c8
	}
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3);
Packit 7838c8
	assert(255>=8+sp->samples_per_pixel_per_plane*3);
Packit 7838c8
	sp->out_buffer[0]=255;
Packit 7838c8
	sp->out_buffer[1]=sp->sof_marker_id;
Packit 7838c8
	/* Lf */
Packit 7838c8
	sp->out_buffer[2]=0;
Packit 7838c8
	sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3;
Packit 7838c8
	/* P */
Packit 7838c8
	sp->out_buffer[4]=8;
Packit 7838c8
	/* Y */
Packit 7838c8
	sp->out_buffer[5]=(uint8)(sp->sof_y>>8);
Packit 7838c8
	sp->out_buffer[6]=(sp->sof_y&255);
Packit 7838c8
	/* X */
Packit 7838c8
	sp->out_buffer[7]=(uint8)(sp->sof_x>>8);
Packit 7838c8
	sp->out_buffer[8]=(sp->sof_x&255);
Packit 7838c8
	/* Nf */
Packit 7838c8
	sp->out_buffer[9]=sp->samples_per_pixel_per_plane;
Packit 7838c8
	for (m=0; m<sp->samples_per_pixel_per_plane; m++)
Packit 7838c8
	{
Packit 7838c8
		/* C */
Packit 7838c8
		sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m];
Packit 7838c8
		/* H and V */
Packit 7838c8
		sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m];
Packit 7838c8
		/* Tq */
Packit 7838c8
		sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m];
Packit 7838c8
	}
Packit 7838c8
	*len=10+sp->samples_per_pixel_per_plane*3;
Packit 7838c8
	*mem=(void*)sp->out_buffer;
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	uint8 m;
Packit 7838c8
	assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2);
Packit 7838c8
	assert(255>=6+sp->samples_per_pixel_per_plane*2);
Packit 7838c8
	sp->out_buffer[0]=255;
Packit 7838c8
	sp->out_buffer[1]=JPEG_MARKER_SOS;
Packit 7838c8
	/* Ls */
Packit 7838c8
	sp->out_buffer[2]=0;
Packit 7838c8
	sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2;
Packit 7838c8
	/* Ns */
Packit 7838c8
	sp->out_buffer[4]=sp->samples_per_pixel_per_plane;
Packit 7838c8
	for (m=0; m<sp->samples_per_pixel_per_plane; m++)
Packit 7838c8
	{
Packit 7838c8
		/* Cs */
Packit 7838c8
		sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m];
Packit 7838c8
		/* Td and Ta */
Packit 7838c8
		sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m];
Packit 7838c8
	}
Packit 7838c8
	/* Ss */
Packit 7838c8
	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0;
Packit 7838c8
	/* Se */
Packit 7838c8
	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63;
Packit 7838c8
	/* Ah and Al */
Packit 7838c8
	sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0;
Packit 7838c8
	*len=8+sp->samples_per_pixel_per_plane*2;
Packit 7838c8
	*mem=(void*)sp->out_buffer;
Packit 7838c8
	sp->out_state++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	if (sp->in_buffer_togo==0)
Packit 7838c8
	{
Packit 7838c8
		if (OJPEGReadBufferFill(sp)==0)
Packit 7838c8
			return(0);
Packit 7838c8
		assert(sp->in_buffer_togo>0);
Packit 7838c8
	}
Packit 7838c8
	*len=sp->in_buffer_togo;
Packit 7838c8
	*mem=(void*)sp->in_buffer_cur;
Packit 7838c8
	sp->in_buffer_togo=0;
Packit 7838c8
	if (sp->in_buffer_file_togo==0)
Packit 7838c8
	{
Packit 7838c8
		switch(sp->in_buffer_source)
Packit 7838c8
		{
Packit 7838c8
			case osibsStrile:
Packit 7838c8
				if (sp->in_buffer_next_strile<sp->in_buffer_strile_count)
Packit 7838c8
					sp->out_state=ososRst;
Packit 7838c8
				else
Packit 7838c8
					sp->out_state=ososEoi;
Packit 7838c8
				break;
Packit 7838c8
			case osibsEof:
Packit 7838c8
				sp->out_state=ososEoi;
Packit 7838c8
				break;
Packit 7838c8
			default:
Packit 7838c8
				break;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(OJPEG_BUFFER>=2);
Packit 7838c8
	sp->out_buffer[0]=255;
Packit 7838c8
	sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index;
Packit 7838c8
	sp->restart_index++;
Packit 7838c8
	if (sp->restart_index==8)
Packit 7838c8
		sp->restart_index=0;
Packit 7838c8
	*len=2;
Packit 7838c8
	*mem=(void*)sp->out_buffer;
Packit 7838c8
	sp->out_state=ososCompressed;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	assert(OJPEG_BUFFER>=2);
Packit 7838c8
	sp->out_buffer[0]=255;
Packit 7838c8
	sp->out_buffer[1]=JPEG_MARKER_EOI;
Packit 7838c8
	*len=2;
Packit 7838c8
	*mem=(void*)sp->out_buffer;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static int
Packit 7838c8
jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	if( SETJMP(sp->exit_jmpbuf) )
Packit 7838c8
		return 0;
Packit 7838c8
	else {
Packit 7838c8
		jpeg_create_decompress(cinfo);
Packit 7838c8
		return 1;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static int
Packit 7838c8
jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image)
Packit 7838c8
{
Packit 7838c8
	if( SETJMP(sp->exit_jmpbuf) )
Packit 7838c8
		return 0;
Packit 7838c8
	else {
Packit 7838c8
		jpeg_read_header(cinfo,require_image);
Packit 7838c8
		return 1;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static int
Packit 7838c8
jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	if( SETJMP(sp->exit_jmpbuf) )
Packit 7838c8
		return 0;
Packit 7838c8
	else {
Packit 7838c8
		jpeg_start_decompress(cinfo);
Packit 7838c8
		return 1;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static int
Packit 7838c8
jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines)
Packit 7838c8
{
Packit 7838c8
	if( SETJMP(sp->exit_jmpbuf) )
Packit 7838c8
		return 0;
Packit 7838c8
	else {
Packit 7838c8
		jpeg_read_scanlines(cinfo,scanlines,max_lines);
Packit 7838c8
		return 1;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static int
Packit 7838c8
jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines)
Packit 7838c8
{
Packit 7838c8
	if( SETJMP(sp->exit_jmpbuf) )
Packit 7838c8
		return 0;
Packit 7838c8
	else {
Packit 7838c8
		jpeg_read_raw_data(cinfo,data,max_lines);
Packit 7838c8
		return 1;
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifndef LIBJPEG_ENCAP_EXTERNAL
Packit 7838c8
static void
Packit 7838c8
jpeg_encap_unwind(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	LONGJMP(sp->exit_jmpbuf,1);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	char buffer[JMSG_LENGTH_MAX];
Packit 7838c8
	(*cinfo->err->format_message)(cinfo,buffer);
Packit 7838c8
	TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	char buffer[JMSG_LENGTH_MAX];
Packit 7838c8
	(*cinfo->err->format_message)(cinfo,buffer);
Packit 7838c8
	TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
Packit 7838c8
	jpeg_encap_unwind((TIFF*)(cinfo->client_data));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	(void)cinfo;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static boolean
Packit 7838c8
OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	TIFF* tif=(TIFF*)cinfo->client_data;
Packit 7838c8
	OJPEGState* sp=(OJPEGState*)tif->tif_data;
Packit 7838c8
	void* mem=0;
Packit 7838c8
	uint32 len=0U;
Packit 7838c8
	if (OJPEGWriteStream(tif,&mem,&len)==0)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data");
Packit 7838c8
		jpeg_encap_unwind(tif);
Packit 7838c8
	}
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len;
Packit 7838c8
	sp->libjpeg_jpeg_source_mgr.next_input_byte=mem;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes)
Packit 7838c8
{
Packit 7838c8
	TIFF* tif=(TIFF*)cinfo->client_data;
Packit 7838c8
	(void)num_bytes;
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
Packit 7838c8
	jpeg_encap_unwind(tif);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef _MSC_VER
Packit 7838c8
#pragma warning( push )
Packit 7838c8
#pragma warning( disable : 4702 ) /* unreachable code */
Packit 7838c8
#endif
Packit 7838c8
static boolean
Packit 7838c8
OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired)
Packit 7838c8
{
Packit 7838c8
	TIFF* tif=(TIFF*)cinfo->client_data;
Packit 7838c8
	(void)desired;
Packit 7838c8
	TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
Packit 7838c8
	jpeg_encap_unwind(tif);
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
#ifdef _MSC_VER
Packit 7838c8
#pragma warning( pop ) 
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo)
Packit 7838c8
{
Packit 7838c8
	(void)cinfo;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Local Variables:
Packit 7838c8
 * mode: c
Packit 7838c8
 * c-basic-offset: 8
Packit 7838c8
 * fill-column: 78
Packit 7838c8
 * End:
Packit 7838c8
 */