blob: df06e03fab22ccf99b7a38272b0846eb97b83deb [file] [log] [blame]
Nicolas Penac7600242017-07-20 14:35:29 -04001/* $Id: tif_jpeg.c,v 1.127 2017-01-31 13:02:27 erouault Exp $ */
Bo Xufdc00a72014-10-28 23:03:33 -07002
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 */
Lei Zhang9c2c87d2016-01-07 15:52:44 -080026
Bo Xufdc00a72014-10-28 23:03:33 -070027#define WIN32_LEAN_AND_MEAN
28#define VC_EXTRALEAN
29
30#include "tiffiop.h"
31#ifdef JPEG_SUPPORT
32
33/*
34 * TIFF Library
35 *
36 * JPEG Compression support per TIFF Technical Note #2
37 * (*not* per the original TIFF 6.0 spec).
38 *
39 * This file is simply an interface to the libjpeg library written by
40 * the Independent JPEG Group. You need release 5 or later of the IJG
41 * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
42 *
43 * Contributed by Tom Lane <tgl@sss.pgh.pa.us>.
44 */
45#include <setjmp.h>
46
47int TIFFFillStrip(TIFF* tif, uint32 strip);
48int TIFFFillTile(TIFF* tif, uint32 tile);
49int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode );
50
51/* We undefine FAR to avoid conflict with JPEG definition */
52
53#ifdef FAR
54#undef FAR
55#endif
56
57/*
58 Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is
59 not defined. Unfortunately, the MinGW and Borland compilers include
60 a typedef for INT32, which causes a conflict. MSVC does not include
Lei Zhangcfb6f462017-03-20 15:46:06 -070061 a conflicting typedef given the headers which are included.
Bo Xufdc00a72014-10-28 23:03:33 -070062*/
63#if defined(__BORLANDC__) || defined(__MINGW32__)
64# define XMD_H 1
65#endif
66
67/*
68 The windows RPCNDR.H file defines boolean, but defines it with the
69 unsigned char size. You should compile JPEG library using appropriate
70 definitions in jconfig.h header, but many users compile library in wrong
71 way. That causes errors of the following type:
72
73 "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432,
74 caller expects 464"
75
76 For such users we wil fix the problem here. See install.doc file from
77 the JPEG library distribution for details.
78*/
79
80/* Define "boolean" as unsigned char, not int, per Windows custom. */
Lei Zhang9c2c87d2016-01-07 15:52:44 -080081#if defined(__WIN32__) && !defined(__MINGW32__)
Bo Xufdc00a72014-10-28 23:03:33 -070082# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
83 typedef unsigned char boolean;
84# endif
85# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
86#endif
87
Lei Zhang888ec9f2015-11-10 13:16:37 -080088#if defined(USE_SYSTEM_LIBJPEG)
89#include <jerror.h>
90#include <jpeglib.h>
91#elif defined(USE_LIBJPEG_TURBO)
92#include "third_party/libjpeg_turbo/jerror.h"
93#include "third_party/libjpeg_turbo/jpeglib.h"
Bo Xufdc00a72014-10-28 23:03:33 -070094#else
Lei Zhang888ec9f2015-11-10 13:16:37 -080095#include "third_party/libjpeg/jerror.h"
96#include "third_party/libjpeg/jpeglib.h"
97#endif
Bo Xufdc00a72014-10-28 23:03:33 -070098
99/*
100 * Do we want to do special processing suitable for when JSAMPLE is a
101 * 16bit value?
102 */
103
104#if defined(JPEG_LIB_MK1)
105# define JPEG_LIB_MK1_OR_12BIT 1
106#elif BITS_IN_JSAMPLE == 12
107# define JPEG_LIB_MK1_OR_12BIT 1
108#endif
109
110/*
111 * We are using width_in_blocks which is supposed to be private to
112 * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has
113 * renamed this member to width_in_data_units. Since the header has
114 * also renamed a define, use that unique define name in order to
115 * detect the problem header and adjust to suit.
116 */
117#if defined(D_MAX_DATA_UNITS_IN_MCU)
118#define width_in_blocks width_in_data_units
119#endif
120
121/*
122 * On some machines it may be worthwhile to use _setjmp or sigsetjmp
123 * in place of plain setjmp. These macros will make it easier.
124 */
125#define SETJMP(jbuf) setjmp(jbuf)
126#define LONGJMP(jbuf,code) longjmp(jbuf,code)
127#define JMP_BUF jmp_buf
128
129typedef struct jpeg_destination_mgr jpeg_destination_mgr;
130typedef struct jpeg_source_mgr jpeg_source_mgr;
131typedef struct jpeg_error_mgr jpeg_error_mgr;
132
133/*
134 * State block for each open TIFF file using
135 * libjpeg to do JPEG compression/decompression.
136 *
137 * libjpeg's visible state is either a jpeg_compress_struct
138 * or jpeg_decompress_struct depending on which way we
139 * are going. comm can be used to refer to the fields
140 * which are common to both.
141 *
142 * NB: cinfo is required to be the first member of JPEGState,
143 * so we can safely cast JPEGState* -> jpeg_xxx_struct*
144 * and vice versa!
145 */
146typedef struct {
147 union {
148 struct jpeg_compress_struct c;
149 struct jpeg_decompress_struct d;
150 struct jpeg_common_struct comm;
151 } cinfo; /* NB: must be first */
152 int cinfo_initialized;
153
154 jpeg_error_mgr err; /* libjpeg error manager */
155 JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
156 /*
157 * The following two members could be a union, but
158 * they're small enough that it's not worth the effort.
159 */
160 jpeg_destination_mgr dest; /* data dest for compression */
161 jpeg_source_mgr src; /* data source for decompression */
162 /* private state */
163 TIFF* tif; /* back link needed by some code */
164 uint16 photometric; /* copy of PhotometricInterpretation */
165 uint16 h_sampling; /* luminance sampling factors */
166 uint16 v_sampling;
167 tmsize_t bytesperline; /* decompressed bytes per scanline */
168 /* pointers to intermediate buffers when processing downsampled data */
169 JSAMPARRAY ds_buffer[MAX_COMPONENTS];
170 int scancount; /* number of "scanlines" accumulated */
171 int samplesperclump;
172
173 TIFFVGetMethod vgetparent; /* super-class method */
174 TIFFVSetMethod vsetparent; /* super-class method */
175 TIFFPrintMethod printdir; /* super-class method */
176 TIFFStripMethod defsparent; /* super-class method */
177 TIFFTileMethod deftparent; /* super-class method */
178 /* pseudo-tag fields */
179 void* jpegtables; /* JPEGTables tag value, or NULL */
180 uint32 jpegtables_length; /* number of bytes in same */
181 int jpegquality; /* Compression quality level */
182 int jpegcolormode; /* Auto RGB<=>YCbCr convert? */
183 int jpegtablesmode; /* What to put in JPEGTables */
184
185 int ycbcrsampling_fetched;
186} JPEGState;
187
188#define JState(tif) ((JPEGState*)(tif)->tif_data)
189
190static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
191static int JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
192static int JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
193static int JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
194static int JPEGInitializeLibJPEG(TIFF * tif, int decode );
195static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
196
197#define FIELD_JPEGTABLES (FIELD_CODEC+0)
198
199static const TIFFField jpegFields[] = {
200 { TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL },
201 { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
202 { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL },
203 { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL }
204};
205
206/*
207 * libjpeg interface layer.
208 *
209 * We use setjmp/longjmp to return control to libtiff
210 * when a fatal error is encountered within the JPEG
211 * library. We also direct libjpeg error and warning
212 * messages through the appropriate libtiff handlers.
213 */
214
215/*
216 * Error handling routines (these replace corresponding
217 * IJG routines from jerror.c). These are used for both
218 * compression and decompression.
219 */
220static void
221TIFFjpeg_error_exit(j_common_ptr cinfo)
222{
223 JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */
224 char buffer[JMSG_LENGTH_MAX];
225
226 (*cinfo->err->format_message) (cinfo, buffer);
227 TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer); /* display the error message */
228 jpeg_abort(cinfo); /* clean up libjpeg state */
229 LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
230}
231
232/*
233 * This routine is invoked only for warning messages,
234 * since error_exit does its own thing and trace_level
235 * is never set > 0.
236 */
237static void
238TIFFjpeg_output_message(j_common_ptr cinfo)
239{
240 char buffer[JMSG_LENGTH_MAX];
241
242 (*cinfo->err->format_message) (cinfo, buffer);
243 TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer);
244}
245
246/*
247 * Interface routines. This layer of routines exists
248 * primarily to limit side-effects from using setjmp.
249 * Also, normal/error returns are converted into return
250 * values per libtiff practice.
251 */
252#define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
253#define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1))
254
255static int
256TIFFjpeg_create_compress(JPEGState* sp)
257{
258 /* initialize JPEG error handling */
259 sp->cinfo.c.err = jpeg_std_error(&sp->err);
260 sp->err.error_exit = TIFFjpeg_error_exit;
261 sp->err.output_message = TIFFjpeg_output_message;
262
Lei Zhang9c2c87d2016-01-07 15:52:44 -0800263 /* set client_data to avoid UMR warning from tools like Purify */
264 sp->cinfo.c.client_data = NULL;
265
Bo Xufdc00a72014-10-28 23:03:33 -0700266 return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
267}
268
269static int
270TIFFjpeg_create_decompress(JPEGState* sp)
271{
272 /* initialize JPEG error handling */
273 sp->cinfo.d.err = jpeg_std_error(&sp->err);
274 sp->err.error_exit = TIFFjpeg_error_exit;
275 sp->err.output_message = TIFFjpeg_output_message;
276
Lei Zhang9c2c87d2016-01-07 15:52:44 -0800277 /* set client_data to avoid UMR warning from tools like Purify */
278 sp->cinfo.d.client_data = NULL;
279
Bo Xufdc00a72014-10-28 23:03:33 -0700280 return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
281}
282
283static int
284TIFFjpeg_set_defaults(JPEGState* sp)
285{
286 return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
287}
288
289static int
290TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
291{
292 return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
293}
294
295static int
296TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
297{
298 return CALLVJPEG(sp,
299 jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
300}
301
302static int
303TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
304{
305 return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
306}
307
308static int
309TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
310{
311 return CALLVJPEG(sp,
312 jpeg_start_compress(&sp->cinfo.c, write_all_tables));
313}
314
315static int
316TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
317{
318 return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
319 scanlines, (JDIMENSION) num_lines));
320}
321
322static int
323TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
324{
325 return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
326 data, (JDIMENSION) num_lines));
327}
328
329static int
330TIFFjpeg_finish_compress(JPEGState* sp)
331{
332 return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
333}
334
335static int
336TIFFjpeg_write_tables(JPEGState* sp)
337{
338 return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
339}
340
341static int
342TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
343{
344 return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
345}
346
347static int
348TIFFjpeg_start_decompress(JPEGState* sp)
349{
350 return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
351}
352
353static int
354TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
355{
356 return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
357 scanlines, (JDIMENSION) max_lines));
358}
359
360static int
361TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
362{
363 return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
364 data, (JDIMENSION) max_lines));
365}
366
367static int
368TIFFjpeg_finish_decompress(JPEGState* sp)
369{
370 return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
371}
372
373static int
374TIFFjpeg_abort(JPEGState* sp)
375{
376 return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
377}
378
379static int
380TIFFjpeg_destroy(JPEGState* sp)
381{
382 return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
383}
384
385static JSAMPARRAY
386TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
387 JDIMENSION samplesperrow, JDIMENSION numrows)
388{
389 return CALLJPEG(sp, (JSAMPARRAY) NULL,
390 (*sp->cinfo.comm.mem->alloc_sarray)
391 (&sp->cinfo.comm, pool_id, samplesperrow, numrows));
392}
393
394/*
395 * JPEG library destination data manager.
396 * These routines direct compressed data from libjpeg into the
397 * libtiff output buffer.
398 */
399
400static void
401std_init_destination(j_compress_ptr cinfo)
402{
403 JPEGState* sp = (JPEGState*) cinfo;
404 TIFF* tif = sp->tif;
405
406 sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
407 sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
408}
409
410static boolean
411std_empty_output_buffer(j_compress_ptr cinfo)
412{
413 JPEGState* sp = (JPEGState*) cinfo;
414 TIFF* tif = sp->tif;
415
416 /* the entire buffer has been filled */
417 tif->tif_rawcc = tif->tif_rawdatasize;
418
419#ifdef IPPJ_HUFF
420 /*
421 * The Intel IPP performance library does not necessarily fill up
422 * the whole output buffer on each pass, so only dump out the parts
423 * that have been filled.
424 * http://trac.osgeo.org/gdal/wiki/JpegIPP
425 */
426 if ( sp->dest.free_in_buffer >= 0 ) {
427 tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer;
428 }
429#endif
430
431 TIFFFlushData1(tif);
432 sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
433 sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
434
435 return (TRUE);
436}
437
438static void
439std_term_destination(j_compress_ptr cinfo)
440{
441 JPEGState* sp = (JPEGState*) cinfo;
442 TIFF* tif = sp->tif;
443
444 tif->tif_rawcp = (uint8*) sp->dest.next_output_byte;
445 tif->tif_rawcc =
446 tif->tif_rawdatasize - (tmsize_t) sp->dest.free_in_buffer;
447 /* NB: libtiff does the final buffer flush */
448}
449
450static void
451TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
452{
453 (void) tif;
454 sp->cinfo.c.dest = &sp->dest;
455 sp->dest.init_destination = std_init_destination;
456 sp->dest.empty_output_buffer = std_empty_output_buffer;
457 sp->dest.term_destination = std_term_destination;
458}
459
460/*
461 * Alternate destination manager for outputting to JPEGTables field.
462 */
463
464static void
465tables_init_destination(j_compress_ptr cinfo)
466{
467 JPEGState* sp = (JPEGState*) cinfo;
468
469 /* while building, jpegtables_length is allocated buffer size */
470 sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
471 sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
472}
473
474static boolean
475tables_empty_output_buffer(j_compress_ptr cinfo)
476{
477 JPEGState* sp = (JPEGState*) cinfo;
478 void* newbuf;
479
480 /* the entire buffer has been filled; enlarge it by 1000 bytes */
481 newbuf = _TIFFrealloc((void*) sp->jpegtables,
482 (tmsize_t) (sp->jpegtables_length + 1000));
483 if (newbuf == NULL)
484 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
485 sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
486 sp->dest.free_in_buffer = (size_t) 1000;
487 sp->jpegtables = newbuf;
488 sp->jpegtables_length += 1000;
489 return (TRUE);
490}
491
492static void
493tables_term_destination(j_compress_ptr cinfo)
494{
495 JPEGState* sp = (JPEGState*) cinfo;
496
497 /* set tables length to number of bytes actually emitted */
498 sp->jpegtables_length -= (uint32) sp->dest.free_in_buffer;
499}
500
501static int
502TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
503{
504 (void) tif;
505 /*
506 * Allocate a working buffer for building tables.
507 * Initial size is 1000 bytes, which is usually adequate.
508 */
509 if (sp->jpegtables)
510 _TIFFfree(sp->jpegtables);
511 sp->jpegtables_length = 1000;
512 sp->jpegtables = (void*) _TIFFmalloc((tmsize_t) sp->jpegtables_length);
513 if (sp->jpegtables == NULL) {
514 sp->jpegtables_length = 0;
515 TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables");
516 return (0);
517 }
518 sp->cinfo.c.dest = &sp->dest;
519 sp->dest.init_destination = tables_init_destination;
520 sp->dest.empty_output_buffer = tables_empty_output_buffer;
521 sp->dest.term_destination = tables_term_destination;
522 return (1);
523}
524
525/*
526 * JPEG library source data manager.
527 * These routines supply compressed data to libjpeg.
528 */
529
530static void
531std_init_source(j_decompress_ptr cinfo)
532{
533 JPEGState* sp = (JPEGState*) cinfo;
534 TIFF* tif = sp->tif;
535
536 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
537 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
538}
539
540static boolean
541std_fill_input_buffer(j_decompress_ptr cinfo)
542{
543 JPEGState* sp = (JPEGState* ) cinfo;
544 static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
545
546#ifdef IPPJ_HUFF
547 /*
548 * The Intel IPP performance library does not necessarily read the whole
549 * input buffer in one pass, so it is possible to get here with data
550 * yet to read.
551 *
552 * We just return without doing anything, until the entire buffer has
553 * been read.
554 * http://trac.osgeo.org/gdal/wiki/JpegIPP
555 */
556 if( sp->src.bytes_in_buffer > 0 ) {
557 return (TRUE);
558 }
559#endif
560
561 /*
562 * Normally the whole strip/tile is read and so we don't need to do
563 * a fill. In the case of CHUNKY_STRIP_READ_SUPPORT we might not have
564 * all the data, but the rawdata is refreshed between scanlines and
565 * we push this into the io machinery in JPEGDecode().
566 * http://trac.osgeo.org/gdal/ticket/3894
567 */
568
569 WARNMS(cinfo, JWRN_JPEG_EOF);
570 /* insert a fake EOI marker */
571 sp->src.next_input_byte = dummy_EOI;
572 sp->src.bytes_in_buffer = 2;
573 return (TRUE);
574}
575
576static void
577std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
578{
579 JPEGState* sp = (JPEGState*) cinfo;
580
581 if (num_bytes > 0) {
582 if ((size_t)num_bytes > sp->src.bytes_in_buffer) {
583 /* oops, buffer overrun */
584 (void) std_fill_input_buffer(cinfo);
585 } else {
586 sp->src.next_input_byte += (size_t) num_bytes;
587 sp->src.bytes_in_buffer -= (size_t) num_bytes;
588 }
589 }
590}
591
592static void
593std_term_source(j_decompress_ptr cinfo)
594{
595 /* No work necessary here */
596 (void) cinfo;
597}
598
599static void
600TIFFjpeg_data_src(JPEGState* sp, TIFF* tif)
601{
602 (void) tif;
603 sp->cinfo.d.src = &sp->src;
604 sp->src.init_source = std_init_source;
605 sp->src.fill_input_buffer = std_fill_input_buffer;
606 sp->src.skip_input_data = std_skip_input_data;
607 sp->src.resync_to_restart = jpeg_resync_to_restart;
608 sp->src.term_source = std_term_source;
609 sp->src.bytes_in_buffer = 0; /* for safety */
610 sp->src.next_input_byte = NULL;
611}
612
613/*
614 * Alternate source manager for reading from JPEGTables.
615 * We can share all the code except for the init routine.
616 */
617
618static void
619tables_init_source(j_decompress_ptr cinfo)
620{
621 JPEGState* sp = (JPEGState*) cinfo;
622
623 sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
624 sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
625}
626
627static void
628TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif)
629{
630 TIFFjpeg_data_src(sp, tif);
631 sp->src.init_source = tables_init_source;
632}
633
634/*
635 * Allocate downsampled-data buffers needed for downsampled I/O.
636 * We use values computed in jpeg_start_compress or jpeg_start_decompress.
637 * We use libjpeg's allocator so that buffers will be released automatically
638 * when done with strip/tile.
639 * This is also a handy place to compute samplesperclump, bytesperline.
640 */
641static int
642alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
643 int num_components)
644{
645 JPEGState* sp = JState(tif);
646 int ci;
647 jpeg_component_info* compptr;
648 JSAMPARRAY buf;
649 int samples_per_clump = 0;
650
651 for (ci = 0, compptr = comp_info; ci < num_components;
652 ci++, compptr++) {
653 samples_per_clump += compptr->h_samp_factor *
654 compptr->v_samp_factor;
655 buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
656 compptr->width_in_blocks * DCTSIZE,
657 (JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
658 if (buf == NULL)
659 return (0);
660 sp->ds_buffer[ci] = buf;
661 }
662 sp->samplesperclump = samples_per_clump;
663 return (1);
664}
665
666
667/*
668 * JPEG Decoding.
669 */
670
671#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
672
673#define JPEG_MARKER_SOF0 0xC0
674#define JPEG_MARKER_SOF1 0xC1
Lei Zhang9c2c87d2016-01-07 15:52:44 -0800675#define JPEG_MARKER_SOF2 0xC2
676#define JPEG_MARKER_SOF9 0xC9
677#define JPEG_MARKER_SOF10 0xCA
Bo Xufdc00a72014-10-28 23:03:33 -0700678#define JPEG_MARKER_DHT 0xC4
679#define JPEG_MARKER_SOI 0xD8
680#define JPEG_MARKER_SOS 0xDA
681#define JPEG_MARKER_DQT 0xDB
682#define JPEG_MARKER_DRI 0xDD
683#define JPEG_MARKER_APP0 0xE0
684#define JPEG_MARKER_COM 0xFE
685struct JPEGFixupTagsSubsamplingData
686{
687 TIFF* tif;
688 void* buffer;
689 uint32 buffersize;
690 uint8* buffercurrentbyte;
691 uint32 bufferbytesleft;
692 uint64 fileoffset;
693 uint64 filebytesleft;
694 uint8 filepositioned;
695};
696static void JPEGFixupTagsSubsampling(TIFF* tif);
697static int JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data);
698static int JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result);
699static int JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result);
700static void JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength);
701
702#endif
703
704static int
705JPEGFixupTags(TIFF* tif)
706{
707#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
Nicolas Penac7600242017-07-20 14:35:29 -0400708 JPEGState* sp = JState(tif);
Bo Xufdc00a72014-10-28 23:03:33 -0700709 if ((tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)&&
710 (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
Nicolas Penac7600242017-07-20 14:35:29 -0400711 (tif->tif_dir.td_samplesperpixel==3) &&
712 !sp->ycbcrsampling_fetched)
Bo Xufdc00a72014-10-28 23:03:33 -0700713 JPEGFixupTagsSubsampling(tif);
714#endif
715
716 return(1);
717}
718
719#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
720
721static void
722JPEGFixupTagsSubsampling(TIFF* tif)
723{
724 /*
725 * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
726 * the TIFF tags, but still use non-default (2,2) values within the jpeg
727 * data stream itself. In order for TIFF applications to work properly
728 * - for instance to get the strip buffer size right - it is imperative
729 * that the subsampling be available before we start reading the image
730 * data normally. This function will attempt to analyze the first strip in
731 * order to get the sampling values from the jpeg data stream.
732 *
733 * Note that JPEGPreDeocode() will produce a fairly loud warning when the
734 * discovered sampling does not match the default sampling (2,2) or whatever
735 * was actually in the tiff tags.
736 *
737 * See the bug in bugzilla for details:
738 *
739 * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
740 *
741 * Frank Warmerdam, July 2002
742 * Joris Van Damme, May 2007
743 */
744 static const char module[] = "JPEGFixupTagsSubsampling";
745 struct JPEGFixupTagsSubsamplingData m;
746
747 _TIFFFillStriles( tif );
748
749 if( tif->tif_dir.td_stripbytecount == NULL
Lei Zhang9c2c87d2016-01-07 15:52:44 -0800750 || tif->tif_dir.td_stripoffset == NULL
Bo Xufdc00a72014-10-28 23:03:33 -0700751 || tif->tif_dir.td_stripbytecount[0] == 0 )
752 {
753 /* Do not even try to check if the first strip/tile does not
754 yet exist, as occurs when GDAL has created a new NULL file
755 for instance. */
756 return;
757 }
758
759 m.tif=tif;
760 m.buffersize=2048;
761 m.buffer=_TIFFmalloc(m.buffersize);
762 if (m.buffer==NULL)
763 {
764 TIFFWarningExt(tif->tif_clientdata,module,
765 "Unable to allocate memory for auto-correcting of subsampling values; auto-correcting skipped");
766 return;
767 }
768 m.buffercurrentbyte=NULL;
769 m.bufferbytesleft=0;
770 m.fileoffset=tif->tif_dir.td_stripoffset[0];
771 m.filepositioned=0;
772 m.filebytesleft=tif->tif_dir.td_stripbytecount[0];
773 if (!JPEGFixupTagsSubsamplingSec(&m))
774 TIFFWarningExt(tif->tif_clientdata,module,
775 "Unable to auto-correct subsampling values, likely corrupt JPEG compressed data in first strip/tile; auto-correcting skipped");
776 _TIFFfree(m.buffer);
777}
778
779static int
780JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data)
781{
782 static const char module[] = "JPEGFixupTagsSubsamplingSec";
783 uint8 m;
784 while (1)
785 {
786 while (1)
787 {
788 if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
789 return(0);
790 if (m==255)
791 break;
792 }
793 while (1)
794 {
795 if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
796 return(0);
797 if (m!=255)
798 break;
799 }
800 switch (m)
801 {
802 case JPEG_MARKER_SOI:
803 /* this type of marker has no data and should be skipped */
804 break;
805 case JPEG_MARKER_COM:
806 case JPEG_MARKER_APP0:
807 case JPEG_MARKER_APP0+1:
808 case JPEG_MARKER_APP0+2:
809 case JPEG_MARKER_APP0+3:
810 case JPEG_MARKER_APP0+4:
811 case JPEG_MARKER_APP0+5:
812 case JPEG_MARKER_APP0+6:
813 case JPEG_MARKER_APP0+7:
814 case JPEG_MARKER_APP0+8:
815 case JPEG_MARKER_APP0+9:
816 case JPEG_MARKER_APP0+10:
817 case JPEG_MARKER_APP0+11:
818 case JPEG_MARKER_APP0+12:
819 case JPEG_MARKER_APP0+13:
820 case JPEG_MARKER_APP0+14:
821 case JPEG_MARKER_APP0+15:
822 case JPEG_MARKER_DQT:
823 case JPEG_MARKER_SOS:
824 case JPEG_MARKER_DHT:
825 case JPEG_MARKER_DRI:
826 /* this type of marker has data, but it has no use to us and should be skipped */
827 {
828 uint16 n;
829 if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
830 return(0);
831 if (n<2)
832 return(0);
833 n-=2;
834 if (n>0)
835 JPEGFixupTagsSubsamplingSkip(data,n);
836 }
837 break;
Lei Zhang9c2c87d2016-01-07 15:52:44 -0800838 case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */
839 case JPEG_MARKER_SOF1: /* Extended sequential Huffman */
840 case JPEG_MARKER_SOF2: /* Progressive Huffman: normally not allowed by TechNote, but that doesn't hurt supporting it */
841 case JPEG_MARKER_SOF9: /* Extended sequential arithmetic */
842 case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not allowed by TechNote, but that doesn't hurt supporting it */
Bo Xufdc00a72014-10-28 23:03:33 -0700843 /* this marker contains the subsampling factors we're scanning for */
844 {
845 uint16 n;
846 uint16 o;
847 uint8 p;
848 uint8 ph,pv;
849 if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
850 return(0);
851 if (n!=8+data->tif->tif_dir.td_samplesperpixel*3)
852 return(0);
853 JPEGFixupTagsSubsamplingSkip(data,7);
854 if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
855 return(0);
856 ph=(p>>4);
857 pv=(p&15);
858 JPEGFixupTagsSubsamplingSkip(data,1);
859 for (o=1; o<data->tif->tif_dir.td_samplesperpixel; o++)
860 {
861 JPEGFixupTagsSubsamplingSkip(data,1);
862 if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
863 return(0);
864 if (p!=0x11)
865 {
866 TIFFWarningExt(data->tif->tif_clientdata,module,
867 "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
868 return(1);
869 }
870 JPEGFixupTagsSubsamplingSkip(data,1);
871 }
872 if (((ph!=1)&&(ph!=2)&&(ph!=4))||((pv!=1)&&(pv!=2)&&(pv!=4)))
873 {
874 TIFFWarningExt(data->tif->tif_clientdata,module,
875 "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
876 return(1);
877 }
878 if ((ph!=data->tif->tif_dir.td_ycbcrsubsampling[0])||(pv!=data->tif->tif_dir.td_ycbcrsubsampling[1]))
879 {
880 TIFFWarningExt(data->tif->tif_clientdata,module,
881 "Auto-corrected former TIFF subsampling values [%d,%d] to match subsampling values inside JPEG compressed data [%d,%d]",
882 (int)data->tif->tif_dir.td_ycbcrsubsampling[0],
883 (int)data->tif->tif_dir.td_ycbcrsubsampling[1],
884 (int)ph,(int)pv);
885 data->tif->tif_dir.td_ycbcrsubsampling[0]=ph;
886 data->tif->tif_dir.td_ycbcrsubsampling[1]=pv;
887 }
888 }
889 return(1);
890 default:
891 return(0);
892 }
893 }
894}
895
896static int
897JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result)
898{
899 if (data->bufferbytesleft==0)
900 {
901 uint32 m;
902 if (data->filebytesleft==0)
903 return(0);
904 if (!data->filepositioned)
905 {
906 TIFFSeekFile(data->tif,data->fileoffset,SEEK_SET);
907 data->filepositioned=1;
908 }
909 m=data->buffersize;
910 if ((uint64)m>data->filebytesleft)
911 m=(uint32)data->filebytesleft;
912 assert(m<0x80000000UL);
913 if (TIFFReadFile(data->tif,data->buffer,(tmsize_t)m)!=(tmsize_t)m)
914 return(0);
915 data->buffercurrentbyte=data->buffer;
916 data->bufferbytesleft=m;
917 data->fileoffset+=m;
918 data->filebytesleft-=m;
919 }
920 *result=*data->buffercurrentbyte;
921 data->buffercurrentbyte++;
922 data->bufferbytesleft--;
923 return(1);
924}
925
926static int
927JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result)
928{
929 uint8 ma;
930 uint8 mb;
931 if (!JPEGFixupTagsSubsamplingReadByte(data,&ma))
932 return(0);
933 if (!JPEGFixupTagsSubsamplingReadByte(data,&mb))
934 return(0);
935 *result=(ma<<8)|mb;
936 return(1);
937}
938
939static void
940JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength)
941{
942 if ((uint32)skiplength<=data->bufferbytesleft)
943 {
944 data->buffercurrentbyte+=skiplength;
945 data->bufferbytesleft-=skiplength;
946 }
947 else
948 {
949 uint16 m;
Lei Zhangcfb6f462017-03-20 15:46:06 -0700950 m=(uint16)(skiplength-data->bufferbytesleft);
Bo Xufdc00a72014-10-28 23:03:33 -0700951 if (m<=data->filebytesleft)
952 {
953 data->bufferbytesleft=0;
954 data->fileoffset+=m;
955 data->filebytesleft-=m;
956 data->filepositioned=0;
957 }
958 else
959 {
960 data->bufferbytesleft=0;
961 data->filebytesleft=0;
962 }
963 }
964}
965
966#endif
967
968
969static int
970JPEGSetupDecode(TIFF* tif)
971{
972 JPEGState* sp = JState(tif);
973 TIFFDirectory *td = &tif->tif_dir;
974
975#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
976 if( tif->tif_dir.td_bitspersample == 12 )
977 return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 0 );
978#endif
979
980 JPEGInitializeLibJPEG( tif, TRUE );
981
982 assert(sp != NULL);
983 assert(sp->cinfo.comm.is_decompressor);
984
985 /* Read JPEGTables if it is present */
986 if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
987 TIFFjpeg_tables_src(sp, tif);
988 if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
989 TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field");
990 return (0);
991 }
992 }
993
994 /* Grab parameters that are same for all strips/tiles */
995 sp->photometric = td->td_photometric;
996 switch (sp->photometric) {
997 case PHOTOMETRIC_YCBCR:
998 sp->h_sampling = td->td_ycbcrsubsampling[0];
999 sp->v_sampling = td->td_ycbcrsubsampling[1];
1000 break;
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 /* Set up for reading normal data */
1009 TIFFjpeg_data_src(sp, tif);
1010 tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
1011 return (1);
1012}
1013
1014/*
1015 * Set up for decoding a strip or tile.
1016 */
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001017/*ARGSUSED*/ static int
Bo Xufdc00a72014-10-28 23:03:33 -07001018JPEGPreDecode(TIFF* tif, uint16 s)
1019{
1020 JPEGState *sp = JState(tif);
1021 TIFFDirectory *td = &tif->tif_dir;
1022 static const char module[] = "JPEGPreDecode";
1023 uint32 segment_width, segment_height;
1024 int downsampled_output;
1025 int ci;
1026
1027 assert(sp != NULL);
1028
1029 if (sp->cinfo.comm.is_decompressor == 0)
1030 {
1031 tif->tif_setupdecode( tif );
1032 }
1033
1034 assert(sp->cinfo.comm.is_decompressor);
1035 /*
1036 * Reset decoder state from any previous strip/tile,
1037 * in case application didn't read the whole strip.
1038 */
1039 if (!TIFFjpeg_abort(sp))
1040 return (0);
1041 /*
1042 * Read the header for this strip/tile.
1043 */
1044
1045 if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
1046 return (0);
1047
1048 tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
1049 tif->tif_rawcc = sp->src.bytes_in_buffer;
1050
1051 /*
1052 * Check image parameters and set decompression parameters.
1053 */
1054 segment_width = td->td_imagewidth;
1055 segment_height = td->td_imagelength - tif->tif_row;
1056 if (isTiled(tif)) {
1057 segment_width = td->td_tilewidth;
1058 segment_height = td->td_tilelength;
1059 sp->bytesperline = TIFFTileRowSize(tif);
1060 } else {
1061 if (segment_height > td->td_rowsperstrip)
1062 segment_height = td->td_rowsperstrip;
1063 sp->bytesperline = TIFFScanlineSize(tif);
1064 }
1065 if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
1066 /*
1067 * For PC 2, scale down the expected strip/tile size
1068 * to match a downsampled component
1069 */
1070 segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
1071 segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
1072 }
1073 if (sp->cinfo.d.image_width < segment_width ||
1074 sp->cinfo.d.image_height < segment_height) {
1075 TIFFWarningExt(tif->tif_clientdata, module,
1076 "Improper JPEG strip/tile size, "
1077 "expected %dx%d, got %dx%d",
1078 segment_width, segment_height,
1079 sp->cinfo.d.image_width,
1080 sp->cinfo.d.image_height);
1081 }
1082 if (sp->cinfo.d.image_width > segment_width ||
1083 sp->cinfo.d.image_height > segment_height) {
1084 /*
1085 * This case could be dangerous, if the strip or tile size has
1086 * been reported as less than the amount of data jpeg will
1087 * return, some potential security issues arise. Catch this
1088 * case and error out.
1089 */
1090 TIFFErrorExt(tif->tif_clientdata, module,
1091 "JPEG strip/tile size exceeds expected dimensions,"
1092 " expected %dx%d, got %dx%d",
1093 segment_width, segment_height,
1094 sp->cinfo.d.image_width, sp->cinfo.d.image_height);
1095 return (0);
1096 }
1097 if (sp->cinfo.d.num_components !=
1098 (td->td_planarconfig == PLANARCONFIG_CONTIG ?
1099 td->td_samplesperpixel : 1)) {
1100 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count");
1101 return (0);
1102 }
1103#ifdef JPEG_LIB_MK1
1104 if (12 != td->td_bitspersample && 8 != td->td_bitspersample) {
1105 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
1106 return (0);
1107 }
1108 sp->cinfo.d.data_precision = td->td_bitspersample;
1109 sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
1110#else
1111 if (sp->cinfo.d.data_precision != td->td_bitspersample) {
1112 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
1113 return (0);
1114 }
1115#endif
1116 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1117 /* Component 0 should have expected sampling factors */
1118 if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
1119 sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
1120 TIFFErrorExt(tif->tif_clientdata, module,
1121 "Improper JPEG sampling factors %d,%d\n"
1122 "Apparently should be %d,%d.",
1123 sp->cinfo.d.comp_info[0].h_samp_factor,
1124 sp->cinfo.d.comp_info[0].v_samp_factor,
1125 sp->h_sampling, sp->v_sampling);
1126 return (0);
1127 }
1128 /* Rest should have sampling factors 1,1 */
1129 for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
1130 if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
1131 sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
1132 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
1133 return (0);
1134 }
1135 }
1136 } else {
1137 /* PC 2's single component should have sampling factors 1,1 */
1138 if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
1139 sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
1140 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
1141 return (0);
1142 }
1143 }
1144 downsampled_output = FALSE;
1145 if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
1146 sp->photometric == PHOTOMETRIC_YCBCR &&
1147 sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1148 /* Convert YCbCr to RGB */
1149 sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
1150 sp->cinfo.d.out_color_space = JCS_RGB;
1151 } else {
1152 /* Suppress colorspace handling */
1153 sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
1154 sp->cinfo.d.out_color_space = JCS_UNKNOWN;
1155 if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
1156 (sp->h_sampling != 1 || sp->v_sampling != 1))
1157 downsampled_output = TRUE;
1158 /* XXX what about up-sampling? */
1159 }
1160 if (downsampled_output) {
1161 /* Need to use raw-data interface to libjpeg */
1162 sp->cinfo.d.raw_data_out = TRUE;
1163#if JPEG_LIB_VERSION >= 70
1164 sp->cinfo.d.do_fancy_upsampling = FALSE;
1165#endif /* JPEG_LIB_VERSION >= 70 */
1166 tif->tif_decoderow = DecodeRowError;
1167 tif->tif_decodestrip = JPEGDecodeRaw;
1168 tif->tif_decodetile = JPEGDecodeRaw;
1169 } else {
1170 /* Use normal interface to libjpeg */
1171 sp->cinfo.d.raw_data_out = FALSE;
1172 tif->tif_decoderow = JPEGDecode;
1173 tif->tif_decodestrip = JPEGDecode;
1174 tif->tif_decodetile = JPEGDecode;
1175 }
1176 /* Start JPEG decompressor */
1177 if (!TIFFjpeg_start_decompress(sp))
1178 return (0);
1179 /* Allocate downsampled-data buffers if needed */
1180 if (downsampled_output) {
1181 if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
1182 sp->cinfo.d.num_components))
1183 return (0);
1184 sp->scancount = DCTSIZE; /* mark buffer empty */
1185 }
1186 return (1);
1187}
1188
1189/*
1190 * Decode a chunk of pixels.
1191 * "Standard" case: returned data is not downsampled.
1192 */
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001193#if !JPEG_LIB_MK1_OR_12BIT
1194static int
1195JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1196{
1197 JPEGState *sp = JState(tif);
1198 tmsize_t nrows;
1199 (void) s;
1200
1201 /*
1202 ** Update available information, buffer may have been refilled
1203 ** between decode requests
1204 */
1205 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
1206 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
1207
1208 if( sp->bytesperline == 0 )
1209 return 0;
1210
1211 nrows = cc / sp->bytesperline;
1212 if (cc % sp->bytesperline)
1213 TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
1214 "fractional scanline not read");
1215
1216 if( nrows > (tmsize_t) sp->cinfo.d.image_height )
1217 nrows = sp->cinfo.d.image_height;
1218
1219 /* data is expected to be read in multiples of a scanline */
1220 if (nrows)
1221 {
1222 do
1223 {
1224 /*
1225 * In the libjpeg6b-9a 8bit case. We read directly into
1226 * the TIFF buffer.
1227 */
1228 JSAMPROW bufptr = (JSAMPROW)buf;
1229
1230 if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
1231 return (0);
1232
1233 ++tif->tif_row;
1234 buf += sp->bytesperline;
1235 cc -= sp->bytesperline;
1236 } while (--nrows > 0);
1237 }
1238
1239 /* Update information on consumed data */
1240 tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
1241 tif->tif_rawcc = sp->src.bytes_in_buffer;
1242
1243 /* Close down the decompressor if we've finished the strip or tile. */
1244 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
1245 || TIFFjpeg_finish_decompress(sp);
1246}
1247#endif /* !JPEG_LIB_MK1_OR_12BIT */
1248
1249#if JPEG_LIB_MK1_OR_12BIT
Bo Xufdc00a72014-10-28 23:03:33 -07001250/*ARGSUSED*/ static int
1251JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1252{
1253 JPEGState *sp = JState(tif);
1254 tmsize_t nrows;
1255 (void) s;
1256
1257 /*
1258 ** Update available information, buffer may have been refilled
1259 ** between decode requests
1260 */
1261 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
1262 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
1263
1264 if( sp->bytesperline == 0 )
1265 return 0;
1266
1267 nrows = cc / sp->bytesperline;
1268 if (cc % sp->bytesperline)
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001269 TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
1270 "fractional scanline not read");
Bo Xufdc00a72014-10-28 23:03:33 -07001271
1272 if( nrows > (tmsize_t) sp->cinfo.d.image_height )
1273 nrows = sp->cinfo.d.image_height;
1274
1275 /* data is expected to be read in multiples of a scanline */
1276 if (nrows)
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001277 {
1278 JSAMPROW line_work_buf = NULL;
Bo Xufdc00a72014-10-28 23:03:33 -07001279
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001280 /*
1281 * For 6B, only use temporary buffer for 12 bit imagery.
1282 * For Mk1 always use it.
1283 */
1284 if( sp->cinfo.d.data_precision == 12 )
1285 {
1286 line_work_buf = (JSAMPROW)
1287 _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width
1288 * sp->cinfo.d.num_components );
1289 }
Bo Xufdc00a72014-10-28 23:03:33 -07001290
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001291 do
1292 {
1293 if( line_work_buf != NULL )
1294 {
1295 /*
Lei Zhangcfb6f462017-03-20 15:46:06 -07001296 * In the MK1 case, we always read into a 16bit
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001297 * buffer, and then pack down to 12bit or 8bit.
1298 * In 6B case we only read into 16 bit buffer
1299 * for 12bit data, which we need to repack.
1300 */
1301 if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
1302 return (0);
Bo Xufdc00a72014-10-28 23:03:33 -07001303
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001304 if( sp->cinfo.d.data_precision == 12 )
1305 {
1306 int value_pairs = (sp->cinfo.d.output_width
1307 * sp->cinfo.d.num_components) / 2;
1308 int iPair;
Bo Xufdc00a72014-10-28 23:03:33 -07001309
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001310 for( iPair = 0; iPair < value_pairs; iPair++ )
1311 {
1312 unsigned char *out_ptr =
1313 ((unsigned char *) buf) + iPair * 3;
1314 JSAMPLE *in_ptr = line_work_buf + iPair * 2;
Bo Xufdc00a72014-10-28 23:03:33 -07001315
Lei Zhangcfb6f462017-03-20 15:46:06 -07001316 out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
1317 out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
1318 | ((in_ptr[1] & 0xf00) >> 8));
1319 out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001320 }
1321 }
1322 else if( sp->cinfo.d.data_precision == 8 )
1323 {
1324 int value_count = (sp->cinfo.d.output_width
1325 * sp->cinfo.d.num_components);
1326 int iValue;
Bo Xufdc00a72014-10-28 23:03:33 -07001327
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001328 for( iValue = 0; iValue < value_count; iValue++ )
1329 {
1330 ((unsigned char *) buf)[iValue] =
1331 line_work_buf[iValue] & 0xff;
1332 }
1333 }
1334 }
Bo Xufdc00a72014-10-28 23:03:33 -07001335
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001336 ++tif->tif_row;
1337 buf += sp->bytesperline;
1338 cc -= sp->bytesperline;
1339 } while (--nrows > 0);
Bo Xufdc00a72014-10-28 23:03:33 -07001340
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001341 if( line_work_buf != NULL )
1342 _TIFFfree( line_work_buf );
1343 }
Bo Xufdc00a72014-10-28 23:03:33 -07001344
1345 /* Update information on consumed data */
1346 tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
1347 tif->tif_rawcc = sp->src.bytes_in_buffer;
1348
1349 /* Close down the decompressor if we've finished the strip or tile. */
1350 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001351 || TIFFjpeg_finish_decompress(sp);
Bo Xufdc00a72014-10-28 23:03:33 -07001352}
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001353#endif /* JPEG_LIB_MK1_OR_12BIT */
Bo Xufdc00a72014-10-28 23:03:33 -07001354
1355/*ARGSUSED*/ static int
1356DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1357
1358{
1359 (void) buf;
1360 (void) cc;
1361 (void) s;
1362
1363 TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline",
1364 "scanline oriented access is not supported for downsampled JPEG compressed images, consider enabling TIFF_JPEGCOLORMODE as JPEGCOLORMODE_RGB." );
1365 return 0;
1366}
1367
1368/*
1369 * Decode a chunk of pixels.
1370 * Returned data is downsampled per sampling factors.
1371 */
1372/*ARGSUSED*/ static int
1373JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1374{
1375 JPEGState *sp = JState(tif);
1376 tmsize_t nrows;
1377 (void) s;
1378
1379 /* data is expected to be read in multiples of a scanline */
Lei Zhangcfb6f462017-03-20 15:46:06 -07001380 if ( (nrows = sp->cinfo.d.image_height) != 0 ) {
Bo Xufdc00a72014-10-28 23:03:33 -07001381
1382 /* Cb,Cr both have sampling factors 1, so this is correct */
1383 JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
1384 int samples_per_clump = sp->samplesperclump;
1385
1386#if defined(JPEG_LIB_MK1_OR_12BIT)
1387 unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) *
1388 sp->cinfo.d.output_width *
1389 sp->cinfo.d.num_components);
1390 if(tmpbuf==NULL) {
1391 TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
1392 "Out of memory");
1393 return 0;
1394 }
1395#endif
1396
1397 do {
1398 jpeg_component_info *compptr;
1399 int ci, clumpoffset;
1400
1401 if( cc < sp->bytesperline ) {
1402 TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
1403 "application buffer not large enough for all data.");
1404 return 0;
1405 }
1406
1407 /* Reload downsampled-data buffer if needed */
1408 if (sp->scancount >= DCTSIZE) {
1409 int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
1410 if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
1411 return (0);
1412 sp->scancount = 0;
1413 }
1414 /*
1415 * Fastest way to unseparate data is to make one pass
1416 * over the scanline for each row of each component.
1417 */
1418 clumpoffset = 0; /* first sample in clump */
1419 for (ci = 0, compptr = sp->cinfo.d.comp_info;
1420 ci < sp->cinfo.d.num_components;
1421 ci++, compptr++) {
1422 int hsamp = compptr->h_samp_factor;
1423 int vsamp = compptr->v_samp_factor;
1424 int ypos;
1425
1426 for (ypos = 0; ypos < vsamp; ypos++) {
1427 JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
1428 JDIMENSION nclump;
1429#if defined(JPEG_LIB_MK1_OR_12BIT)
1430 JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset;
1431#else
1432 JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
1433 if (cc < (tmsize_t) (clumpoffset + samples_per_clump*(clumps_per_line-1) + hsamp)) {
1434 TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
1435 "application buffer not large enough for all data, possible subsampling issue");
1436 return 0;
1437 }
1438#endif
1439
1440 if (hsamp == 1) {
1441 /* fast path for at least Cb and Cr */
1442 for (nclump = clumps_per_line; nclump-- > 0; ) {
1443 outptr[0] = *inptr++;
1444 outptr += samples_per_clump;
1445 }
1446 } else {
1447 int xpos;
1448
1449 /* general case */
1450 for (nclump = clumps_per_line; nclump-- > 0; ) {
1451 for (xpos = 0; xpos < hsamp; xpos++)
1452 outptr[xpos] = *inptr++;
1453 outptr += samples_per_clump;
1454 }
1455 }
1456 clumpoffset += hsamp;
1457 }
1458 }
1459
1460#if defined(JPEG_LIB_MK1_OR_12BIT)
1461 {
1462 if (sp->cinfo.d.data_precision == 8)
1463 {
1464 int i=0;
1465 int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components;
1466 for (i=0; i<len; i++)
1467 {
1468 ((unsigned char*)buf)[i] = tmpbuf[i] & 0xff;
1469 }
1470 }
1471 else
1472 { /* 12-bit */
1473 int value_pairs = (sp->cinfo.d.output_width
1474 * sp->cinfo.d.num_components) / 2;
1475 int iPair;
1476 for( iPair = 0; iPair < value_pairs; iPair++ )
1477 {
1478 unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3;
1479 JSAMPLE *in_ptr = (JSAMPLE *) (tmpbuf + iPair * 2);
Lei Zhangcfb6f462017-03-20 15:46:06 -07001480 out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
1481 out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
1482 | ((in_ptr[1] & 0xf00) >> 8));
1483 out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
Bo Xufdc00a72014-10-28 23:03:33 -07001484 }
1485 }
1486 }
1487#endif
1488
1489 sp->scancount ++;
1490 tif->tif_row += sp->v_sampling;
1491
1492 buf += sp->bytesperline;
1493 cc -= sp->bytesperline;
1494
1495 nrows -= sp->v_sampling;
1496 } while (nrows > 0);
1497
1498#if defined(JPEG_LIB_MK1_OR_12BIT)
1499 _TIFFfree(tmpbuf);
1500#endif
1501
1502 }
1503
1504 /* Close down the decompressor if done. */
1505 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
1506 || TIFFjpeg_finish_decompress(sp);
1507}
1508
1509
1510/*
1511 * JPEG Encoding.
1512 */
1513
1514static void
1515unsuppress_quant_table (JPEGState* sp, int tblno)
1516{
1517 JQUANT_TBL* qtbl;
1518
1519 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
1520 qtbl->sent_table = FALSE;
1521}
1522
1523static void
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001524suppress_quant_table (JPEGState* sp, int tblno)
1525{
1526 JQUANT_TBL* qtbl;
1527
1528 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
1529 qtbl->sent_table = TRUE;
1530}
1531
1532static void
Bo Xufdc00a72014-10-28 23:03:33 -07001533unsuppress_huff_table (JPEGState* sp, int tblno)
1534{
1535 JHUFF_TBL* htbl;
1536
1537 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
1538 htbl->sent_table = FALSE;
1539 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
1540 htbl->sent_table = FALSE;
1541}
1542
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001543static void
1544suppress_huff_table (JPEGState* sp, int tblno)
1545{
1546 JHUFF_TBL* htbl;
1547
1548 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
1549 htbl->sent_table = TRUE;
1550 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
1551 htbl->sent_table = TRUE;
1552}
1553
Bo Xufdc00a72014-10-28 23:03:33 -07001554static int
1555prepare_JPEGTables(TIFF* tif)
1556{
1557 JPEGState* sp = JState(tif);
1558
1559 /* Initialize quant tables for current quality setting */
1560 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
1561 return (0);
1562 /* Mark only the tables we want for output */
1563 /* NB: chrominance tables are currently used only with YCbCr */
1564 if (!TIFFjpeg_suppress_tables(sp, TRUE))
1565 return (0);
1566 if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
1567 unsuppress_quant_table(sp, 0);
1568 if (sp->photometric == PHOTOMETRIC_YCBCR)
1569 unsuppress_quant_table(sp, 1);
1570 }
1571 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
1572 unsuppress_huff_table(sp, 0);
1573 if (sp->photometric == PHOTOMETRIC_YCBCR)
1574 unsuppress_huff_table(sp, 1);
1575 }
1576 /* Direct libjpeg output into jpegtables */
1577 if (!TIFFjpeg_tables_dest(sp, tif))
1578 return (0);
1579 /* Emit tables-only datastream */
1580 if (!TIFFjpeg_write_tables(sp))
1581 return (0);
1582
1583 return (1);
1584}
1585
1586static int
1587JPEGSetupEncode(TIFF* tif)
1588{
1589 JPEGState* sp = JState(tif);
1590 TIFFDirectory *td = &tif->tif_dir;
1591 static const char module[] = "JPEGSetupEncode";
1592
1593#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
1594 if( tif->tif_dir.td_bitspersample == 12 )
1595 return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 );
1596#endif
1597
1598 JPEGInitializeLibJPEG( tif, FALSE );
1599
1600 assert(sp != NULL);
1601 assert(!sp->cinfo.comm.is_decompressor);
1602
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001603 sp->photometric = td->td_photometric;
1604
Bo Xufdc00a72014-10-28 23:03:33 -07001605 /*
1606 * Initialize all JPEG parameters to default values.
1607 * Note that jpeg_set_defaults needs legal values for
1608 * in_color_space and input_components.
1609 */
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001610 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1611 sp->cinfo.c.input_components = td->td_samplesperpixel;
1612 if (sp->photometric == PHOTOMETRIC_YCBCR) {
1613 if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1614 sp->cinfo.c.in_color_space = JCS_RGB;
1615 } else {
1616 sp->cinfo.c.in_color_space = JCS_YCbCr;
1617 }
1618 } else {
1619 if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1)
1620 sp->cinfo.c.in_color_space = JCS_GRAYSCALE;
1621 else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3)
1622 sp->cinfo.c.in_color_space = JCS_RGB;
1623 else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4)
1624 sp->cinfo.c.in_color_space = JCS_CMYK;
1625 else
1626 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1627 }
1628 } else {
1629 sp->cinfo.c.input_components = 1;
1630 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1631 }
Bo Xufdc00a72014-10-28 23:03:33 -07001632 if (!TIFFjpeg_set_defaults(sp))
1633 return (0);
1634 /* Set per-file parameters */
Bo Xufdc00a72014-10-28 23:03:33 -07001635 switch (sp->photometric) {
1636 case PHOTOMETRIC_YCBCR:
1637 sp->h_sampling = td->td_ycbcrsubsampling[0];
1638 sp->v_sampling = td->td_ycbcrsubsampling[1];
Nicolas Penac7600242017-07-20 14:35:29 -04001639 if( sp->h_sampling == 0 || sp->v_sampling == 0 )
1640 {
1641 TIFFErrorExt(tif->tif_clientdata, module,
1642 "Invalig horizontal/vertical sampling value");
1643 return (0);
1644 }
1645 if( td->td_bitspersample > 16 )
1646 {
1647 TIFFErrorExt(tif->tif_clientdata, module,
1648 "BitsPerSample %d not allowed for JPEG",
1649 td->td_bitspersample);
1650 return (0);
1651 }
Nicolas Penaac07d342017-04-18 17:13:56 -04001652
Bo Xufdc00a72014-10-28 23:03:33 -07001653 /*
1654 * A ReferenceBlackWhite field *must* be present since the
1655 * default value is inappropriate for YCbCr. Fill in the
1656 * proper value if application didn't set it.
1657 */
1658 {
1659 float *ref;
1660 if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
1661 &ref)) {
1662 float refbw[6];
1663 long top = 1L << td->td_bitspersample;
1664 refbw[0] = 0;
1665 refbw[1] = (float)(top-1L);
1666 refbw[2] = (float)(top>>1);
1667 refbw[3] = refbw[1];
1668 refbw[4] = refbw[2];
1669 refbw[5] = refbw[1];
1670 TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
1671 refbw);
1672 }
1673 }
1674 break;
1675 case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
1676 case PHOTOMETRIC_MASK:
1677 TIFFErrorExt(tif->tif_clientdata, module,
1678 "PhotometricInterpretation %d not allowed for JPEG",
1679 (int) sp->photometric);
1680 return (0);
1681 default:
1682 /* TIFF 6.0 forbids subsampling of all other color spaces */
1683 sp->h_sampling = 1;
1684 sp->v_sampling = 1;
1685 break;
1686 }
1687
1688 /* Verify miscellaneous parameters */
1689
1690 /*
1691 * This would need work if libtiff ever supports different
1692 * depths for different components, or if libjpeg ever supports
1693 * run-time selection of depth. Neither is imminent.
1694 */
1695#ifdef JPEG_LIB_MK1
1696 /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
1697 if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
1698#else
1699 if (td->td_bitspersample != BITS_IN_JSAMPLE )
1700#endif
1701 {
1702 TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
1703 (int) td->td_bitspersample);
1704 return (0);
1705 }
1706 sp->cinfo.c.data_precision = td->td_bitspersample;
1707#ifdef JPEG_LIB_MK1
1708 sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
1709#endif
1710 if (isTiled(tif)) {
1711 if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
1712 TIFFErrorExt(tif->tif_clientdata, module,
1713 "JPEG tile height must be multiple of %d",
1714 sp->v_sampling * DCTSIZE);
1715 return (0);
1716 }
1717 if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
1718 TIFFErrorExt(tif->tif_clientdata, module,
1719 "JPEG tile width must be multiple of %d",
1720 sp->h_sampling * DCTSIZE);
1721 return (0);
1722 }
1723 } else {
1724 if (td->td_rowsperstrip < td->td_imagelength &&
1725 (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
1726 TIFFErrorExt(tif->tif_clientdata, module,
1727 "RowsPerStrip must be multiple of %d for JPEG",
1728 sp->v_sampling * DCTSIZE);
1729 return (0);
1730 }
1731 }
1732
1733 /* Create a JPEGTables field if appropriate */
1734 if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
1735 if( sp->jpegtables == NULL
1736 || memcmp(sp->jpegtables,"\0\0\0\0\0\0\0\0\0",8) == 0 )
1737 {
1738 if (!prepare_JPEGTables(tif))
1739 return (0);
1740 /* Mark the field present */
1741 /* Can't use TIFFSetField since BEENWRITING is already set! */
1742 tif->tif_flags |= TIFF_DIRTYDIRECT;
1743 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
1744 }
1745 } else {
1746 /* We do not support application-supplied JPEGTables, */
1747 /* so mark the field not present */
1748 TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
1749 }
1750
1751 /* Direct libjpeg output to libtiff's output buffer */
1752 TIFFjpeg_data_dest(sp, tif);
1753
1754 return (1);
1755}
1756
1757/*
1758 * Set encoding state at the start of a strip or tile.
1759 */
1760static int
1761JPEGPreEncode(TIFF* tif, uint16 s)
1762{
1763 JPEGState *sp = JState(tif);
1764 TIFFDirectory *td = &tif->tif_dir;
1765 static const char module[] = "JPEGPreEncode";
1766 uint32 segment_width, segment_height;
1767 int downsampled_input;
1768
1769 assert(sp != NULL);
1770
1771 if (sp->cinfo.comm.is_decompressor == 1)
1772 {
1773 tif->tif_setupencode( tif );
1774 }
1775
1776 assert(!sp->cinfo.comm.is_decompressor);
1777 /*
1778 * Set encoding parameters for this strip/tile.
1779 */
1780 if (isTiled(tif)) {
1781 segment_width = td->td_tilewidth;
1782 segment_height = td->td_tilelength;
1783 sp->bytesperline = TIFFTileRowSize(tif);
1784 } else {
1785 segment_width = td->td_imagewidth;
1786 segment_height = td->td_imagelength - tif->tif_row;
1787 if (segment_height > td->td_rowsperstrip)
1788 segment_height = td->td_rowsperstrip;
1789 sp->bytesperline = TIFFScanlineSize(tif);
1790 }
1791 if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
1792 /* for PC 2, scale down the strip/tile size
1793 * to match a downsampled component
1794 */
1795 segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
1796 segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
1797 }
1798 if (segment_width > 65535 || segment_height > 65535) {
1799 TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG");
1800 return (0);
1801 }
1802 sp->cinfo.c.image_width = segment_width;
1803 sp->cinfo.c.image_height = segment_height;
1804 downsampled_input = FALSE;
1805 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1806 sp->cinfo.c.input_components = td->td_samplesperpixel;
1807 if (sp->photometric == PHOTOMETRIC_YCBCR) {
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001808 if (sp->jpegcolormode != JPEGCOLORMODE_RGB) {
Bo Xufdc00a72014-10-28 23:03:33 -07001809 if (sp->h_sampling != 1 || sp->v_sampling != 1)
1810 downsampled_input = TRUE;
1811 }
1812 if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
1813 return (0);
1814 /*
1815 * Set Y sampling factors;
1816 * we assume jpeg_set_colorspace() set the rest to 1
1817 */
1818 sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
1819 sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
1820 } else {
Bo Xufdc00a72014-10-28 23:03:33 -07001821 if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space))
1822 return (0);
1823 /* jpeg_set_colorspace set all sampling factors to 1 */
1824 }
1825 } else {
Bo Xufdc00a72014-10-28 23:03:33 -07001826 if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
1827 return (0);
1828 sp->cinfo.c.comp_info[0].component_id = s;
1829 /* jpeg_set_colorspace() set sampling factors to 1 */
1830 if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
1831 sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
1832 sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
1833 sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
1834 }
1835 }
1836 /* ensure libjpeg won't write any extraneous markers */
1837 sp->cinfo.c.write_JFIF_header = FALSE;
1838 sp->cinfo.c.write_Adobe_marker = FALSE;
1839 /* set up table handling correctly */
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001840 /* calling TIFFjpeg_set_quality() causes quantization tables to be flagged */
1841 /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT */
1842 /* mode, so we must manually suppress them. However TIFFjpeg_set_quality() */
1843 /* should really be called when dealing with files with directories with */
1844 /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
1845 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
Bo Xufdc00a72014-10-28 23:03:33 -07001846 return (0);
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001847 if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
1848 suppress_quant_table(sp, 0);
1849 suppress_quant_table(sp, 1);
1850 }
1851 else {
Bo Xufdc00a72014-10-28 23:03:33 -07001852 unsuppress_quant_table(sp, 0);
1853 unsuppress_quant_table(sp, 1);
1854 }
1855 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001856 {
1857 /* Explicit suppression is only needed if we did not go through the */
1858 /* prepare_JPEGTables() code path, which may be the case if updating */
1859 /* an existing file */
1860 suppress_huff_table(sp, 0);
1861 suppress_huff_table(sp, 1);
Bo Xufdc00a72014-10-28 23:03:33 -07001862 sp->cinfo.c.optimize_coding = FALSE;
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001863 }
Bo Xufdc00a72014-10-28 23:03:33 -07001864 else
1865 sp->cinfo.c.optimize_coding = TRUE;
1866 if (downsampled_input) {
1867 /* Need to use raw-data interface to libjpeg */
1868 sp->cinfo.c.raw_data_in = TRUE;
1869 tif->tif_encoderow = JPEGEncodeRaw;
1870 tif->tif_encodestrip = JPEGEncodeRaw;
1871 tif->tif_encodetile = JPEGEncodeRaw;
1872 } else {
1873 /* Use normal interface to libjpeg */
1874 sp->cinfo.c.raw_data_in = FALSE;
1875 tif->tif_encoderow = JPEGEncode;
1876 tif->tif_encodestrip = JPEGEncode;
1877 tif->tif_encodetile = JPEGEncode;
1878 }
1879 /* Start JPEG compressor */
1880 if (!TIFFjpeg_start_compress(sp, FALSE))
1881 return (0);
1882 /* Allocate downsampled-data buffers if needed */
1883 if (downsampled_input) {
1884 if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
1885 sp->cinfo.c.num_components))
1886 return (0);
1887 }
1888 sp->scancount = 0;
1889
1890 return (1);
1891}
1892
1893/*
1894 * Encode a chunk of pixels.
1895 * "Standard" case: incoming data is not downsampled.
1896 */
1897static int
1898JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1899{
1900 JPEGState *sp = JState(tif);
1901 tmsize_t nrows;
1902 JSAMPROW bufptr[1];
1903 short *line16 = NULL;
1904 int line16_count = 0;
1905
1906 (void) s;
1907 assert(sp != NULL);
1908 /* data is expected to be supplied in multiples of a scanline */
1909 nrows = cc / sp->bytesperline;
1910 if (cc % sp->bytesperline)
1911 TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
1912 "fractional scanline discarded");
1913
1914 /* The last strip will be limited to image size */
1915 if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength )
1916 nrows = tif->tif_dir.td_imagelength - tif->tif_row;
1917
1918 if( sp->cinfo.c.data_precision == 12 )
1919 {
Lei Zhangcfb6f462017-03-20 15:46:06 -07001920 line16_count = (int)((sp->bytesperline * 2) / 3);
Bo Xufdc00a72014-10-28 23:03:33 -07001921 line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count);
Lei Zhang9c2c87d2016-01-07 15:52:44 -08001922 if (!line16)
1923 {
1924 TIFFErrorExt(tif->tif_clientdata,
1925 "JPEGEncode",
1926 "Failed to allocate memory");
1927
1928 return 0;
1929 }
Bo Xufdc00a72014-10-28 23:03:33 -07001930 }
1931
1932 while (nrows-- > 0) {
1933
1934 if( sp->cinfo.c.data_precision == 12 )
1935 {
1936
1937 int value_pairs = line16_count / 2;
1938 int iPair;
1939
1940 bufptr[0] = (JSAMPROW) line16;
1941
1942 for( iPair = 0; iPair < value_pairs; iPair++ )
1943 {
1944 unsigned char *in_ptr =
1945 ((unsigned char *) buf) + iPair * 3;
1946 JSAMPLE *out_ptr = (JSAMPLE *) (line16 + iPair * 2);
1947
1948 out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4);
1949 out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2];
1950 }
1951 }
1952 else
1953 {
1954 bufptr[0] = (JSAMPROW) buf;
1955 }
1956 if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
1957 return (0);
1958 if (nrows > 0)
1959 tif->tif_row++;
1960 buf += sp->bytesperline;
1961 }
1962
1963 if( sp->cinfo.c.data_precision == 12 )
1964 {
1965 _TIFFfree( line16 );
1966 }
1967
1968 return (1);
1969}
1970
1971/*
1972 * Encode a chunk of pixels.
1973 * Incoming data is expected to be downsampled per sampling factors.
1974 */
1975static int
1976JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
1977{
1978 JPEGState *sp = JState(tif);
1979 JSAMPLE* inptr;
1980 JSAMPLE* outptr;
1981 tmsize_t nrows;
1982 JDIMENSION clumps_per_line, nclump;
1983 int clumpoffset, ci, xpos, ypos;
1984 jpeg_component_info* compptr;
1985 int samples_per_clump = sp->samplesperclump;
1986 tmsize_t bytesperclumpline;
1987
1988 (void) s;
1989 assert(sp != NULL);
1990 /* data is expected to be supplied in multiples of a clumpline */
1991 /* a clumpline is equivalent to v_sampling desubsampled scanlines */
1992 /* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */
1993 bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling)
1994 *(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7)
1995 /8;
1996
1997 nrows = ( cc / bytesperclumpline ) * sp->v_sampling;
1998 if (cc % bytesperclumpline)
1999 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
2000
2001 /* Cb,Cr both have sampling factors 1, so this is correct */
2002 clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
2003
2004 while (nrows > 0) {
2005 /*
2006 * Fastest way to separate the data is to make one pass
2007 * over the scanline for each row of each component.
2008 */
2009 clumpoffset = 0; /* first sample in clump */
2010 for (ci = 0, compptr = sp->cinfo.c.comp_info;
2011 ci < sp->cinfo.c.num_components;
2012 ci++, compptr++) {
2013 int hsamp = compptr->h_samp_factor;
2014 int vsamp = compptr->v_samp_factor;
2015 int padding = (int) (compptr->width_in_blocks * DCTSIZE -
2016 clumps_per_line * hsamp);
2017 for (ypos = 0; ypos < vsamp; ypos++) {
2018 inptr = ((JSAMPLE*) buf) + clumpoffset;
2019 outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
2020 if (hsamp == 1) {
2021 /* fast path for at least Cb and Cr */
2022 for (nclump = clumps_per_line; nclump-- > 0; ) {
2023 *outptr++ = inptr[0];
2024 inptr += samples_per_clump;
2025 }
2026 } else {
2027 /* general case */
2028 for (nclump = clumps_per_line; nclump-- > 0; ) {
2029 for (xpos = 0; xpos < hsamp; xpos++)
2030 *outptr++ = inptr[xpos];
2031 inptr += samples_per_clump;
2032 }
2033 }
2034 /* pad each scanline as needed */
2035 for (xpos = 0; xpos < padding; xpos++) {
2036 *outptr = outptr[-1];
2037 outptr++;
2038 }
2039 clumpoffset += hsamp;
2040 }
2041 }
2042 sp->scancount++;
2043 if (sp->scancount >= DCTSIZE) {
2044 int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
2045 if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
2046 return (0);
2047 sp->scancount = 0;
2048 }
2049 tif->tif_row += sp->v_sampling;
2050 buf += bytesperclumpline;
2051 nrows -= sp->v_sampling;
2052 }
2053 return (1);
2054}
2055
2056/*
2057 * Finish up at the end of a strip or tile.
2058 */
2059static int
2060JPEGPostEncode(TIFF* tif)
2061{
2062 JPEGState *sp = JState(tif);
2063
2064 if (sp->scancount > 0) {
2065 /*
2066 * Need to emit a partial bufferload of downsampled data.
2067 * Pad the data vertically.
2068 */
2069 int ci, ypos, n;
2070 jpeg_component_info* compptr;
2071
2072 for (ci = 0, compptr = sp->cinfo.c.comp_info;
2073 ci < sp->cinfo.c.num_components;
2074 ci++, compptr++) {
2075 int vsamp = compptr->v_samp_factor;
2076 tmsize_t row_width = compptr->width_in_blocks * DCTSIZE
2077 * sizeof(JSAMPLE);
2078 for (ypos = sp->scancount * vsamp;
2079 ypos < DCTSIZE * vsamp; ypos++) {
2080 _TIFFmemcpy((void*)sp->ds_buffer[ci][ypos],
2081 (void*)sp->ds_buffer[ci][ypos-1],
2082 row_width);
2083
2084 }
2085 }
2086 n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
2087 if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
2088 return (0);
2089 }
2090
2091 return (TIFFjpeg_finish_compress(JState(tif)));
2092}
2093
2094static void
2095JPEGCleanup(TIFF* tif)
2096{
2097 JPEGState *sp = JState(tif);
2098
2099 assert(sp != 0);
2100
2101 tif->tif_tagmethods.vgetfield = sp->vgetparent;
2102 tif->tif_tagmethods.vsetfield = sp->vsetparent;
2103 tif->tif_tagmethods.printdir = sp->printdir;
Lei Zhang9c2c87d2016-01-07 15:52:44 -08002104 if( sp->cinfo_initialized )
2105 TIFFjpeg_destroy(sp); /* release libjpeg resources */
2106 if (sp->jpegtables) /* tag value */
2107 _TIFFfree(sp->jpegtables);
Bo Xufdc00a72014-10-28 23:03:33 -07002108 _TIFFfree(tif->tif_data); /* release local state */
2109 tif->tif_data = NULL;
2110
2111 _TIFFSetDefaultCompressionState(tif);
2112}
2113
2114static void
2115JPEGResetUpsampled( TIFF* tif )
2116{
2117 JPEGState* sp = JState(tif);
2118 TIFFDirectory* td = &tif->tif_dir;
2119
2120 /*
2121 * Mark whether returned data is up-sampled or not so TIFFStripSize
2122 * and TIFFTileSize return values that reflect the true amount of
2123 * data.
2124 */
2125 tif->tif_flags &= ~TIFF_UPSAMPLED;
2126 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
2127 if (td->td_photometric == PHOTOMETRIC_YCBCR &&
2128 sp->jpegcolormode == JPEGCOLORMODE_RGB) {
2129 tif->tif_flags |= TIFF_UPSAMPLED;
2130 } else {
2131#ifdef notdef
2132 if (td->td_ycbcrsubsampling[0] != 1 ||
2133 td->td_ycbcrsubsampling[1] != 1)
2134 ; /* XXX what about up-sampling? */
2135#endif
2136 }
2137 }
2138
2139 /*
2140 * Must recalculate cached tile size in case sampling state changed.
2141 * Should we really be doing this now if image size isn't set?
2142 */
2143 if( tif->tif_tilesize > 0 )
2144 tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
2145 if( tif->tif_scanlinesize > 0 )
2146 tif->tif_scanlinesize = TIFFScanlineSize(tif);
2147}
2148
2149static int
2150JPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
2151{
2152 JPEGState* sp = JState(tif);
2153 const TIFFField* fip;
2154 uint32 v32;
2155
2156 assert(sp != NULL);
2157
2158 switch (tag) {
2159 case TIFFTAG_JPEGTABLES:
2160 v32 = (uint32) va_arg(ap, uint32);
2161 if (v32 == 0) {
2162 /* XXX */
2163 return (0);
2164 }
Lei Zhangcfb6f462017-03-20 15:46:06 -07002165 _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), v32);
Bo Xufdc00a72014-10-28 23:03:33 -07002166 sp->jpegtables_length = v32;
2167 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
2168 break;
2169 case TIFFTAG_JPEGQUALITY:
2170 sp->jpegquality = (int) va_arg(ap, int);
2171 return (1); /* pseudo tag */
2172 case TIFFTAG_JPEGCOLORMODE:
2173 sp->jpegcolormode = (int) va_arg(ap, int);
2174 JPEGResetUpsampled( tif );
2175 return (1); /* pseudo tag */
2176 case TIFFTAG_PHOTOMETRIC:
2177 {
2178 int ret_value = (*sp->vsetparent)(tif, tag, ap);
2179 JPEGResetUpsampled( tif );
2180 return ret_value;
2181 }
2182 case TIFFTAG_JPEGTABLESMODE:
2183 sp->jpegtablesmode = (int) va_arg(ap, int);
2184 return (1); /* pseudo tag */
2185 case TIFFTAG_YCBCRSUBSAMPLING:
2186 /* mark the fact that we have a real ycbcrsubsampling! */
2187 sp->ycbcrsampling_fetched = 1;
2188 /* should we be recomputing upsampling info here? */
2189 return (*sp->vsetparent)(tif, tag, ap);
2190 default:
2191 return (*sp->vsetparent)(tif, tag, ap);
2192 }
2193
Lei Zhangcfb6f462017-03-20 15:46:06 -07002194 if ((fip = TIFFFieldWithTag(tif, tag)) != NULL) {
Bo Xufdc00a72014-10-28 23:03:33 -07002195 TIFFSetFieldBit(tif, fip->field_bit);
2196 } else {
2197 return (0);
2198 }
2199
2200 tif->tif_flags |= TIFF_DIRTYDIRECT;
2201 return (1);
2202}
2203
2204static int
2205JPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
2206{
2207 JPEGState* sp = JState(tif);
2208
2209 assert(sp != NULL);
2210
2211 switch (tag) {
2212 case TIFFTAG_JPEGTABLES:
2213 *va_arg(ap, uint32*) = sp->jpegtables_length;
2214 *va_arg(ap, void**) = sp->jpegtables;
2215 break;
2216 case TIFFTAG_JPEGQUALITY:
2217 *va_arg(ap, int*) = sp->jpegquality;
2218 break;
2219 case TIFFTAG_JPEGCOLORMODE:
2220 *va_arg(ap, int*) = sp->jpegcolormode;
2221 break;
2222 case TIFFTAG_JPEGTABLESMODE:
2223 *va_arg(ap, int*) = sp->jpegtablesmode;
2224 break;
2225 default:
2226 return (*sp->vgetparent)(tif, tag, ap);
2227 }
2228 return (1);
2229}
2230
2231static void
2232JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
2233{
2234 JPEGState* sp = JState(tif);
2235
2236 assert(sp != NULL);
2237 (void) flags;
2238
2239 if( sp != NULL ) {
2240 if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
2241 fprintf(fd, " JPEG Tables: (%lu bytes)\n",
2242 (unsigned long) sp->jpegtables_length);
2243 if (sp->printdir)
2244 (*sp->printdir)(tif, fd, flags);
2245 }
2246}
2247
2248static uint32
2249JPEGDefaultStripSize(TIFF* tif, uint32 s)
2250{
2251 JPEGState* sp = JState(tif);
2252 TIFFDirectory *td = &tif->tif_dir;
2253
2254 s = (*sp->defsparent)(tif, s);
2255 if (s < td->td_imagelength)
2256 s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
2257 return (s);
2258}
2259
2260static void
2261JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
2262{
2263 JPEGState* sp = JState(tif);
2264 TIFFDirectory *td = &tif->tif_dir;
2265
2266 (*sp->deftparent)(tif, tw, th);
2267 *tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
2268 *th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
2269}
2270
2271/*
2272 * The JPEG library initialized used to be done in TIFFInitJPEG(), but
2273 * now that we allow a TIFF file to be opened in update mode it is necessary
2274 * to have some way of deciding whether compression or decompression is
2275 * desired other than looking at tif->tif_mode. We accomplish this by
2276 * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
2277 * If so, we assume decompression is desired.
2278 *
2279 * This is tricky, because TIFFInitJPEG() is called while the directory is
2280 * being read, and generally speaking the BYTECOUNTS tag won't have been read
2281 * at that point. So we try to defer jpeg library initialization till we
2282 * do have that tag ... basically any access that might require the compressor
2283 * or decompressor that occurs after the reading of the directory.
2284 *
2285 * In an ideal world compressors or decompressors would be setup
2286 * at the point where a single tile or strip was accessed (for read or write)
2287 * so that stuff like update of missing tiles, or replacement of tiles could
2288 * be done. However, we aren't trying to crack that nut just yet ...
2289 *
2290 * NFW, Feb 3rd, 2003.
2291 */
2292
2293static int JPEGInitializeLibJPEG( TIFF * tif, int decompress )
2294{
2295 JPEGState* sp = JState(tif);
2296
2297 if(sp->cinfo_initialized)
2298 {
2299 if( !decompress && sp->cinfo.comm.is_decompressor )
2300 TIFFjpeg_destroy( sp );
2301 else if( decompress && !sp->cinfo.comm.is_decompressor )
2302 TIFFjpeg_destroy( sp );
2303 else
2304 return 1;
2305
2306 sp->cinfo_initialized = 0;
2307 }
2308
2309 /*
2310 * Initialize libjpeg.
2311 */
2312 if ( decompress ) {
2313 if (!TIFFjpeg_create_decompress(sp))
2314 return (0);
2315 } else {
2316 if (!TIFFjpeg_create_compress(sp))
2317 return (0);
Nicolas Penac7600242017-07-20 14:35:29 -04002318#ifndef TIFF_JPEG_MAX_MEMORY_TO_USE
2319#define TIFF_JPEG_MAX_MEMORY_TO_USE (10 * 1024 * 1024)
2320#endif
2321 /* Increase the max memory usable. This helps when creating files */
2322 /* with "big" tile, without using libjpeg temporary files. */
2323 /* For example a 512x512 tile with 3 bands */
2324 /* requires 1.5 MB which is above libjpeg 1MB default */
2325 if( sp->cinfo.c.mem->max_memory_to_use < TIFF_JPEG_MAX_MEMORY_TO_USE )
2326 sp->cinfo.c.mem->max_memory_to_use = TIFF_JPEG_MAX_MEMORY_TO_USE;
Bo Xufdc00a72014-10-28 23:03:33 -07002327 }
2328
2329 sp->cinfo_initialized = TRUE;
2330
2331 return 1;
2332}
2333
2334int
2335TIFFInitJPEG(TIFF* tif, int scheme)
2336{
2337 JPEGState* sp;
2338
2339 assert(scheme == COMPRESSION_JPEG);
2340
2341 /*
2342 * Merge codec-specific tag information.
2343 */
2344 if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields))) {
2345 TIFFErrorExt(tif->tif_clientdata,
2346 "TIFFInitJPEG",
2347 "Merging JPEG codec-specific tags failed");
2348 return 0;
2349 }
2350
2351 /*
2352 * Allocate state block so tag methods have storage to record values.
2353 */
2354 tif->tif_data = (uint8*) _TIFFmalloc(sizeof (JPEGState));
2355
2356 if (tif->tif_data == NULL) {
2357 TIFFErrorExt(tif->tif_clientdata,
2358 "TIFFInitJPEG", "No space for JPEG state block");
2359 return 0;
2360 }
2361 _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
2362
2363 sp = JState(tif);
2364 sp->tif = tif; /* back link */
2365
2366 /*
2367 * Override parent get/set field methods.
2368 */
2369 sp->vgetparent = tif->tif_tagmethods.vgetfield;
2370 tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
2371 sp->vsetparent = tif->tif_tagmethods.vsetfield;
2372 tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
2373 sp->printdir = tif->tif_tagmethods.printdir;
2374 tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
2375
2376 /* Default values for codec-specific fields */
2377 sp->jpegtables = NULL;
2378 sp->jpegtables_length = 0;
2379 sp->jpegquality = 75; /* Default IJG quality */
2380 sp->jpegcolormode = JPEGCOLORMODE_RAW;
2381 sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
2382 sp->ycbcrsampling_fetched = 0;
2383
2384 /*
2385 * Install codec methods.
2386 */
2387 tif->tif_fixuptags = JPEGFixupTags;
2388 tif->tif_setupdecode = JPEGSetupDecode;
2389 tif->tif_predecode = JPEGPreDecode;
2390 tif->tif_decoderow = JPEGDecode;
2391 tif->tif_decodestrip = JPEGDecode;
2392 tif->tif_decodetile = JPEGDecode;
2393 tif->tif_setupencode = JPEGSetupEncode;
2394 tif->tif_preencode = JPEGPreEncode;
2395 tif->tif_postencode = JPEGPostEncode;
2396 tif->tif_encoderow = JPEGEncode;
2397 tif->tif_encodestrip = JPEGEncode;
2398 tif->tif_encodetile = JPEGEncode;
2399 tif->tif_cleanup = JPEGCleanup;
2400 sp->defsparent = tif->tif_defstripsize;
2401 tif->tif_defstripsize = JPEGDefaultStripSize;
2402 sp->deftparent = tif->tif_deftilesize;
2403 tif->tif_deftilesize = JPEGDefaultTileSize;
2404 tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
2405
2406 sp->cinfo_initialized = FALSE;
2407
2408 /*
2409 ** Create a JPEGTables field if no directory has yet been created.
2410 ** We do this just to ensure that sufficient space is reserved for
2411 ** the JPEGTables field. It will be properly created the right
2412 ** size later.
2413 */
2414 if( tif->tif_diroff == 0 )
2415 {
2416#define SIZE_OF_JPEGTABLES 2000
2417/*
2418The following line assumes incorrectly that all JPEG-in-TIFF files will have
2419a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written
2420when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be
2421set, anyway, later when actual JPEGTABLES header is generated, so removing it
2422here hopefully is harmless.
2423 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
2424*/
2425 sp->jpegtables_length = SIZE_OF_JPEGTABLES;
2426 sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length);
Lei Zhang9c2c87d2016-01-07 15:52:44 -08002427 if (sp->jpegtables)
2428 {
2429 _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES);
2430 }
2431 else
2432 {
2433 TIFFErrorExt(tif->tif_clientdata,
2434 "TIFFInitJPEG",
2435 "Failed to allocate memory for JPEG tables");
2436 return 0;
2437 }
Bo Xufdc00a72014-10-28 23:03:33 -07002438#undef SIZE_OF_JPEGTABLES
2439 }
2440
2441 return 1;
2442}
2443#endif /* JPEG_SUPPORT */
2444
2445/* vim: set ts=8 sts=8 sw=8 noet: */
2446
2447/*
2448 * Local Variables:
2449 * mode: c
2450 * c-basic-offset: 8
2451 * fill-column: 78
2452 * End:
2453 */