Blame libtiff/tif_jpeg.c

Packit 7838c8
/* $Id: tif_jpeg.c,v 1.134 2017-10-17 19:04:47 erouault Exp $ */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Copyright (c) 1994-1997 Sam Leffler
Packit 7838c8
 * Copyright (c) 1994-1997 Silicon Graphics, Inc.
Packit 7838c8
 *
Packit 7838c8
 * Permission to use, copy, modify, distribute, and sell this software and 
Packit 7838c8
 * its documentation for any purpose is hereby granted without fee, provided
Packit 7838c8
 * that (i) the above copyright notices and this permission notice appear in
Packit 7838c8
 * all copies of the software and related documentation, and (ii) the names of
Packit 7838c8
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit 7838c8
 * publicity relating to the software without the specific, prior written
Packit 7838c8
 * permission of Sam Leffler and Silicon Graphics.
Packit 7838c8
 * 
Packit 7838c8
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
Packit 7838c8
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
Packit 7838c8
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
Packit 7838c8
 * 
Packit 7838c8
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS 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
Packit 7838c8
#define WIN32_LEAN_AND_MEAN
Packit 7838c8
#define VC_EXTRALEAN
Packit 7838c8
Packit 7838c8
#include <stdlib.h>
Packit 7838c8
Packit 7838c8
#include "tiffiop.h"
Packit 7838c8
#ifdef JPEG_SUPPORT
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * TIFF Library
Packit 7838c8
 *
Packit 7838c8
 * JPEG Compression support per TIFF Technical Note #2
Packit 7838c8
 * (*not* per the original TIFF 6.0 spec).
Packit 7838c8
 *
Packit 7838c8
 * This file is simply an interface to the libjpeg library written by
Packit 7838c8
 * the Independent JPEG Group.  You need release 5 or later of the IJG
Packit 7838c8
 * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
Packit 7838c8
 *
Packit 7838c8
 * Contributed by Tom Lane <tgl@sss.pgh.pa.us>.
Packit 7838c8
 */
Packit 7838c8
#include <setjmp.h>
Packit 7838c8
Packit 7838c8
int TIFFFillStrip(TIFF* tif, uint32 strip);
Packit 7838c8
int TIFFFillTile(TIFF* tif, uint32 tile);
Packit 7838c8
int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode );
Packit 7838c8
int TIFFJPEGIsFullStripRequired_12(TIFF* tif);
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
/*
Packit 7838c8
   The windows RPCNDR.H file defines boolean, but defines it with the
Packit 7838c8
   unsigned char size.  You should compile JPEG library using appropriate
Packit 7838c8
   definitions in jconfig.h header, but many users compile library in wrong
Packit 7838c8
   way. That causes errors of the following type:
Packit 7838c8
Packit 7838c8
   "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432,
Packit 7838c8
   caller expects 464"
Packit 7838c8
Packit 7838c8
   For such users we wil fix the problem here. See install.doc file from
Packit 7838c8
   the JPEG library distribution for details.
Packit 7838c8
*/
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
/* 
Packit 7838c8
 * Do we want to do special processing suitable for when JSAMPLE is a
Packit 7838c8
 * 16bit value?  
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
#if defined(JPEG_LIB_MK1)
Packit 7838c8
#  define JPEG_LIB_MK1_OR_12BIT 1
Packit 7838c8
#elif BITS_IN_JSAMPLE == 12
Packit 7838c8
#  define JPEG_LIB_MK1_OR_12BIT 1
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * We are using width_in_blocks which is supposed to be private to
Packit 7838c8
 * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has
Packit 7838c8
 * renamed this member to width_in_data_units.  Since the header has
Packit 7838c8
 * also renamed a define, use that unique define name in order to
Packit 7838c8
 * detect the problem header and adjust to suit.
Packit 7838c8
 */
Packit 7838c8
#if defined(D_MAX_DATA_UNITS_IN_MCU)
Packit 7838c8
#define width_in_blocks width_in_data_units
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * On some machines it may be worthwhile to use _setjmp or sigsetjmp
Packit 7838c8
 * in place of plain setjmp.  These macros will make it easier.
Packit 7838c8
 */
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
Packit 7838c8
typedef struct jpeg_destination_mgr jpeg_destination_mgr;
Packit 7838c8
typedef struct jpeg_source_mgr jpeg_source_mgr;
Packit 7838c8
typedef struct jpeg_error_mgr jpeg_error_mgr;
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * State block for each open TIFF file using
Packit 7838c8
 * libjpeg to do JPEG compression/decompression.
Packit 7838c8
 *
Packit 7838c8
 * libjpeg's visible state is either a jpeg_compress_struct
Packit 7838c8
 * or jpeg_decompress_struct depending on which way we
Packit 7838c8
 * are going.  comm can be used to refer to the fields
Packit 7838c8
 * which are common to both.
Packit 7838c8
 *
Packit 7838c8
 * NB: cinfo is required to be the first member of JPEGState,
Packit 7838c8
 *     so we can safely cast JPEGState* -> jpeg_xxx_struct*
Packit 7838c8
 *     and vice versa!
Packit 7838c8
 */
