1 /* $Header$ */
2 
3 /*
4  * Copyright (c) 1994-1997 Sam Leffler
5  * Copyright (c) 1994-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and
8  * its documentation for any purpose is hereby granted without fee, provided
9  * that (i) the above copyright notices and this permission notice appear in
10  * all copies of the software and related documentation, and (ii) the names of
11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  *
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24  * OF THIS SOFTWARE.
25  */
26 
27 #include "tiffiop.h"
28 #ifdef JPEG_SUPPORT
29 /*
30  * TIFF Library
31  *
32  * JPEG Compression support per TIFF Technical Note #2
33  * (*not* per the original TIFF 6.0 spec).
34  *
35  * This file is simply an interface to the libjpeg library written by
36  * the Independent JPEG Group.  You need release 5 or later of the IJG
37  * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
38  *
39  * Contributed by Tom Lane <tgl@sss.pgh.pa.us>.
40  */
41 #include <assert.h>
42 #include <stdio.h>
43 #include <setjmp.h>
44 
45 int TIFFFillStrip(TIFF*, tstrip_t);
46 int TIFFFillTile(TIFF*, ttile_t);
47 
48 /* We undefine FAR to avoid conflict with JPEG definition */
49 
50 #ifdef FAR
51 #undef FAR
52 #endif
53 
54 /*
55    The windows RPCNDR.H file defines boolean, but defines it with the
56    wrong size.  So we declare HAVE_BOOLEAN so that the jpeg include file
57    won't try to typedef boolean, but #define it to override the rpcndr.h
58    definition.
59 
60    http://bugzilla.remotesensing.org/show_bug.cgi?id=188
61 */
62 #ifdef wxHACK_BOOLEAN
63     #include "wx/defs.h"
64     #define XMD_H
65     #define HAVE_BOOLEAN
66     #define boolean wxHACK_BOOLEAN
67 #endif
68 
69 #include "jpeglib.h"
70 #include "jerror.h"
71 
72 #ifndef HAVE_WXJPEG_BOOLEAN
73 typedef boolean wxjpeg_boolean;
74 #endif
75 
76 /*
77  * On some machines it may be worthwhile to use _setjmp or sigsetjmp
78  * in place of plain setjmp.  These macros will make it easier.
79  */
80 #define SETJMP(jbuf)		setjmp(jbuf)
81 #define LONGJMP(jbuf,code)	longjmp(jbuf,code)
82 #define JMP_BUF			jmp_buf
83 
84 typedef struct jpeg_destination_mgr jpeg_destination_mgr;
85 typedef struct jpeg_source_mgr jpeg_source_mgr;
86 typedef	struct jpeg_error_mgr jpeg_error_mgr;
87 
88 /*
89  * State block for each open TIFF file using
90  * libjpeg to do JPEG compression/decompression.
91  *
92  * libjpeg's visible state is either a jpeg_compress_struct
93  * or jpeg_decompress_struct depending on which way we
94  * are going.  comm can be used to refer to the fields
95  * which are common to both.
96  *
97  * NB: cinfo is required to be the first member of JPEGState,
98  *     so we can safely cast JPEGState* -> jpeg_xxx_struct*
99  *     and vice versa!
100  */
101 typedef	struct {
102 	union {
103 		struct jpeg_compress_struct c;
104 		struct jpeg_decompress_struct d;
105 		struct jpeg_common_struct comm;
106 	} cinfo;			/* NB: must be first */
107         int             cinfo_initialized;
108 
109 	jpeg_error_mgr	err;		/* libjpeg error manager */
110 	JMP_BUF		exit_jmpbuf;	/* for catching libjpeg failures */
111 	/*
112 	 * The following two members could be a union, but
113 	 * they're small enough that it's not worth the effort.
114 	 */
115 	jpeg_destination_mgr dest;	/* data dest for compression */
116 	jpeg_source_mgr	src;		/* data source for decompression */
117 					/* private state */
118 	TIFF*		tif;		/* back link needed by some code */
119 	uint16		photometric;	/* copy of PhotometricInterpretation */
120 	uint16		h_sampling;	/* luminance sampling factors */
121 	uint16		v_sampling;
122 	tsize_t		bytesperline;	/* decompressed bytes per scanline */
123 	/* pointers to intermediate buffers when processing downsampled data */
124 	JSAMPARRAY	ds_buffer[MAX_COMPONENTS];
125 	int		scancount;	/* number of "scanlines" accumulated */
126 	int		samplesperclump;
127 
128 	TIFFVGetMethod	vgetparent;	/* super-class method */
129 	TIFFVSetMethod	vsetparent;	/* super-class method */
130 	TIFFStripMethod	defsparent;	/* super-class method */
131 	TIFFTileMethod	deftparent;	/* super-class method */
132 					/* pseudo-tag fields */
133 	void*		jpegtables;	/* JPEGTables tag value, or NULL */
134 	uint32		jpegtables_length; /* number of bytes in same */
135 	int		jpegquality;	/* Compression quality level */
136 	int		jpegcolormode;	/* Auto RGB<=>YCbCr convert? */
137 	int		jpegtablesmode;	/* What to put in JPEGTables */
138 
139         int             ycbcrsampling_fetched;
140 } JPEGState;
141 
142 #define	JState(tif)	((JPEGState*)(tif)->tif_data)
143 
144 static	int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t);
145 static	int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
146 static	int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t);
147 static	int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
148 static  int JPEGInitializeLibJPEG( TIFF * tif );
149 
150 #define	FIELD_JPEGTABLES	(FIELD_CODEC+0)
151 
152 static const TIFFFieldInfo jpegFieldInfo[] = {
153     { TIFFTAG_JPEGTABLES,	 -1,-1,	TIFF_UNDEFINED,	FIELD_JPEGTABLES,
154       FALSE,	TRUE,	"JPEGTables" },
155     { TIFFTAG_JPEGQUALITY,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
156       TRUE,	FALSE,	"" },
157     { TIFFTAG_JPEGCOLORMODE,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
158       FALSE,	FALSE,	"" },
159     { TIFFTAG_JPEGTABLESMODE,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
160       FALSE,	FALSE,	"" },
161 };
162 #define	N(a)	(sizeof (a) / sizeof (a[0]))
163 
164 /*
165  * libjpeg interface layer.
166  *
167  * We use setjmp/longjmp to return control to libtiff
168  * when a fatal error is encountered within the JPEG
169  * library.  We also direct libjpeg error and warning
170  * messages through the appropriate libtiff handlers.
171  */
172 
173 /*
174  * Error handling routines (these replace corresponding
175  * IJG routines from jerror.c).  These are used for both
176  * compression and decompression.
177  */
178 static void
TIFFjpeg_error_exit(j_common_ptr cinfo)179 TIFFjpeg_error_exit(j_common_ptr cinfo)
180 {
181 	JPEGState *sp = (JPEGState *) cinfo;	/* NB: cinfo assumed first */
182 	char buffer[JMSG_LENGTH_MAX];
183 
184 	(*cinfo->err->format_message) (cinfo, buffer);
185 	TIFFError("JPEGLib", buffer);		/* display the error message */
186 	jpeg_abort(cinfo);			/* clean up libjpeg state */
187 	LONGJMP(sp->exit_jmpbuf, 1);		/* return to libtiff caller */
188 }
189 
190 /*
191  * This routine is invoked only for warning messages,
192  * since error_exit does its own thing and trace_level
193  * is never set > 0.
194  */
195 static void
TIFFjpeg_output_message(j_common_ptr cinfo)196 TIFFjpeg_output_message(j_common_ptr cinfo)
197 {
198 	char buffer[JMSG_LENGTH_MAX];
199 
200 	(*cinfo->err->format_message) (cinfo, buffer);
201 	TIFFWarning("JPEGLib", buffer);
202 }
203 
204 /*
205  * Interface routines.  This layer of routines exists
206  * primarily to limit side-effects from using setjmp.
207  * Also, normal/error returns are converted into return
208  * values per libtiff practice.
209  */
210 #define	CALLJPEG(sp, fail, op)	(SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
211 #define	CALLVJPEG(sp, op)	CALLJPEG(sp, 0, ((op),1))
212 
213 static int
TIFFjpeg_create_compress(JPEGState * sp)214 TIFFjpeg_create_compress(JPEGState* sp)
215 {
216 	/* initialize JPEG error handling */
217 	sp->cinfo.c.err = jpeg_std_error(&sp->err);
218 	sp->err.error_exit = TIFFjpeg_error_exit;
219 	sp->err.output_message = TIFFjpeg_output_message;
220 
221 	return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
222 }
223 
224 static int
TIFFjpeg_create_decompress(JPEGState * sp)225 TIFFjpeg_create_decompress(JPEGState* sp)
226 {
227 	/* initialize JPEG error handling */
228 	sp->cinfo.d.err = jpeg_std_error(&sp->err);
229 	sp->err.error_exit = TIFFjpeg_error_exit;
230 	sp->err.output_message = TIFFjpeg_output_message;
231 
232 	return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
233 }
234 
235 static int
TIFFjpeg_set_defaults(JPEGState * sp)236 TIFFjpeg_set_defaults(JPEGState* sp)
237 {
238 	return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
239 }
240 
241 static int
TIFFjpeg_set_colorspace(JPEGState * sp,J_COLOR_SPACE colorspace)242 TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
243 {
244 	return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
245 }
246 
247 static int
TIFFjpeg_set_quality(JPEGState * sp,int quality,wxjpeg_boolean force_baseline)248 TIFFjpeg_set_quality(JPEGState* sp, int quality, wxjpeg_boolean force_baseline)
249 {
250 	return CALLVJPEG(sp,
251 	    jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
252 }
253 
254 static int
TIFFjpeg_suppress_tables(JPEGState * sp,wxjpeg_boolean suppress)255 TIFFjpeg_suppress_tables(JPEGState* sp, wxjpeg_boolean suppress)
256 {
257 	return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
258 }
259 
260 static int
TIFFjpeg_start_compress(JPEGState * sp,wxjpeg_boolean write_all_tables)261 TIFFjpeg_start_compress(JPEGState* sp, wxjpeg_boolean write_all_tables)
262 {
263 	return CALLVJPEG(sp,
264 	    jpeg_start_compress(&sp->cinfo.c, write_all_tables));
265 }
266 
267 static int
TIFFjpeg_write_scanlines(JPEGState * sp,JSAMPARRAY scanlines,int num_lines)268 TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
269 {
270 	return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
271 	    scanlines, (JDIMENSION) num_lines));
272 }
273 
274 static int
TIFFjpeg_write_raw_data(JPEGState * sp,JSAMPIMAGE data,int num_lines)275 TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
276 {
277 	return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
278 	    data, (JDIMENSION) num_lines));
279 }
280 
281 static int
TIFFjpeg_finish_compress(JPEGState * sp)282 TIFFjpeg_finish_compress(JPEGState* sp)
283 {
284 	return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
285 }
286 
287 static int
TIFFjpeg_write_tables(JPEGState * sp)288 TIFFjpeg_write_tables(JPEGState* sp)
289 {
290 	return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
291 }
292 
293 static int
TIFFjpeg_read_header(JPEGState * sp,wxjpeg_boolean require_image)294 TIFFjpeg_read_header(JPEGState* sp, wxjpeg_boolean require_image)
295 {
296 	return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
297 }
298 
299 static int
TIFFjpeg_start_decompress(JPEGState * sp)300 TIFFjpeg_start_decompress(JPEGState* sp)
301 {
302 	return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
303 }
304 
305 static int
TIFFjpeg_read_scanlines(JPEGState * sp,JSAMPARRAY scanlines,int max_lines)306 TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
307 {
308 	return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
309 	    scanlines, (JDIMENSION) max_lines));
310 }
311 
312 static int
TIFFjpeg_read_raw_data(JPEGState * sp,JSAMPIMAGE data,int max_lines)313 TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
314 {
315 	return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
316 	    data, (JDIMENSION) max_lines));
317 }
318 
319 static int
TIFFjpeg_finish_decompress(JPEGState * sp)320 TIFFjpeg_finish_decompress(JPEGState* sp)
321 {
322 	return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
323 }
324 
325 static int
TIFFjpeg_abort(JPEGState * sp)326 TIFFjpeg_abort(JPEGState* sp)
327 {
328 	return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
329 }
330 
331 static int
TIFFjpeg_destroy(JPEGState * sp)332 TIFFjpeg_destroy(JPEGState* sp)
333 {
334 	return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
335 }
336 
337 static JSAMPARRAY
TIFFjpeg_alloc_sarray(JPEGState * sp,int pool_id,JDIMENSION samplesperrow,JDIMENSION numrows)338 TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
339 		      JDIMENSION samplesperrow, JDIMENSION numrows)
340 {
341 	return CALLJPEG(sp, (JSAMPARRAY) NULL,
342 	    (*sp->cinfo.comm.mem->alloc_sarray)
343 		(&sp->cinfo.comm, pool_id, samplesperrow, numrows));
344 }
345 
346 /*
347  * JPEG library destination data manager.
348  * These routines direct compressed data from libjpeg into the
349  * libtiff output buffer.
350  */
351 
352 static void
std_init_destination(j_compress_ptr cinfo)353 std_init_destination(j_compress_ptr cinfo)
354 {
355 	JPEGState* sp = (JPEGState*) cinfo;
356 	TIFF* tif = sp->tif;
357 
358 	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
359 	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
360 }
361 
362 static wxjpeg_boolean
std_empty_output_buffer(j_compress_ptr cinfo)363 std_empty_output_buffer(j_compress_ptr cinfo)
364 {
365 	JPEGState* sp = (JPEGState*) cinfo;
366 	TIFF* tif = sp->tif;
367 
368 	/* the entire buffer has been filled */
369 	tif->tif_rawcc = tif->tif_rawdatasize;
370 	TIFFFlushData1(tif);
371 	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
372 	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
373 
374 	return (TRUE);
375 }
376 
377 static void
std_term_destination(j_compress_ptr cinfo)378 std_term_destination(j_compress_ptr cinfo)
379 {
380 	JPEGState* sp = (JPEGState*) cinfo;
381 	TIFF* tif = sp->tif;
382 
383 	tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte;
384 	tif->tif_rawcc =
385 	    tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer;
386 	/* NB: libtiff does the final buffer flush */
387 }
388 
389 static void
TIFFjpeg_data_dest(JPEGState * sp,TIFF * tif)390 TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
391 {
392 	(void) tif;
393 	sp->cinfo.c.dest = &sp->dest;
394 	sp->dest.init_destination = std_init_destination;
395 	sp->dest.empty_output_buffer = std_empty_output_buffer;
396 	sp->dest.term_destination = std_term_destination;
397 }
398 
399 /*
400  * Alternate destination manager for outputting to JPEGTables field.
401  */
402 
403 static void
tables_init_destination(j_compress_ptr cinfo)404 tables_init_destination(j_compress_ptr cinfo)
405 {
406 	JPEGState* sp = (JPEGState*) cinfo;
407 
408 	/* while building, jpegtables_length is allocated buffer size */
409 	sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
410 	sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
411 }
412 
413 static wxjpeg_boolean
tables_empty_output_buffer(j_compress_ptr cinfo)414 tables_empty_output_buffer(j_compress_ptr cinfo)
415 {
416 	JPEGState* sp = (JPEGState*) cinfo;
417 	void* newbuf;
418 
419 	/* the entire buffer has been filled; enlarge it by 1000 bytes */
420 	newbuf = _TIFFrealloc((tdata_t) sp->jpegtables,
421 			      (tsize_t) (sp->jpegtables_length + 1000));
422 	if (newbuf == NULL)
423 		ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
424 	sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
425 	sp->dest.free_in_buffer = (size_t) 1000;
426 	sp->jpegtables = newbuf;
427 	sp->jpegtables_length += 1000;
428 	return (TRUE);
429 }
430 
431 static void
tables_term_destination(j_compress_ptr cinfo)432 tables_term_destination(j_compress_ptr cinfo)
433 {
434 	JPEGState* sp = (JPEGState*) cinfo;
435 
436 	/* set tables length to number of bytes actually emitted */
437 	sp->jpegtables_length -= sp->dest.free_in_buffer;
438 }
439 
440 static int
TIFFjpeg_tables_dest(JPEGState * sp,TIFF * tif)441 TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
442 {
443 	(void) tif;
444 	/*
445 	 * Allocate a working buffer for building tables.
446 	 * Initial size is 1000 bytes, which is usually adequate.
447 	 */
448 	if (sp->jpegtables)
449 		_TIFFfree(sp->jpegtables);
450 	sp->jpegtables_length = 1000;
451 	sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length);
452 	if (sp->jpegtables == NULL) {
453 		sp->jpegtables_length = 0;
454 		TIFFError("TIFFjpeg_tables_dest", "No space for JPEGTables");
455 		return (0);
456 	}
457 	sp->cinfo.c.dest = &sp->dest;
458 	sp->dest.init_destination = tables_init_destination;
459 	sp->dest.empty_output_buffer = tables_empty_output_buffer;
460 	sp->dest.term_destination = tables_term_destination;
461 	return (1);
462 }
463 
464 /*
465  * JPEG library source data manager.
466  * These routines supply compressed data to libjpeg.
467  */
468 
469 static void
std_init_source(j_decompress_ptr cinfo)470 std_init_source(j_decompress_ptr cinfo)
471 {
472 	JPEGState* sp = (JPEGState*) cinfo;
473 	TIFF* tif = sp->tif;
474 
475 	sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
476 	sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
477 }
478 
479 static wxjpeg_boolean
std_fill_input_buffer(j_decompress_ptr cinfo)480 std_fill_input_buffer(j_decompress_ptr cinfo)
481 {
482 	JPEGState* sp = (JPEGState* ) cinfo;
483 	static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
484 
485 	/*
486 	 * Should never get here since entire strip/tile is
487 	 * read into memory before the decompressor is called,
488 	 * and thus was supplied by init_source.
489 	 */
490 	WARNMS(cinfo, JWRN_JPEG_EOF);
491 	/* insert a fake EOI marker */
492 	sp->src.next_input_byte = dummy_EOI;
493 	sp->src.bytes_in_buffer = 2;
494 	return (TRUE);
495 }
496 
497 static void
std_skip_input_data(j_decompress_ptr cinfo,long num_bytes)498 std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
499 {
500 	JPEGState* sp = (JPEGState*) cinfo;
501 
502 	if (num_bytes > 0) {
503 		if (num_bytes > (long) sp->src.bytes_in_buffer) {
504 			/* oops, buffer overrun */
505 			(void) std_fill_input_buffer(cinfo);
506 		} else {
507 			sp->src.next_input_byte += (size_t) num_bytes;
508 			sp->src.bytes_in_buffer -= (size_t) num_bytes;
509 		}
510 	}
511 }
512 
513 static void
std_term_source(j_decompress_ptr cinfo)514 std_term_source(j_decompress_ptr cinfo)
515 {
516 	/* No work necessary here */
517 	/* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */
518 	/* (if so, need empty tables_term_source!) */
519 	(void) cinfo;
520 }
521 
522 static void
TIFFjpeg_data_src(JPEGState * sp,TIFF * tif)523 TIFFjpeg_data_src(JPEGState* sp, TIFF* tif)
524 {
525 	(void) tif;
526 	sp->cinfo.d.src = &sp->src;
527 	sp->src.init_source = std_init_source;
528 	sp->src.fill_input_buffer = std_fill_input_buffer;
529 	sp->src.skip_input_data = std_skip_input_data;
530 	sp->src.resync_to_restart = jpeg_resync_to_restart;
531 	sp->src.term_source = std_term_source;
532 	sp->src.bytes_in_buffer = 0;		/* for safety */
533 	sp->src.next_input_byte = NULL;
534 }
535 
536 /*
537  * Alternate source manager for reading from JPEGTables.
538  * We can share all the code except for the init routine.
539  */
540 
541 static void
tables_init_source(j_decompress_ptr cinfo)542 tables_init_source(j_decompress_ptr cinfo)
543 {
544 	JPEGState* sp = (JPEGState*) cinfo;
545 
546 	sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
547 	sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
548 }
549 
550 static void
TIFFjpeg_tables_src(JPEGState * sp,TIFF * tif)551 TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif)
552 {
553 	TIFFjpeg_data_src(sp, tif);
554 	sp->src.init_source = tables_init_source;
555 }
556 
557 /*
558  * Allocate downsampled-data buffers needed for downsampled I/O.
559  * We use values computed in jpeg_start_compress or jpeg_start_decompress.
560  * We use libjpeg's allocator so that buffers will be released automatically
561  * when done with strip/tile.
562  * This is also a handy place to compute samplesperclump, bytesperline.
563  */
564 static int
alloc_downsampled_buffers(TIFF * tif,jpeg_component_info * comp_info,int num_components)565 alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
566 			  int num_components)
567 {
568 	JPEGState* sp = JState(tif);
569 	int ci;
570 	jpeg_component_info* compptr;
571 	JSAMPARRAY buf;
572 	int samples_per_clump = 0;
573 
574 	for (ci = 0, compptr = comp_info; ci < num_components;
575 	     ci++, compptr++) {
576 		samples_per_clump += compptr->h_samp_factor *
577 			compptr->v_samp_factor;
578 		buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
579 				compptr->width_in_blocks * DCTSIZE,
580 				(JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
581 		if (buf == NULL)
582 			return (0);
583 		sp->ds_buffer[ci] = buf;
584 	}
585 	sp->samplesperclump = samples_per_clump;
586 	return (1);
587 }
588 
589 
590 /*
591  * JPEG Decoding.
592  */
593 
594 static int
JPEGSetupDecode(TIFF * tif)595 JPEGSetupDecode(TIFF* tif)
596 {
597 	JPEGState* sp = JState(tif);
598 	TIFFDirectory *td = &tif->tif_dir;
599 
600         JPEGInitializeLibJPEG( tif );
601 
602 	assert(sp != NULL);
603 	assert(sp->cinfo.comm.is_decompressor);
604 
605 	/* Read JPEGTables if it is present */
606 	if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
607 		TIFFjpeg_tables_src(sp, tif);
608 		if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
609 			TIFFError("JPEGSetupDecode", "Bogus JPEGTables field");
610 			return (0);
611 		}
612 	}
613 
614 	/* Grab parameters that are same for all strips/tiles */
615 	sp->photometric = td->td_photometric;
616 	switch (sp->photometric) {
617 	case PHOTOMETRIC_YCBCR:
618 		sp->h_sampling = td->td_ycbcrsubsampling[0];
619 		sp->v_sampling = td->td_ycbcrsubsampling[1];
620 		break;
621 	default:
622 		/* TIFF 6.0 forbids subsampling of all other color spaces */
623 		sp->h_sampling = 1;
624 		sp->v_sampling = 1;
625 		break;
626 	}
627 
628 	/* Set up for reading normal data */
629 	TIFFjpeg_data_src(sp, tif);
630 	tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
631 	return (1);
632 }
633 
634 /*
635  * Set up for decoding a strip or tile.
636  */
637 static int
JPEGPreDecode(TIFF * tif,tsample_t s)638 JPEGPreDecode(TIFF* tif, tsample_t s)
639 {
640 	JPEGState *sp = JState(tif);
641 	TIFFDirectory *td = &tif->tif_dir;
642 	static const char module[] = "JPEGPreDecode";
643 	uint32 segment_width, segment_height;
644 	int downsampled_output;
645 	int ci;
646 
647 	assert(sp != NULL);
648 	assert(sp->cinfo.comm.is_decompressor);
649 	/*
650 	 * Reset decoder state from any previous strip/tile,
651 	 * in case application didn't read the whole strip.
652 	 */
653 	if (!TIFFjpeg_abort(sp))
654 		return (0);
655 	/*
656 	 * Read the header for this strip/tile.
657 	 */
658 	if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
659 		return (0);
660 	/*
661 	 * Check image parameters and set decompression parameters.
662 	 */
663 	segment_width = td->td_imagewidth;
664 	segment_height = td->td_imagelength - tif->tif_row;
665 	if (isTiled(tif)) {
666                 segment_width = td->td_tilewidth;
667                 segment_height = td->td_tilelength;
668 		sp->bytesperline = TIFFTileRowSize(tif);
669 	} else {
670 		if (segment_height > td->td_rowsperstrip)
671 			segment_height = td->td_rowsperstrip;
672 		sp->bytesperline = TIFFScanlineSize(tif);
673 	}
674 	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
675 		/*
676 		 * For PC 2, scale down the expected strip/tile size
677 		 * to match a downsampled component
678 		 */
679 		segment_width = TIFFhowmany(segment_width, sp->h_sampling);
680 		segment_height = TIFFhowmany(segment_height, sp->v_sampling);
681 	}
682 	if (sp->cinfo.d.image_width != segment_width ||
683 	    sp->cinfo.d.image_height != segment_height) {
684 		TIFFWarning(module,
685                  "Improper JPEG strip/tile size, expected %dx%d, got %dx%d",
686                           segment_width,
687                           segment_height,
688                           sp->cinfo.d.image_width,
689                           sp->cinfo.d.image_height);
690 	}
691 	if (sp->cinfo.d.num_components !=
692 	    (td->td_planarconfig == PLANARCONFIG_CONTIG ?
693 	     td->td_samplesperpixel : 1)) {
694 		TIFFError(module, "Improper JPEG component count");
695 		return (0);
696 	}
697 	if (sp->cinfo.d.data_precision != td->td_bitspersample) {
698 		TIFFError(module, "Improper JPEG data precision");
699 		return (0);
700 	}
701 	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
702 		/* Component 0 should have expected sampling factors */
703 		if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
704 		    sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
705 			TIFFWarning(module,
706                                     "Improper JPEG sampling factors %d,%d\n"
707                                     "Apparently should be %d,%d, "
708                                     "decompressor will try reading with "
709                                     "sampling %d,%d",
710                                     sp->cinfo.d.comp_info[0].h_samp_factor,
711                                     sp->cinfo.d.comp_info[0].v_samp_factor,
712                                     sp->h_sampling,
713                                     sp->v_sampling,
714                                     sp->cinfo.d.comp_info[0].h_samp_factor,
715                                     sp->cinfo.d.comp_info[0].v_samp_factor );
716 
717                         sp->h_sampling = (uint16)
718                             sp->cinfo.d.comp_info[0].h_samp_factor;
719                         sp->v_sampling = (uint16)
720                             sp->cinfo.d.comp_info[0].v_samp_factor;
721 		}
722 		/* Rest should have sampling factors 1,1 */
723 		for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
724 			if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
725 			    sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
726 				TIFFError(module, "Improper JPEG sampling factors");
727 				return (0);
728 			}
729 		}
730 	} else {
731 		/* PC 2's single component should have sampling factors 1,1 */
732 		if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
733 		    sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
734 			TIFFError(module, "Improper JPEG sampling factors");
735 			return (0);
736 		}
737 	}
738 	downsampled_output = FALSE;
739 	if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
740 	    sp->photometric == PHOTOMETRIC_YCBCR &&
741 	    sp->jpegcolormode == JPEGCOLORMODE_RGB) {
742     	/* Convert YCbCr to RGB */
743 		sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
744 		sp->cinfo.d.out_color_space = JCS_RGB;
745 	} else {
746 			/* Suppress colorspace handling */
747 		sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
748 		sp->cinfo.d.out_color_space = JCS_UNKNOWN;
749 		if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
750 		    (sp->h_sampling != 1 || sp->v_sampling != 1))
751 			downsampled_output = TRUE;
752 		/* XXX what about up-sampling? */
753 	}
754 	if (downsampled_output) {
755 		/* Need to use raw-data interface to libjpeg */
756 		sp->cinfo.d.raw_data_out = TRUE;
757 		tif->tif_decoderow = JPEGDecodeRaw;
758 		tif->tif_decodestrip = JPEGDecodeRaw;
759 		tif->tif_decodetile = JPEGDecodeRaw;
760 	} else {
761 		/* Use normal interface to libjpeg */
762 		sp->cinfo.d.raw_data_out = FALSE;
763 		tif->tif_decoderow = JPEGDecode;
764 		tif->tif_decodestrip = JPEGDecode;
765 		tif->tif_decodetile = JPEGDecode;
766 	}
767 	/* Start JPEG decompressor */
768 	if (!TIFFjpeg_start_decompress(sp))
769 		return (0);
770 	/* Allocate downsampled-data buffers if needed */
771 	if (downsampled_output) {
772 		if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
773 					       sp->cinfo.d.num_components))
774 			return (0);
775 		sp->scancount = DCTSIZE;	/* mark buffer empty */
776 	}
777 	return (1);
778 }
779 
780 /*
781  * Decode a chunk of pixels.
782  * "Standard" case: returned data is not downsampled.
783  */
784 /*ARGSUSED*/ static int
JPEGDecode(TIFF * tif,tidata_t buf,tsize_t cc,tsample_t s)785 JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
786 {
787     JPEGState *sp = JState(tif);
788     tsize_t nrows;
789 
790     nrows = cc / sp->bytesperline;
791     if (cc % sp->bytesperline)
792         TIFFWarning(tif->tif_name, "fractional scanline not read");
793 
794     if( nrows > (int) sp->cinfo.d.image_height )
795         nrows = sp->cinfo.d.image_height;
796 
797     /* data is expected to be read in multiples of a scanline */
798     if (nrows)
799     {
800         do {
801             JSAMPROW bufptr = (JSAMPROW)buf;
802 
803             if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
804                 return (0);
805             ++tif->tif_row;
806             buf += sp->bytesperline;
807             cc -= sp->bytesperline;
808         } while (--nrows > 0);
809     }
810     /* Close down the decompressor if we've finished the strip or tile. */
811     return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
812         || TIFFjpeg_finish_decompress(sp);
813 }
814 
815 /*
816  * Decode a chunk of pixels.
817  * Returned data is downsampled per sampling factors.
818  */
819 /*ARGSUSED*/ static int
JPEGDecodeRaw(TIFF * tif,tidata_t buf,tsize_t cc,tsample_t s)820 JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
821 {
822 	JPEGState *sp = JState(tif);
823 	tsize_t nrows;
824 
825 	/* data is expected to be read in multiples of a scanline */
826 	if ( (nrows = sp->cinfo.d.image_height) ) {
827 		/* Cb,Cr both have sampling factors 1, so this is correct */
828 		JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
829 		int samples_per_clump = sp->samplesperclump;
830 
831 		do {
832 			jpeg_component_info *compptr;
833 			int ci, clumpoffset;
834 
835 			/* Reload downsampled-data buffer if needed */
836 			if (sp->scancount >= DCTSIZE) {
837 				int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
838 
839 				if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n)
840 					!= n)
841 					return (0);
842 				sp->scancount = 0;
843 			}
844 			/*
845 			 * Fastest way to unseparate data is to make one pass
846 			 * over the scanline for each row of each component.
847 			 */
848 			clumpoffset = 0;	/* first sample in clump */
849 			for (ci = 0, compptr = sp->cinfo.d.comp_info;
850 			     ci < sp->cinfo.d.num_components;
851 			     ci++, compptr++) {
852 			    int hsamp = compptr->h_samp_factor;
853 			    int vsamp = compptr->v_samp_factor;
854 			    int ypos;
855 
856 			    for (ypos = 0; ypos < vsamp; ypos++) {
857 				JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
858 				JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
859 				JDIMENSION nclump;
860 
861 				if (hsamp == 1) {
862 				    /* fast path for at least Cb and Cr */
863 				    for (nclump = clumps_per_line; nclump-- > 0; ) {
864 					outptr[0] = *inptr++;
865 					outptr += samples_per_clump;
866 				    }
867 				} else {
868 					int xpos;
869 
870 				    /* general case */
871 				    for (nclump = clumps_per_line; nclump-- > 0; ) {
872 					for (xpos = 0; xpos < hsamp; xpos++)
873 					    outptr[xpos] = *inptr++;
874 					outptr += samples_per_clump;
875 				    }
876 				}
877 				clumpoffset += hsamp;
878 			    }
879 			}
880 			++sp->scancount;
881 			++tif->tif_row;
882 			buf += sp->bytesperline;
883 			cc -= sp->bytesperline;
884 		} while (--nrows > 0);
885 	}
886 
887         /* Close down the decompressor if done. */
888         return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
889        	    || TIFFjpeg_finish_decompress(sp);
890 }
891 
892 
893 /*
894  * JPEG Encoding.
895  */
896 
897 static void
unsuppress_quant_table(JPEGState * sp,int tblno)898 unsuppress_quant_table (JPEGState* sp, int tblno)
899 {
900 	JQUANT_TBL* qtbl;
901 
902 	if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
903 		qtbl->sent_table = FALSE;
904 }
905 
906 static void
unsuppress_huff_table(JPEGState * sp,int tblno)907 unsuppress_huff_table (JPEGState* sp, int tblno)
908 {
909 	JHUFF_TBL* htbl;
910 
911 	if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
912 		htbl->sent_table = FALSE;
913 	if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
914 		htbl->sent_table = FALSE;
915 }
916 
917 static int
prepare_JPEGTables(TIFF * tif)918 prepare_JPEGTables(TIFF* tif)
919 {
920 	JPEGState* sp = JState(tif);
921 
922         JPEGInitializeLibJPEG( tif );
923 
924 	/* Initialize quant tables for current quality setting */
925 	if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
926 		return (0);
927 	/* Mark only the tables we want for output */
928 	/* NB: chrominance tables are currently used only with YCbCr */
929 	if (!TIFFjpeg_suppress_tables(sp, TRUE))
930 		return (0);
931 	if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
932 		unsuppress_quant_table(sp, 0);
933 		if (sp->photometric == PHOTOMETRIC_YCBCR)
934 			unsuppress_quant_table(sp, 1);
935 	}
936 	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
937 		unsuppress_huff_table(sp, 0);
938 		if (sp->photometric == PHOTOMETRIC_YCBCR)
939 			unsuppress_huff_table(sp, 1);
940 	}
941 	/* Direct libjpeg output into jpegtables */
942 	if (!TIFFjpeg_tables_dest(sp, tif))
943 		return (0);
944 	/* Emit tables-only datastream */
945 	if (!TIFFjpeg_write_tables(sp))
946 		return (0);
947 
948 	return (1);
949 }
950 
951 static int
JPEGSetupEncode(TIFF * tif)952 JPEGSetupEncode(TIFF* tif)
953 {
954 	JPEGState* sp = JState(tif);
955 	TIFFDirectory *td = &tif->tif_dir;
956 	static const char module[] = "JPEGSetupEncode";
957 
958         JPEGInitializeLibJPEG( tif );
959 
960 	assert(sp != NULL);
961 	assert(!sp->cinfo.comm.is_decompressor);
962 
963 	/*
964 	 * Initialize all JPEG parameters to default values.
965 	 * Note that jpeg_set_defaults needs legal values for
966 	 * in_color_space and input_components.
967 	 */
968 	sp->cinfo.c.in_color_space = JCS_UNKNOWN;
969 	sp->cinfo.c.input_components = 1;
970 	if (!TIFFjpeg_set_defaults(sp))
971 		return (0);
972 	/* Set per-file parameters */
973 	sp->photometric = td->td_photometric;
974 	switch (sp->photometric) {
975 	case PHOTOMETRIC_YCBCR:
976 		sp->h_sampling = td->td_ycbcrsubsampling[0];
977 		sp->v_sampling = td->td_ycbcrsubsampling[1];
978 		/*
979 		 * A ReferenceBlackWhite field *must* be present since the
980 		 * default value is inappropriate for YCbCr.  Fill in the
981 		 * proper value if application didn't set it.
982 		 */
983 		if (!TIFFFieldSet(tif, FIELD_REFBLACKWHITE)) {
984 			float refbw[6];
985 			long top = 1L << td->td_bitspersample;
986 			refbw[0] = 0;
987 			refbw[1] = (float)(top-1L);
988 			refbw[2] = (float)(top>>1);
989 			refbw[3] = refbw[1];
990 			refbw[4] = refbw[2];
991 			refbw[5] = refbw[1];
992 			TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
993 		}
994 		break;
995 	case PHOTOMETRIC_PALETTE:		/* disallowed by Tech Note */
996 	case PHOTOMETRIC_MASK:
997 		TIFFError(module,
998 			  "PhotometricInterpretation %d not allowed for JPEG",
999 			  (int) sp->photometric);
1000 		return (0);
1001 	default:
1002 		/* TIFF 6.0 forbids subsampling of all other color spaces */
1003 		sp->h_sampling = 1;
1004 		sp->v_sampling = 1;
1005 		break;
1006 	}
1007 
1008 	/* Verify miscellaneous parameters */
1009 
1010 	/*
1011 	 * This would need work if libtiff ever supports different
1012 	 * depths for different components, or if libjpeg ever supports
1013 	 * run-time selection of depth.  Neither is imminent.
1014 	 */
1015 	if (td->td_bitspersample != BITS_IN_JSAMPLE) {
1016 		TIFFError(module, "BitsPerSample %d not allowed for JPEG",
1017 			  (int) td->td_bitspersample);
1018 		return (0);
1019 	}
1020 	sp->cinfo.c.data_precision = td->td_bitspersample;
1021 	if (isTiled(tif)) {
1022 		if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
1023 			TIFFError(module,
1024 				  "JPEG tile height must be multiple of %d",
1025 				  sp->v_sampling * DCTSIZE);
1026 			return (0);
1027 		}
1028 		if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
1029 			TIFFError(module,
1030 				  "JPEG tile width must be multiple of %d",
1031 				  sp->h_sampling * DCTSIZE);
1032 			return (0);
1033 		}
1034 	} else {
1035 		if (td->td_rowsperstrip < td->td_imagelength &&
1036 		    (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
1037 			TIFFError(module,
1038 				  "RowsPerStrip must be multiple of %d for JPEG",
1039 				  sp->v_sampling * DCTSIZE);
1040 			return (0);
1041 		}
1042 	}
1043 
1044 	/* Create a JPEGTables field if appropriate */
1045 	if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
1046 		if (!prepare_JPEGTables(tif))
1047 			return (0);
1048 		/* Mark the field present */
1049 		/* Can't use TIFFSetField since BEENWRITING is already set! */
1050 		TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
1051 		tif->tif_flags |= TIFF_DIRTYDIRECT;
1052 	} else {
1053 		/* We do not support application-supplied JPEGTables, */
1054 		/* so mark the field not present */
1055 		TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
1056 	}
1057 
1058 	/* Direct libjpeg output to libtiff's output buffer */
1059 	TIFFjpeg_data_dest(sp, tif);
1060 
1061 	return (1);
1062 }
1063 
1064 /*
1065  * Set encoding state at the start of a strip or tile.
1066  */
1067 static int
JPEGPreEncode(TIFF * tif,tsample_t s)1068 JPEGPreEncode(TIFF* tif, tsample_t s)
1069 {
1070 	JPEGState *sp = JState(tif);
1071 	TIFFDirectory *td = &tif->tif_dir;
1072 	static const char module[] = "JPEGPreEncode";
1073 	uint32 segment_width, segment_height;
1074 	int downsampled_input;
1075 
1076 	assert(sp != NULL);
1077 	assert(!sp->cinfo.comm.is_decompressor);
1078 	/*
1079 	 * Set encoding parameters for this strip/tile.
1080 	 */
1081 	if (isTiled(tif)) {
1082 		segment_width = td->td_tilewidth;
1083 		segment_height = td->td_tilelength;
1084 		sp->bytesperline = TIFFTileRowSize(tif);
1085 	} else {
1086 		segment_width = td->td_imagewidth;
1087 		segment_height = td->td_imagelength - tif->tif_row;
1088 		if (segment_height > td->td_rowsperstrip)
1089 			segment_height = td->td_rowsperstrip;
1090 		sp->bytesperline = TIFFScanlineSize(tif);
1091 	}
1092 	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
1093 		/* for PC 2, scale down the strip/tile size
1094 		 * to match a downsampled component
1095 		 */
1096 		segment_width = TIFFhowmany(segment_width, sp->h_sampling);
1097 		segment_height = TIFFhowmany(segment_height, sp->v_sampling);
1098 	}
1099 	if (segment_width > 65535 || segment_height > 65535) {
1100 		TIFFError(module, "Strip/tile too large for JPEG");
1101 		return (0);
1102 	}
1103 	sp->cinfo.c.image_width = segment_width;
1104 	sp->cinfo.c.image_height = segment_height;
1105 	downsampled_input = FALSE;
1106 	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1107 		sp->cinfo.c.input_components = td->td_samplesperpixel;
1108 		if (sp->photometric == PHOTOMETRIC_YCBCR) {
1109 			if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1110 				sp->cinfo.c.in_color_space = JCS_RGB;
1111 			} else {
1112 				sp->cinfo.c.in_color_space = JCS_YCbCr;
1113 				if (sp->h_sampling != 1 || sp->v_sampling != 1)
1114 					downsampled_input = TRUE;
1115 			}
1116 			if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
1117 				return (0);
1118 			/*
1119 			 * Set Y sampling factors;
1120 			 * we assume jpeg_set_colorspace() set the rest to 1
1121 			 */
1122 			sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
1123 			sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
1124 		} else {
1125 			sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1126 			if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
1127 				return (0);
1128 			/* jpeg_set_colorspace set all sampling factors to 1 */
1129 		}
1130 	} else {
1131 		sp->cinfo.c.input_components = 1;
1132 		sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1133 		if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
1134 			return (0);
1135 		sp->cinfo.c.comp_info[0].component_id = s;
1136 		/* jpeg_set_colorspace() set sampling factors to 1 */
1137 		if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
1138 			sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
1139 			sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
1140 			sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
1141 		}
1142 	}
1143 	/* ensure libjpeg won't write any extraneous markers */
1144 	sp->cinfo.c.write_JFIF_header = FALSE;
1145 	sp->cinfo.c.write_Adobe_marker = FALSE;
1146 	/* set up table handling correctly */
1147 	if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) {
1148 		if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
1149 			return (0);
1150 		unsuppress_quant_table(sp, 0);
1151 		unsuppress_quant_table(sp, 1);
1152 	}
1153 	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
1154 		sp->cinfo.c.optimize_coding = FALSE;
1155 	else
1156 		sp->cinfo.c.optimize_coding = TRUE;
1157 	if (downsampled_input) {
1158 		/* Need to use raw-data interface to libjpeg */
1159 		sp->cinfo.c.raw_data_in = TRUE;
1160 		tif->tif_encoderow = JPEGEncodeRaw;
1161 		tif->tif_encodestrip = JPEGEncodeRaw;
1162 		tif->tif_encodetile = JPEGEncodeRaw;
1163 	} else {
1164 		/* Use normal interface to libjpeg */
1165 		sp->cinfo.c.raw_data_in = FALSE;
1166 		tif->tif_encoderow = JPEGEncode;
1167 		tif->tif_encodestrip = JPEGEncode;
1168 		tif->tif_encodetile = JPEGEncode;
1169 	}
1170 	/* Start JPEG compressor */
1171 	if (!TIFFjpeg_start_compress(sp, FALSE))
1172 		return (0);
1173 	/* Allocate downsampled-data buffers if needed */
1174 	if (downsampled_input) {
1175 		if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
1176 					       sp->cinfo.c.num_components))
1177 			return (0);
1178 	}
1179 	sp->scancount = 0;
1180 
1181 	return (1);
1182 }
1183 
1184 /*
1185  * Encode a chunk of pixels.
1186  * "Standard" case: incoming data is not downsampled.
1187  */
1188 static int
JPEGEncode(TIFF * tif,tidata_t buf,tsize_t cc,tsample_t s)1189 JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
1190 {
1191 	JPEGState *sp = JState(tif);
1192 	tsize_t nrows;
1193 	JSAMPROW bufptr[1];
1194 
1195 	(void) s;
1196 	assert(sp != NULL);
1197 	/* data is expected to be supplied in multiples of a scanline */
1198 	nrows = cc / sp->bytesperline;
1199 	if (cc % sp->bytesperline)
1200 		TIFFWarning(tif->tif_name, "fractional scanline discarded");
1201 
1202 	while (nrows-- > 0) {
1203 		bufptr[0] = (JSAMPROW) buf;
1204 		if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
1205 			return (0);
1206 		if (nrows > 0)
1207 			tif->tif_row++;
1208 		buf += sp->bytesperline;
1209 	}
1210 	return (1);
1211 }
1212 
1213 /*
1214  * Encode a chunk of pixels.
1215  * Incoming data is expected to be downsampled per sampling factors.
1216  */
1217 static int
JPEGEncodeRaw(TIFF * tif,tidata_t buf,tsize_t cc,tsample_t s)1218 JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
1219 {
1220 	JPEGState *sp = JState(tif);
1221 	JSAMPLE* inptr;
1222 	JSAMPLE* outptr;
1223 	tsize_t nrows;
1224 	JDIMENSION clumps_per_line, nclump;
1225 	int clumpoffset, ci, xpos, ypos;
1226 	jpeg_component_info* compptr;
1227 	int samples_per_clump = sp->samplesperclump;
1228 
1229 	(void) s;
1230 	assert(sp != NULL);
1231 	/* data is expected to be supplied in multiples of a scanline */
1232 	nrows = cc / sp->bytesperline;
1233 	if (cc % sp->bytesperline)
1234 		TIFFWarning(tif->tif_name, "fractional scanline discarded");
1235 
1236 	/* Cb,Cr both have sampling factors 1, so this is correct */
1237 	clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
1238 
1239 	while (nrows-- > 0) {
1240 		/*
1241 		 * Fastest way to separate the data is to make one pass
1242 		 * over the scanline for each row of each component.
1243 		 */
1244 		clumpoffset = 0;		/* first sample in clump */
1245 		for (ci = 0, compptr = sp->cinfo.c.comp_info;
1246 		     ci < sp->cinfo.c.num_components;
1247 		     ci++, compptr++) {
1248 		    int hsamp = compptr->h_samp_factor;
1249 		    int vsamp = compptr->v_samp_factor;
1250 		    int padding = (int) (compptr->width_in_blocks * DCTSIZE -
1251 					 clumps_per_line * hsamp);
1252 		    for (ypos = 0; ypos < vsamp; ypos++) {
1253 			inptr = ((JSAMPLE*) buf) + clumpoffset;
1254 			outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
1255 			if (hsamp == 1) {
1256 			    /* fast path for at least Cb and Cr */
1257 			    for (nclump = clumps_per_line; nclump-- > 0; ) {
1258 				*outptr++ = inptr[0];
1259 				inptr += samples_per_clump;
1260 			    }
1261 			} else {
1262 			    /* general case */
1263 			    for (nclump = clumps_per_line; nclump-- > 0; ) {
1264 				for (xpos = 0; xpos < hsamp; xpos++)
1265 				    *outptr++ = inptr[xpos];
1266 				inptr += samples_per_clump;
1267 			    }
1268 			}
1269 			/* pad each scanline as needed */
1270 			for (xpos = 0; xpos < padding; xpos++) {
1271 			    *outptr = outptr[-1];
1272 			    outptr++;
1273 			}
1274 			clumpoffset += hsamp;
1275 		    }
1276 		}
1277 		sp->scancount++;
1278 		if (sp->scancount >= DCTSIZE) {
1279 			int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
1280 			if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
1281 				return (0);
1282 			sp->scancount = 0;
1283 		}
1284 		if (nrows > 0)
1285 			tif->tif_row++;
1286 		buf += sp->bytesperline;
1287 	}
1288 	return (1);
1289 }
1290 
1291 /*
1292  * Finish up at the end of a strip or tile.
1293  */
1294 static int
JPEGPostEncode(TIFF * tif)1295 JPEGPostEncode(TIFF* tif)
1296 {
1297 	JPEGState *sp = JState(tif);
1298 
1299 	if (sp->scancount > 0) {
1300 		/*
1301 		 * Need to emit a partial bufferload of downsampled data.
1302 		 * Pad the data vertically.
1303 		 */
1304 		int ci, ypos, n;
1305 		jpeg_component_info* compptr;
1306 
1307 		for (ci = 0, compptr = sp->cinfo.c.comp_info;
1308 		     ci < sp->cinfo.c.num_components;
1309 		     ci++, compptr++) {
1310 			int vsamp = compptr->v_samp_factor;
1311 			tsize_t row_width = compptr->width_in_blocks * DCTSIZE
1312 				* sizeof(JSAMPLE);
1313 			for (ypos = sp->scancount * vsamp;
1314 			     ypos < DCTSIZE * vsamp; ypos++) {
1315 				_TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos],
1316 					    (tdata_t)sp->ds_buffer[ci][ypos-1],
1317 					    row_width);
1318 
1319 			}
1320 		}
1321 		n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
1322 		if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
1323 			return (0);
1324 	}
1325 
1326 	return (TIFFjpeg_finish_compress(JState(tif)));
1327 }
1328 
1329 static void
JPEGCleanup(TIFF * tif)1330 JPEGCleanup(TIFF* tif)
1331 {
1332 	if (tif->tif_data) {
1333 		JPEGState *sp = JState(tif);
1334                 if( sp->cinfo_initialized )
1335                     TIFFjpeg_destroy(sp);	/* release libjpeg resources */
1336 		if (sp->jpegtables)		/* tag value */
1337 			_TIFFfree(sp->jpegtables);
1338 		_TIFFfree(tif->tif_data);	/* release local state */
1339 		tif->tif_data = NULL;
1340 	}
1341 }
1342 
1343 static int
JPEGVSetField(TIFF * tif,ttag_t tag,va_list ap)1344 JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap)
1345 {
1346 	JPEGState* sp = JState(tif);
1347 	TIFFDirectory* td = &tif->tif_dir;
1348 	uint32 v32;
1349 
1350 	switch (tag) {
1351 	case TIFFTAG_JPEGTABLES:
1352 		v32 = va_arg(ap, uint32);
1353 		if (v32 == 0) {
1354 			/* XXX */
1355 			return (0);
1356 		}
1357 		_TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*),
1358 		    (long) v32);
1359 		sp->jpegtables_length = v32;
1360 		TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
1361 		break;
1362 	case TIFFTAG_JPEGQUALITY:
1363 		sp->jpegquality = va_arg(ap, int);
1364 		return (1);			/* pseudo tag */
1365 	case TIFFTAG_JPEGCOLORMODE:
1366 		sp->jpegcolormode = va_arg(ap, int);
1367 		/*
1368 		 * Mark whether returned data is up-sampled or not
1369 		 * so TIFFStripSize and TIFFTileSize return values
1370 		 * that reflect the true amount of data.
1371 		 */
1372 		tif->tif_flags &= ~TIFF_UPSAMPLED;
1373 		if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1374 		    if (td->td_photometric == PHOTOMETRIC_YCBCR &&
1375 		      sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1376 			tif->tif_flags |= TIFF_UPSAMPLED;
1377 		    } else {
1378 			if (td->td_ycbcrsubsampling[0] != 1 ||
1379 			    td->td_ycbcrsubsampling[1] != 1)
1380 			    ; /* XXX what about up-sampling? */
1381 		    }
1382 		}
1383 		/*
1384 		 * Must recalculate cached tile size
1385 		 * in case sampling state changed.
1386 		 */
1387 		tif->tif_tilesize = TIFFTileSize(tif);
1388 		return (1);			/* pseudo tag */
1389 	case TIFFTAG_JPEGTABLESMODE:
1390 		sp->jpegtablesmode = va_arg(ap, int);
1391 		return (1);			/* pseudo tag */
1392 	case TIFFTAG_YCBCRSUBSAMPLING:
1393                 /* mark the fact that we have a real ycbcrsubsampling! */
1394 		sp->ycbcrsampling_fetched = 1;
1395 		return (*sp->vsetparent)(tif, tag, ap);
1396 	default:
1397 		return (*sp->vsetparent)(tif, tag, ap);
1398 	}
1399 	tif->tif_flags |= TIFF_DIRTYDIRECT;
1400 	return (1);
1401 }
1402 
1403 /*
1404  * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
1405  * the TIFF tags, but still use non-default (2,2) values within the jpeg
1406  * data stream itself.  In order for TIFF applications to work properly
1407  * - for instance to get the strip buffer size right - it is imperative
1408  * that the subsampling be available before we start reading the image
1409  * data normally.  This function will attempt to load the first strip in
1410  * order to get the sampling values from the jpeg data stream.  Various
1411  * hacks are various places are done to ensure this function gets called
1412  * before the td_ycbcrsubsampling values are used from the directory structure,
1413  * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from
1414  * TIFFStripSize(), and the printing code in tif_print.c.
1415  *
1416  * Note that JPEGPreDeocode() will produce a fairly loud warning when the
1417  * discovered sampling does not match the default sampling (2,2) or whatever
1418  * was actually in the tiff tags.
1419  *
1420  * Problems:
1421  *  o This code will cause one whole strip/tile of compressed data to be
1422  *    loaded just to get the tags right, even if the imagery is never read.
1423  *    It would be more efficient to just load a bit of the header, and
1424  *    initialize things from that.
1425  *
1426  * See the bug in bugzilla for details:
1427  *
1428  * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
1429  *
1430  * Frank Warmerdam, July 2002
1431  */
1432 
1433 static void
JPEGFixupTestSubsampling(TIFF * tif)1434 JPEGFixupTestSubsampling( TIFF * tif )
1435 {
1436 #if CHECK_JPEG_YCBCR_SUBSAMPLING == 1
1437     JPEGState *sp = JState(tif);
1438     TIFFDirectory *td = &tif->tif_dir;
1439 
1440     JPEGInitializeLibJPEG( tif );
1441 
1442     /*
1443      * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags,
1444      * and use a sampling schema other than the default 2,2.  To handle
1445      * this we actually have to scan the header of a strip or tile of
1446      * jpeg data to get the sampling.
1447      */
1448     if( !sp->cinfo.comm.is_decompressor
1449         || sp->ycbcrsampling_fetched
1450         || td->td_photometric != PHOTOMETRIC_YCBCR )
1451         return;
1452 
1453     sp->ycbcrsampling_fetched = 1;
1454     if( TIFFIsTiled( tif ) )
1455     {
1456         if( !TIFFFillTile( tif, 0 ) )
1457             return;
1458     }
1459     else
1460     {
1461         if( !TIFFFillStrip( tif, 0 ) )
1462             return;
1463     }
1464 
1465     TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
1466                   (uint16) sp->h_sampling, (uint16) sp->v_sampling );
1467 #endif /* CHECK_JPEG_YCBCR_SUBSAMPLING == 1 */
1468 }
1469 
1470 static int
JPEGVGetField(TIFF * tif,ttag_t tag,va_list ap)1471 JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap)
1472 {
1473 	JPEGState* sp = JState(tif);
1474 
1475 	switch (tag) {
1476 	case TIFFTAG_JPEGTABLES:
1477 		/* u_short is bogus --- should be uint32 ??? */
1478 		/* TIFFWriteNormalTag needs fixed  XXX */
1479 		*va_arg(ap, u_short*) = (u_short) sp->jpegtables_length;
1480 		*va_arg(ap, void**) = sp->jpegtables;
1481 		break;
1482 	case TIFFTAG_JPEGQUALITY:
1483 		*va_arg(ap, int*) = sp->jpegquality;
1484 		break;
1485 	case TIFFTAG_JPEGCOLORMODE:
1486 		*va_arg(ap, int*) = sp->jpegcolormode;
1487 		break;
1488 	case TIFFTAG_JPEGTABLESMODE:
1489 		*va_arg(ap, int*) = sp->jpegtablesmode;
1490 		break;
1491 	case TIFFTAG_YCBCRSUBSAMPLING:
1492                 JPEGFixupTestSubsampling( tif );
1493 		return (*sp->vgetparent)(tif, tag, ap);
1494 		break;
1495 	default:
1496 		return (*sp->vgetparent)(tif, tag, ap);
1497 	}
1498 	return (1);
1499 }
1500 
1501 static void
JPEGPrintDir(TIFF * tif,FILE * fd,long flags)1502 JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
1503 {
1504 	JPEGState* sp = JState(tif);
1505 
1506 	(void) flags;
1507 	if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
1508 		fprintf(fd, "  JPEG Tables: (%lu bytes)\n",
1509 			(u_long) sp->jpegtables_length);
1510 }
1511 
1512 static uint32
JPEGDefaultStripSize(TIFF * tif,uint32 s)1513 JPEGDefaultStripSize(TIFF* tif, uint32 s)
1514 {
1515 	JPEGState* sp = JState(tif);
1516 	TIFFDirectory *td = &tif->tif_dir;
1517 
1518 	s = (*sp->defsparent)(tif, s);
1519 	if (s < td->td_imagelength)
1520 		s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
1521 	return (s);
1522 }
1523 
1524 static void
JPEGDefaultTileSize(TIFF * tif,uint32 * tw,uint32 * th)1525 JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
1526 {
1527 	JPEGState* sp = JState(tif);
1528 	TIFFDirectory *td = &tif->tif_dir;
1529 
1530 	(*sp->deftparent)(tif, tw, th);
1531 	*tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
1532 	*th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
1533 }
1534 
1535 /*
1536  * The JPEG library initialized used to be done in TIFFInitJPEG(), but
1537  * now that we allow a TIFF file to be opened in update mode it is necessary
1538  * to have some way of deciding whether compression or decompression is
1539  * desired other than looking at tif->tif_mode.  We accomplish this by
1540  * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
1541  * If so, we assume decompression is desired.
1542  *
1543  * This is tricky, because TIFFInitJPEG() is called while the directory is
1544  * being read, and generally speaking the BYTECOUNTS tag won't have been read
1545  * at that point.  So we try to defer jpeg library initialization till we
1546  * do have that tag ... basically any access that might require the compressor
1547  * or decompressor that occurs after the reading of the directory.
1548  *
1549  * In an ideal world compressors or decompressors would be setup
1550  * at the point where a single tile or strip was accessed (for read or write)
1551  * so that stuff like update of missing tiles, or replacement of tiles could
1552  * be done. However, we aren't trying to crack that nut just yet ...
1553  *
1554  * NFW, Feb 3rd, 2003.
1555  */
1556 
JPEGInitializeLibJPEG(TIFF * tif)1557 static int JPEGInitializeLibJPEG( TIFF * tif )
1558 {
1559     JPEGState* sp = JState(tif);
1560     uint32 *byte_counts = NULL;
1561     int     data_is_empty = TRUE;
1562 
1563     if( sp->cinfo_initialized )
1564         return 1;
1565 
1566     /*
1567      * Do we have tile data already?  Make sure we initialize the
1568      * the state in decompressor mode if we have tile data, even if we
1569      * are not in read-only file access mode.
1570      */
1571     if( TIFFIsTiled( tif )
1572         && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &byte_counts )
1573         && byte_counts != NULL )
1574     {
1575         data_is_empty = byte_counts[0] == 0;
1576     }
1577     if( !TIFFIsTiled( tif )
1578         && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &byte_counts)
1579         && byte_counts != NULL )
1580     {
1581         data_is_empty = byte_counts[0] == 0;
1582     }
1583 
1584     /*
1585      * Initialize libjpeg.
1586      */
1587     if (tif->tif_mode == O_RDONLY || !data_is_empty ) {
1588         if (!TIFFjpeg_create_decompress(sp))
1589             return (0);
1590 
1591     } else {
1592         if (!TIFFjpeg_create_compress(sp))
1593             return (0);
1594     }
1595 
1596     sp->cinfo_initialized = TRUE;
1597 
1598     return 1;
1599 }
1600 
1601 int
TIFFInitJPEG(TIFF * tif,int scheme)1602 TIFFInitJPEG(TIFF* tif, int scheme)
1603 {
1604 	JPEGState* sp;
1605 
1606 	assert(scheme == COMPRESSION_JPEG);
1607 
1608 	/*
1609 	 * Allocate state block so tag methods have storage to record values.
1610 	 */
1611 	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState));
1612 
1613 	if (tif->tif_data == NULL) {
1614 		TIFFError("TIFFInitJPEG", "No space for JPEG state block");
1615 		return (0);
1616 	}
1617         memset( tif->tif_data, 0, sizeof(JPEGState));
1618 
1619 	sp = JState(tif);
1620 	sp->tif = tif;				/* back link */
1621 
1622 	/*
1623 	 * Merge codec-specific tag information and
1624 	 * override parent get/set field methods.
1625 	 */
1626 	_TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo));
1627 	sp->vgetparent = tif->tif_tagmethods.vgetfield;
1628 	tif->tif_tagmethods.vgetfield = JPEGVGetField;	/* hook for codec tags */
1629 	sp->vsetparent = tif->tif_tagmethods.vsetfield;
1630 	tif->tif_tagmethods.vsetfield = JPEGVSetField;	/* hook for codec tags */
1631 	tif->tif_tagmethods.printdir = JPEGPrintDir;	/* hook for codec tags */
1632 
1633 	/* Default values for codec-specific fields */
1634 	sp->jpegtables = NULL;
1635 	sp->jpegtables_length = 0;
1636 	sp->jpegquality = 75;			/* Default IJG quality */
1637 	sp->jpegcolormode = JPEGCOLORMODE_RAW;
1638 	sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
1639 
1640         sp->ycbcrsampling_fetched = 0;
1641 
1642 	/*
1643 	 * Install codec methods.
1644 	 */
1645 	tif->tif_setupdecode = JPEGSetupDecode;
1646 	tif->tif_predecode = JPEGPreDecode;
1647 	tif->tif_decoderow = JPEGDecode;
1648 	tif->tif_decodestrip = JPEGDecode;
1649 	tif->tif_decodetile = JPEGDecode;
1650 	tif->tif_setupencode = JPEGSetupEncode;
1651 	tif->tif_preencode = JPEGPreEncode;
1652 	tif->tif_postencode = JPEGPostEncode;
1653 	tif->tif_encoderow = JPEGEncode;
1654 	tif->tif_encodestrip = JPEGEncode;
1655 	tif->tif_encodetile = JPEGEncode;
1656 	tif->tif_cleanup = JPEGCleanup;
1657 	sp->defsparent = tif->tif_defstripsize;
1658 	tif->tif_defstripsize = JPEGDefaultStripSize;
1659 	sp->deftparent = tif->tif_deftilesize;
1660 	tif->tif_deftilesize = JPEGDefaultTileSize;
1661 	tif->tif_flags |= TIFF_NOBITREV;	/* no bit reversal, please */
1662 
1663         sp->cinfo_initialized = FALSE;
1664 
1665         /*
1666          * Mark the TIFFTAG_YCBCRSAMPLES as present even if it is not
1667          * see: JPEGFixupTestSubsampling().
1668          */
1669         TIFFSetFieldBit( tif, FIELD_YCBCRSUBSAMPLING );
1670 
1671 	return (1);
1672 }
1673 #endif /* JPEG_SUPPORT */
1674