Packit 7838c8
typedef struct {
Packit 7838c8
	union {
Packit 7838c8
		struct jpeg_compress_struct c;
Packit 7838c8
		struct jpeg_decompress_struct d;
Packit 7838c8
		struct jpeg_common_struct comm;
Packit 7838c8
	} cinfo;			/* NB: must be first */
Packit 7838c8
	int             cinfo_initialized;
Packit 7838c8
Packit 7838c8
	jpeg_error_mgr	err;		/* libjpeg error manager */
Packit 7838c8
	JMP_BUF		exit_jmpbuf;	/* for catching libjpeg failures */
Packit 7838c8
	
Packit 7838c8
	struct jpeg_progress_mgr progress;
Packit 7838c8
	/*
Packit 7838c8
	 * The following two members could be a union, but
Packit 7838c8
	 * they're small enough that it's not worth the effort.
Packit 7838c8
	 */
Packit 7838c8
	jpeg_destination_mgr dest;	/* data dest for compression */
Packit 7838c8
	jpeg_source_mgr	src;		/* data source for decompression */
Packit 7838c8
					/* private state */
Packit 7838c8
	TIFF*		tif;		/* back link needed by some code */
Packit 7838c8
	uint16		photometric;	/* copy of PhotometricInterpretation */
Packit 7838c8
	uint16		h_sampling;	/* luminance sampling factors */
Packit 7838c8
	uint16		v_sampling;
Packit 7838c8
	tmsize_t   	bytesperline;	/* decompressed bytes per scanline */
Packit 7838c8
	/* pointers to intermediate buffers when processing downsampled data */
Packit 7838c8
	JSAMPARRAY	ds_buffer[MAX_COMPONENTS];
Packit 7838c8
	int		scancount;	/* number of "scanlines" accumulated */
Packit 7838c8
	int		samplesperclump;
Packit 7838c8
Packit 7838c8
	TIFFVGetMethod	vgetparent;	/* super-class method */
Packit 7838c8
	TIFFVSetMethod	vsetparent;	/* super-class method */
Packit 7838c8
	TIFFPrintMethod printdir;	/* super-class method */
Packit 7838c8
	TIFFStripMethod	defsparent;	/* super-class method */
Packit 7838c8
	TIFFTileMethod	deftparent;	/* super-class method */
Packit 7838c8
					/* pseudo-tag fields */
Packit 7838c8
	void*		jpegtables;	/* JPEGTables tag value, or NULL */
Packit 7838c8
	uint32		jpegtables_length; /* number of bytes in same */
Packit 7838c8
	int		jpegquality;	/* Compression quality level */
Packit 7838c8
	int		jpegcolormode;	/* Auto RGB<=>YCbCr convert? */
Packit 7838c8
	int		jpegtablesmode;	/* What to put in JPEGTables */
Packit 7838c8
Packit 7838c8
        int             ycbcrsampling_fetched;
Packit 7838c8
        int             max_allowed_scan_number;
Packit 7838c8
} JPEGState;
Packit 7838c8
Packit 7838c8
#define	JState(tif)	((JPEGState*)(tif)->tif_data)
Packit 7838c8
Packit 7838c8
static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
static int JPEGInitializeLibJPEG(TIFF * tif, int decode );
Packit 7838c8
static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
Packit 7838c8
Packit 7838c8
#define	FIELD_JPEGTABLES	(FIELD_CODEC+0)
Packit 7838c8
Packit 7838c8
static const TIFFField jpegFields[] = {
Packit 7838c8
    { TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL },
Packit 7838c8
    { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
Packit 7838c8
    { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL },
Packit 7838c8
    { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL }
Packit 7838c8
};
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * libjpeg interface layer.
Packit 7838c8
 *
Packit 7838c8
 * We use setjmp/longjmp to return control to libtiff
Packit 7838c8
 * when a fatal error is encountered within the JPEG
Packit 7838c8
 * library.  We also direct libjpeg error and warning
Packit 7838c8
 * messages through the appropriate libtiff handlers.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Error handling routines (these replace corresponding
Packit 7838c8
 * IJG routines from jerror.c).  These are used for both
Packit 7838c8
 * compression and decompression.
Packit 7838c8
 */
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_error_exit(j_common_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = (JPEGState *) cinfo;	/* NB: cinfo assumed first */
Packit 7838c8
	char buffer[JMSG_LENGTH_MAX];
Packit 7838c8
Packit 7838c8
	(*cinfo->err->format_message) (cinfo, buffer);
Packit 7838c8
	TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer);		/* display the error message */
Packit 7838c8
	jpeg_abort(cinfo);			/* clean up libjpeg state */
Packit 7838c8
	LONGJMP(sp->exit_jmpbuf, 1);		/* return to libtiff caller */
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * This routine is invoked only for warning messages,
Packit 7838c8
 * since error_exit does its own thing and trace_level
Packit 7838c8
 * is never set > 0.
Packit 7838c8
 */
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_output_message(j_common_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	char buffer[JMSG_LENGTH_MAX];
Packit 7838c8
Packit 7838c8
	(*cinfo->err->format_message) (cinfo, buffer);
Packit 7838c8
	TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* Avoid the risk of denial-of-service on crafted JPEGs with an insane */
Packit 7838c8
/* number of scans. */
Packit 7838c8
/* See http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf */
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_progress_monitor(j_common_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
    JPEGState *sp = (JPEGState *) cinfo;	/* NB: cinfo assumed first */
Packit 7838c8
    if (cinfo->is_decompressor)
Packit 7838c8
    {
Packit 7838c8
        const int scan_no =
Packit 7838c8
            ((j_decompress_ptr)cinfo)->input_scan_number;
Packit 7838c8
        if (scan_no >= sp->max_allowed_scan_number)
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(((JPEGState *) cinfo)->tif->tif_clientdata, 
Packit 7838c8
                     "TIFFjpeg_progress_monitor",
Packit 7838c8
                     "Scan number %d exceeds maximum scans (%d). This limit "
Packit 7838c8
                     "can be raised through the LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER "
Packit 7838c8
                     "environment variable.",
Packit 7838c8
                     scan_no, sp->max_allowed_scan_number);
Packit 7838c8
Packit 7838c8
            jpeg_abort(cinfo);			/* clean up libjpeg state */
Packit 7838c8
            LONGJMP(sp->exit_jmpbuf, 1);		/* return to libtiff caller */
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Interface routines.  This layer of routines exists
Packit 7838c8
 * primarily to limit side-effects from using setjmp.
Packit 7838c8
 * Also, normal/error returns are converted into return
Packit 7838c8
 * values per libtiff practice.
Packit 7838c8
 */
Packit 7838c8
#define	CALLJPEG(sp, fail, op)	(SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
Packit 7838c8
#define	CALLVJPEG(sp, op)	CALLJPEG(sp, 0, ((op),1))
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_create_compress(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	/* initialize JPEG error handling */
Packit 7838c8
	sp->cinfo.c.err = jpeg_std_error(&sp->err);
Packit 7838c8
	sp->err.error_exit = TIFFjpeg_error_exit;
Packit 7838c8
	sp->err.output_message = TIFFjpeg_output_message;
Packit 7838c8
Packit 7838c8
	/* set client_data to avoid UMR warning from tools like Purify */
Packit 7838c8
	sp->cinfo.c.client_data = NULL;
Packit 7838c8
Packit 7838c8
	return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_create_decompress(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	/* initialize JPEG error handling */
Packit 7838c8
	sp->cinfo.d.err = jpeg_std_error(&sp->err);
Packit 7838c8
	sp->err.error_exit = TIFFjpeg_error_exit;
Packit 7838c8
	sp->err.output_message = TIFFjpeg_output_message;
Packit 7838c8
Packit 7838c8
	/* set client_data to avoid UMR warning from tools like Purify */
Packit 7838c8
	sp->cinfo.d.client_data = NULL;
Packit 7838c8
Packit 7838c8
	return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_set_defaults(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp,
Packit 7838c8
	    jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp,
Packit 7838c8
	    jpeg_start_compress(&sp->cinfo.c, write_all_tables));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
Packit 7838c8
	    scanlines, (JDIMENSION) num_lines));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
Packit 7838c8
	    data, (JDIMENSION) num_lines));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_finish_compress(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_write_tables(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_has_multiple_scans(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, 0, jpeg_has_multiple_scans(&sp->cinfo.d));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_start_decompress(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
        const char* sz_max_allowed_scan_number;
Packit 7838c8
        /* progress monitor */
Packit 7838c8
        sp->cinfo.d.progress = &sp->progress;
Packit 7838c8
        sp->progress.progress_monitor = TIFFjpeg_progress_monitor;
Packit 7838c8
        sp->max_allowed_scan_number = 100;
Packit 7838c8
        sz_max_allowed_scan_number = getenv("LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER");
Packit 7838c8
        if( sz_max_allowed_scan_number )
Packit 7838c8
            sp->max_allowed_scan_number = atoi(sz_max_allowed_scan_number);
Packit 7838c8
Packit 7838c8
	return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
Packit 7838c8
	    scanlines, (JDIMENSION) max_lines));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
Packit 7838c8
	    data, (JDIMENSION) max_lines));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_finish_decompress(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_abort(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_destroy(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static JSAMPARRAY
Packit 7838c8
TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
Packit 7838c8
		      JDIMENSION samplesperrow, JDIMENSION numrows)
Packit 7838c8
{
Packit 7838c8
	return CALLJPEG(sp, (JSAMPARRAY) NULL,
Packit 7838c8
	    (*sp->cinfo.comm.mem->alloc_sarray)
Packit 7838c8
		(&sp->cinfo.comm, pool_id, samplesperrow, numrows));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * JPEG library destination data manager.
Packit 7838c8
 * These routines direct compressed data from libjpeg into the
Packit 7838c8
 * libtiff output buffer.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
std_init_destination(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
	TIFF* tif = sp->tif;
Packit 7838c8
Packit 7838c8
	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
Packit 7838c8
	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static boolean
Packit 7838c8
std_empty_output_buffer(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
	TIFF* tif = sp->tif;
Packit 7838c8
Packit 7838c8
	/* the entire buffer has been filled */
Packit 7838c8
	tif->tif_rawcc = tif->tif_rawdatasize;
Packit 7838c8
Packit 7838c8
#ifdef IPPJ_HUFF
Packit 7838c8
       /*
Packit 7838c8
        * The Intel IPP performance library does not necessarily fill up
Packit 7838c8
        * the whole output buffer on each pass, so only dump out the parts
Packit 7838c8
        * that have been filled.
Packit 7838c8
        *   http://trac.osgeo.org/gdal/wiki/JpegIPP
Packit 7838c8
        */
Packit 7838c8
       if ( sp->dest.free_in_buffer >= 0 ) {
Packit 7838c8
               tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer;
Packit 7838c8
       }
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
	TIFFFlushData1(tif);
Packit 7838c8
	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
Packit 7838c8
	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
Packit 7838c8
Packit 7838c8
	return (TRUE);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
std_term_destination(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
	TIFF* tif = sp->tif;
Packit 7838c8
Packit 7838c8
	tif->tif_rawcp = (uint8*) sp->dest.next_output_byte;
Packit 7838c8
	tif->tif_rawcc =
Packit 7838c8
	    tif->tif_rawdatasize - (tmsize_t) sp->dest.free_in_buffer;
Packit 7838c8
	/* NB: libtiff does the final buffer flush */
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	(void) tif;
Packit 7838c8
	sp->cinfo.c.dest = &sp->dest;
Packit 7838c8
	sp->dest.init_destination = std_init_destination;
Packit 7838c8
	sp->dest.empty_output_buffer = std_empty_output_buffer;
Packit 7838c8
	sp->dest.term_destination = std_term_destination;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Alternate destination manager for outputting to JPEGTables field.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
tables_init_destination(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
Packit 7838c8
	/* while building, jpegtables_length is allocated buffer size */
Packit 7838c8
	sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
Packit 7838c8
	sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static boolean
Packit 7838c8
tables_empty_output_buffer(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
	void* newbuf;
Packit 7838c8
Packit 7838c8
	/* the entire buffer has been filled; enlarge it by 1000 bytes */
Packit 7838c8
	newbuf = _TIFFrealloc((void*) sp->jpegtables,
Packit 7838c8
			      (tmsize_t) (sp->jpegtables_length + 1000));
Packit 7838c8
	if (newbuf == NULL)
Packit 7838c8
		ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
Packit 7838c8
	sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
Packit 7838c8
	sp->dest.free_in_buffer = (size_t) 1000;
Packit 7838c8
	sp->jpegtables = newbuf;
Packit 7838c8
	sp->jpegtables_length += 1000;
Packit 7838c8
	return (TRUE);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
tables_term_destination(j_compress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
Packit 7838c8
	/* set tables length to number of bytes actually emitted */
Packit 7838c8
	sp->jpegtables_length -= (uint32) sp->dest.free_in_buffer;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	(void) tif;
Packit 7838c8
	/*
Packit 7838c8
	 * Allocate a working buffer for building tables.
Packit 7838c8
	 * Initial size is 1000 bytes, which is usually adequate.
Packit 7838c8
	 */
Packit 7838c8
	if (sp->jpegtables)
Packit 7838c8
		_TIFFfree(sp->jpegtables);
Packit 7838c8
	sp->jpegtables_length = 1000;
Packit 7838c8
	sp->jpegtables = (void*) _TIFFmalloc((tmsize_t) sp->jpegtables_length);
Packit 7838c8
	if (sp->jpegtables == NULL) {
Packit 7838c8
		sp->jpegtables_length = 0;
Packit 7838c8
		TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
	sp->cinfo.c.dest = &sp->dest;
Packit 7838c8
	sp->dest.init_destination = tables_init_destination;
Packit 7838c8
	sp->dest.empty_output_buffer = tables_empty_output_buffer;
Packit 7838c8
	sp->dest.term_destination = tables_term_destination;
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * JPEG library source data manager.
Packit 7838c8
 * These routines supply compressed data to libjpeg.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
std_init_source(j_decompress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
	TIFF* tif = sp->tif;
Packit 7838c8
Packit 7838c8
	sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
Packit 7838c8
	sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static boolean
Packit 7838c8
std_fill_input_buffer(j_decompress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState* ) cinfo;
Packit 7838c8
	static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
Packit 7838c8
Packit 7838c8
#ifdef IPPJ_HUFF
Packit 7838c8
        /*
Packit 7838c8
         * The Intel IPP performance library does not necessarily read the whole
Packit 7838c8
         * input buffer in one pass, so it is possible to get here with data
Packit 7838c8
         * yet to read. 
Packit 7838c8
         * 
Packit 7838c8
         * We just return without doing anything, until the entire buffer has
Packit 7838c8
         * been read.  
Packit 7838c8
         * http://trac.osgeo.org/gdal/wiki/JpegIPP
Packit 7838c8
         */
Packit 7838c8
        if( sp->src.bytes_in_buffer > 0 ) {
Packit 7838c8
            return (TRUE);
Packit 7838c8
        }
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
         * Normally the whole strip/tile is read and so we don't need to do
Packit 7838c8
         * a fill.  In the case of CHUNKY_STRIP_READ_SUPPORT we might not have
Packit 7838c8
         * all the data, but the rawdata is refreshed between scanlines and
Packit 7838c8
         * we push this into the io machinery in JPEGDecode(). 	 
Packit 7838c8
         * http://trac.osgeo.org/gdal/ticket/3894
Packit 7838c8
	 */
Packit 7838c8
        
Packit 7838c8
	WARNMS(cinfo, JWRN_JPEG_EOF);
Packit 7838c8
	/* insert a fake EOI marker */
Packit 7838c8
	sp->src.next_input_byte = dummy_EOI;
Packit 7838c8
	sp->src.bytes_in_buffer = 2;
Packit 7838c8
	return (TRUE);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
Packit 7838c8
	if (num_bytes > 0) {
Packit 7838c8
		if ((size_t)num_bytes > sp->src.bytes_in_buffer) {
Packit 7838c8
			/* oops, buffer overrun */
Packit 7838c8
			(void) std_fill_input_buffer(cinfo);
Packit 7838c8
		} else {
Packit 7838c8
			sp->src.next_input_byte += (size_t) num_bytes;
Packit 7838c8
			sp->src.bytes_in_buffer -= (size_t) num_bytes;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
std_term_source(j_decompress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	/* No work necessary here */
Packit 7838c8
	(void) cinfo;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_data_src(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	sp->cinfo.d.src = &sp->src;
Packit 7838c8
	sp->src.init_source = std_init_source;
Packit 7838c8
	sp->src.fill_input_buffer = std_fill_input_buffer;
Packit 7838c8
	sp->src.skip_input_data = std_skip_input_data;
Packit 7838c8
	sp->src.resync_to_restart = jpeg_resync_to_restart;
Packit 7838c8
	sp->src.term_source = std_term_source;
Packit 7838c8
	sp->src.bytes_in_buffer = 0;		/* for safety */
Packit 7838c8
	sp->src.next_input_byte = NULL;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Alternate source manager for reading from JPEGTables.
Packit 7838c8
 * We can share all the code except for the init routine.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
tables_init_source(j_decompress_ptr cinfo)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = (JPEGState*) cinfo;
Packit 7838c8
Packit 7838c8
	sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
Packit 7838c8
	sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
TIFFjpeg_tables_src(JPEGState* sp)
Packit 7838c8
{
Packit 7838c8
	TIFFjpeg_data_src(sp);
Packit 7838c8
	sp->src.init_source = tables_init_source;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Allocate downsampled-data buffers needed for downsampled I/O.
Packit 7838c8
 * We use values computed in jpeg_start_compress or jpeg_start_decompress.
Packit 7838c8
 * We use libjpeg's allocator so that buffers will be released automatically
Packit 7838c8
 * when done with strip/tile.
Packit 7838c8
 * This is also a handy place to compute samplesperclump, bytesperline.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
Packit 7838c8
			  int num_components)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	int ci;
Packit 7838c8
	jpeg_component_info* compptr;
Packit 7838c8
	JSAMPARRAY buf;
Packit 7838c8
	int samples_per_clump = 0;
Packit 7838c8
Packit 7838c8
	for (ci = 0, compptr = comp_info; ci < num_components;
Packit 7838c8
	     ci++, compptr++) {
Packit 7838c8
		samples_per_clump += compptr->h_samp_factor *
Packit 7838c8
			compptr->v_samp_factor;
Packit 7838c8
		buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
Packit 7838c8
				compptr->width_in_blocks * DCTSIZE,
Packit 7838c8
				(JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
Packit 7838c8
		if (buf == NULL)
Packit 7838c8
			return (0);
Packit 7838c8
		sp->ds_buffer[ci] = buf;
Packit 7838c8
	}
Packit 7838c8
	sp->samplesperclump = samples_per_clump;
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * JPEG Decoding.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
Packit 7838c8
Packit 7838c8
#define JPEG_MARKER_SOF0 0xC0
Packit 7838c8
#define JPEG_MARKER_SOF1 0xC1
Packit 7838c8
#define JPEG_MARKER_SOF2 0xC2
Packit 7838c8
#define JPEG_MARKER_SOF9 0xC9
Packit 7838c8
#define JPEG_MARKER_SOF10 0xCA
Packit 7838c8
#define JPEG_MARKER_DHT 0xC4
Packit 7838c8
#define JPEG_MARKER_SOI 0xD8
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
struct JPEGFixupTagsSubsamplingData
Packit 7838c8
{
Packit 7838c8
	TIFF* tif;
Packit 7838c8
	void* buffer;
Packit 7838c8
	uint32 buffersize;
Packit 7838c8
	uint8* buffercurrentbyte;
Packit 7838c8
	uint32 bufferbytesleft;
Packit 7838c8
	uint64 fileoffset;
Packit 7838c8
	uint64 filebytesleft;
Packit 7838c8
	uint8 filepositioned;
Packit 7838c8
};
Packit 7838c8
static void JPEGFixupTagsSubsampling(TIFF* tif);
Packit 7838c8
static int JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data);
Packit 7838c8
static int JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result);
Packit 7838c8
static int JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result);
Packit 7838c8
static void JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength);
Packit 7838c8
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGFixupTags(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
Packit 7838c8
        JPEGState* sp = JState(tif);
Packit 7838c8
	if ((tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)&&
Packit 7838c8
	    (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
Packit 7838c8
	    (tif->tif_dir.td_samplesperpixel==3) &&
Packit 7838c8
            !sp->ycbcrsampling_fetched)
Packit 7838c8
		JPEGFixupTagsSubsampling(tif);
Packit 7838c8
#endif
Packit 7838c8
        
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
JPEGFixupTagsSubsampling(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	/*
Packit 7838c8
	 * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
Packit 7838c8
	 * the TIFF tags, but still use non-default (2,2) values within the jpeg
Packit 7838c8
	 * data stream itself.  In order for TIFF applications to work properly
Packit 7838c8
	 * - for instance to get the strip buffer size right - it is imperative
Packit 7838c8
	 * that the subsampling be available before we start reading the image
Packit 7838c8
	 * data normally.  This function will attempt to analyze the first strip in
Packit 7838c8
	 * order to get the sampling values from the jpeg data stream.
Packit 7838c8
	 *
Packit 7838c8
	 * Note that JPEGPreDeocode() will produce a fairly loud warning when the
Packit 7838c8
	 * discovered sampling does not match the default sampling (2,2) or whatever
Packit 7838c8
	 * was actually in the tiff tags.
Packit 7838c8
	 *
Packit 7838c8
	 * See the bug in bugzilla for details:
Packit 7838c8
	 *
Packit 7838c8
	 * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
Packit 7838c8
	 *
Packit 7838c8
	 * Frank Warmerdam, July 2002
Packit 7838c8
	 * Joris Van Damme, May 2007
Packit 7838c8
	 */
Packit 7838c8
	static const char module[] = "JPEGFixupTagsSubsampling";
Packit 7838c8
	struct JPEGFixupTagsSubsamplingData m;
Packit 7838c8
Packit 7838c8
        _TIFFFillStriles( tif );
Packit 7838c8
        
Packit 7838c8
        if( tif->tif_dir.td_stripbytecount == NULL
Packit 7838c8
            || tif->tif_dir.td_stripoffset == NULL
Packit 7838c8
            || tif->tif_dir.td_stripbytecount[0] == 0 )
Packit 7838c8
        {
Packit 7838c8
            /* Do not even try to check if the first strip/tile does not
Packit 7838c8
               yet exist, as occurs when GDAL has created a new NULL file
Packit 7838c8
               for instance. */
Packit 7838c8
            return;
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
	m.tif=tif;
Packit 7838c8
	m.buffersize=2048;
Packit 7838c8
	m.buffer=_TIFFmalloc(m.buffersize);
Packit 7838c8
	if (m.buffer==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata,module,
Packit 7838c8
		    "Unable to allocate memory for auto-correcting of subsampling values; auto-correcting skipped");
Packit 7838c8
		return;
Packit 7838c8
	}
Packit 7838c8
	m.buffercurrentbyte=NULL;
Packit 7838c8
	m.bufferbytesleft=0;
Packit 7838c8
	m.fileoffset=tif->tif_dir.td_stripoffset[0];
Packit 7838c8
	m.filepositioned=0;
Packit 7838c8
	m.filebytesleft=tif->tif_dir.td_stripbytecount[0];
Packit 7838c8
	if (!JPEGFixupTagsSubsamplingSec(&m))
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata,module,
Packit 7838c8
		    "Unable to auto-correct subsampling values, likely corrupt JPEG compressed data in first strip/tile; auto-correcting skipped");
Packit 7838c8
	_TIFFfree(m.buffer);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "JPEGFixupTagsSubsamplingSec";
Packit 7838c8
	uint8 m;
Packit 7838c8
	while (1)
Packit 7838c8
	{
Packit 7838c8
		while (1)
Packit 7838c8
		{
Packit 7838c8
			if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
Packit 7838c8
				return(0);
Packit 7838c8
			if (m==255)
Packit 7838c8
				break;
Packit 7838c8
		}
Packit 7838c8
		while (1)
Packit 7838c8
		{
Packit 7838c8
			if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
Packit 7838c8
				return(0);
Packit 7838c8
			if (m!=255)
Packit 7838c8
				break;
Packit 7838c8
		}
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
			case JPEG_MARKER_DQT:
Packit 7838c8
			case JPEG_MARKER_SOS:
Packit 7838c8
			case JPEG_MARKER_DHT:
Packit 7838c8
			case JPEG_MARKER_DRI:
Packit 7838c8
				/* this type of marker has data, but it has no use to us and should be skipped */
Packit 7838c8
				{
Packit 7838c8
					uint16 n;
Packit 7838c8
					if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
Packit 7838c8
						return(0);
Packit 7838c8
					if (n<2)
Packit 7838c8
						return(0);
Packit 7838c8
					n-=2;
Packit 7838c8
					if (n>0)
Packit 7838c8
						JPEGFixupTagsSubsamplingSkip(data,n);
Packit 7838c8
				}
Packit 7838c8
				break;
Packit 7838c8
			case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */
Packit 7838c8
			case JPEG_MARKER_SOF1: /* Extended sequential Huffman */
Packit 7838c8
			case JPEG_MARKER_SOF2: /* Progressive Huffman: normally not allowed by TechNote, but that doesn't hurt supporting it */
Packit 7838c8
			case JPEG_MARKER_SOF9: /* Extended sequential arithmetic */
Packit 7838c8
			case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not allowed by TechNote, but that doesn't hurt supporting it */
Packit 7838c8
				/* this marker contains the subsampling factors we're scanning for */
Packit 7838c8
				{
Packit 7838c8
					uint16 n;
Packit 7838c8
					uint16 o;
Packit 7838c8
					uint8 p;
Packit 7838c8
					uint8 ph,pv;
Packit 7838c8
					if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
Packit 7838c8
						return(0);
Packit 7838c8
					if (n!=8+data->tif->tif_dir.td_samplesperpixel*3)
Packit 7838c8
						return(0);
Packit 7838c8
					JPEGFixupTagsSubsamplingSkip(data,7);
Packit 7838c8
					if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
Packit 7838c8
						return(0);
Packit 7838c8
					ph=(p>>4);
Packit 7838c8
					pv=(p&15);
Packit 7838c8
					JPEGFixupTagsSubsamplingSkip(data,1);
Packit 7838c8
					for (o=1; o<data->tif->tif_dir.td_samplesperpixel; o++)
Packit 7838c8
					{
Packit 7838c8
						JPEGFixupTagsSubsamplingSkip(data,1);
Packit 7838c8
						if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
Packit 7838c8
							return(0);
Packit 7838c8
						if (p!=0x11)
Packit 7838c8
						{
Packit 7838c8
							TIFFWarningExt(data->tif->tif_clientdata,module,
Packit 7838c8
							    "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
Packit 7838c8
							return(1);
Packit 7838c8
						}
Packit 7838c8
						JPEGFixupTagsSubsamplingSkip(data,1);
Packit 7838c8
					}
Packit 7838c8
					if (((ph!=1)&&(ph!=2)&&(ph!=4))||((pv!=1)&&(pv!=2)&&(pv!=4)))
Packit 7838c8
					{
Packit 7838c8
						TIFFWarningExt(data->tif->tif_clientdata,module,
Packit 7838c8
						    "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
Packit 7838c8
						return(1);
Packit 7838c8
					}
Packit 7838c8
					if ((ph!=data->tif->tif_dir.td_ycbcrsubsampling[0])||(pv!=data->tif->tif_dir.td_ycbcrsubsampling[1]))
Packit 7838c8
					{
Packit 7838c8
						TIFFWarningExt(data->tif->tif_clientdata,module,
Packit 7838c8
						    "Auto-corrected former TIFF subsampling values [%d,%d] to match subsampling values inside JPEG compressed data [%d,%d]",
Packit 7838c8
						    (int)data->tif->tif_dir.td_ycbcrsubsampling[0],
Packit 7838c8
						    (int)data->tif->tif_dir.td_ycbcrsubsampling[1],
Packit 7838c8
						    (int)ph,(int)pv);
Packit 7838c8
						data->tif->tif_dir.td_ycbcrsubsampling[0]=ph;
Packit 7838c8
						data->tif->tif_dir.td_ycbcrsubsampling[1]=pv;
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
				return(1);
Packit 7838c8
			default:
Packit 7838c8
				return(0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result)
Packit 7838c8
{
Packit 7838c8
	if (data->bufferbytesleft==0)
Packit 7838c8
	{
Packit 7838c8
		uint32 m;
Packit 7838c8
		if (data->filebytesleft==0)
Packit 7838c8
			return(0);
Packit 7838c8
		if (!data->filepositioned)
Packit 7838c8
		{
Packit 7838c8
			TIFFSeekFile(data->tif,data->fileoffset,SEEK_SET);
Packit 7838c8
			data->filepositioned=1;
Packit 7838c8
		}
Packit 7838c8
		m=data->buffersize;
Packit 7838c8
		if ((uint64)m>data->filebytesleft)
Packit 7838c8
			m=(uint32)data->filebytesleft;
Packit 7838c8
		assert(m<0x80000000UL);
Packit 7838c8
		if (TIFFReadFile(data->tif,data->buffer,(tmsize_t)m)!=(tmsize_t)m)
Packit 7838c8
			return(0);
Packit 7838c8
		data->buffercurrentbyte=data->buffer;
Packit 7838c8
		data->bufferbytesleft=m;
Packit 7838c8
		data->fileoffset+=m;
Packit 7838c8
		data->filebytesleft-=m;
Packit 7838c8
	}
Packit 7838c8
	*result=*data->buffercurrentbyte;
Packit 7838c8
	data->buffercurrentbyte++;
Packit 7838c8
	data->bufferbytesleft--;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result)
Packit 7838c8
{
Packit 7838c8
	uint8 ma;
Packit 7838c8
	uint8 mb;
Packit 7838c8
	if (!JPEGFixupTagsSubsamplingReadByte(data,&ma))
Packit 7838c8
		return(0);
Packit 7838c8
	if (!JPEGFixupTagsSubsamplingReadByte(data,&mb))
Packit 7838c8
		return(0);
Packit 7838c8
	*result=(ma<<8)|mb;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength)
Packit 7838c8
{
Packit 7838c8
	if ((uint32)skiplength<=data->bufferbytesleft)
Packit 7838c8
	{
Packit 7838c8
		data->buffercurrentbyte+=skiplength;
Packit 7838c8
		data->bufferbytesleft-=skiplength;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		uint16 m;
Packit 7838c8
		m=(uint16)(skiplength-data->bufferbytesleft);
Packit 7838c8
		if (m<=data->filebytesleft)
Packit 7838c8
		{
Packit 7838c8
			data->bufferbytesleft=0;
Packit 7838c8
			data->fileoffset+=m;
Packit 7838c8
			data->filebytesleft-=m;
Packit 7838c8
			data->filepositioned=0;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			data->bufferbytesleft=0;
Packit 7838c8
			data->filebytesleft=0;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGSetupDecode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
Packit 7838c8
#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
Packit 7838c8
        if( tif->tif_dir.td_bitspersample == 12 )
Packit 7838c8
            return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 0 );
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
	JPEGInitializeLibJPEG( tif, TRUE );
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
	assert(sp->cinfo.comm.is_decompressor);
Packit 7838c8
Packit 7838c8
	/* Read JPEGTables if it is present */
Packit 7838c8
	if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
Packit 7838c8
		TIFFjpeg_tables_src(sp);
Packit 7838c8
		if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field");
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Grab parameters that are same for all strips/tiles */
Packit 7838c8
	sp->photometric = td->td_photometric;
Packit 7838c8
	switch (sp->photometric) {
Packit 7838c8
	case PHOTOMETRIC_YCBCR:
Packit 7838c8
		sp->h_sampling = td->td_ycbcrsubsampling[0];
Packit 7838c8
		sp->v_sampling = td->td_ycbcrsubsampling[1];
Packit 7838c8
		break;
Packit 7838c8
	default:
Packit 7838c8
		/* TIFF 6.0 forbids subsampling of all other color spaces */
Packit 7838c8
		sp->h_sampling = 1;
Packit 7838c8
		sp->v_sampling = 1;
Packit 7838c8
		break;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Set up for reading normal data */
Packit 7838c8
	TIFFjpeg_data_src(sp);
Packit 7838c8
	tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* Returns 1 if the full strip should be read, even when doing scanline per */
Packit 7838c8
/* scanline decoding. This happens when the JPEG stream uses multiple scans. */
Packit 7838c8
/* Currently only called in CHUNKY_STRIP_READ_SUPPORT mode through */
Packit 7838c8
/* scanline interface. */
Packit 7838c8
/* Only reads tif->tif_dir.td_bitspersample, tif->tif_rawdata and */
Packit 7838c8
/* tif->tif_rawcc members. */
Packit 7838c8
/* Can be called independently of the usual setup/predecode/decode states */
Packit 7838c8
int TIFFJPEGIsFullStripRequired(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
    int ret;
Packit 7838c8
    JPEGState state;
Packit 7838c8
Packit 7838c8
#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFJPEGIsFullStripRequired)
Packit 7838c8
    if( tif->tif_dir.td_bitspersample == 12 )
Packit 7838c8
        return TIFFJPEGIsFullStripRequired_12( tif );
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
    memset(&state, 0, sizeof(JPEGState));
Packit 7838c8
    state.tif = tif;
Packit 7838c8
Packit 7838c8
    TIFFjpeg_create_decompress(&state);
Packit 7838c8
Packit 7838c8
    TIFFjpeg_data_src(&state);
Packit 7838c8
Packit 7838c8
    if (TIFFjpeg_read_header(&state, TRUE) != JPEG_HEADER_OK)
Packit 7838c8
    {
Packit 7838c8
        TIFFjpeg_destroy(&state);
Packit 7838c8
        return (0);
Packit 7838c8
    }
Packit 7838c8
    ret = TIFFjpeg_has_multiple_scans(&state);
Packit 7838c8
Packit 7838c8
    TIFFjpeg_destroy(&state);
Packit 7838c8
Packit 7838c8
    return ret;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Set up for decoding a strip or tile.
Packit 7838c8
 */
Packit 7838c8
/*ARGSUSED*/ static int
Packit 7838c8
JPEGPreDecode(TIFF* tif, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
	static const char module[] = "JPEGPreDecode";
Packit 7838c8
	uint32 segment_width, segment_height;
Packit 7838c8
	int downsampled_output;
Packit 7838c8
	int ci;
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
  
Packit 7838c8
	if (sp->cinfo.comm.is_decompressor == 0)
Packit 7838c8
	{
Packit 7838c8
		tif->tif_setupdecode( tif );
Packit 7838c8
	}
Packit 7838c8
  
Packit 7838c8
	assert(sp->cinfo.comm.is_decompressor);
Packit 7838c8
	/*
Packit 7838c8
	 * Reset decoder state from any previous strip/tile,
Packit 7838c8
	 * in case application didn't read the whole strip.
Packit 7838c8
	 */
Packit 7838c8
	if (!TIFFjpeg_abort(sp))
Packit 7838c8
		return (0);
Packit 7838c8
	/*
Packit 7838c8
	 * Read the header for this strip/tile.
Packit 7838c8
	 */
Packit 7838c8
        
Packit 7838c8
	if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
Packit 7838c8
		return (0);
Packit 7838c8
Packit 7838c8
        tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
Packit 7838c8
        tif->tif_rawcc = sp->src.bytes_in_buffer;
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Check image parameters and set decompression parameters.
Packit 7838c8
	 */
Packit 7838c8
	if (isTiled(tif)) {
Packit 7838c8
                segment_width = td->td_tilewidth;
Packit 7838c8
                segment_height = td->td_tilelength;
Packit 7838c8
		sp->bytesperline = TIFFTileRowSize(tif);
Packit 7838c8
	} else {
Packit 7838c8
		segment_width = td->td_imagewidth;
Packit 7838c8
		segment_height = td->td_imagelength - tif->tif_row;
Packit 7838c8
		if (segment_height > td->td_rowsperstrip)
Packit 7838c8
			segment_height = td->td_rowsperstrip;
Packit 7838c8
		sp->bytesperline = TIFFScanlineSize(tif);
Packit 7838c8
	}
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
Packit 7838c8
		/*
Packit 7838c8
		 * For PC 2, scale down the expected strip/tile size
Packit 7838c8
		 * to match a downsampled component
Packit 7838c8
		 */
Packit 7838c8
		segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
Packit 7838c8
		segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
Packit 7838c8
	}
Packit 7838c8
	if (sp->cinfo.d.image_width < segment_width ||
Packit 7838c8
	    sp->cinfo.d.image_height < segment_height) {
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata, module,
Packit 7838c8
			       "Improper JPEG strip/tile size, "
Packit 7838c8
			       "expected %dx%d, got %dx%d",
Packit 7838c8
			       segment_width, segment_height,
Packit 7838c8
			       sp->cinfo.d.image_width,
Packit 7838c8
			       sp->cinfo.d.image_height);
Packit 7838c8
	}
Packit 7838c8
	if( sp->cinfo.d.image_width == segment_width &&
Packit 7838c8
	    sp->cinfo.d.image_height > segment_height &&
Packit 7838c8
	    tif->tif_row + segment_height == td->td_imagelength &&
Packit 7838c8
	    !isTiled(tif) ) {
Packit 7838c8
		/* Some files have a last strip, that should be truncated, */
Packit 7838c8
		/* but their JPEG codestream has still the maximum strip */
Packit 7838c8
		/* height. Warn about this as this is non compliant, but */
Packit 7838c8
		/* we can safely recover from that. */
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata, module,
Packit 7838c8
			     "JPEG strip size exceeds expected dimensions,"
Packit 7838c8
			     " expected %dx%d, got %dx%d",
Packit 7838c8
			     segment_width, segment_height,
Packit 7838c8
			     sp->cinfo.d.image_width, sp->cinfo.d.image_height);
Packit 7838c8
	}
Packit 7838c8
	else if (sp->cinfo.d.image_width > segment_width ||
Packit 7838c8
		 sp->cinfo.d.image_height > segment_height) {
Packit 7838c8
		/*
Packit 7838c8
		 * This case could be dangerous, if the strip or tile size has
Packit 7838c8
		 * been reported as less than the amount of data jpeg will
Packit 7838c8
		 * return, some potential security issues arise. Catch this
Packit 7838c8
		 * case and error out.
Packit 7838c8
		 */
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
			     "JPEG strip/tile size exceeds expected dimensions,"
Packit 7838c8
			     " expected %dx%d, got %dx%d",
Packit 7838c8
			     segment_width, segment_height,
Packit 7838c8
			     sp->cinfo.d.image_width, sp->cinfo.d.image_height);
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
	if (sp->cinfo.d.num_components !=
Packit 7838c8
	    (td->td_planarconfig == PLANARCONFIG_CONTIG ?
Packit 7838c8
	     td->td_samplesperpixel : 1)) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
#ifdef JPEG_LIB_MK1
Packit 7838c8
	if (12 != td->td_bitspersample && 8 != td->td_bitspersample) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
	sp->cinfo.d.data_precision = td->td_bitspersample;
Packit 7838c8
	sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
Packit 7838c8
#else
Packit 7838c8
	if (sp->cinfo.d.data_precision != td->td_bitspersample) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
        /* In some cases, libjpeg needs to allocate a lot of memory */
Packit 7838c8
        /* http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf */
Packit 7838c8
        if( TIFFjpeg_has_multiple_scans(sp) )
Packit 7838c8
        {
Packit 7838c8
            /* In this case libjpeg will need to allocate memory or backing */
Packit 7838c8
            /* store for all coefficients */
Packit 7838c8
            /* See call to jinit_d_coef_controller() from master_selection() */
Packit 7838c8
            /* in libjpeg */
Packit 7838c8
            toff_t nRequiredMemory = (toff_t)sp->cinfo.d.image_width *
Packit 7838c8
                                     sp->cinfo.d.image_height *
Packit 7838c8
                                     sp->cinfo.d.num_components *
Packit 7838c8
                                     ((td->td_bitspersample+7)/8);
Packit 7838c8
            /* BLOCK_SMOOTHING_SUPPORTED is generally defined, so we need */
Packit 7838c8
            /* to replicate the logic of jinit_d_coef_controller() */
Packit 7838c8
            if( sp->cinfo.d.progressive_mode )
Packit 7838c8
                nRequiredMemory *= 3;
Packit 7838c8
Packit 7838c8
#ifndef TIFF_LIBJPEG_LARGEST_MEM_ALLOC
Packit 7838c8
#define TIFF_LIBJPEG_LARGEST_MEM_ALLOC (100 * 1024 * 1024)
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
            if( nRequiredMemory > TIFF_LIBJPEG_LARGEST_MEM_ALLOC &&
Packit 7838c8
                getenv("LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC") == NULL )
Packit 7838c8
            {
Packit 7838c8
                    TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                        "Reading this strip would require libjpeg to allocate "
Packit 7838c8
                        "at least %u bytes. "
Packit 7838c8
                        "This is disabled since above the %u threshold. "
Packit 7838c8
                        "You may override this restriction by defining the "
Packit 7838c8
                        "LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC environment variable, "
Packit 7838c8
                        "or recompile libtiff by defining the "
Packit 7838c8
                        "TIFF_LIBJPEG_LARGEST_MEM_ALLOC macro to a value greater "
Packit 7838c8
                        "than %u",
Packit 7838c8
                        (unsigned)nRequiredMemory,
Packit 7838c8
                        (unsigned)TIFF_LIBJPEG_LARGEST_MEM_ALLOC,
Packit 7838c8
                        (unsigned)TIFF_LIBJPEG_LARGEST_MEM_ALLOC);
Packit 7838c8
                    return (0);
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
Packit 7838c8
		/* Component 0 should have expected sampling factors */
Packit 7838c8
		if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
Packit 7838c8
		    sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				       "Improper JPEG sampling factors %d,%d\n"
Packit 7838c8
				       "Apparently should be %d,%d.",
Packit 7838c8
				       sp->cinfo.d.comp_info[0].h_samp_factor,
Packit 7838c8
				       sp->cinfo.d.comp_info[0].v_samp_factor,
Packit 7838c8
				       sp->h_sampling, sp->v_sampling);
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
		/* Rest should have sampling factors 1,1 */
Packit 7838c8
		for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
Packit 7838c8
			if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
Packit 7838c8
			    sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	} else {
Packit 7838c8
		/* PC 2's single component should have sampling factors 1,1 */
Packit 7838c8
		if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
Packit 7838c8
		    sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	downsampled_output = FALSE;
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
Packit 7838c8
	    sp->photometric == PHOTOMETRIC_YCBCR &&
Packit 7838c8
	    sp->jpegcolormode == JPEGCOLORMODE_RGB) {
Packit 7838c8
		/* Convert YCbCr to RGB */
Packit 7838c8
		sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
Packit 7838c8
		sp->cinfo.d.out_color_space = JCS_RGB;
Packit 7838c8
	} else {
Packit 7838c8
		/* Suppress colorspace handling */
Packit 7838c8
		sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
Packit 7838c8
		sp->cinfo.d.out_color_space = JCS_UNKNOWN;
Packit 7838c8
		if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
Packit 7838c8
		    (sp->h_sampling != 1 || sp->v_sampling != 1))
Packit 7838c8
			downsampled_output = TRUE;
Packit 7838c8
		/* XXX what about up-sampling? */
Packit 7838c8
	}
Packit 7838c8
	if (downsampled_output) {
Packit 7838c8
		/* Need to use raw-data interface to libjpeg */
Packit 7838c8
		sp->cinfo.d.raw_data_out = TRUE;
Packit 7838c8
#if JPEG_LIB_VERSION >= 70
Packit 7838c8
		sp->cinfo.d.do_fancy_upsampling = FALSE;
Packit 7838c8
#endif /* JPEG_LIB_VERSION >= 70 */
Packit 7838c8
		tif->tif_decoderow = DecodeRowError;
Packit 7838c8
		tif->tif_decodestrip = JPEGDecodeRaw;
Packit 7838c8
		tif->tif_decodetile = JPEGDecodeRaw;
Packit 7838c8
	} else {
Packit 7838c8
		/* Use normal interface to libjpeg */
Packit 7838c8
		sp->cinfo.d.raw_data_out = FALSE;
Packit 7838c8
		tif->tif_decoderow = JPEGDecode;
Packit 7838c8
		tif->tif_decodestrip = JPEGDecode;
Packit 7838c8
		tif->tif_decodetile = JPEGDecode;  
Packit 7838c8
	}
Packit 7838c8
	/* Start JPEG decompressor */
Packit 7838c8
	if (!TIFFjpeg_start_decompress(sp))
Packit 7838c8
		return (0);
Packit 7838c8
	/* Allocate downsampled-data buffers if needed */
Packit 7838c8
	if (downsampled_output) {
Packit 7838c8
		if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
Packit 7838c8
					       sp->cinfo.d.num_components))
Packit 7838c8
			return (0);
Packit 7838c8
		sp->scancount = DCTSIZE;	/* mark buffer empty */
Packit 7838c8
	}
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Decode a chunk of pixels.
Packit 7838c8
 * "Standard" case: returned data is not downsampled.
Packit 7838c8
 */
Packit 7838c8
#if !JPEG_LIB_MK1_OR_12BIT
Packit 7838c8
static int
Packit 7838c8
JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	tmsize_t nrows;
Packit 7838c8
	(void) s;
Packit 7838c8
Packit 7838c8
        /*
Packit 7838c8
        ** Update available information, buffer may have been refilled
Packit 7838c8
        ** between decode requests
Packit 7838c8
        */
Packit 7838c8
	sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
Packit 7838c8
	sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
Packit 7838c8
Packit 7838c8
        if( sp->bytesperline == 0 )
Packit 7838c8
                return 0;
Packit 7838c8
        
Packit 7838c8
	nrows = cc / sp->bytesperline;
Packit 7838c8
	if (cc % sp->bytesperline)
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
                               "fractional scanline not read");
Packit 7838c8
Packit 7838c8
	if( nrows > (tmsize_t) sp->cinfo.d.image_height )
Packit 7838c8
		nrows = sp->cinfo.d.image_height;
Packit 7838c8
Packit 7838c8
	/* data is expected to be read in multiples of a scanline */
Packit 7838c8
	if (nrows)
Packit 7838c8
        {
Packit 7838c8
                do
Packit 7838c8
                {
Packit 7838c8
                        /*
Packit 7838c8
                         * In the libjpeg6b-9a 8bit case.  We read directly into
Packit 7838c8
                         * the TIFF buffer.
Packit 7838c8
                         */
Packit 7838c8
                        JSAMPROW bufptr = (JSAMPROW)buf;
Packit 7838c8
Packit 7838c8
                        if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
Packit 7838c8
                                return (0);
Packit 7838c8
Packit 7838c8
                        ++tif->tif_row;
Packit 7838c8
                        buf += sp->bytesperline;
Packit 7838c8
                        cc -= sp->bytesperline;
Packit 7838c8
                } while (--nrows > 0);
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
        /* Update information on consumed data */
Packit 7838c8
        tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
Packit 7838c8
        tif->tif_rawcc = sp->src.bytes_in_buffer;
Packit 7838c8
                
Packit 7838c8
	/* Close down the decompressor if we've finished the strip or tile. */
Packit 7838c8
	return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
Packit 7838c8
                || TIFFjpeg_finish_decompress(sp);
Packit 7838c8
}
Packit 7838c8
#endif /* !JPEG_LIB_MK1_OR_12BIT */
Packit 7838c8
Packit 7838c8
#if JPEG_LIB_MK1_OR_12BIT
Packit 7838c8
/*ARGSUSED*/ static int
Packit 7838c8
JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	tmsize_t nrows;
Packit 7838c8
	(void) s;
Packit 7838c8
Packit 7838c8
        /*
Packit 7838c8
        ** Update available information, buffer may have been refilled
Packit 7838c8
        ** between decode requests
Packit 7838c8
        */
Packit 7838c8
	sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
Packit 7838c8
	sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
Packit 7838c8
Packit 7838c8
        if( sp->bytesperline == 0 )
Packit 7838c8
                return 0;
Packit 7838c8
        
Packit 7838c8
	nrows = cc / sp->bytesperline;
Packit 7838c8
	if (cc % sp->bytesperline)
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
                               "fractional scanline not read");
Packit 7838c8
Packit 7838c8
	if( nrows > (tmsize_t) sp->cinfo.d.image_height )
Packit 7838c8
		nrows = sp->cinfo.d.image_height;
Packit 7838c8
Packit 7838c8
	/* data is expected to be read in multiples of a scanline */
Packit 7838c8
	if (nrows)
Packit 7838c8
        {
Packit 7838c8
                JSAMPROW line_work_buf = NULL;
Packit 7838c8
Packit 7838c8
                /*
Packit 7838c8
                 * For 6B, only use temporary buffer for 12 bit imagery.
Packit 7838c8
                 * For Mk1 always use it.
Packit 7838c8
                 */
Packit 7838c8
                if( sp->cinfo.d.data_precision == 12 )
Packit 7838c8
                {
Packit 7838c8
                        line_work_buf = (JSAMPROW)
Packit 7838c8
                                _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width
Packit 7838c8
                                            * sp->cinfo.d.num_components );
Packit 7838c8
                }
Packit 7838c8
Packit 7838c8
               do
Packit 7838c8
               {
Packit 7838c8
                       if( line_work_buf != NULL )
Packit 7838c8
                       {
Packit 7838c8
                               /*
Packit 7838c8
                                * In the MK1 case, we always read into a 16bit
Packit 7838c8
                                * buffer, and then pack down to 12bit or 8bit.
Packit 7838c8
                                * In 6B case we only read into 16 bit buffer
Packit 7838c8
                                * for 12bit data, which we need to repack.
Packit 7838c8
                                */
Packit 7838c8
                               if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
Packit 7838c8
                                       return (0);
Packit 7838c8
Packit 7838c8
                               if( sp->cinfo.d.data_precision == 12 )
Packit 7838c8
                               {
Packit 7838c8
                                       int value_pairs = (sp->cinfo.d.output_width
Packit 7838c8
                                                          * sp->cinfo.d.num_components) / 2;
Packit 7838c8
                                       int iPair;
Packit 7838c8
Packit 7838c8
                                       for( iPair = 0; iPair < value_pairs; iPair++ )
Packit 7838c8
                                       {
Packit 7838c8
                                               unsigned char *out_ptr =
Packit 7838c8
                                                       ((unsigned char *) buf) + iPair * 3;
Packit 7838c8
                                               JSAMPLE *in_ptr = line_work_buf + iPair * 2;
Packit 7838c8
Packit 7838c8
                                               out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
Packit 7838c8
                                               out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
Packit 7838c8
                                                       | ((in_ptr[1] & 0xf00) >> 8));
Packit 7838c8
                                               out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
Packit 7838c8
                                       }
Packit 7838c8
                               }
Packit 7838c8
                               else if( sp->cinfo.d.data_precision == 8 )
Packit 7838c8
                               {
Packit 7838c8
                                       int value_count = (sp->cinfo.d.output_width
Packit 7838c8
                                                          * sp->cinfo.d.num_components);
Packit 7838c8
                                       int iValue;
Packit 7838c8
Packit 7838c8
                                       for( iValue = 0; iValue < value_count; iValue++ )
Packit 7838c8
                                       {
Packit 7838c8
                                               ((unsigned char *) buf)[iValue] =
Packit 7838c8
                                                       line_work_buf[iValue] & 0xff;
Packit 7838c8
                                       }
Packit 7838c8
                               }
Packit 7838c8
                       }
Packit 7838c8
Packit 7838c8
                       ++tif->tif_row;
Packit 7838c8
                       buf += sp->bytesperline;
Packit 7838c8
                       cc -= sp->bytesperline;
Packit 7838c8
               } while (--nrows > 0);
Packit 7838c8
Packit 7838c8
               if( line_work_buf != NULL )
Packit 7838c8
                       _TIFFfree( line_work_buf );
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
        /* Update information on consumed data */
Packit 7838c8
        tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
Packit 7838c8
        tif->tif_rawcc = sp->src.bytes_in_buffer;
Packit 7838c8
                
Packit 7838c8
	/* Close down the decompressor if we've finished the strip or tile. */
Packit 7838c8
	return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
Packit 7838c8
                || TIFFjpeg_finish_decompress(sp);
Packit 7838c8
}
Packit 7838c8
#endif /* JPEG_LIB_MK1_OR_12BIT */
Packit 7838c8
Packit 7838c8
/*ARGSUSED*/ static int
Packit 7838c8
DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
Packit 7838c8
{
Packit 7838c8
    (void) buf;
Packit 7838c8
    (void) cc;
Packit 7838c8
    (void) s;
Packit 7838c8
Packit 7838c8
    TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline",
Packit 7838c8
                 "scanline oriented access is not supported for downsampled JPEG compressed images, consider enabling TIFF_JPEGCOLORMODE as JPEGCOLORMODE_RGB." );
Packit 7838c8
    return 0;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Decode a chunk of pixels.
Packit 7838c8
 * Returned data is downsampled per sampling factors.
Packit 7838c8
 */
Packit 7838c8
/*ARGSUSED*/ static int
Packit 7838c8
JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	tmsize_t nrows;
Packit 7838c8
        TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
	(void) s;
Packit 7838c8
Packit 7838c8
        nrows = sp->cinfo.d.image_height;
Packit 7838c8
        /* For last strip, limit number of rows to its truncated height */
Packit 7838c8
        /* even if the codestream height is larger (which is not compliant, */
Packit 7838c8
        /* but that we tolerate) */
Packit 7838c8
        if( (uint32)nrows > td->td_imagelength - tif->tif_row && !isTiled(tif) )
Packit 7838c8
            nrows = td->td_imagelength - tif->tif_row;
Packit 7838c8
Packit 7838c8
	/* data is expected to be read in multiples of a scanline */
Packit 7838c8
	if ( nrows != 0 ) {
Packit 7838c8
Packit 7838c8
		/* Cb,Cr both have sampling factors 1, so this is correct */
Packit 7838c8
		JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;            
Packit 7838c8
		int samples_per_clump = sp->samplesperclump;
Packit 7838c8
Packit 7838c8
#if defined(JPEG_LIB_MK1_OR_12BIT)
Packit 7838c8
		unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) *
Packit 7838c8
						     sp->cinfo.d.output_width *
Packit 7838c8
						     sp->cinfo.d.num_components);
Packit 7838c8
		if(tmpbuf==NULL) {
Packit 7838c8
                        TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
Packit 7838c8
				     "Out of memory");
Packit 7838c8
			return 0;
Packit 7838c8
                }
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
		do {
Packit 7838c8
			jpeg_component_info *compptr;
Packit 7838c8
			int ci, clumpoffset;
Packit 7838c8
Packit 7838c8
                        if( cc < sp->bytesperline ) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
Packit 7838c8
					     "application buffer not large enough for all data.");
Packit 7838c8
				return 0;
Packit 7838c8
                        }
Packit 7838c8
Packit 7838c8
			/* Reload downsampled-data buffer if needed */
Packit 7838c8
			if (sp->scancount >= DCTSIZE) {
Packit 7838c8
				int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
Packit 7838c8
				if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
Packit 7838c8
					return (0);
Packit 7838c8
				sp->scancount = 0;
Packit 7838c8
			}
Packit 7838c8
			/*
Packit 7838c8
			 * Fastest way to unseparate data is to make one pass
Packit 7838c8
			 * over the scanline for each row of each component.
Packit 7838c8
			 */
Packit 7838c8
			clumpoffset = 0;    /* first sample in clump */
Packit 7838c8
			for (ci = 0, compptr = sp->cinfo.d.comp_info;
Packit 7838c8
			     ci < sp->cinfo.d.num_components;
Packit 7838c8
			     ci++, compptr++) {
Packit 7838c8
				int hsamp = compptr->h_samp_factor;
Packit 7838c8
				int vsamp = compptr->v_samp_factor;
Packit 7838c8
				int ypos;
Packit 7838c8
Packit 7838c8
				for (ypos = 0; ypos < vsamp; ypos++) {
Packit 7838c8
					JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
Packit 7838c8
					JDIMENSION nclump;
Packit 7838c8
#if defined(JPEG_LIB_MK1_OR_12BIT)
Packit 7838c8
					JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset;
Packit 7838c8
#else
Packit 7838c8
					JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
Packit 7838c8
					if (cc < (tmsize_t) (clumpoffset + samples_per_clump*(clumps_per_line-1) + hsamp)) {
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
Packit 7838c8
							     "application buffer not large enough for all data, possible subsampling issue");
Packit 7838c8
						return 0;
Packit 7838c8
					}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
					if (hsamp == 1) {
Packit 7838c8
						/* fast path for at least Cb and Cr */
Packit 7838c8
						for (nclump = clumps_per_line; nclump-- > 0; ) {
Packit 7838c8
							outptr[0] = *inptr++;
Packit 7838c8
							outptr += samples_per_clump;
Packit 7838c8
						}
Packit 7838c8
					} else {
Packit 7838c8
						int xpos;
Packit 7838c8
Packit 7838c8
						/* general case */
Packit 7838c8
						for (nclump = clumps_per_line; nclump-- > 0; ) {
Packit 7838c8
							for (xpos = 0; xpos < hsamp; xpos++)
Packit 7838c8
								outptr[xpos] = *inptr++;
Packit 7838c8
							outptr += samples_per_clump;
Packit 7838c8
						}
Packit 7838c8
					}
Packit 7838c8
					clumpoffset += hsamp;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
Packit 7838c8
#if defined(JPEG_LIB_MK1_OR_12BIT)
Packit 7838c8
			{
Packit 7838c8
				if (sp->cinfo.d.data_precision == 8)
Packit 7838c8
				{
Packit 7838c8
					int i=0;
Packit 7838c8
					int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components;
Packit 7838c8
					for (i=0; i
Packit 7838c8
					{
Packit 7838c8
						((unsigned char*)buf)[i] = tmpbuf[i] & 0xff;
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
				else
Packit 7838c8
				{         /* 12-bit */
Packit 7838c8
					int value_pairs = (sp->cinfo.d.output_width
Packit 7838c8
							   * sp->cinfo.d.num_components) / 2;
Packit 7838c8
					int iPair;
Packit 7838c8
					for( iPair = 0; iPair < value_pairs; iPair++ )
Packit 7838c8
					{
Packit 7838c8
						unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3;
Packit 7838c8
						JSAMPLE *in_ptr = (JSAMPLE *) (tmpbuf + iPair * 2);
Packit 7838c8
						out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
Packit 7838c8
						out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
Packit 7838c8
							| ((in_ptr[1] & 0xf00) >> 8));
Packit 7838c8
						out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
			sp->scancount ++;
Packit 7838c8
			tif->tif_row += sp->v_sampling;
Packit 7838c8
Packit 7838c8
			buf += sp->bytesperline;
Packit 7838c8
			cc -= sp->bytesperline;
Packit 7838c8
Packit 7838c8
			nrows -= sp->v_sampling;
Packit 7838c8
		} while (nrows > 0);
Packit 7838c8
Packit 7838c8
#if defined(JPEG_LIB_MK1_OR_12BIT)
Packit 7838c8
		_TIFFfree(tmpbuf);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Close down the decompressor if done. */
Packit 7838c8
	return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
Packit 7838c8
		|| TIFFjpeg_finish_decompress(sp);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * JPEG Encoding.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
unsuppress_quant_table (JPEGState* sp, int tblno)
Packit 7838c8
{
Packit 7838c8
	JQUANT_TBL* qtbl;
Packit 7838c8
Packit 7838c8
	if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		qtbl->sent_table = FALSE;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
suppress_quant_table (JPEGState* sp, int tblno)
Packit 7838c8
{
Packit 7838c8
	JQUANT_TBL* qtbl;
Packit 7838c8
Packit 7838c8
	if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		qtbl->sent_table = TRUE;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
unsuppress_huff_table (JPEGState* sp, int tblno)
Packit 7838c8
{
Packit 7838c8
	JHUFF_TBL* htbl;
Packit 7838c8
Packit 7838c8
	if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		htbl->sent_table = FALSE;
Packit 7838c8
	if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		htbl->sent_table = FALSE;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
suppress_huff_table (JPEGState* sp, int tblno)
Packit 7838c8
{
Packit 7838c8
	JHUFF_TBL* htbl;
Packit 7838c8
Packit 7838c8
	if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		htbl->sent_table = TRUE;
Packit 7838c8
	if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
Packit 7838c8
		htbl->sent_table = TRUE;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
prepare_JPEGTables(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
Packit 7838c8
	/* Initialize quant tables for current quality setting */
Packit 7838c8
	if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
Packit 7838c8
		return (0);
Packit 7838c8
	/* Mark only the tables we want for output */
Packit 7838c8
	/* NB: chrominance tables are currently used only with YCbCr */
Packit 7838c8
	if (!TIFFjpeg_suppress_tables(sp, TRUE))
Packit 7838c8
		return (0);
Packit 7838c8
	if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
Packit 7838c8
		unsuppress_quant_table(sp, 0);
Packit 7838c8
		if (sp->photometric == PHOTOMETRIC_YCBCR)
Packit 7838c8
			unsuppress_quant_table(sp, 1);
Packit 7838c8
	}
Packit 7838c8
	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
Packit 7838c8
		unsuppress_huff_table(sp, 0);
Packit 7838c8
		if (sp->photometric == PHOTOMETRIC_YCBCR)
Packit 7838c8
			unsuppress_huff_table(sp, 1);
Packit 7838c8
	}
Packit 7838c8
	/* Direct libjpeg output into jpegtables */
Packit 7838c8
	if (!TIFFjpeg_tables_dest(sp, tif))
Packit 7838c8
		return (0);
Packit 7838c8
	/* Emit tables-only datastream */
Packit 7838c8
	if (!TIFFjpeg_write_tables(sp))
Packit 7838c8
		return (0);
Packit 7838c8
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGSetupEncode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
	static const char module[] = "JPEGSetupEncode";
Packit 7838c8
Packit 7838c8
#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
Packit 7838c8
        if( tif->tif_dir.td_bitspersample == 12 )
Packit 7838c8
            return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 );
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
        JPEGInitializeLibJPEG( tif, FALSE );
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
	assert(!sp->cinfo.comm.is_decompressor);
Packit 7838c8
Packit 7838c8
	sp->photometric = td->td_photometric;
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Initialize all JPEG parameters to default values.
Packit 7838c8
	 * Note that jpeg_set_defaults needs legal values for
Packit 7838c8
	 * in_color_space and input_components.
Packit 7838c8
	 */
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
Packit 7838c8
		sp->cinfo.c.input_components = td->td_samplesperpixel;
Packit 7838c8
		if (sp->photometric == PHOTOMETRIC_YCBCR) {
Packit 7838c8
			if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_RGB;
Packit 7838c8
			} else {
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_YCbCr;
Packit 7838c8
			}
Packit 7838c8
		} else {
Packit 7838c8
			if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1)
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_GRAYSCALE;
Packit 7838c8
			else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3)
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_RGB;
Packit 7838c8
			else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4)
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_CMYK;
Packit 7838c8
			else
Packit 7838c8
				sp->cinfo.c.in_color_space = JCS_UNKNOWN;
Packit 7838c8
		}
Packit 7838c8
	} else {
Packit 7838c8
		sp->cinfo.c.input_components = 1;
Packit 7838c8
		sp->cinfo.c.in_color_space = JCS_UNKNOWN;
Packit 7838c8
	}
Packit 7838c8
	if (!TIFFjpeg_set_defaults(sp))
Packit 7838c8
		return (0);
Packit 7838c8
	/* Set per-file parameters */
Packit 7838c8
	switch (sp->photometric) {
Packit 7838c8
	case PHOTOMETRIC_YCBCR:
Packit 7838c8
		sp->h_sampling = td->td_ycbcrsubsampling[0];
Packit 7838c8
		sp->v_sampling = td->td_ycbcrsubsampling[1];
Packit 7838c8
                if( sp->h_sampling == 0 || sp->v_sampling == 0 )
Packit 7838c8
                {
Packit 7838c8
                    TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                            "Invalig horizontal/vertical sampling value");
Packit 7838c8
                    return (0);
Packit 7838c8
                }
Packit 7838c8
                if( td->td_bitspersample > 16 )
Packit 7838c8
                {
Packit 7838c8
                    TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                                 "BitsPerSample %d not allowed for JPEG",
Packit 7838c8
                                 td->td_bitspersample);
Packit 7838c8
                    return (0);
Packit 7838c8
                }
Packit 7838c8
Packit 7838c8
		/*
Packit 7838c8
		 * A ReferenceBlackWhite field *must* be present since the
Packit 7838c8
		 * default value is inappropriate for YCbCr.  Fill in the
Packit 7838c8
		 * proper value if application didn't set it.
Packit 7838c8
		 */
Packit 7838c8
		{
Packit 7838c8
			float *ref;
Packit 7838c8
			if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
Packit 7838c8
					  &ref)) {
Packit 7838c8
				float refbw[6];
Packit 7838c8
				long top = 1L << td->td_bitspersample;
Packit 7838c8
				refbw[0] = 0;
Packit 7838c8
				refbw[1] = (float)(top-1L);
Packit 7838c8
				refbw[2] = (float)(top>>1);
Packit 7838c8
				refbw[3] = refbw[1];
Packit 7838c8
				refbw[4] = refbw[2];
Packit 7838c8
				refbw[5] = refbw[1];
Packit 7838c8
				TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
Packit 7838c8
					     refbw);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		break;
Packit 7838c8
	case PHOTOMETRIC_PALETTE:		/* disallowed by Tech Note */
Packit 7838c8
	case PHOTOMETRIC_MASK:
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
			  "PhotometricInterpretation %d not allowed for JPEG",
Packit 7838c8
			  (int) sp->photometric);
Packit 7838c8
		return (0);
Packit 7838c8
	default:
Packit 7838c8
		/* TIFF 6.0 forbids subsampling of all other color spaces */
Packit 7838c8
		sp->h_sampling = 1;
Packit 7838c8
		sp->v_sampling = 1;
Packit 7838c8
		break;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Verify miscellaneous parameters */
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * This would need work if libtiff ever supports different
Packit 7838c8
	 * depths for different components, or if libjpeg ever supports
Packit 7838c8
	 * run-time selection of depth.  Neither is imminent.
Packit 7838c8
	 */
Packit 7838c8
#ifdef JPEG_LIB_MK1
Packit 7838c8
        /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
Packit 7838c8
	if (td->td_bitspersample != 8 && td->td_bitspersample != 12) 
Packit 7838c8
#else
Packit 7838c8
	if (td->td_bitspersample != BITS_IN_JSAMPLE )
Packit 7838c8
#endif
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
Packit 7838c8
			  (int) td->td_bitspersample);
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
	sp->cinfo.c.data_precision = td->td_bitspersample;
Packit 7838c8
#ifdef JPEG_LIB_MK1
Packit 7838c8
        sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
Packit 7838c8
#endif
Packit 7838c8
	if (isTiled(tif)) {
Packit 7838c8
		if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				  "JPEG tile height must be multiple of %d",
Packit 7838c8
				  sp->v_sampling * DCTSIZE);
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
		if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				  "JPEG tile width must be multiple of %d",
Packit 7838c8
				  sp->h_sampling * DCTSIZE);
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
	} else {
Packit 7838c8
		if (td->td_rowsperstrip < td->td_imagelength &&
Packit 7838c8
		    (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				  "RowsPerStrip must be multiple of %d for JPEG",
Packit 7838c8
				  sp->v_sampling * DCTSIZE);
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Create a JPEGTables field if appropriate */
Packit 7838c8
	if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
Packit 7838c8
                if( sp->jpegtables == NULL
Packit 7838c8
                    || memcmp(sp->jpegtables,"\0\0\0\0\0\0\0\0\0",8) == 0 )
Packit 7838c8
                {
Packit 7838c8
                        if (!prepare_JPEGTables(tif))
Packit 7838c8
                                return (0);
Packit 7838c8
                        /* Mark the field present */
Packit 7838c8
                        /* Can't use TIFFSetField since BEENWRITING is already set! */
Packit 7838c8
                        tif->tif_flags |= TIFF_DIRTYDIRECT;
Packit 7838c8
                        TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
Packit 7838c8
                }
Packit 7838c8
	} else {
Packit 7838c8
		/* We do not support application-supplied JPEGTables, */
Packit 7838c8
		/* so mark the field not present */
Packit 7838c8
		TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/* Direct libjpeg output to libtiff's output buffer */
Packit 7838c8
	TIFFjpeg_data_dest(sp, tif);
Packit 7838c8
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Set encoding state at the start of a strip or tile.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
JPEGPreEncode(TIFF* tif, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
	static const char module[] = "JPEGPreEncode";
Packit 7838c8
	uint32 segment_width, segment_height;
Packit 7838c8
	int downsampled_input;
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
  
Packit 7838c8
	if (sp->cinfo.comm.is_decompressor == 1)
Packit 7838c8
	{
Packit 7838c8
		tif->tif_setupencode( tif );
Packit 7838c8
	}
Packit 7838c8
  
Packit 7838c8
	assert(!sp->cinfo.comm.is_decompressor);
Packit 7838c8
	/*
Packit 7838c8
	 * Set encoding parameters for this strip/tile.
Packit 7838c8
	 */
Packit 7838c8
	if (isTiled(tif)) {
Packit 7838c8
		segment_width = td->td_tilewidth;
Packit 7838c8
		segment_height = td->td_tilelength;
Packit 7838c8
		sp->bytesperline = TIFFTileRowSize(tif);
Packit 7838c8
	} else {
Packit 7838c8
		segment_width = td->td_imagewidth;
Packit 7838c8
		segment_height = td->td_imagelength - tif->tif_row;
Packit 7838c8
		if (segment_height > td->td_rowsperstrip)
Packit 7838c8
			segment_height = td->td_rowsperstrip;
Packit 7838c8
		sp->bytesperline = TIFFScanlineSize(tif);
Packit 7838c8
	}
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
Packit 7838c8
		/* for PC 2, scale down the strip/tile size
Packit 7838c8
		 * to match a downsampled component
Packit 7838c8
		 */
Packit 7838c8
		segment_width = TIFFhowmany_32(segment_width, sp->h_sampling); 
Packit 7838c8
		segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
Packit 7838c8
	}
Packit 7838c8
	if (segment_width > 65535 || segment_height > 65535) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
	sp->cinfo.c.image_width = segment_width;
Packit 7838c8
	sp->cinfo.c.image_height = segment_height;
Packit 7838c8
	downsampled_input = FALSE;
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
Packit 7838c8
		sp->cinfo.c.input_components = td->td_samplesperpixel;
Packit 7838c8
		if (sp->photometric == PHOTOMETRIC_YCBCR) {
Packit 7838c8
			if (sp->jpegcolormode != JPEGCOLORMODE_RGB) {
Packit 7838c8
				if (sp->h_sampling != 1 || sp->v_sampling != 1)
Packit 7838c8
					downsampled_input = TRUE;
Packit 7838c8
			}
Packit 7838c8
			if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
Packit 7838c8
				return (0);
Packit 7838c8
			/*
Packit 7838c8
			 * Set Y sampling factors;
Packit 7838c8
			 * we assume jpeg_set_colorspace() set the rest to 1
Packit 7838c8
			 */
Packit 7838c8
			sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
Packit 7838c8
			sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
Packit 7838c8
		} else {
Packit 7838c8
			if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space))
Packit 7838c8
				return (0);
Packit 7838c8
			/* jpeg_set_colorspace set all sampling factors to 1 */
Packit 7838c8
		}
Packit 7838c8
	} else {
Packit 7838c8
		if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
Packit 7838c8
			return (0);
Packit 7838c8
		sp->cinfo.c.comp_info[0].component_id = s;
Packit 7838c8
		/* jpeg_set_colorspace() set sampling factors to 1 */
Packit 7838c8
		if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
Packit 7838c8
			sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
Packit 7838c8
			sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
Packit 7838c8
			sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	/* ensure libjpeg won't write any extraneous markers */
Packit 7838c8
	sp->cinfo.c.write_JFIF_header = FALSE;
Packit 7838c8
	sp->cinfo.c.write_Adobe_marker = FALSE;
Packit 7838c8
	/* set up table handling correctly */
Packit 7838c8
	/* calling TIFFjpeg_set_quality() causes quantization tables to be flagged */
Packit 7838c8
	/* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT */
Packit 7838c8
	/* mode, so we must manually suppress them. However TIFFjpeg_set_quality() */
Packit 7838c8
	/* should really be called when dealing with files with directories with */
Packit 7838c8
	/* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
Packit 7838c8
	if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
Packit 7838c8
		return (0);
Packit 7838c8
	if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
Packit 7838c8
		suppress_quant_table(sp, 0);
Packit 7838c8
		suppress_quant_table(sp, 1);
Packit 7838c8
	}
Packit 7838c8
	else {
Packit 7838c8
		unsuppress_quant_table(sp, 0);
Packit 7838c8
		unsuppress_quant_table(sp, 1);
Packit 7838c8
	}
Packit 7838c8
	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
Packit 7838c8
	{
Packit 7838c8
		/* Explicit suppression is only needed if we did not go through the */
Packit 7838c8
		/* prepare_JPEGTables() code path, which may be the case if updating */
Packit 7838c8
		/* an existing file */
Packit 7838c8
		suppress_huff_table(sp, 0);
Packit 7838c8
		suppress_huff_table(sp, 1);
Packit 7838c8
		sp->cinfo.c.optimize_coding = FALSE;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		sp->cinfo.c.optimize_coding = TRUE;
Packit 7838c8
	if (downsampled_input) {
Packit 7838c8
		/* Need to use raw-data interface to libjpeg */
Packit 7838c8
		sp->cinfo.c.raw_data_in = TRUE;
Packit 7838c8
		tif->tif_encoderow = JPEGEncodeRaw;
Packit 7838c8
		tif->tif_encodestrip = JPEGEncodeRaw;
Packit 7838c8
		tif->tif_encodetile = JPEGEncodeRaw;
Packit 7838c8
	} else {
Packit 7838c8
		/* Use normal interface to libjpeg */
Packit 7838c8
		sp->cinfo.c.raw_data_in = FALSE;
Packit 7838c8
		tif->tif_encoderow = JPEGEncode;
Packit 7838c8
		tif->tif_encodestrip = JPEGEncode;
Packit 7838c8
		tif->tif_encodetile = JPEGEncode;
Packit 7838c8
	}
Packit 7838c8
	/* Start JPEG compressor */
Packit 7838c8
	if (!TIFFjpeg_start_compress(sp, FALSE))
Packit 7838c8
		return (0);
Packit 7838c8
	/* Allocate downsampled-data buffers if needed */
Packit 7838c8
	if (downsampled_input) {
Packit 7838c8
		if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
Packit 7838c8
					       sp->cinfo.c.num_components))
Packit 7838c8
			return (0);
Packit 7838c8
	}
Packit 7838c8
	sp->scancount = 0;
Packit 7838c8
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Encode a chunk of pixels.
Packit 7838c8
 * "Standard" case: incoming data is not downsampled.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	tmsize_t nrows;
Packit 7838c8
	JSAMPROW bufptr[1];
Packit 7838c8
        short *line16 = NULL;
Packit 7838c8
        int    line16_count = 0;
Packit 7838c8
Packit 7838c8
	(void) s;
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
	/* data is expected to be supplied in multiples of a scanline */
Packit 7838c8
	nrows = cc / sp->bytesperline;
Packit 7838c8
	if (cc % sp->bytesperline)
Packit 7838c8
            TIFFWarningExt(tif->tif_clientdata, tif->tif_name, 
Packit 7838c8
                           "fractional scanline discarded");
Packit 7838c8
Packit 7838c8
        /* The last strip will be limited to image size */
Packit 7838c8
        if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength )
Packit 7838c8
            nrows = tif->tif_dir.td_imagelength - tif->tif_row;
Packit 7838c8
Packit 7838c8
        if( sp->cinfo.c.data_precision == 12 )
Packit 7838c8
        {
Packit 7838c8
            line16_count = (int)((sp->bytesperline * 2) / 3);
Packit 7838c8
            line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count);
Packit 7838c8
            if (!line16)
Packit 7838c8
            {
Packit 7838c8
                TIFFErrorExt(tif->tif_clientdata,
Packit 7838c8
			     "JPEGEncode",
Packit 7838c8
                             "Failed to allocate memory");
Packit 7838c8
Packit 7838c8
                return 0;
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
            
Packit 7838c8
	while (nrows-- > 0) {
Packit 7838c8
Packit 7838c8
            if( sp->cinfo.c.data_precision == 12 )
Packit 7838c8
            {
Packit 7838c8
Packit 7838c8
                int value_pairs = line16_count / 2;
Packit 7838c8
                int iPair;
Packit 7838c8
Packit 7838c8
		bufptr[0] = (JSAMPROW) line16;
Packit 7838c8
Packit 7838c8
                for( iPair = 0; iPair < value_pairs; iPair++ )
Packit 7838c8
                {
Packit 7838c8
                    unsigned char *in_ptr =
Packit 7838c8
                        ((unsigned char *) buf) + iPair * 3;
Packit 7838c8
                    JSAMPLE *out_ptr = (JSAMPLE *) (line16 + iPair * 2);
Packit 7838c8
Packit 7838c8
                    out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4);
Packit 7838c8
                    out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2];
Packit 7838c8
                }
Packit 7838c8
            }
Packit 7838c8
            else
Packit 7838c8
            {
Packit 7838c8
		bufptr[0] = (JSAMPROW) buf;
Packit 7838c8
            }
Packit 7838c8
            if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
Packit 7838c8
                return (0);
Packit 7838c8
            if (nrows > 0)
Packit 7838c8
                tif->tif_row++;
Packit 7838c8
            buf += sp->bytesperline;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
        if( sp->cinfo.c.data_precision == 12 )
Packit 7838c8
        {
Packit 7838c8
            _TIFFfree( line16 );
Packit 7838c8
        }
Packit 7838c8
            
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Encode a chunk of pixels.
Packit 7838c8
 * Incoming data is expected to be downsampled per sampling factors.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	JSAMPLE* inptr;
Packit 7838c8
	JSAMPLE* outptr;
Packit 7838c8
	tmsize_t nrows;
Packit 7838c8
	JDIMENSION clumps_per_line, nclump;
Packit 7838c8
	int clumpoffset, ci, xpos, ypos;
Packit 7838c8
	jpeg_component_info* compptr;
Packit 7838c8
	int samples_per_clump = sp->samplesperclump;
Packit 7838c8
	tmsize_t bytesperclumpline;
Packit 7838c8
Packit 7838c8
	(void) s;
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
	/* data is expected to be supplied in multiples of a clumpline */
Packit 7838c8
	/* a clumpline is equivalent to v_sampling desubsampled scanlines */
Packit 7838c8
	/* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */
Packit 7838c8
	bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling)
Packit 7838c8
			     *(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7)
Packit 7838c8
			    /8;
Packit 7838c8
Packit 7838c8
	nrows = ( cc / bytesperclumpline ) * sp->v_sampling;
Packit 7838c8
	if (cc % bytesperclumpline)
Packit 7838c8
		TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
Packit 7838c8
Packit 7838c8
	/* Cb,Cr both have sampling factors 1, so this is correct */
Packit 7838c8
	clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
Packit 7838c8
Packit 7838c8
	while (nrows > 0) {
Packit 7838c8
		/*
Packit 7838c8
		 * Fastest way to separate the data is to make one pass
Packit 7838c8
		 * over the scanline for each row of each component.
Packit 7838c8
		 */
Packit 7838c8
		clumpoffset = 0;		/* first sample in clump */
Packit 7838c8
		for (ci = 0, compptr = sp->cinfo.c.comp_info;
Packit 7838c8
		     ci < sp->cinfo.c.num_components;
Packit 7838c8
		     ci++, compptr++) {
Packit 7838c8
		    int hsamp = compptr->h_samp_factor;
Packit 7838c8
		    int vsamp = compptr->v_samp_factor;
Packit 7838c8
		    int padding = (int) (compptr->width_in_blocks * DCTSIZE -
Packit 7838c8
					 clumps_per_line * hsamp);
Packit 7838c8
		    for (ypos = 0; ypos < vsamp; ypos++) {
Packit 7838c8
			inptr = ((JSAMPLE*) buf) + clumpoffset;
Packit 7838c8
			outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
Packit 7838c8
			if (hsamp == 1) {
Packit 7838c8
			    /* fast path for at least Cb and Cr */
Packit 7838c8
			    for (nclump = clumps_per_line; nclump-- > 0; ) {
Packit 7838c8
				*outptr++ = inptr[0];
Packit 7838c8
				inptr += samples_per_clump;
Packit 7838c8
			    }
Packit 7838c8
			} else {
Packit 7838c8
			    /* general case */
Packit 7838c8
			    for (nclump = clumps_per_line; nclump-- > 0; ) {
Packit 7838c8
				for (xpos = 0; xpos < hsamp; xpos++)
Packit 7838c8
				    *outptr++ = inptr[xpos];
Packit 7838c8
				inptr += samples_per_clump;
Packit 7838c8
			    }
Packit 7838c8
			}
Packit 7838c8
			/* pad each scanline as needed */
Packit 7838c8
			for (xpos = 0; xpos < padding; xpos++) {
Packit 7838c8
			    *outptr = outptr[-1];
Packit 7838c8
			    outptr++;
Packit 7838c8
			}
Packit 7838c8
			clumpoffset += hsamp;
Packit 7838c8
		    }
Packit 7838c8
		}
Packit 7838c8
		sp->scancount++;
Packit 7838c8
		if (sp->scancount >= DCTSIZE) {
Packit 7838c8
			int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
Packit 7838c8
			if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
Packit 7838c8
				return (0);
Packit 7838c8
			sp->scancount = 0;
Packit 7838c8
		}
Packit 7838c8
		tif->tif_row += sp->v_sampling;
Packit 7838c8
		buf += bytesperclumpline;
Packit 7838c8
		nrows -= sp->v_sampling;
Packit 7838c8
	}
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Finish up at the end of a strip or tile.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
JPEGPostEncode(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
Packit 7838c8
	if (sp->scancount > 0) {
Packit 7838c8
		/*
Packit 7838c8
		 * Need to emit a partial bufferload of downsampled data.
Packit 7838c8
		 * Pad the data vertically.
Packit 7838c8
		 */
Packit 7838c8
		int ci, ypos, n;
Packit 7838c8
		jpeg_component_info* compptr;
Packit 7838c8
Packit 7838c8
		for (ci = 0, compptr = sp->cinfo.c.comp_info;
Packit 7838c8
		     ci < sp->cinfo.c.num_components;
Packit 7838c8
		     ci++, compptr++) {
Packit 7838c8
			int vsamp = compptr->v_samp_factor;
Packit 7838c8
			tmsize_t row_width = compptr->width_in_blocks * DCTSIZE
Packit 7838c8
				* sizeof(JSAMPLE);
Packit 7838c8
			for (ypos = sp->scancount * vsamp;
Packit 7838c8
			     ypos < DCTSIZE * vsamp; ypos++) {
Packit 7838c8
				_TIFFmemcpy((void*)sp->ds_buffer[ci][ypos],
Packit 7838c8
					    (void*)sp->ds_buffer[ci][ypos-1],
Packit 7838c8
					    row_width);
Packit 7838c8
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
Packit 7838c8
		if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
Packit 7838c8
			return (0);
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	return (TIFFjpeg_finish_compress(JState(tif)));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
JPEGCleanup(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	JPEGState *sp = JState(tif);
Packit 7838c8
	
Packit 7838c8
	assert(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->cinfo_initialized )
Packit 7838c8
                TIFFjpeg_destroy(sp);	/* release libjpeg resources */
Packit 7838c8
        if (sp->jpegtables)		/* tag value */
Packit 7838c8
                _TIFFfree(sp->jpegtables);
Packit 7838c8
	_TIFFfree(tif->tif_data);	/* release local state */
Packit 7838c8
	tif->tif_data = NULL;
Packit 7838c8
Packit 7838c8
	_TIFFSetDefaultCompressionState(tif);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void 
Packit 7838c8
JPEGResetUpsampled( TIFF* tif )
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	TIFFDirectory* td = &tif->tif_dir;
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Mark whether returned data is up-sampled or not so TIFFStripSize
Packit 7838c8
	 * and TIFFTileSize return values that reflect the true amount of
Packit 7838c8
	 * data.
Packit 7838c8
	 */
Packit 7838c8
	tif->tif_flags &= ~TIFF_UPSAMPLED;
Packit 7838c8
	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
Packit 7838c8
		if (td->td_photometric == PHOTOMETRIC_YCBCR &&
Packit 7838c8
		    sp->jpegcolormode == JPEGCOLORMODE_RGB) {
Packit 7838c8
			tif->tif_flags |= TIFF_UPSAMPLED;
Packit 7838c8
		} else {
Packit 7838c8
#ifdef notdef
Packit 7838c8
			if (td->td_ycbcrsubsampling[0] != 1 ||
Packit 7838c8
			    td->td_ycbcrsubsampling[1] != 1)
Packit 7838c8
				; /* XXX what about up-sampling? */
Packit 7838c8
#endif
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Must recalculate cached tile size in case sampling state changed.
Packit 7838c8
	 * Should we really be doing this now if image size isn't set? 
Packit 7838c8
	 */
Packit 7838c8
        if( tif->tif_tilesize > 0 )
Packit 7838c8
            tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);   
Packit 7838c8
        if( tif->tif_scanlinesize > 0 )
Packit 7838c8
            tif->tif_scanlinesize = TIFFScanlineSize(tif); 
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	const TIFFField* fip;
Packit 7838c8
	uint32 v32;
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
Packit 7838c8
	switch (tag) {
Packit 7838c8
	case TIFFTAG_JPEGTABLES:
Packit 7838c8
		v32 = (uint32) va_arg(ap, uint32);
Packit 7838c8
		if (v32 == 0) {
Packit 7838c8
			/* XXX */
Packit 7838c8
			return (0);
Packit 7838c8
		}
Packit 7838c8
		_TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), v32);
Packit 7838c8
		sp->jpegtables_length = v32;
Packit 7838c8
		TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
Packit 7838c8
		break;
Packit 7838c8
	case TIFFTAG_JPEGQUALITY:
Packit 7838c8
		sp->jpegquality = (int) va_arg(ap, int);
Packit 7838c8
		return (1);			/* pseudo tag */
Packit 7838c8
	case TIFFTAG_JPEGCOLORMODE:
Packit 7838c8
		sp->jpegcolormode = (int) va_arg(ap, int);
Packit 7838c8
		JPEGResetUpsampled( tif );
Packit 7838c8
		return (1);			/* pseudo tag */
Packit 7838c8
	case TIFFTAG_PHOTOMETRIC:
Packit 7838c8
	{
Packit 7838c8
		int ret_value = (*sp->vsetparent)(tif, tag, ap);
Packit 7838c8
		JPEGResetUpsampled( tif );
Packit 7838c8
		return ret_value;
Packit 7838c8
	}
Packit 7838c8
	case TIFFTAG_JPEGTABLESMODE:
Packit 7838c8
		sp->jpegtablesmode = (int) va_arg(ap, int);
Packit 7838c8
		return (1);			/* pseudo tag */
Packit 7838c8
	case TIFFTAG_YCBCRSUBSAMPLING:
Packit 7838c8
		/* mark the fact that we have a real ycbcrsubsampling! */
Packit 7838c8
		sp->ycbcrsampling_fetched = 1;
Packit 7838c8
		/* should we be recomputing upsampling info here? */
Packit 7838c8
		return (*sp->vsetparent)(tif, tag, ap);
Packit 7838c8
	default:
Packit 7838c8
		return (*sp->vsetparent)(tif, tag, ap);
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	if ((fip = TIFFFieldWithTag(tif, tag)) != NULL) {
Packit 7838c8
		TIFFSetFieldBit(tif, fip->field_bit);
Packit 7838c8
	} else {
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	tif->tif_flags |= TIFF_DIRTYDIRECT;
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
JPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
Packit 7838c8
	switch (tag) {
Packit 7838c8
		case TIFFTAG_JPEGTABLES:
Packit 7838c8
			*va_arg(ap, uint32*) = sp->jpegtables_length;
Packit 7838c8
			*va_arg(ap, void**) = sp->jpegtables;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGQUALITY:
Packit 7838c8
			*va_arg(ap, int*) = sp->jpegquality;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGCOLORMODE:
Packit 7838c8
			*va_arg(ap, int*) = sp->jpegcolormode;
Packit 7838c8
			break;
Packit 7838c8
		case TIFFTAG_JPEGTABLESMODE:
Packit 7838c8
			*va_arg(ap, int*) = sp->jpegtablesmode;
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 void
Packit 7838c8
JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
Packit 7838c8
	assert(sp != NULL);
Packit 7838c8
	(void) flags;
Packit 7838c8
Packit 7838c8
        if( sp != NULL ) {
Packit 7838c8
		if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
Packit 7838c8
			fprintf(fd, "  JPEG Tables: (%lu bytes)\n",
Packit 7838c8
				(unsigned long) sp->jpegtables_length);
Packit 7838c8
		if (sp->printdir)
Packit 7838c8
			(*sp->printdir)(tif, fd, flags);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static uint32
Packit 7838c8
JPEGDefaultStripSize(TIFF* tif, uint32 s)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
Packit 7838c8
	s = (*sp->defsparent)(tif, s);
Packit 7838c8
	if (s < td->td_imagelength)
Packit 7838c8
		s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
Packit 7838c8
	return (s);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp = JState(tif);
Packit 7838c8
	TIFFDirectory *td = &tif->tif_dir;
Packit 7838c8
Packit 7838c8
	(*sp->deftparent)(tif, tw, th);
Packit 7838c8
	*tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
Packit 7838c8
	*th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * The JPEG library initialized used to be done in TIFFInitJPEG(), but
Packit 7838c8
 * now that we allow a TIFF file to be opened in update mode it is necessary
Packit 7838c8
 * to have some way of deciding whether compression or decompression is
Packit 7838c8
 * desired other than looking at tif->tif_mode.  We accomplish this by 
Packit 7838c8
 * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
Packit 7838c8
 * If so, we assume decompression is desired. 
Packit 7838c8
 *
Packit 7838c8
 * This is tricky, because TIFFInitJPEG() is called while the directory is
Packit 7838c8
 * being read, and generally speaking the BYTECOUNTS tag won't have been read
Packit 7838c8
 * at that point.  So we try to defer jpeg library initialization till we
Packit 7838c8
 * do have that tag ... basically any access that might require the compressor
Packit 7838c8
 * or decompressor that occurs after the reading of the directory. 
Packit 7838c8
 *
Packit 7838c8
 * In an ideal world compressors or decompressors would be setup
Packit 7838c8
 * at the point where a single tile or strip was accessed (for read or write)
Packit 7838c8
 * so that stuff like update of missing tiles, or replacement of tiles could
Packit 7838c8
 * be done. However, we aren't trying to crack that nut just yet ...
Packit 7838c8
 *
Packit 7838c8
 * NFW, Feb 3rd, 2003.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
static int JPEGInitializeLibJPEG( TIFF * tif, int decompress )
Packit 7838c8
{
Packit 7838c8
    JPEGState* sp = JState(tif);
Packit 7838c8
Packit 7838c8
    if(sp->cinfo_initialized)
Packit 7838c8
    {
Packit 7838c8
        if( !decompress && sp->cinfo.comm.is_decompressor )
Packit 7838c8
            TIFFjpeg_destroy( sp );
Packit 7838c8
        else if( decompress && !sp->cinfo.comm.is_decompressor )
Packit 7838c8
            TIFFjpeg_destroy( sp );
Packit 7838c8
        else
Packit 7838c8
            return 1;
Packit 7838c8
Packit 7838c8
        sp->cinfo_initialized = 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    /*
Packit 7838c8
     * Initialize libjpeg.
Packit 7838c8
     */
Packit 7838c8
    if ( decompress ) {
Packit 7838c8
        if (!TIFFjpeg_create_decompress(sp))
Packit 7838c8
            return (0);
Packit 7838c8
    } else {
Packit 7838c8
        if (!TIFFjpeg_create_compress(sp))
Packit 7838c8
            return (0);
Packit 7838c8
#ifndef TIFF_JPEG_MAX_MEMORY_TO_USE
Packit 7838c8
#define TIFF_JPEG_MAX_MEMORY_TO_USE (10 * 1024 * 1024)
Packit 7838c8
#endif
Packit 7838c8
        /* libjpeg turbo 1.5.2 honours max_memory_to_use, but has no backing */
Packit 7838c8
        /* store implementation, so better not set max_memory_to_use ourselves. */
Packit 7838c8
        /* See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/162 */
Packit 7838c8
        if( sp->cinfo.c.mem->max_memory_to_use > 0 )
Packit 7838c8
        {
Packit 7838c8
            /* This is to address bug related in ticket GDAL #1795. */
Packit 7838c8
            if (getenv("JPEGMEM") == NULL)
Packit 7838c8
            {
Packit 7838c8
                /* Increase the max memory usable. This helps when creating files */
Packit 7838c8
                /* with "big" tile, without using libjpeg temporary files. */
Packit 7838c8
                /* For example a 512x512 tile with 3 bands */
Packit 7838c8
                /* requires 1.5 MB which is above libjpeg 1MB default */
Packit 7838c8
                if( sp->cinfo.c.mem->max_memory_to_use < TIFF_JPEG_MAX_MEMORY_TO_USE )
Packit 7838c8
                    sp->cinfo.c.mem->max_memory_to_use = TIFF_JPEG_MAX_MEMORY_TO_USE;
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    sp->cinfo_initialized = TRUE;
Packit 7838c8
Packit 7838c8
    return 1;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
TIFFInitJPEG(TIFF* tif, int scheme)
Packit 7838c8
{
Packit 7838c8
	JPEGState* sp;
Packit 7838c8
Packit 7838c8
	assert(scheme == COMPRESSION_JPEG);
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Merge codec-specific tag information.
Packit 7838c8
	 */
Packit 7838c8
	if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields))) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,
Packit 7838c8
			     "TIFFInitJPEG",
Packit 7838c8
			     "Merging JPEG codec-specific tags failed");
Packit 7838c8
		return 0;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Allocate state block so tag methods have storage to record values.
Packit 7838c8
	 */
Packit 7838c8
	tif->tif_data = (uint8*) _TIFFmalloc(sizeof (JPEGState));
Packit 7838c8
Packit 7838c8
	if (tif->tif_data == NULL) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,
Packit 7838c8
			     "TIFFInitJPEG", "No space for JPEG state block");
Packit 7838c8
		return 0;
Packit 7838c8
	}
Packit 7838c8
        _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
Packit 7838c8
Packit 7838c8
	sp = JState(tif);
Packit 7838c8
	sp->tif = tif;				/* back link */
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Override parent get/set field methods.
Packit 7838c8
	 */
Packit 7838c8
	sp->vgetparent = tif->tif_tagmethods.vgetfield;
Packit 7838c8
	tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
Packit 7838c8
	sp->vsetparent = tif->tif_tagmethods.vsetfield;
Packit 7838c8
	tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
Packit 7838c8
	sp->printdir = tif->tif_tagmethods.printdir;
Packit 7838c8
	tif->tif_tagmethods.printdir = JPEGPrintDir;   /* hook for codec tags */
Packit 7838c8
Packit 7838c8
	/* Default values for codec-specific fields */
Packit 7838c8
	sp->jpegtables = NULL;
Packit 7838c8
	sp->jpegtables_length = 0;
Packit 7838c8
	sp->jpegquality = 75;			/* Default IJG quality */
Packit 7838c8
	sp->jpegcolormode = JPEGCOLORMODE_RAW;
Packit 7838c8
	sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
Packit 7838c8
        sp->ycbcrsampling_fetched = 0;
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Install codec methods.
Packit 7838c8
	 */
Packit 7838c8
	tif->tif_fixuptags = JPEGFixupTags;
Packit 7838c8
	tif->tif_setupdecode = JPEGSetupDecode;
Packit 7838c8
	tif->tif_predecode = JPEGPreDecode;
Packit 7838c8
	tif->tif_decoderow = JPEGDecode;
Packit 7838c8
	tif->tif_decodestrip = JPEGDecode;
Packit 7838c8
	tif->tif_decodetile = JPEGDecode;
Packit 7838c8
	tif->tif_setupencode = JPEGSetupEncode;
Packit 7838c8
	tif->tif_preencode = JPEGPreEncode;
Packit 7838c8
	tif->tif_postencode = JPEGPostEncode;
Packit 7838c8
	tif->tif_encoderow = JPEGEncode;
Packit 7838c8
	tif->tif_encodestrip = JPEGEncode;
Packit 7838c8
	tif->tif_encodetile = JPEGEncode;  
Packit 7838c8
	tif->tif_cleanup = JPEGCleanup;
Packit 7838c8
	sp->defsparent = tif->tif_defstripsize;
Packit 7838c8
	tif->tif_defstripsize = JPEGDefaultStripSize;
Packit 7838c8
	sp->deftparent = tif->tif_deftilesize;
Packit 7838c8
	tif->tif_deftilesize = JPEGDefaultTileSize;
Packit 7838c8
	tif->tif_flags |= TIFF_NOBITREV;	/* no bit reversal, please */
Packit 7838c8
Packit 7838c8
        sp->cinfo_initialized = FALSE;
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
        ** Create a JPEGTables field if no directory has yet been created. 
Packit 7838c8
        ** We do this just to ensure that sufficient space is reserved for
Packit 7838c8
        ** the JPEGTables field.  It will be properly created the right
Packit 7838c8
        ** size later. 
Packit 7838c8
        */
Packit 7838c8
        if( tif->tif_diroff == 0 )
Packit 7838c8
        {
Packit 7838c8
#define SIZE_OF_JPEGTABLES 2000
Packit 7838c8
/*
Packit 7838c8
The following line assumes incorrectly that all JPEG-in-TIFF files will have
Packit 7838c8
a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written
Packit 7838c8
when the JPEG data is placed with TIFFWriteRawStrip.  The field bit should be 
Packit 7838c8
set, anyway, later when actual JPEGTABLES header is generated, so removing it 
Packit 7838c8
here hopefully is harmless.
Packit 7838c8
            TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
Packit 7838c8
*/
Packit 7838c8
            sp->jpegtables_length = SIZE_OF_JPEGTABLES;
Packit 7838c8
            sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length);
Packit 7838c8
            if (sp->jpegtables)
Packit 7838c8
            {
Packit 7838c8
                _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES);
Packit 7838c8
            }
Packit 7838c8
            else
Packit 7838c8
            {
Packit 7838c8
                TIFFErrorExt(tif->tif_clientdata,
Packit 7838c8
			     "TIFFInitJPEG",
Packit 7838c8
                             "Failed to allocate memory for JPEG tables");
Packit 7838c8
                return 0;
Packit 7838c8
            }
Packit 7838c8
#undef SIZE_OF_JPEGTABLES
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
	return 1;
Packit 7838c8
}
Packit 7838c8
#endif /* JPEG_SUPPORT */
Packit 7838c8
Packit 7838c8
/* vim: set ts=8 sts=8 sw=8 noet: */
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
 */