LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_jpeg.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 731 1112 65.7 %
Date: 2024-11-21 22:18:42 Functions: 57 73 78.1 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 1994-1997 Sam Leffler
       3             :  * Copyright (c) 1994-1997 Silicon Graphics, Inc.
       4             :  *
       5             :  * Permission to use, copy, modify, distribute, and sell this software and
       6             :  * its documentation for any purpose is hereby granted without fee, provided
       7             :  * that (i) the above copyright notices and this permission notice appear in
       8             :  * all copies of the software and related documentation, and (ii) the names of
       9             :  * Sam Leffler and Silicon Graphics may not be used in any advertising or
      10             :  * publicity relating to the software without the specific, prior written
      11             :  * permission of Sam Leffler and Silicon Graphics.
      12             :  *
      13             :  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
      14             :  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
      15             :  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
      16             :  *
      17             :  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      18             :  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      19             :  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      20             :  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
      21             :  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      22             :  * OF THIS SOFTWARE.
      23             :  */
      24             : 
      25             : #define WIN32_LEAN_AND_MEAN
      26             : #define VC_EXTRALEAN
      27             : 
      28             : #include "tiffiop.h"
      29             : #include <stdlib.h>
      30             : 
      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             : 
      47             : /* Settings that are independent of libjpeg ABI. Used when reinitializing the */
      48             : /* JPEGState from libjpegs 8 bit to libjpeg 12 bits, which have potentially */
      49             : /* different ABI */
      50             : typedef struct
      51             : {
      52             :     TIFFVGetMethod vgetparent;  /* super-class method */
      53             :     TIFFVSetMethod vsetparent;  /* super-class method */
      54             :     TIFFPrintMethod printdir;   /* super-class method */
      55             :     TIFFStripMethod defsparent; /* super-class method */
      56             :     TIFFTileMethod deftparent;  /* super-class method */
      57             : 
      58             :     /* pseudo-tag fields */
      59             :     void *jpegtables;           /* JPEGTables tag value, or NULL */
      60             :     uint32_t jpegtables_length; /* number of bytes in same */
      61             :     int jpegquality;            /* Compression quality level */
      62             :     int jpegcolormode;          /* Auto RGB<=>YCbCr convert? */
      63             :     int jpegtablesmode;         /* What to put in JPEGTables */
      64             : 
      65             :     int ycbcrsampling_fetched;
      66             :     int max_allowed_scan_number;
      67             :     int has_warned_about_progressive_mode;
      68             : } JPEGOtherSettings;
      69             : 
      70             : int TIFFFillStrip(TIFF *tif, uint32_t strip);
      71             : int TIFFFillTile(TIFF *tif, uint32_t tile);
      72             : int TIFFReInitJPEG_12(TIFF *tif, const JPEGOtherSettings *otherSettings,
      73             :                       int scheme, int is_encode);
      74             : int TIFFJPEGIsFullStripRequired_12(TIFF *tif);
      75             : 
      76             : #include "jerror.h"
      77             : #include "jpeglib.h"
      78             : 
      79             : /* Do optional compile-time version check */
      80             : #if defined(EXPECTED_JPEG_LIB_VERSION) && !defined(LIBJPEG_12_PATH)
      81             : #if EXPECTED_JPEG_LIB_VERSION != JPEG_LIB_VERSION
      82             : #error EXPECTED_JPEG_LIB_VERSION != JPEG_LIB_VERSION
      83             : #endif
      84             : #endif
      85             : 
      86             : /*
      87             :  * Do we want to do special processing suitable for when JSAMPLE is a
      88             :  * 16bit value?
      89             :  */
      90             : 
      91             : /* HAVE_JPEGTURBO_DUAL_MODE_8_12 is defined for libjpeg-turbo >= 3.0 which
      92             :  * adds a dual-mode 8/12 bit API in the same library.
      93             :  */
      94             : 
      95             : #if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
      96             : #define JPEG_DUAL_MODE_8_12
      97             : /* Start by undefining BITS_IN_JSAMPLE which is always set to 8 in libjpeg-turbo
      98             :  * >= 3.0 Cf
      99             :  * https://github.com/libjpeg-turbo/libjpeg-turbo/commit/8b9bc4b9635a2a047fb23ebe70c9acd728d3f99b
     100             :  */
     101             : #undef BITS_IN_JSAMPLE
     102             : /* libjpeg-turbo >= 3.0 adds J12xxxx datatypes for the 12-bit mode. */
     103             : #if defined(FROM_TIF_JPEG_12)
     104             : #define BITS_IN_JSAMPLE 12
     105             : #define TIFF_JSAMPLE J12SAMPLE
     106             : #define TIFF_JSAMPARRAY J12SAMPARRAY
     107             : #define TIFF_JSAMPIMAGE J12SAMPIMAGE
     108             : #define TIFF_JSAMPROW J12SAMPROW
     109             : #else
     110             : #define BITS_IN_JSAMPLE 8
     111             : #define TIFF_JSAMPLE JSAMPLE
     112             : #define TIFF_JSAMPARRAY JSAMPARRAY
     113             : #define TIFF_JSAMPIMAGE JSAMPIMAGE
     114             : #define TIFF_JSAMPROW JSAMPROW
     115             : #endif
     116             : #else
     117             : #define TIFF_JSAMPLE JSAMPLE
     118             : #define TIFF_JSAMPARRAY JSAMPARRAY
     119             : #define TIFF_JSAMPIMAGE JSAMPIMAGE
     120             : #define TIFF_JSAMPROW JSAMPROW
     121             : #endif
     122             : 
     123             : #if defined(JPEG_LIB_MK1)
     124             : #define JPEG_LIB_MK1_OR_12BIT 1
     125             : #elif BITS_IN_JSAMPLE == 12
     126             : #define JPEG_LIB_MK1_OR_12BIT 1
     127             : #endif
     128             : 
     129             : /*
     130             :  * We are using width_in_blocks which is supposed to be private to
     131             :  * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has
     132             :  * renamed this member to width_in_data_units.  Since the header has
     133             :  * also renamed a define, use that unique define name in order to
     134             :  * detect the problem header and adjust to suit.
     135             :  */
     136             : #if defined(D_MAX_DATA_UNITS_IN_MCU)
     137             : #define width_in_blocks width_in_data_units
     138             : #endif
     139             : 
     140             : /*
     141             :  * On some machines it may be worthwhile to use _setjmp or sigsetjmp
     142             :  * in place of plain setjmp.  These macros will make it easier.
     143             :  */
     144             : #define SETJMP(jbuf) setjmp(jbuf)
     145             : #define LONGJMP(jbuf, code) longjmp(jbuf, code)
     146             : #define JMP_BUF jmp_buf
     147             : 
     148             : #ifndef TIFF_jpeg_destination_mgr_defined
     149             : #define TIFF_jpeg_destination_mgr_defined
     150             : typedef struct jpeg_destination_mgr jpeg_destination_mgr;
     151             : #endif
     152             : 
     153             : #ifndef TIFF_jpeg_source_mgr_defined
     154             : #define TIFF_jpeg_source_mgr_defined
     155             : typedef struct jpeg_source_mgr jpeg_source_mgr;
     156             : #endif
     157             : 
     158             : #ifndef TIFF_jpeg_error_mgr_defined
     159             : #define TIFF_jpeg_error_mgr_defined
     160             : typedef struct jpeg_error_mgr jpeg_error_mgr;
     161             : #endif
     162             : 
     163             : /*
     164             :  * State block for each open TIFF file using
     165             :  * libjpeg to do JPEG compression/decompression.
     166             :  *
     167             :  * libjpeg's visible state is either a jpeg_compress_struct
     168             :  * or jpeg_decompress_struct depending on which way we
     169             :  * are going.  comm can be used to refer to the fields
     170             :  * which are common to both.
     171             :  *
     172             :  * NB: cinfo is required to be the first member of JPEGState,
     173             :  *     so we can safely cast JPEGState* -> jpeg_xxx_struct*
     174             :  *     and vice versa!
     175             :  */
     176             : typedef struct
     177             : {
     178             :     union
     179             :     {
     180             :         struct jpeg_compress_struct c;
     181             :         struct jpeg_decompress_struct d;
     182             :         struct jpeg_common_struct comm;
     183             :     } cinfo; /* NB: must be first */
     184             :     int cinfo_initialized;
     185             : 
     186             :     jpeg_error_mgr err;  /* libjpeg error manager */
     187             :     JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
     188             : 
     189             :     struct jpeg_progress_mgr progress;
     190             :     /*
     191             :      * The following two members could be a union, but
     192             :      * they're small enough that it's not worth the effort.
     193             :      */
     194             :     jpeg_destination_mgr dest; /* data dest for compression */
     195             :     jpeg_source_mgr src;       /* data source for decompression */
     196             :                                /* private state */
     197             :     TIFF *tif;                 /* back link needed by some code */
     198             :     uint16_t photometric;      /* copy of PhotometricInterpretation */
     199             :     uint16_t h_sampling;       /* luminance sampling factors */
     200             :     uint16_t v_sampling;
     201             :     tmsize_t bytesperline; /* decompressed bytes per scanline */
     202             :     /* pointers to intermediate buffers when processing downsampled data */
     203             :     TIFF_JSAMPARRAY ds_buffer[MAX_COMPONENTS];
     204             :     int scancount; /* number of "scanlines" accumulated */
     205             :     int samplesperclump;
     206             : 
     207             :     JPEGOtherSettings otherSettings;
     208             : } JPEGState;
     209             : 
     210             : #define JState(tif) ((JPEGState *)(tif)->tif_data)
     211             : 
     212             : static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
     213             : static int JPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
     214             : static int JPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
     215             : static int JPEGEncodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
     216             : static int JPEGInitializeLibJPEG(TIFF *tif, int decode);
     217             : static int DecodeRowError(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
     218             : 
     219             : #define FIELD_JPEGTABLES (FIELD_CODEC + 0)
     220             : 
     221             : static const TIFFField jpegFields[] = {
     222             :     {TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8,
     223             :      TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL},
     224             :     {TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
     225             :      TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
     226             :     {TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
     227             :      TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL},
     228             :     {TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
     229             :      TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL}};
     230             : 
     231             : /*
     232             :  * libjpeg interface layer.
     233             :  *
     234             :  * We use setjmp/longjmp to return control to libtiff
     235             :  * when a fatal error is encountered within the JPEG
     236             :  * library.  We also direct libjpeg error and warning
     237             :  * messages through the appropriate libtiff handlers.
     238             :  */
     239             : 
     240             : /*
     241             :  * Error handling routines (these replace corresponding
     242             :  * IJG routines from jerror.c).  These are used for both
     243             :  * compression and decompression.
     244             :  */
     245           0 : static void TIFFjpeg_error_exit(j_common_ptr cinfo)
     246             : {
     247           0 :     JPEGState *sp = (JPEGState *)cinfo; /* NB: cinfo assumed first */
     248             :     char buffer[JMSG_LENGTH_MAX];
     249             : 
     250           0 :     (*cinfo->err->format_message)(cinfo, buffer);
     251           0 :     TIFFErrorExtR(sp->tif, "JPEGLib", "%s",
     252             :                   buffer);       /* display the error message */
     253           0 :     jpeg_abort(cinfo);           /* clean up libjpeg state */
     254           0 :     LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
     255             : }
     256             : 
     257             : /*
     258             :  * This routine is invoked only for warning messages,
     259             :  * since error_exit does its own thing and trace_level
     260             :  * is never set > 0.
     261             :  */
     262          69 : static void TIFFjpeg_output_message(j_common_ptr cinfo)
     263             : {
     264             :     char buffer[JMSG_LENGTH_MAX];
     265             : 
     266          69 :     (*cinfo->err->format_message)(cinfo, buffer);
     267          69 :     TIFFWarningExtR(((JPEGState *)cinfo)->tif, "JPEGLib", "%s", buffer);
     268          69 : }
     269             : 
     270             : /* Avoid the risk of denial-of-service on crafted JPEGs with an insane */
     271             : /* number of scans. */
     272             : /* See
     273             :  * http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
     274             :  */
     275      220796 : static void TIFFjpeg_progress_monitor(j_common_ptr cinfo)
     276             : {
     277      220796 :     JPEGState *sp = (JPEGState *)cinfo; /* NB: cinfo assumed first */
     278      220796 :     if (cinfo->is_decompressor)
     279             :     {
     280      220796 :         const int scan_no = ((j_decompress_ptr)cinfo)->input_scan_number;
     281      220796 :         if (scan_no >= sp->otherSettings.max_allowed_scan_number)
     282             :         {
     283           2 :             TIFFErrorExtR(
     284             :                 ((JPEGState *)cinfo)->tif, "TIFFjpeg_progress_monitor",
     285             :                 "Scan number %d exceeds maximum scans (%d). This limit "
     286             :                 "can be raised through the "
     287             :                 "LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER "
     288             :                 "environment variable.",
     289             :                 scan_no, sp->otherSettings.max_allowed_scan_number);
     290             : 
     291           2 :             jpeg_abort(cinfo);           /* clean up libjpeg state */
     292           2 :             LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
     293             :         }
     294             :     }
     295      220794 : }
     296             : 
     297             : /*
     298             :  * Interface routines.  This layer of routines exists
     299             :  * primarily to limit side-effects from using setjmp.
     300             :  * Also, normal/error returns are converted into return
     301             :  * values per libtiff practice.
     302             :  */
     303             : #define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
     304             : #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op), 1))
     305             : 
     306        2201 : static int TIFFjpeg_create_compress(JPEGState *sp)
     307             : {
     308             :     /* initialize JPEG error handling */
     309        2201 :     sp->cinfo.c.err = jpeg_std_error(&sp->err);
     310        2201 :     sp->err.error_exit = TIFFjpeg_error_exit;
     311        2201 :     sp->err.output_message = TIFFjpeg_output_message;
     312             : 
     313             :     /* set client_data to avoid UMR warning from tools like Purify */
     314        2201 :     sp->cinfo.c.client_data = NULL;
     315             : 
     316        2201 :     return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
     317             : }
     318             : 
     319         175 : static int TIFFjpeg_create_decompress(JPEGState *sp)
     320             : {
     321             :     /* initialize JPEG error handling */
     322         175 :     sp->cinfo.d.err = jpeg_std_error(&sp->err);
     323         175 :     sp->err.error_exit = TIFFjpeg_error_exit;
     324         175 :     sp->err.output_message = TIFFjpeg_output_message;
     325             : 
     326             :     /* set client_data to avoid UMR warning from tools like Purify */
     327         175 :     sp->cinfo.d.client_data = NULL;
     328             : 
     329         175 :     return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
     330             : }
     331             : 
     332        2201 : static int TIFFjpeg_set_defaults(JPEGState *sp)
     333             : {
     334        2201 :     return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
     335             : }
     336             : 
     337        4207 : static int TIFFjpeg_set_colorspace(JPEGState *sp, J_COLOR_SPACE colorspace)
     338             : {
     339        4207 :     return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
     340             : }
     341             : 
     342        5387 : static int TIFFjpeg_set_quality(JPEGState *sp, int quality,
     343             :                                 boolean force_baseline)
     344             : {
     345        5387 :     return CALLVJPEG(sp,
     346             :                      jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
     347             : }
     348             : 
     349        1179 : static int TIFFjpeg_suppress_tables(JPEGState *sp, boolean suppress)
     350             : {
     351        1179 :     return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
     352             : }
     353             : 
     354        4208 : static int TIFFjpeg_start_compress(JPEGState *sp, boolean write_all_tables)
     355             : {
     356        4208 :     return CALLVJPEG(sp, jpeg_start_compress(&sp->cinfo.c, write_all_tables));
     357             : }
     358             : 
     359      176848 : static int TIFFjpeg_write_scanlines(JPEGState *sp, TIFF_JSAMPARRAY scanlines,
     360             :                                     int num_lines)
     361             : {
     362             : #if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
     363             :     return CALLJPEG(sp, -1,
     364             :                     (int)jpeg12_write_scanlines(&sp->cinfo.c, scanlines,
     365             :                                                 (JDIMENSION)num_lines));
     366             : #else
     367      176848 :     return CALLJPEG(sp, -1,
     368             :                     (int)jpeg_write_scanlines(&sp->cinfo.c, scanlines,
     369             :                                               (JDIMENSION)num_lines));
     370             : #endif
     371             : }
     372             : 
     373           0 : static int TIFFjpeg_write_raw_data(JPEGState *sp, TIFF_JSAMPIMAGE data,
     374             :                                    int num_lines)
     375             : {
     376             : #if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
     377             :     return CALLJPEG(
     378             :         sp, -1,
     379             :         (int)jpeg12_write_raw_data(&sp->cinfo.c, data, (JDIMENSION)num_lines));
     380             : #else
     381           0 :     return CALLJPEG(
     382             :         sp, -1,
     383             :         (int)jpeg_write_raw_data(&sp->cinfo.c, data, (JDIMENSION)num_lines));
     384             : #endif
     385             : }
     386             : 
     387        4207 : static int TIFFjpeg_finish_compress(JPEGState *sp)
     388             : {
     389        4207 :     return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
     390             : }
     391             : 
     392        1178 : static int TIFFjpeg_write_tables(JPEGState *sp)
     393             : {
     394        1178 :     return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
     395             : }
     396             : 
     397        1952 : static int TIFFjpeg_read_header(JPEGState *sp, boolean require_image)
     398             : {
     399        1952 :     return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
     400             : }
     401             : 
     402        1786 : static int TIFFjpeg_has_multiple_scans(JPEGState *sp)
     403             : {
     404        1786 :     return CALLJPEG(sp, 0, jpeg_has_multiple_scans(&sp->cinfo.d));
     405             : }
     406             : 
     407        1784 : static int TIFFjpeg_start_decompress(JPEGState *sp)
     408             : {
     409             :     const char *sz_max_allowed_scan_number;
     410             :     /* progress monitor */
     411        1784 :     sp->cinfo.d.progress = &sp->progress;
     412        1784 :     sp->progress.progress_monitor = TIFFjpeg_progress_monitor;
     413        1784 :     sp->otherSettings.max_allowed_scan_number = 100;
     414        1784 :     sz_max_allowed_scan_number = getenv("LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER");
     415        1784 :     if (sz_max_allowed_scan_number)
     416           1 :         sp->otherSettings.max_allowed_scan_number =
     417           1 :             atoi(sz_max_allowed_scan_number);
     418             : 
     419        1784 :     return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
     420             : }
     421             : 
     422      110094 : static int TIFFjpeg_read_scanlines(JPEGState *sp, TIFF_JSAMPARRAY scanlines,
     423             :                                    int max_lines)
     424             : {
     425             : #if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
     426             :     return CALLJPEG(sp, -1,
     427             :                     (int)jpeg12_read_scanlines(&sp->cinfo.d, scanlines,
     428             :                                                (JDIMENSION)max_lines));
     429             : #else
     430      110094 :     return CALLJPEG(sp, -1,
     431             :                     (int)jpeg_read_scanlines(&sp->cinfo.d, scanlines,
     432             :                                              (JDIMENSION)max_lines));
     433             : #endif
     434             : }
     435             : 
     436           0 : static int TIFFjpeg_read_raw_data(JPEGState *sp, TIFF_JSAMPIMAGE data,
     437             :                                   int max_lines)
     438             : {
     439             : #if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
     440             :     return CALLJPEG(
     441             :         sp, -1,
     442             :         (int)jpeg12_read_raw_data(&sp->cinfo.d, data, (JDIMENSION)max_lines));
     443             : #else
     444           0 :     return CALLJPEG(
     445             :         sp, -1,
     446             :         (int)jpeg_read_raw_data(&sp->cinfo.d, data, (JDIMENSION)max_lines));
     447             : #endif
     448             : }
     449             : 
     450        1708 : static int TIFFjpeg_finish_decompress(JPEGState *sp)
     451             : {
     452        1708 :     return CALLJPEG(sp, -1, (int)jpeg_finish_decompress(&sp->cinfo.d));
     453             : }
     454             : 
     455        1785 : static int TIFFjpeg_abort(JPEGState *sp)
     456             : {
     457        1785 :     return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
     458             : }
     459             : 
     460        2375 : static int TIFFjpeg_destroy(JPEGState *sp)
     461             : {
     462        2375 :     return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
     463             : }
     464             : 
     465           0 : static JSAMPARRAY TIFFjpeg_alloc_sarray(JPEGState *sp, int pool_id,
     466             :                                         JDIMENSION samplesperrow,
     467             :                                         JDIMENSION numrows)
     468             : {
     469           0 :     return CALLJPEG(sp, (JSAMPARRAY)NULL,
     470             :                     (*sp->cinfo.comm.mem->alloc_sarray)(
     471             :                         &sp->cinfo.comm, pool_id, samplesperrow, numrows));
     472             : }
     473             : 
     474             : /*
     475             :  * JPEG library destination data manager.
     476             :  * These routines direct compressed data from libjpeg into the
     477             :  * libtiff output buffer.
     478             :  */
     479             : 
     480        4207 : static void std_init_destination(j_compress_ptr cinfo)
     481             : {
     482        4207 :     JPEGState *sp = (JPEGState *)cinfo;
     483        4207 :     TIFF *tif = sp->tif;
     484             : 
     485        4207 :     sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
     486        4207 :     sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
     487        4207 : }
     488             : 
     489           0 : static boolean std_empty_output_buffer(j_compress_ptr cinfo)
     490             : {
     491           0 :     JPEGState *sp = (JPEGState *)cinfo;
     492           0 :     TIFF *tif = sp->tif;
     493             : 
     494             :     /* the entire buffer has been filled */
     495           0 :     tif->tif_rawcc = tif->tif_rawdatasize;
     496             : 
     497             : #ifdef IPPJ_HUFF
     498             :     /*
     499             :      * The Intel IPP performance library does not necessarily fill up
     500             :      * the whole output buffer on each pass, so only dump out the parts
     501             :      * that have been filled.
     502             :      *   http://trac.osgeo.org/gdal/wiki/JpegIPP
     503             :      */
     504             :     if (sp->dest.free_in_buffer >= 0)
     505             :     {
     506             :         tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer;
     507             :     }
     508             : #endif
     509             : 
     510           0 :     if (!TIFFFlushData1(tif))
     511           0 :         return FALSE;
     512           0 :     sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
     513           0 :     sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
     514             : 
     515           0 :     return (TRUE);
     516             : }
     517             : 
     518        4208 : static void std_term_destination(j_compress_ptr cinfo)
     519             : {
     520        4208 :     JPEGState *sp = (JPEGState *)cinfo;
     521        4208 :     TIFF *tif = sp->tif;
     522             : 
     523        4208 :     tif->tif_rawcp = (uint8_t *)sp->dest.next_output_byte;
     524        4208 :     tif->tif_rawcc = tif->tif_rawdatasize - (tmsize_t)sp->dest.free_in_buffer;
     525             :     /* NB: libtiff does the final buffer flush */
     526        4208 : }
     527             : 
     528        2201 : static void TIFFjpeg_data_dest(JPEGState *sp, TIFF *tif)
     529             : {
     530             :     (void)tif;
     531        2201 :     sp->cinfo.c.dest = &sp->dest;
     532        2201 :     sp->dest.init_destination = std_init_destination;
     533        2201 :     sp->dest.empty_output_buffer = std_empty_output_buffer;
     534        2201 :     sp->dest.term_destination = std_term_destination;
     535        2201 : }
     536             : 
     537             : /*
     538             :  * Alternate destination manager for outputting to JPEGTables field.
     539             :  */
     540             : 
     541        1179 : static void tables_init_destination(j_compress_ptr cinfo)
     542             : {
     543        1179 :     JPEGState *sp = (JPEGState *)cinfo;
     544             : 
     545             :     /* while building, otherSettings.jpegtables_length is allocated buffer size
     546             :      */
     547        1179 :     sp->dest.next_output_byte = (JOCTET *)sp->otherSettings.jpegtables;
     548        1179 :     sp->dest.free_in_buffer = (size_t)sp->otherSettings.jpegtables_length;
     549        1179 : }
     550             : 
     551           0 : static boolean tables_empty_output_buffer(j_compress_ptr cinfo)
     552             : {
     553           0 :     JPEGState *sp = (JPEGState *)cinfo;
     554             :     void *newbuf;
     555             : 
     556             :     /* the entire buffer has been filled; enlarge it by 1000 bytes */
     557             :     newbuf =
     558           0 :         _TIFFreallocExt(sp->tif, (void *)sp->otherSettings.jpegtables,
     559           0 :                         (tmsize_t)(sp->otherSettings.jpegtables_length + 1000));
     560           0 :     if (newbuf == NULL)
     561           0 :         ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
     562           0 :     sp->dest.next_output_byte =
     563           0 :         (JOCTET *)newbuf + sp->otherSettings.jpegtables_length;
     564           0 :     sp->dest.free_in_buffer = (size_t)1000;
     565           0 :     sp->otherSettings.jpegtables = newbuf;
     566           0 :     sp->otherSettings.jpegtables_length += 1000;
     567           0 :     return (TRUE);
     568             : }
     569             : 
     570        1178 : static void tables_term_destination(j_compress_ptr cinfo)
     571             : {
     572        1178 :     JPEGState *sp = (JPEGState *)cinfo;
     573             : 
     574             :     /* set tables length to number of bytes actually emitted */
     575        1178 :     sp->otherSettings.jpegtables_length -= (uint32_t)sp->dest.free_in_buffer;
     576        1178 : }
     577             : 
     578        1179 : static int TIFFjpeg_tables_dest(JPEGState *sp, TIFF *tif)
     579             : {
     580             :     (void)tif;
     581             :     /*
     582             :      * Allocate a working buffer for building tables.
     583             :      * Initial size is 1000 bytes, which is usually adequate.
     584             :      */
     585        1179 :     if (sp->otherSettings.jpegtables)
     586         112 :         _TIFFfreeExt(tif, sp->otherSettings.jpegtables);
     587        1179 :     sp->otherSettings.jpegtables_length = 1000;
     588        2357 :     sp->otherSettings.jpegtables = (void *)_TIFFmallocExt(
     589        1179 :         tif, (tmsize_t)sp->otherSettings.jpegtables_length);
     590        1178 :     if (sp->otherSettings.jpegtables == NULL)
     591             :     {
     592           0 :         sp->otherSettings.jpegtables_length = 0;
     593           0 :         TIFFErrorExtR(sp->tif, "TIFFjpeg_tables_dest",
     594             :                       "No space for JPEGTables");
     595           0 :         return (0);
     596             :     }
     597        1178 :     sp->cinfo.c.dest = &sp->dest;
     598        1178 :     sp->dest.init_destination = tables_init_destination;
     599        1178 :     sp->dest.empty_output_buffer = tables_empty_output_buffer;
     600        1178 :     sp->dest.term_destination = tables_term_destination;
     601        1178 :     return (1);
     602             : }
     603             : 
     604             : /*
     605             :  * JPEG library source data manager.
     606             :  * These routines supply compressed data to libjpeg.
     607             :  */
     608             : 
     609        1787 : static void std_init_source(j_decompress_ptr cinfo)
     610             : {
     611        1787 :     JPEGState *sp = (JPEGState *)cinfo;
     612        1787 :     TIFF *tif = sp->tif;
     613             : 
     614        1787 :     sp->src.next_input_byte = (const JOCTET *)tif->tif_rawdata;
     615        1787 :     sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
     616        1787 : }
     617             : 
     618           0 : static boolean std_fill_input_buffer(j_decompress_ptr cinfo)
     619             : {
     620           0 :     JPEGState *sp = (JPEGState *)cinfo;
     621             :     static const JOCTET dummy_EOI[2] = {0xFF, JPEG_EOI};
     622             : 
     623             : #ifdef IPPJ_HUFF
     624             :     /*
     625             :      * The Intel IPP performance library does not necessarily read the whole
     626             :      * input buffer in one pass, so it is possible to get here with data
     627             :      * yet to read.
     628             :      *
     629             :      * We just return without doing anything, until the entire buffer has
     630             :      * been read.
     631             :      * http://trac.osgeo.org/gdal/wiki/JpegIPP
     632             :      */
     633             :     if (sp->src.bytes_in_buffer > 0)
     634             :     {
     635             :         return (TRUE);
     636             :     }
     637             : #endif
     638             : 
     639             :     /*
     640             :      * Normally the whole strip/tile is read and so we don't need to do
     641             :      * a fill.  In the case of CHUNKY_STRIP_READ_SUPPORT we might not have
     642             :      * all the data, but the rawdata is refreshed between scanlines and
     643             :      * we push this into the io machinery in JPEGDecode().
     644             :      * http://trac.osgeo.org/gdal/ticket/3894
     645             :      */
     646             : 
     647           0 :     WARNMS(cinfo, JWRN_JPEG_EOF);
     648             :     /* insert a fake EOI marker */
     649           0 :     sp->src.next_input_byte = dummy_EOI;
     650           0 :     sp->src.bytes_in_buffer = 2;
     651           0 :     return (TRUE);
     652             : }
     653             : 
     654           0 : static void std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
     655             : {
     656           0 :     JPEGState *sp = (JPEGState *)cinfo;
     657             : 
     658           0 :     if (num_bytes > 0)
     659             :     {
     660           0 :         if ((size_t)num_bytes > sp->src.bytes_in_buffer)
     661             :         {
     662             :             /* oops, buffer overrun */
     663           0 :             (void)std_fill_input_buffer(cinfo);
     664             :         }
     665             :         else
     666             :         {
     667           0 :             sp->src.next_input_byte += (size_t)num_bytes;
     668           0 :             sp->src.bytes_in_buffer -= (size_t)num_bytes;
     669             :         }
     670             :     }
     671           0 : }
     672             : 
     673        1708 : static void std_term_source(j_decompress_ptr cinfo)
     674             : {
     675             :     /* No work necessary here */
     676             :     (void)cinfo;
     677        1708 : }
     678             : 
     679         340 : static void TIFFjpeg_data_src(JPEGState *sp)
     680             : {
     681         340 :     sp->cinfo.d.src = &sp->src;
     682         340 :     sp->src.init_source = std_init_source;
     683         340 :     sp->src.fill_input_buffer = std_fill_input_buffer;
     684         340 :     sp->src.skip_input_data = std_skip_input_data;
     685         340 :     sp->src.resync_to_restart = jpeg_resync_to_restart;
     686         340 :     sp->src.term_source = std_term_source;
     687         340 :     sp->src.bytes_in_buffer = 0; /* for safety */
     688         340 :     sp->src.next_input_byte = NULL;
     689         340 : }
     690             : 
     691             : /*
     692             :  * Alternate source manager for reading from JPEGTables.
     693             :  * We can share all the code except for the init routine.
     694             :  */
     695             : 
     696         165 : static void tables_init_source(j_decompress_ptr cinfo)
     697             : {
     698         165 :     JPEGState *sp = (JPEGState *)cinfo;
     699             : 
     700         165 :     sp->src.next_input_byte = (const JOCTET *)sp->otherSettings.jpegtables;
     701         165 :     sp->src.bytes_in_buffer = (size_t)sp->otherSettings.jpegtables_length;
     702         165 : }
     703             : 
     704         165 : static void TIFFjpeg_tables_src(JPEGState *sp)
     705             : {
     706         165 :     TIFFjpeg_data_src(sp);
     707         165 :     sp->src.init_source = tables_init_source;
     708         165 : }
     709             : 
     710             : /*
     711             :  * Allocate downsampled-data buffers needed for downsampled I/O.
     712             :  * We use values computed in jpeg_start_compress or jpeg_start_decompress.
     713             :  * We use libjpeg's allocator so that buffers will be released automatically
     714             :  * when done with strip/tile.
     715             :  * This is also a handy place to compute samplesperclump, bytesperline.
     716             :  */
     717           0 : static int alloc_downsampled_buffers(TIFF *tif, jpeg_component_info *comp_info,
     718             :                                      int num_components)
     719             : {
     720           0 :     JPEGState *sp = JState(tif);
     721             :     int ci;
     722             :     jpeg_component_info *compptr;
     723             :     TIFF_JSAMPARRAY buf;
     724           0 :     int samples_per_clump = 0;
     725             : 
     726           0 :     for (ci = 0, compptr = comp_info; ci < num_components; ci++, compptr++)
     727             :     {
     728           0 :         samples_per_clump += compptr->h_samp_factor * compptr->v_samp_factor;
     729           0 :         buf = (TIFF_JSAMPARRAY)TIFFjpeg_alloc_sarray(
     730           0 :             sp, JPOOL_IMAGE, compptr->width_in_blocks * DCTSIZE,
     731           0 :             (JDIMENSION)(compptr->v_samp_factor * DCTSIZE));
     732           0 :         if (buf == NULL)
     733           0 :             return (0);
     734           0 :         sp->ds_buffer[ci] = buf;
     735             :     }
     736           0 :     sp->samplesperclump = samples_per_clump;
     737           0 :     return (1);
     738             : }
     739             : 
     740             : /*
     741             :  * JPEG Decoding.
     742             :  */
     743             : 
     744             : #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
     745             : 
     746             : #define JPEG_MARKER_SOF0 0xC0
     747             : #define JPEG_MARKER_SOF1 0xC1
     748             : #define JPEG_MARKER_SOF2 0xC2
     749             : #define JPEG_MARKER_SOF9 0xC9
     750             : #define JPEG_MARKER_SOF10 0xCA
     751             : #define JPEG_MARKER_DHT 0xC4
     752             : #define JPEG_MARKER_SOI 0xD8
     753             : #define JPEG_MARKER_SOS 0xDA
     754             : #define JPEG_MARKER_DQT 0xDB
     755             : #define JPEG_MARKER_DRI 0xDD
     756             : #define JPEG_MARKER_APP0 0xE0
     757             : #define JPEG_MARKER_COM 0xFE
     758             : struct JPEGFixupTagsSubsamplingData
     759             : {
     760             :     TIFF *tif;
     761             :     void *buffer;
     762             :     uint32_t buffersize;
     763             :     uint8_t *buffercurrentbyte;
     764             :     uint32_t bufferbytesleft;
     765             :     uint64_t fileoffset;
     766             :     uint64_t filebytesleft;
     767             :     uint8_t filepositioned;
     768             : };
     769             : static void JPEGFixupTagsSubsampling(TIFF *tif);
     770             : static int
     771             : JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData *data);
     772             : static int
     773             : JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData *data,
     774             :                                  uint8_t *result);
     775             : static int
     776             : JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData *data,
     777             :                                  uint16_t *result);
     778             : static void
     779             : JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData *data,
     780             :                              uint16_t skiplength);
     781             : 
     782             : #endif
     783             : 
     784        3112 : static int JPEGFixupTags(TIFF *tif)
     785             : {
     786             : #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
     787        3112 :     JPEGState *sp = JState(tif);
     788        3112 :     if ((tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR) &&
     789        1443 :         (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG) &&
     790        1443 :         (tif->tif_dir.td_samplesperpixel == 3) &&
     791        1443 :         !sp->otherSettings.ycbcrsampling_fetched)
     792          70 :         JPEGFixupTagsSubsampling(tif);
     793             : #endif
     794             : 
     795        3112 :     return (1);
     796             : }
     797             : 
     798             : #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
     799             : 
     800          70 : static void JPEGFixupTagsSubsampling(TIFF *tif)
     801             : {
     802             :     /*
     803             :      * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
     804             :      * the TIFF tags, but still use non-default (2,2) values within the jpeg
     805             :      * data stream itself.  In order for TIFF applications to work properly
     806             :      * - for instance to get the strip buffer size right - it is imperative
     807             :      * that the subsampling be available before we start reading the image
     808             :      * data normally.  This function will attempt to analyze the first strip in
     809             :      * order to get the sampling values from the jpeg data stream.
     810             :      *
     811             :      * Note that JPEGPreDeocode() will produce a fairly loud warning when the
     812             :      * discovered sampling does not match the default sampling (2,2) or whatever
     813             :      * was actually in the tiff tags.
     814             :      *
     815             :      * See the bug in bugzilla for details:
     816             :      *
     817             :      * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
     818             :      *
     819             :      * Frank Warmerdam, July 2002
     820             :      * Joris Van Damme, May 2007
     821             :      */
     822             :     static const char module[] = "JPEGFixupTagsSubsampling";
     823             :     struct JPEGFixupTagsSubsamplingData m;
     824          70 :     uint64_t fileoffset = TIFFGetStrileOffset(tif, 0);
     825             : 
     826          70 :     if (fileoffset == 0)
     827             :     {
     828             :         /* Do not even try to check if the first strip/tile does not
     829             :            yet exist, as occurs when GDAL has created a new NULL file
     830             :            for instance. */
     831           0 :         return;
     832             :     }
     833             : 
     834          70 :     m.tif = tif;
     835          70 :     m.buffersize = 2048;
     836          70 :     m.buffer = _TIFFmallocExt(tif, m.buffersize);
     837          70 :     if (m.buffer == NULL)
     838             :     {
     839           0 :         TIFFWarningExtR(tif, module,
     840             :                         "Unable to allocate memory for auto-correcting of "
     841             :                         "subsampling values; auto-correcting skipped");
     842           0 :         return;
     843             :     }
     844          70 :     m.buffercurrentbyte = NULL;
     845          70 :     m.bufferbytesleft = 0;
     846          70 :     m.fileoffset = fileoffset;
     847          70 :     m.filepositioned = 0;
     848          70 :     m.filebytesleft = TIFFGetStrileByteCount(tif, 0);
     849          70 :     if (!JPEGFixupTagsSubsamplingSec(&m))
     850           0 :         TIFFWarningExtR(
     851             :             tif, module,
     852             :             "Unable to auto-correct subsampling values, likely corrupt JPEG "
     853             :             "compressed data in first strip/tile; auto-correcting skipped");
     854          70 :     _TIFFfreeExt(tif, m.buffer);
     855             : }
     856             : 
     857             : static int
     858         228 : JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData *data)
     859             : {
     860             :     static const char module[] = "JPEGFixupTagsSubsamplingSec";
     861             :     uint8_t m;
     862         158 :     while (1)
     863             :     {
     864             :         while (1)
     865             :         {
     866         228 :             if (!JPEGFixupTagsSubsamplingReadByte(data, &m))
     867           0 :                 return (0);
     868         228 :             if (m == 255)
     869         228 :                 break;
     870             :         }
     871             :         while (1)
     872             :         {
     873         228 :             if (!JPEGFixupTagsSubsamplingReadByte(data, &m))
     874           0 :                 return (0);
     875         228 :             if (m != 255)
     876         228 :                 break;
     877             :         }
     878         228 :         switch (m)
     879             :         {
     880          70 :             case JPEG_MARKER_SOI:
     881             :                 /* this type of marker has no data and should be skipped */
     882          70 :                 break;
     883          88 :             case JPEG_MARKER_COM:
     884             :             case JPEG_MARKER_APP0:
     885             :             case JPEG_MARKER_APP0 + 1:
     886             :             case JPEG_MARKER_APP0 + 2:
     887             :             case JPEG_MARKER_APP0 + 3:
     888             :             case JPEG_MARKER_APP0 + 4:
     889             :             case JPEG_MARKER_APP0 + 5:
     890             :             case JPEG_MARKER_APP0 + 6:
     891             :             case JPEG_MARKER_APP0 + 7:
     892             :             case JPEG_MARKER_APP0 + 8:
     893             :             case JPEG_MARKER_APP0 + 9:
     894             :             case JPEG_MARKER_APP0 + 10:
     895             :             case JPEG_MARKER_APP0 + 11:
     896             :             case JPEG_MARKER_APP0 + 12:
     897             :             case JPEG_MARKER_APP0 + 13:
     898             :             case JPEG_MARKER_APP0 + 14:
     899             :             case JPEG_MARKER_APP0 + 15:
     900             :             case JPEG_MARKER_DQT:
     901             :             case JPEG_MARKER_SOS:
     902             :             case JPEG_MARKER_DHT:
     903             :             case JPEG_MARKER_DRI:
     904             :                 /* this type of marker has data, but it has no use to us and
     905             :                  * should be skipped */
     906             :                 {
     907             :                     uint16_t n;
     908          88 :                     if (!JPEGFixupTagsSubsamplingReadWord(data, &n))
     909           0 :                         return (0);
     910          88 :                     if (n < 2)
     911           0 :                         return (0);
     912          88 :                     n -= 2;
     913          88 :                     if (n > 0)
     914          88 :                         JPEGFixupTagsSubsamplingSkip(data, n);
     915             :                 }
     916          88 :                 break;
     917          70 :             case JPEG_MARKER_SOF0:  /* Baseline sequential Huffman */
     918             :             case JPEG_MARKER_SOF1:  /* Extended sequential Huffman */
     919             :             case JPEG_MARKER_SOF2:  /* Progressive Huffman: normally not allowed
     920             :                                        by  TechNote, but that doesn't hurt
     921             :                                        supporting it */
     922             :             case JPEG_MARKER_SOF9:  /* Extended sequential arithmetic */
     923             :             case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not
     924             :                                        allowed by TechNote, but that doesn't
     925             :                                        hurt supporting it */
     926             :                 /* this marker contains the subsampling factors we're scanning
     927             :                  * for */
     928             :                 {
     929             :                     uint16_t n;
     930             :                     uint16_t o;
     931             :                     uint8_t p;
     932             :                     uint8_t ph, pv;
     933          70 :                     if (!JPEGFixupTagsSubsamplingReadWord(data, &n))
     934           0 :                         return (0);
     935          70 :                     if (n != 8 + data->tif->tif_dir.td_samplesperpixel * 3)
     936           0 :                         return (0);
     937          70 :                     JPEGFixupTagsSubsamplingSkip(data, 7);
     938          70 :                     if (!JPEGFixupTagsSubsamplingReadByte(data, &p))
     939           0 :                         return (0);
     940          70 :                     ph = (p >> 4);
     941          70 :                     pv = (p & 15);
     942          70 :                     JPEGFixupTagsSubsamplingSkip(data, 1);
     943         210 :                     for (o = 1; o < data->tif->tif_dir.td_samplesperpixel; o++)
     944             :                     {
     945         140 :                         JPEGFixupTagsSubsamplingSkip(data, 1);
     946         140 :                         if (!JPEGFixupTagsSubsamplingReadByte(data, &p))
     947           0 :                             return (0);
     948         140 :                         if (p != 0x11)
     949             :                         {
     950           0 :                             TIFFWarningExtR(data->tif, module,
     951             :                                             "Subsampling values inside JPEG "
     952             :                                             "compressed data "
     953             :                                             "have no TIFF equivalent, "
     954             :                                             "auto-correction of TIFF "
     955             :                                             "subsampling values failed");
     956           0 :                             return (1);
     957             :                         }
     958         140 :                         JPEGFixupTagsSubsamplingSkip(data, 1);
     959             :                     }
     960          70 :                     if (((ph != 1) && (ph != 2) && (ph != 4)) ||
     961          70 :                         ((pv != 1) && (pv != 2) && (pv != 4)))
     962             :                     {
     963           0 :                         TIFFWarningExtR(data->tif, module,
     964             :                                         "Subsampling values inside JPEG "
     965             :                                         "compressed data have no TIFF "
     966             :                                         "equivalent, auto-correction of TIFF "
     967             :                                         "subsampling values failed");
     968           0 :                         return (1);
     969             :                     }
     970          70 :                     if ((ph != data->tif->tif_dir.td_ycbcrsubsampling[0]) ||
     971          70 :                         (pv != data->tif->tif_dir.td_ycbcrsubsampling[1]))
     972             :                     {
     973           0 :                         TIFFWarningExtR(
     974             :                             data->tif, module,
     975             :                             "Auto-corrected former TIFF subsampling values "
     976             :                             "[%" PRIu16 ",%" PRIu16
     977             :                             "] to match subsampling values inside JPEG "
     978             :                             "compressed data [%" PRIu8 ",%" PRIu8 "]",
     979           0 :                             data->tif->tif_dir.td_ycbcrsubsampling[0],
     980           0 :                             data->tif->tif_dir.td_ycbcrsubsampling[1], ph, pv);
     981           0 :                         data->tif->tif_dir.td_ycbcrsubsampling[0] = ph;
     982           0 :                         data->tif->tif_dir.td_ycbcrsubsampling[1] = pv;
     983             :                     }
     984             :                 }
     985          70 :                 return (1);
     986           0 :             default:
     987           0 :                 return (0);
     988             :         }
     989             :     }
     990             : }
     991             : 
     992             : static int
     993         982 : JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData *data,
     994             :                                  uint8_t *result)
     995             : {
     996         982 :     if (data->bufferbytesleft == 0)
     997             :     {
     998             :         uint32_t m;
     999          70 :         if (data->filebytesleft == 0)
    1000           0 :             return (0);
    1001          70 :         if (!data->filepositioned)
    1002             :         {
    1003          70 :             if (TIFFSeekFile(data->tif, data->fileoffset, SEEK_SET) ==
    1004             :                 (toff_t)-1)
    1005             :             {
    1006           0 :                 return 0;
    1007             :             }
    1008          70 :             data->filepositioned = 1;
    1009             :         }
    1010          70 :         m = data->buffersize;
    1011          70 :         if ((uint64_t)m > data->filebytesleft)
    1012           0 :             m = (uint32_t)data->filebytesleft;
    1013          70 :         assert(m < 0x80000000UL);
    1014          70 :         if (TIFFReadFile(data->tif, data->buffer, (tmsize_t)m) != (tmsize_t)m)
    1015           0 :             return (0);
    1016          70 :         data->buffercurrentbyte = data->buffer;
    1017          70 :         data->bufferbytesleft = m;
    1018          70 :         data->fileoffset += m;
    1019          70 :         data->filebytesleft -= m;
    1020             :     }
    1021         982 :     *result = *data->buffercurrentbyte;
    1022         982 :     data->buffercurrentbyte++;
    1023         982 :     data->bufferbytesleft--;
    1024         982 :     return (1);
    1025             : }
    1026             : 
    1027             : static int
    1028         158 : JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData *data,
    1029             :                                  uint16_t *result)
    1030             : {
    1031             :     uint8_t ma;
    1032             :     uint8_t mb;
    1033         158 :     if (!JPEGFixupTagsSubsamplingReadByte(data, &ma))
    1034           0 :         return (0);
    1035         158 :     if (!JPEGFixupTagsSubsamplingReadByte(data, &mb))
    1036           0 :         return (0);
    1037         158 :     *result = (ma << 8) | mb;
    1038         158 :     return (1);
    1039             : }
    1040             : 
    1041             : static void
    1042         508 : JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData *data,
    1043             :                              uint16_t skiplength)
    1044             : {
    1045         508 :     if ((uint32_t)skiplength <= data->bufferbytesleft)
    1046             :     {
    1047         508 :         data->buffercurrentbyte += skiplength;
    1048         508 :         data->bufferbytesleft -= skiplength;
    1049             :     }
    1050             :     else
    1051             :     {
    1052             :         uint16_t m;
    1053           0 :         m = (uint16_t)(skiplength - data->bufferbytesleft);
    1054           0 :         if (m <= data->filebytesleft)
    1055             :         {
    1056           0 :             data->bufferbytesleft = 0;
    1057           0 :             data->fileoffset += m;
    1058           0 :             data->filebytesleft -= m;
    1059           0 :             data->filepositioned = 0;
    1060             :         }
    1061             :         else
    1062             :         {
    1063           0 :             data->bufferbytesleft = 0;
    1064           0 :             data->filebytesleft = 0;
    1065             :         }
    1066             :     }
    1067         508 : }
    1068             : 
    1069             : #endif
    1070             : 
    1071         181 : static int JPEGSetupDecode(TIFF *tif)
    1072             : {
    1073         181 :     JPEGState *sp = JState(tif);
    1074         181 :     TIFFDirectory *td = &tif->tif_dir;
    1075             : 
    1076             : #if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
    1077         173 :     if (tif->tif_dir.td_bitspersample == 12)
    1078             :     {
    1079             :         /* We pass a pointer to a copy of otherSettings, since */
    1080             :         /* TIFFReInitJPEG_12() will clear sp */
    1081           8 :         JPEGOtherSettings savedOtherSettings = sp->otherSettings;
    1082           8 :         return TIFFReInitJPEG_12(tif, &savedOtherSettings, COMPRESSION_JPEG, 0);
    1083             :     }
    1084             : #endif
    1085             : 
    1086         173 :     JPEGInitializeLibJPEG(tif, TRUE);
    1087             : 
    1088         173 :     assert(sp != NULL);
    1089         173 :     assert(sp->cinfo.comm.is_decompressor);
    1090             : 
    1091             :     /* Read JPEGTables if it is present */
    1092         173 :     if (TIFFFieldSet(tif, FIELD_JPEGTABLES))
    1093             :     {
    1094         165 :         TIFFjpeg_tables_src(sp);
    1095         165 :         if (TIFFjpeg_read_header(sp, FALSE) != JPEG_HEADER_TABLES_ONLY)
    1096             :         {
    1097           0 :             TIFFErrorExtR(tif, "JPEGSetupDecode", "Bogus JPEGTables field");
    1098           0 :             return (0);
    1099             :         }
    1100             :     }
    1101             : 
    1102             :     /* Grab parameters that are same for all strips/tiles */
    1103         173 :     sp->photometric = td->td_photometric;
    1104         173 :     switch (sp->photometric)
    1105             :     {
    1106         106 :         case PHOTOMETRIC_YCBCR:
    1107         106 :             sp->h_sampling = td->td_ycbcrsubsampling[0];
    1108         106 :             sp->v_sampling = td->td_ycbcrsubsampling[1];
    1109         106 :             break;
    1110          67 :         default:
    1111             :             /* TIFF 6.0 forbids subsampling of all other color spaces */
    1112          67 :             sp->h_sampling = 1;
    1113          67 :             sp->v_sampling = 1;
    1114          67 :             break;
    1115             :     }
    1116             : 
    1117             :     /* Set up for reading normal data */
    1118         173 :     TIFFjpeg_data_src(sp);
    1119         173 :     tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
    1120         173 :     return (1);
    1121             : }
    1122             : 
    1123             : /* Returns 1 if the full strip should be read, even when doing scanline per */
    1124             : /* scanline decoding. This happens when the JPEG stream uses multiple scans. */
    1125             : /* Currently only called in CHUNKY_STRIP_READ_SUPPORT mode through */
    1126             : /* scanline interface. */
    1127             : /* Only reads tif->tif_dir.td_bitspersample, tif->tif_rawdata and */
    1128             : /* tif->tif_rawcc members. */
    1129             : /* Can be called independently of the usual setup/predecode/decode states */
    1130           2 : int TIFFJPEGIsFullStripRequired(TIFF *tif)
    1131             : {
    1132             :     int ret;
    1133             :     JPEGState state;
    1134             : 
    1135             : #if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
    1136           2 :     if (tif->tif_dir.td_bitspersample == 12)
    1137           0 :         return TIFFJPEGIsFullStripRequired_12(tif);
    1138             : #endif
    1139             : 
    1140           2 :     memset(&state, 0, sizeof(JPEGState));
    1141           2 :     state.tif = tif;
    1142             : 
    1143           2 :     TIFFjpeg_create_decompress(&state);
    1144             : 
    1145           2 :     TIFFjpeg_data_src(&state);
    1146             : 
    1147           2 :     if (TIFFjpeg_read_header(&state, TRUE) != JPEG_HEADER_OK)
    1148             :     {
    1149           0 :         TIFFjpeg_destroy(&state);
    1150           0 :         return (0);
    1151             :     }
    1152           2 :     ret = TIFFjpeg_has_multiple_scans(&state);
    1153             : 
    1154           2 :     TIFFjpeg_destroy(&state);
    1155             : 
    1156           2 :     return ret;
    1157             : }
    1158             : 
    1159             : /*
    1160             :  * Set up for decoding a strip or tile.
    1161             :  */
    1162        1785 : /*ARGSUSED*/ static int JPEGPreDecode(TIFF *tif, uint16_t s)
    1163             : {
    1164        1785 :     JPEGState *sp = JState(tif);
    1165        1785 :     TIFFDirectory *td = &tif->tif_dir;
    1166             :     static const char module[] = "JPEGPreDecode";
    1167             :     uint32_t segment_width, segment_height;
    1168             :     int downsampled_output;
    1169             :     int ci;
    1170             : 
    1171        1785 :     assert(sp != NULL);
    1172             : 
    1173        1785 :     if (sp->cinfo.comm.is_decompressor == 0)
    1174             :     {
    1175          14 :         tif->tif_setupdecode(tif);
    1176             :     }
    1177             : 
    1178        1785 :     assert(sp->cinfo.comm.is_decompressor);
    1179             :     /*
    1180             :      * Reset decoder state from any previous strip/tile,
    1181             :      * in case application didn't read the whole strip.
    1182             :      */
    1183        1785 :     if (!TIFFjpeg_abort(sp))
    1184           0 :         return (0);
    1185             :     /*
    1186             :      * Read the header for this strip/tile.
    1187             :      */
    1188             : 
    1189        1785 :     if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
    1190           0 :         return (0);
    1191             : 
    1192        1785 :     tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
    1193        1785 :     tif->tif_rawcc = sp->src.bytes_in_buffer;
    1194             : 
    1195             :     /*
    1196             :      * Check image parameters and set decompression parameters.
    1197             :      */
    1198        1785 :     if (isTiled(tif))
    1199             :     {
    1200         512 :         segment_width = td->td_tilewidth;
    1201         512 :         segment_height = td->td_tilelength;
    1202         512 :         sp->bytesperline = TIFFTileRowSize(tif);
    1203             :     }
    1204             :     else
    1205             :     {
    1206        1273 :         segment_width = td->td_imagewidth;
    1207        1273 :         segment_height = td->td_imagelength - tif->tif_row;
    1208        1273 :         if (segment_height > td->td_rowsperstrip)
    1209        1173 :             segment_height = td->td_rowsperstrip;
    1210        1273 :         sp->bytesperline = TIFFScanlineSize(tif);
    1211             :     }
    1212        1785 :     if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0)
    1213             :     {
    1214             :         /*
    1215             :          * For PC 2, scale down the expected strip/tile size
    1216             :          * to match a downsampled component
    1217             :          */
    1218          21 :         if (sp->h_sampling == 0 || sp->v_sampling == 0)
    1219             :         {
    1220           0 :             TIFFErrorExtR(tif, module,
    1221             :                           "JPEG horizontal or vertical sampling is zero");
    1222           0 :             return (0);
    1223             :         }
    1224          21 :         segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
    1225          21 :         segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
    1226             :     }
    1227        1785 :     if (sp->cinfo.d.image_width < segment_width ||
    1228        1785 :         sp->cinfo.d.image_height < segment_height)
    1229             :     {
    1230           0 :         TIFFWarningExtR(tif, module,
    1231             :                         "Improper JPEG strip/tile size, "
    1232             :                         "expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
    1233             :                         segment_width, segment_height, sp->cinfo.d.image_width,
    1234             :                         sp->cinfo.d.image_height);
    1235             :     }
    1236        1785 :     if (sp->cinfo.d.image_width == segment_width &&
    1237        1784 :         sp->cinfo.d.image_height > segment_height &&
    1238           2 :         tif->tif_row + segment_height == td->td_imagelength && !isTiled(tif))
    1239             :     {
    1240             :         /* Some files have a last strip, that should be truncated, */
    1241             :         /* but their JPEG codestream has still the maximum strip */
    1242             :         /* height. Warn about this as this is non compliant, but */
    1243             :         /* we can safely recover from that. */
    1244           2 :         TIFFWarningExtR(tif, module,
    1245             :                         "JPEG strip size exceeds expected dimensions,"
    1246             :                         " expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
    1247             :                         segment_width, segment_height, sp->cinfo.d.image_width,
    1248             :                         sp->cinfo.d.image_height);
    1249             :     }
    1250        1783 :     else if (sp->cinfo.d.image_width > segment_width ||
    1251        1782 :              sp->cinfo.d.image_height > segment_height)
    1252             :     {
    1253             :         /*
    1254             :          * This case could be dangerous, if the strip or tile size has
    1255             :          * been reported as less than the amount of data jpeg will
    1256             :          * return, some potential security issues arise. Catch this
    1257             :          * case and error out.
    1258             :          */
    1259           1 :         TIFFErrorExtR(tif, module,
    1260             :                       "JPEG strip/tile size exceeds expected dimensions,"
    1261             :                       " expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
    1262             :                       segment_width, segment_height, sp->cinfo.d.image_width,
    1263             :                       sp->cinfo.d.image_height);
    1264           1 :         return (0);
    1265             :     }
    1266        1784 :     if (sp->cinfo.d.num_components !=
    1267        3540 :         (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
    1268        1784 :                                                     : 1))
    1269             :     {
    1270           0 :         TIFFErrorExtR(tif, module, "Improper JPEG component count");
    1271           0 :         return (0);
    1272             :     }
    1273             : #ifdef JPEG_LIB_MK1
    1274             :     if (12 != td->td_bitspersample && 8 != td->td_bitspersample)
    1275             :     {
    1276             :         TIFFErrorExtR(tif, module, "Improper JPEG data precision");
    1277             :         return (0);
    1278             :     }
    1279             :     sp->cinfo.d.data_precision = td->td_bitspersample;
    1280             :     sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
    1281             : #else
    1282        1784 :     if (sp->cinfo.d.data_precision != td->td_bitspersample)
    1283             :     {
    1284           0 :         TIFFErrorExtR(tif, module, "Improper JPEG data precision");
    1285           0 :         return (0);
    1286             :     }
    1287             : #endif
    1288             : 
    1289        1784 :     if (sp->cinfo.d.progressive_mode &&
    1290           2 :         !sp->otherSettings.has_warned_about_progressive_mode)
    1291             :     {
    1292           2 :         TIFFWarningExtR(tif, module,
    1293             :                         "The JPEG strip/tile is encoded with progressive mode, "
    1294             :                         "which is normally not legal for JPEG-in-TIFF.\n"
    1295             :                         "libtiff should be able to decode it, but it might "
    1296             :                         "cause compatibility issues with other readers");
    1297           2 :         sp->otherSettings.has_warned_about_progressive_mode = TRUE;
    1298             :     }
    1299             : 
    1300             :     /* In some cases, libjpeg needs to allocate a lot of memory */
    1301             :     /* http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
    1302             :      */
    1303        1784 :     if (TIFFjpeg_has_multiple_scans(sp))
    1304             :     {
    1305             :         /* In this case libjpeg will need to allocate memory or backing */
    1306             :         /* store for all coefficients */
    1307             :         /* See call to jinit_d_coef_controller() from master_selection() */
    1308             :         /* in libjpeg */
    1309             : 
    1310             :         /* 1 MB for regular libjpeg usage */
    1311           2 :         toff_t nRequiredMemory = 1024 * 1024;
    1312             : 
    1313           4 :         for (ci = 0; ci < sp->cinfo.d.num_components; ci++)
    1314             :         {
    1315           2 :             const jpeg_component_info *compptr = &(sp->cinfo.d.comp_info[ci]);
    1316           2 :             if (compptr->h_samp_factor > 0 && compptr->v_samp_factor > 0)
    1317             :             {
    1318           2 :                 nRequiredMemory +=
    1319           2 :                     (toff_t)(((compptr->width_in_blocks +
    1320           2 :                                compptr->h_samp_factor - 1) /
    1321           2 :                               compptr->h_samp_factor)) *
    1322           2 :                     ((compptr->height_in_blocks + compptr->v_samp_factor - 1) /
    1323           2 :                      compptr->v_samp_factor) *
    1324             :                     sizeof(JBLOCK);
    1325             :             }
    1326             :         }
    1327             : 
    1328           2 :         if (sp->cinfo.d.mem->max_memory_to_use > 0 &&
    1329           0 :             nRequiredMemory > (toff_t)(sp->cinfo.d.mem->max_memory_to_use) &&
    1330           0 :             getenv("LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC") == NULL)
    1331             :         {
    1332           0 :             TIFFErrorExtR(
    1333             :                 tif, module,
    1334             :                 "Reading this image would require libjpeg to allocate "
    1335             :                 "at least %" PRIu64 " bytes. "
    1336             :                 "This is disabled since above the %ld threshold. "
    1337             :                 "You may override this restriction by defining the "
    1338             :                 "LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC environment variable, "
    1339             :                 "or setting the JPEGMEM environment variable to a value "
    1340             :                 "greater "
    1341             :                 "or equal to '%" PRIu64 "M'",
    1342           0 :                 nRequiredMemory, sp->cinfo.d.mem->max_memory_to_use,
    1343           0 :                 (nRequiredMemory + 1000000u - 1u) / 1000000u);
    1344           0 :             return 0;
    1345             :         }
    1346             :     }
    1347             : 
    1348        1784 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG)
    1349             :     {
    1350             :         /* Component 0 should have expected sampling factors */
    1351        1756 :         if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
    1352        1756 :             sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling)
    1353             :         {
    1354           0 :             TIFFErrorExtR(tif, module,
    1355             :                           "Improper JPEG sampling factors %d,%d\n"
    1356             :                           "Apparently should be %" PRIu16 ",%" PRIu16 ".",
    1357           0 :                           sp->cinfo.d.comp_info[0].h_samp_factor,
    1358           0 :                           sp->cinfo.d.comp_info[0].v_samp_factor,
    1359           0 :                           sp->h_sampling, sp->v_sampling);
    1360           0 :             return (0);
    1361             :         }
    1362             :         /* Rest should have sampling factors 1,1 */
    1363        5053 :         for (ci = 1; ci < sp->cinfo.d.num_components; ci++)
    1364             :         {
    1365        3297 :             if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
    1366        3297 :                 sp->cinfo.d.comp_info[ci].v_samp_factor != 1)
    1367             :             {
    1368           0 :                 TIFFErrorExtR(tif, module, "Improper JPEG sampling factors");
    1369           0 :                 return (0);
    1370             :             }
    1371             :         }
    1372             :     }
    1373             :     else
    1374             :     {
    1375             :         /* PC 2's single component should have sampling factors 1,1 */
    1376          28 :         if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
    1377          28 :             sp->cinfo.d.comp_info[0].v_samp_factor != 1)
    1378             :         {
    1379           0 :             TIFFErrorExtR(tif, module, "Improper JPEG sampling factors");
    1380           0 :             return (0);
    1381             :         }
    1382             :     }
    1383        1784 :     downsampled_output = FALSE;
    1384        1784 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
    1385        1756 :         sp->photometric == PHOTOMETRIC_YCBCR &&
    1386        1558 :         sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
    1387             :     {
    1388             :         /* Convert YCbCr to RGB */
    1389        1558 :         sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
    1390        1558 :         sp->cinfo.d.out_color_space = JCS_RGB;
    1391             :     }
    1392             :     else
    1393             :     {
    1394             :         /* Suppress colorspace handling */
    1395         226 :         sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
    1396         226 :         sp->cinfo.d.out_color_space = JCS_UNKNOWN;
    1397         226 :         if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
    1398         198 :             (sp->h_sampling != 1 || sp->v_sampling != 1))
    1399           0 :             downsampled_output = TRUE;
    1400             :         /* XXX what about up-sampling? */
    1401             :     }
    1402        1784 :     if (downsampled_output)
    1403             :     {
    1404             :         /* Need to use raw-data interface to libjpeg */
    1405           0 :         sp->cinfo.d.raw_data_out = TRUE;
    1406             : #if JPEG_LIB_VERSION >= 70
    1407           0 :         sp->cinfo.d.do_fancy_upsampling = FALSE;
    1408             : #endif /* JPEG_LIB_VERSION >= 70 */
    1409           0 :         tif->tif_decoderow = DecodeRowError;
    1410           0 :         tif->tif_decodestrip = JPEGDecodeRaw;
    1411           0 :         tif->tif_decodetile = JPEGDecodeRaw;
    1412             :     }
    1413             :     else
    1414             :     {
    1415             :         /* Use normal interface to libjpeg */
    1416        1784 :         sp->cinfo.d.raw_data_out = FALSE;
    1417        1784 :         tif->tif_decoderow = JPEGDecode;
    1418        1784 :         tif->tif_decodestrip = JPEGDecode;
    1419        1784 :         tif->tif_decodetile = JPEGDecode;
    1420             :     }
    1421             :     /* Start JPEG decompressor */
    1422        1784 :     if (!TIFFjpeg_start_decompress(sp))
    1423           2 :         return (0);
    1424             :     /* Allocate downsampled-data buffers if needed */
    1425        1782 :     if (downsampled_output)
    1426             :     {
    1427           0 :         if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
    1428             :                                        sp->cinfo.d.num_components))
    1429           0 :             return (0);
    1430           0 :         sp->scancount = DCTSIZE; /* mark buffer empty */
    1431             :     }
    1432        1782 :     return (1);
    1433             : }
    1434             : 
    1435             : /*
    1436             :  * Decode a chunk of pixels.
    1437             :  * "Standard" case: returned data is not downsampled.
    1438             :  */
    1439             : #if !JPEG_LIB_MK1_OR_12BIT
    1440       10963 : static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
    1441             : {
    1442       10963 :     JPEGState *sp = JState(tif);
    1443             :     tmsize_t nrows;
    1444             :     (void)s;
    1445             : 
    1446             :     /*
    1447             :     ** Update available information, buffer may have been refilled
    1448             :     ** between decode requests
    1449             :     */
    1450       10963 :     sp->src.next_input_byte = (const JOCTET *)tif->tif_rawcp;
    1451       10963 :     sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
    1452             : 
    1453       10963 :     if (sp->bytesperline == 0)
    1454             :     {
    1455           0 :         memset(buf, 0, (size_t)cc);
    1456           0 :         return 0;
    1457             :     }
    1458             : 
    1459       10963 :     nrows = cc / sp->bytesperline;
    1460       10963 :     if (cc % sp->bytesperline)
    1461           0 :         TIFFWarningExtR(tif, tif->tif_name, "fractional scanline not read");
    1462             : 
    1463       10963 :     if (nrows > (tmsize_t)sp->cinfo.d.image_height)
    1464           0 :         nrows = sp->cinfo.d.image_height;
    1465             : 
    1466             :     /* data is expected to be read in multiples of a scanline */
    1467       10963 :     if (nrows)
    1468             :     {
    1469             :         do
    1470             :         {
    1471             :             /*
    1472             :              * In the libjpeg6b-9a 8bit case.  We read directly into
    1473             :              * the TIFF buffer.
    1474             :              */
    1475      109454 :             JSAMPROW bufptr = (JSAMPROW)buf;
    1476             : 
    1477      109454 :             if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
    1478             :             {
    1479           0 :                 memset(buf, 0, (size_t)cc);
    1480           0 :                 return (0);
    1481             :             }
    1482             : 
    1483      109454 :             ++tif->tif_row;
    1484      109454 :             buf += sp->bytesperline;
    1485      109454 :             cc -= sp->bytesperline;
    1486      109454 :         } while (--nrows > 0);
    1487             :     }
    1488             : 
    1489             :     /* Update information on consumed data */
    1490       10963 :     tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
    1491       10963 :     tif->tif_rawcc = sp->src.bytes_in_buffer;
    1492             : 
    1493             :     /* Close down the decompressor if we've finished the strip or tile. */
    1494       12662 :     return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
    1495        1699 :            TIFFjpeg_finish_decompress(sp);
    1496             : }
    1497             : #endif /* !JPEG_LIB_MK1_OR_12BIT */
    1498             : 
    1499             : #if JPEG_LIB_MK1_OR_12BIT
    1500           9 : /*ARGSUSED*/ static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc,
    1501             :                                    uint16_t s)
    1502             : {
    1503           9 :     JPEGState *sp = JState(tif);
    1504             :     tmsize_t nrows;
    1505             :     (void)s;
    1506             : 
    1507             :     /*
    1508             :     ** Update available information, buffer may have been refilled
    1509             :     ** between decode requests
    1510             :     */
    1511           9 :     sp->src.next_input_byte = (const JOCTET *)tif->tif_rawcp;
    1512           9 :     sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
    1513             : 
    1514           9 :     if (sp->bytesperline == 0)
    1515             :     {
    1516           0 :         memset(buf, 0, (size_t)cc);
    1517           0 :         return 0;
    1518             :     }
    1519             : 
    1520           9 :     nrows = cc / sp->bytesperline;
    1521           9 :     if (cc % sp->bytesperline)
    1522           0 :         TIFFWarningExtR(tif, tif->tif_name, "fractional scanline not read");
    1523             : 
    1524           9 :     if (nrows > (tmsize_t)sp->cinfo.d.image_height)
    1525           0 :         nrows = sp->cinfo.d.image_height;
    1526             : 
    1527             :     /* data is expected to be read in multiples of a scanline */
    1528           9 :     if (nrows)
    1529             :     {
    1530           9 :         TIFF_JSAMPROW line_work_buf = NULL;
    1531             : 
    1532             :         /*
    1533             :          * For 6B, only use temporary buffer for 12 bit imagery.
    1534             :          * For Mk1 always use it.
    1535             :          */
    1536           9 :         if (sp->cinfo.d.data_precision == 12)
    1537             :         {
    1538           9 :             line_work_buf = (TIFF_JSAMPROW)_TIFFmallocExt(
    1539           9 :                 tif, sizeof(short) * sp->cinfo.d.output_width *
    1540           9 :                          sp->cinfo.d.num_components);
    1541             :         }
    1542             : 
    1543             :         do
    1544             :         {
    1545         640 :             if (line_work_buf != NULL)
    1546             :             {
    1547             :                 /*
    1548             :                  * In the MK1 case, we always read into a 16bit
    1549             :                  * buffer, and then pack down to 12bit or 8bit.
    1550             :                  * In 6B case we only read into 16 bit buffer
    1551             :                  * for 12bit data, which we need to repack.
    1552             :                  */
    1553         640 :                 if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
    1554             :                 {
    1555           0 :                     memset(buf, 0, (size_t)cc);
    1556           0 :                     return (0);
    1557             :                 }
    1558             : 
    1559         640 :                 if (sp->cinfo.d.data_precision == 12)
    1560             :                 {
    1561         640 :                     int value_pairs = (sp->cinfo.d.output_width *
    1562         640 :                                        sp->cinfo.d.num_components) /
    1563             :                                       2;
    1564             :                     int iPair;
    1565             : 
    1566       53888 :                     for (iPair = 0; iPair < value_pairs; iPair++)
    1567             :                     {
    1568       53248 :                         unsigned char *out_ptr =
    1569       53248 :                             ((unsigned char *)buf) + iPair * 3;
    1570       53248 :                         TIFF_JSAMPLE *in_ptr = line_work_buf + iPair * 2;
    1571             : 
    1572       53248 :                         out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
    1573       53248 :                         out_ptr[1] =
    1574       53248 :                             (unsigned char)(((in_ptr[0] & 0xf) << 4) |
    1575       53248 :                                             ((in_ptr[1] & 0xf00) >> 8));
    1576       53248 :                         out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
    1577             :                     }
    1578             :                 }
    1579           0 :                 else if (sp->cinfo.d.data_precision == 8)
    1580             :                 {
    1581           0 :                     int value_count =
    1582           0 :                         (sp->cinfo.d.output_width * sp->cinfo.d.num_components);
    1583             :                     int iValue;
    1584             : 
    1585           0 :                     for (iValue = 0; iValue < value_count; iValue++)
    1586             :                     {
    1587           0 :                         ((unsigned char *)buf)[iValue] =
    1588           0 :                             line_work_buf[iValue] & 0xff;
    1589             :                     }
    1590             :                 }
    1591             :             }
    1592             : 
    1593         640 :             ++tif->tif_row;
    1594         640 :             buf += sp->bytesperline;
    1595         640 :             cc -= sp->bytesperline;
    1596         640 :         } while (--nrows > 0);
    1597             : 
    1598           9 :         if (line_work_buf != NULL)
    1599           9 :             _TIFFfreeExt(tif, line_work_buf);
    1600             :     }
    1601             : 
    1602             :     /* Update information on consumed data */
    1603           9 :     tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
    1604           9 :     tif->tif_rawcc = sp->src.bytes_in_buffer;
    1605             : 
    1606             :     /* Close down the decompressor if we've finished the strip or tile. */
    1607          18 :     return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
    1608           9 :            TIFFjpeg_finish_decompress(sp);
    1609             : }
    1610             : #endif /* JPEG_LIB_MK1_OR_12BIT */
    1611             : 
    1612           0 : /*ARGSUSED*/ static int DecodeRowError(TIFF *tif, uint8_t *buf, tmsize_t cc,
    1613             :                                        uint16_t s)
    1614             : 
    1615             : {
    1616             :     (void)buf;
    1617             :     (void)cc;
    1618             :     (void)s;
    1619             : 
    1620           0 :     TIFFErrorExtR(
    1621             :         tif, "TIFFReadScanline",
    1622             :         "scanline oriented access is not supported for downsampled JPEG "
    1623             :         "compressed images, consider enabling TIFFTAG_JPEGCOLORMODE as "
    1624             :         "JPEGCOLORMODE_RGB.");
    1625           0 :     return 0;
    1626             : }
    1627             : 
    1628             : /*
    1629             :  * Decode a chunk of pixels.
    1630             :  * Returned data is downsampled per sampling factors.
    1631             :  */
    1632           0 : /*ARGSUSED*/ static int JPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc,
    1633             :                                       uint16_t s)
    1634             : {
    1635           0 :     JPEGState *sp = JState(tif);
    1636             :     tmsize_t nrows;
    1637           0 :     TIFFDirectory *td = &tif->tif_dir;
    1638             :     (void)s;
    1639             : 
    1640           0 :     nrows = sp->cinfo.d.image_height;
    1641             :     /* For last strip, limit number of rows to its truncated height */
    1642             :     /* even if the codestream height is larger (which is not compliant, */
    1643             :     /* but that we tolerate) */
    1644           0 :     if ((uint32_t)nrows > td->td_imagelength - tif->tif_row && !isTiled(tif))
    1645           0 :         nrows = td->td_imagelength - tif->tif_row;
    1646             : 
    1647             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1648           0 :     unsigned short *tmpbuf = NULL;
    1649             : #endif
    1650             : 
    1651             :     /* data is expected to be read in multiples of a scanline */
    1652           0 :     if (nrows != 0)
    1653             :     {
    1654             : 
    1655             :         /* Cb,Cr both have sampling factors 1, so this is correct */
    1656           0 :         JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
    1657           0 :         int samples_per_clump = sp->samplesperclump;
    1658             : 
    1659             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1660           0 :         tmpbuf = _TIFFmallocExt(tif, sizeof(unsigned short) *
    1661           0 :                                          sp->cinfo.d.output_width *
    1662           0 :                                          sp->cinfo.d.num_components);
    1663           0 :         if (tmpbuf == NULL)
    1664             :         {
    1665           0 :             TIFFErrorExtR(tif, "JPEGDecodeRaw", "Out of memory");
    1666           0 :             return 0;
    1667             :         }
    1668             : #endif
    1669             : 
    1670             :         do
    1671             :         {
    1672             :             jpeg_component_info *compptr;
    1673             :             int ci, clumpoffset;
    1674             : 
    1675           0 :             if (cc < sp->bytesperline)
    1676             :             {
    1677           0 :                 TIFFErrorExtR(
    1678             :                     tif, "JPEGDecodeRaw",
    1679             :                     "application buffer not large enough for all data.");
    1680           0 :                 goto error;
    1681             :             }
    1682             : 
    1683             :             /* Reload downsampled-data buffer if needed */
    1684           0 :             if (sp->scancount >= DCTSIZE)
    1685             :             {
    1686           0 :                 int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
    1687           0 :                 if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
    1688           0 :                     goto error;
    1689           0 :                 sp->scancount = 0;
    1690             :             }
    1691             :             /*
    1692             :              * Fastest way to unseparate data is to make one pass
    1693             :              * over the scanline for each row of each component.
    1694             :              */
    1695           0 :             clumpoffset = 0; /* first sample in clump */
    1696           0 :             for (ci = 0, compptr = sp->cinfo.d.comp_info;
    1697           0 :                  ci < sp->cinfo.d.num_components; ci++, compptr++)
    1698             :             {
    1699           0 :                 int hsamp = compptr->h_samp_factor;
    1700           0 :                 int vsamp = compptr->v_samp_factor;
    1701             :                 int ypos;
    1702             : 
    1703           0 :                 for (ypos = 0; ypos < vsamp; ypos++)
    1704             :                 {
    1705           0 :                     TIFF_JSAMPLE *inptr =
    1706           0 :                         sp->ds_buffer[ci][sp->scancount * vsamp + ypos];
    1707             :                     JDIMENSION nclump;
    1708             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1709           0 :                     TIFF_JSAMPLE *outptr = (TIFF_JSAMPLE *)tmpbuf + clumpoffset;
    1710             : #else
    1711           0 :                     TIFF_JSAMPLE *outptr = (TIFF_JSAMPLE *)buf + clumpoffset;
    1712           0 :                     if (cc < (tmsize_t)(clumpoffset +
    1713           0 :                                         (tmsize_t)samples_per_clump *
    1714           0 :                                             (clumps_per_line - 1) +
    1715             :                                         hsamp))
    1716             :                     {
    1717           0 :                         TIFFErrorExtR(
    1718             :                             tif, "JPEGDecodeRaw",
    1719             :                             "application buffer not large enough for all data, "
    1720             :                             "possible subsampling issue");
    1721           0 :                         goto error;
    1722             :                     }
    1723             : #endif
    1724             : 
    1725           0 :                     if (hsamp == 1)
    1726             :                     {
    1727             :                         /* fast path for at least Cb and Cr */
    1728           0 :                         for (nclump = clumps_per_line; nclump-- > 0;)
    1729             :                         {
    1730           0 :                             outptr[0] = *inptr++;
    1731           0 :                             outptr += samples_per_clump;
    1732             :                         }
    1733             :                     }
    1734             :                     else
    1735             :                     {
    1736             :                         int xpos;
    1737             : 
    1738             :                         /* general case */
    1739           0 :                         for (nclump = clumps_per_line; nclump-- > 0;)
    1740             :                         {
    1741           0 :                             for (xpos = 0; xpos < hsamp; xpos++)
    1742           0 :                                 outptr[xpos] = *inptr++;
    1743           0 :                             outptr += samples_per_clump;
    1744             :                         }
    1745             :                     }
    1746           0 :                     clumpoffset += hsamp;
    1747             :                 }
    1748             :             }
    1749             : 
    1750             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1751             :             {
    1752           0 :                 if (sp->cinfo.d.data_precision == 8)
    1753             :                 {
    1754           0 :                     int i = 0;
    1755           0 :                     int len =
    1756           0 :                         sp->cinfo.d.output_width * sp->cinfo.d.num_components;
    1757           0 :                     for (i = 0; i < len; i++)
    1758             :                     {
    1759           0 :                         ((unsigned char *)buf)[i] = tmpbuf[i] & 0xff;
    1760             :                     }
    1761             :                 }
    1762             :                 else
    1763             :                 { /* 12-bit */
    1764           0 :                     int value_pairs = (sp->cinfo.d.output_width *
    1765           0 :                                        sp->cinfo.d.num_components) /
    1766             :                                       2;
    1767             :                     int iPair;
    1768           0 :                     for (iPair = 0; iPair < value_pairs; iPair++)
    1769             :                     {
    1770           0 :                         unsigned char *out_ptr =
    1771           0 :                             ((unsigned char *)buf) + iPair * 3;
    1772           0 :                         JSAMPLE *in_ptr = (JSAMPLE *)(tmpbuf + iPair * 2);
    1773           0 :                         out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
    1774           0 :                         out_ptr[1] =
    1775           0 :                             (unsigned char)(((in_ptr[0] & 0xf) << 4) |
    1776           0 :                                             ((in_ptr[1] & 0xf00) >> 8));
    1777           0 :                         out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
    1778             :                     }
    1779             :                 }
    1780             :             }
    1781             : #endif
    1782             : 
    1783           0 :             sp->scancount++;
    1784           0 :             tif->tif_row += sp->v_sampling;
    1785             : 
    1786           0 :             buf += sp->bytesperline;
    1787           0 :             cc -= sp->bytesperline;
    1788             : 
    1789           0 :             nrows -= sp->v_sampling;
    1790           0 :         } while (nrows > 0);
    1791             : 
    1792             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1793           0 :         _TIFFfreeExt(tif, tmpbuf);
    1794             : #endif
    1795             :     }
    1796             : 
    1797             :     /* Close down the decompressor if done. */
    1798           0 :     return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
    1799           0 :            TIFFjpeg_finish_decompress(sp);
    1800             : 
    1801           0 : error:
    1802             : #if defined(JPEG_LIB_MK1_OR_12BIT)
    1803           0 :     _TIFFfreeExt(tif, tmpbuf);
    1804             : #endif
    1805           0 :     return 0;
    1806             : }
    1807             : 
    1808             : /*
    1809             :  * JPEG Encoding.
    1810             :  */
    1811             : 
    1812        1741 : static void unsuppress_quant_table(JPEGState *sp, int tblno)
    1813             : {
    1814             :     JQUANT_TBL *qtbl;
    1815             : 
    1816        1741 :     if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
    1817        1741 :         qtbl->sent_table = FALSE;
    1818        1741 : }
    1819             : 
    1820        8292 : static void suppress_quant_table(JPEGState *sp, int tblno)
    1821             : {
    1822             :     JQUANT_TBL *qtbl;
    1823             : 
    1824        8292 :     if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
    1825        8292 :         qtbl->sent_table = TRUE;
    1826        8292 : }
    1827             : 
    1828          22 : static void unsuppress_huff_table(JPEGState *sp, int tblno)
    1829             : {
    1830             :     JHUFF_TBL *htbl;
    1831             : 
    1832          22 :     if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
    1833          22 :         htbl->sent_table = FALSE;
    1834          22 :     if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
    1835          22 :         htbl->sent_table = FALSE;
    1836          22 : }
    1837             : 
    1838        1870 : static void suppress_huff_table(JPEGState *sp, int tblno)
    1839             : {
    1840             :     JHUFF_TBL *htbl;
    1841             : 
    1842        1870 :     if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
    1843        1870 :         htbl->sent_table = TRUE;
    1844        1870 :     if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
    1845        1870 :         htbl->sent_table = TRUE;
    1846        1870 : }
    1847             : 
    1848        1179 : static int prepare_JPEGTables(TIFF *tif)
    1849             : {
    1850        1179 :     JPEGState *sp = JState(tif);
    1851             : 
    1852             :     /* Initialize quant tables for current quality setting */
    1853        1179 :     if (!TIFFjpeg_set_quality(sp, sp->otherSettings.jpegquality, FALSE))
    1854           0 :         return (0);
    1855             :     /* Mark only the tables we want for output */
    1856             :     /* NB: chrominance tables are currently used only with YCbCr */
    1857        1179 :     if (!TIFFjpeg_suppress_tables(sp, TRUE))
    1858           0 :         return (0);
    1859        1179 :     if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_QUANT)
    1860             :     {
    1861        1175 :         unsuppress_quant_table(sp, 0);
    1862        1175 :         if (sp->photometric == PHOTOMETRIC_YCBCR)
    1863         445 :             unsuppress_quant_table(sp, 1);
    1864             :     }
    1865        1179 :     if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF)
    1866             :     {
    1867          16 :         unsuppress_huff_table(sp, 0);
    1868          16 :         if (sp->photometric == PHOTOMETRIC_YCBCR)
    1869           6 :             unsuppress_huff_table(sp, 1);
    1870             :     }
    1871             :     /* Direct libjpeg output into otherSettings.jpegtables */
    1872        1179 :     if (!TIFFjpeg_tables_dest(sp, tif))
    1873           0 :         return (0);
    1874             :     /* Emit tables-only datastream */
    1875        1178 :     if (!TIFFjpeg_write_tables(sp))
    1876           0 :         return (0);
    1877             : 
    1878        1178 :     return (1);
    1879             : }
    1880             : 
    1881             : #if defined(JPEG_LIB_VERSION_MAJOR) &&                                         \
    1882             :     (JPEG_LIB_VERSION_MAJOR > 9 ||                                             \
    1883             :      (JPEG_LIB_VERSION_MAJOR == 9 && JPEG_LIB_VERSION_MINOR >= 4))
    1884             : /* This is a modified version of std_huff_tables() from jcparam.c
    1885             :  * in libjpeg-9d because it no longer initializes default Huffman
    1886             :  * tables in jpeg_set_defaults(). */
    1887             : static void TIFF_std_huff_tables(j_compress_ptr cinfo)
    1888             : {
    1889             : 
    1890             :     if (cinfo->dc_huff_tbl_ptrs[0] == NULL)
    1891             :     {
    1892             :         (void)jpeg_std_huff_table((j_common_ptr)cinfo, TRUE, 0);
    1893             :     }
    1894             :     if (cinfo->ac_huff_tbl_ptrs[0] == NULL)
    1895             :     {
    1896             :         (void)jpeg_std_huff_table((j_common_ptr)cinfo, FALSE, 0);
    1897             :     }
    1898             :     if (cinfo->dc_huff_tbl_ptrs[1] == NULL)
    1899             :     {
    1900             :         (void)jpeg_std_huff_table((j_common_ptr)cinfo, TRUE, 1);
    1901             :     }
    1902             :     if (cinfo->ac_huff_tbl_ptrs[1] == NULL)
    1903             :     {
    1904             :         (void)jpeg_std_huff_table((j_common_ptr)cinfo, FALSE, 1);
    1905             :     }
    1906             : }
    1907             : #endif
    1908             : 
    1909        3381 : static int JPEGSetupEncode(TIFF *tif)
    1910             : {
    1911        3381 :     JPEGState *sp = JState(tif);
    1912        3381 :     TIFFDirectory *td = &tif->tif_dir;
    1913             :     static const char module[] = "JPEGSetupEncode";
    1914             : 
    1915             : #if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
    1916        2201 :     if (tif->tif_dir.td_bitspersample == 12)
    1917             :     {
    1918             :         /* We pass a pointer to a copy of otherSettings, since */
    1919             :         /* TIFFReInitJPEG_12() will clear sp */
    1920        1180 :         JPEGOtherSettings savedOtherSettings = sp->otherSettings;
    1921        1180 :         return TIFFReInitJPEG_12(tif, &savedOtherSettings, COMPRESSION_JPEG, 1);
    1922             :     }
    1923             : #endif
    1924             : 
    1925        2201 :     JPEGInitializeLibJPEG(tif, FALSE);
    1926             : 
    1927        2201 :     assert(sp != NULL);
    1928        2201 :     assert(!sp->cinfo.comm.is_decompressor);
    1929             : 
    1930        2201 :     sp->photometric = td->td_photometric;
    1931             : 
    1932             :     /*
    1933             :      * Initialize all JPEG parameters to default values.
    1934             :      * Note that jpeg_set_defaults needs legal values for
    1935             :      * in_color_space and input_components.
    1936             :      */
    1937        2201 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG)
    1938             :     {
    1939        2194 :         sp->cinfo.c.input_components = td->td_samplesperpixel;
    1940        2194 :         if (sp->photometric == PHOTOMETRIC_YCBCR)
    1941             :         {
    1942         809 :             if (sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
    1943             :             {
    1944         809 :                 sp->cinfo.c.in_color_space = JCS_RGB;
    1945             :             }
    1946             :             else
    1947             :             {
    1948           0 :                 sp->cinfo.c.in_color_space = JCS_YCbCr;
    1949             :             }
    1950             :         }
    1951             :         else
    1952             :         {
    1953        1385 :             if ((td->td_photometric == PHOTOMETRIC_MINISWHITE ||
    1954        1385 :                  td->td_photometric == PHOTOMETRIC_MINISBLACK) &&
    1955         658 :                 td->td_samplesperpixel == 1)
    1956          73 :                 sp->cinfo.c.in_color_space = JCS_GRAYSCALE;
    1957        1312 :             else if (td->td_photometric == PHOTOMETRIC_RGB &&
    1958         721 :                      td->td_samplesperpixel == 3)
    1959          86 :                 sp->cinfo.c.in_color_space = JCS_RGB;
    1960        1226 :             else if (td->td_photometric == PHOTOMETRIC_SEPARATED &&
    1961           6 :                      td->td_samplesperpixel == 4)
    1962           6 :                 sp->cinfo.c.in_color_space = JCS_CMYK;
    1963             :             else
    1964        1220 :                 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
    1965             :         }
    1966             :     }
    1967             :     else
    1968             :     {
    1969           7 :         sp->cinfo.c.input_components = 1;
    1970           7 :         sp->cinfo.c.in_color_space = JCS_UNKNOWN;
    1971             :     }
    1972        2201 :     if (!TIFFjpeg_set_defaults(sp))
    1973           0 :         return (0);
    1974             : 
    1975             :     /* mozjpeg by default enables progressive JPEG, which is illegal in
    1976             :      * JPEG-in-TIFF */
    1977             :     /* So explicitly disable it. */
    1978        2201 :     if (sp->cinfo.c.num_scans != 0 &&
    1979           0 :         (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF) != 0)
    1980             :     {
    1981             :         /* it has been found that mozjpeg could create corrupt strips/tiles */
    1982             :         /* in non optimize_coding mode. */
    1983           0 :         TIFFWarningExtR(
    1984             :             tif, module,
    1985             :             "mozjpeg library likely detected. Disable emission of "
    1986             :             "Huffman tables in JpegTables tag, and use optimize_coding "
    1987             :             "to avoid potential issues");
    1988           0 :         sp->otherSettings.jpegtablesmode &= ~JPEGTABLESMODE_HUFF;
    1989             :     }
    1990        2201 :     sp->cinfo.c.num_scans = 0;
    1991        2201 :     sp->cinfo.c.scan_info = NULL;
    1992             : 
    1993             :     /* Set per-file parameters */
    1994        2201 :     switch (sp->photometric)
    1995             :     {
    1996         809 :         case PHOTOMETRIC_YCBCR:
    1997         809 :             sp->h_sampling = td->td_ycbcrsubsampling[0];
    1998         809 :             sp->v_sampling = td->td_ycbcrsubsampling[1];
    1999         809 :             if (sp->h_sampling == 0 || sp->v_sampling == 0)
    2000             :             {
    2001           0 :                 TIFFErrorExtR(tif, module,
    2002             :                               "Invalig horizontal/vertical sampling value");
    2003           0 :                 return (0);
    2004             :             }
    2005         809 :             if (td->td_bitspersample > 16)
    2006             :             {
    2007           0 :                 TIFFErrorExtR(tif, module,
    2008             :                               "BitsPerSample %" PRIu16 " not allowed for JPEG",
    2009           0 :                               td->td_bitspersample);
    2010           0 :                 return (0);
    2011             :             }
    2012             : 
    2013             :             /*
    2014             :              * A ReferenceBlackWhite field *must* be present since the
    2015             :              * default value is inappropriate for YCbCr.  Fill in the
    2016             :              * proper value if application didn't set it.
    2017             :              */
    2018             :             {
    2019             :                 float *ref;
    2020         809 :                 if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE, &ref))
    2021             :                 {
    2022             :                     float refbw[6];
    2023         446 :                     long top = 1L << td->td_bitspersample;
    2024         446 :                     refbw[0] = 0;
    2025         446 :                     refbw[1] = (float)(top - 1L);
    2026         446 :                     refbw[2] = (float)(top >> 1);
    2027         446 :                     refbw[3] = refbw[1];
    2028         446 :                     refbw[4] = refbw[2];
    2029         446 :                     refbw[5] = refbw[1];
    2030         446 :                     TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
    2031             :                 }
    2032             :             }
    2033         809 :             break;
    2034           0 :         case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
    2035             :         case PHOTOMETRIC_MASK:
    2036           0 :             TIFFErrorExtR(tif, module,
    2037             :                           "PhotometricInterpretation %" PRIu16
    2038             :                           " not allowed for JPEG",
    2039           0 :                           sp->photometric);
    2040           0 :             return (0);
    2041        1392 :         default:
    2042             :             /* TIFF 6.0 forbids subsampling of all other color spaces */
    2043        1392 :             sp->h_sampling = 1;
    2044        1392 :             sp->v_sampling = 1;
    2045        1392 :             break;
    2046             :     }
    2047             : 
    2048             :         /* Verify miscellaneous parameters */
    2049             : 
    2050             :         /*
    2051             :          * This would need work if libtiff ever supports different
    2052             :          * depths for different components, or if libjpeg ever supports
    2053             :          * run-time selection of depth.  Neither is imminent.
    2054             :          */
    2055             : #ifdef JPEG_LIB_MK1
    2056             :     /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
    2057             :     if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
    2058             : #else
    2059        2201 :     if (td->td_bitspersample != BITS_IN_JSAMPLE)
    2060             : #endif
    2061             :     {
    2062           0 :         TIFFErrorExtR(tif, module,
    2063             :                       "BitsPerSample %" PRIu16 " not allowed for JPEG",
    2064           0 :                       td->td_bitspersample);
    2065           0 :         return (0);
    2066             :     }
    2067        2201 :     sp->cinfo.c.data_precision = td->td_bitspersample;
    2068             : #ifdef JPEG_LIB_MK1
    2069             :     sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
    2070             : #endif
    2071        2201 :     if (isTiled(tif))
    2072             :     {
    2073          63 :         if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0)
    2074             :         {
    2075           0 :             TIFFErrorExtR(tif, module,
    2076             :                           "JPEG tile height must be multiple of %" PRIu32,
    2077           0 :                           (uint32_t)(sp->v_sampling * DCTSIZE));
    2078           0 :             return (0);
    2079             :         }
    2080          63 :         if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0)
    2081             :         {
    2082           0 :             TIFFErrorExtR(tif, module,
    2083             :                           "JPEG tile width must be multiple of %" PRIu32,
    2084           0 :                           (uint32_t)(sp->h_sampling * DCTSIZE));
    2085           0 :             return (0);
    2086             :         }
    2087             :     }
    2088             :     else
    2089             :     {
    2090        2138 :         if (td->td_rowsperstrip < td->td_imagelength &&
    2091          30 :             (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0)
    2092             :         {
    2093           0 :             TIFFErrorExtR(tif, module,
    2094             :                           "RowsPerStrip must be multiple of %" PRIu32
    2095             :                           " for JPEG",
    2096           0 :                           (uint32_t)(sp->v_sampling * DCTSIZE));
    2097           0 :             return (0);
    2098             :         }
    2099             :     }
    2100             : 
    2101             :     /* Create a JPEGTables field if appropriate */
    2102        2201 :     if (sp->otherSettings.jpegtablesmode &
    2103             :         (JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF))
    2104             :     {
    2105        2194 :         if (sp->otherSettings.jpegtables == NULL ||
    2106        1127 :             memcmp(sp->otherSettings.jpegtables, "\0\0\0\0\0\0\0\0\0", 8) == 0)
    2107             :         {
    2108             : #if defined(JPEG_LIB_VERSION_MAJOR) &&                                         \
    2109             :     (JPEG_LIB_VERSION_MAJOR > 9 ||                                             \
    2110             :      (JPEG_LIB_VERSION_MAJOR == 9 && JPEG_LIB_VERSION_MINOR >= 4))
    2111             :             if ((sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF) != 0 &&
    2112             :                 (sp->cinfo.c.dc_huff_tbl_ptrs[0] == NULL ||
    2113             :                  sp->cinfo.c.dc_huff_tbl_ptrs[1] == NULL ||
    2114             :                  sp->cinfo.c.ac_huff_tbl_ptrs[0] == NULL ||
    2115             :                  sp->cinfo.c.ac_huff_tbl_ptrs[1] == NULL))
    2116             :             {
    2117             :                 /* libjpeg-9d no longer initializes default Huffman tables in */
    2118             :                 /* jpeg_set_defaults() */
    2119             :                 TIFF_std_huff_tables(&sp->cinfo.c);
    2120             :             }
    2121             : #endif
    2122             : 
    2123        1179 :             if (!prepare_JPEGTables(tif))
    2124           0 :                 return (0);
    2125             :             /* Mark the field present */
    2126             :             /* Can't use TIFFSetField since BEENWRITING is already set! */
    2127        1178 :             tif->tif_flags |= TIFF_DIRTYDIRECT;
    2128        1178 :             TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
    2129             :         }
    2130             :     }
    2131             :     else
    2132             :     {
    2133             :         /* We do not support application-supplied JPEGTables, */
    2134             :         /* so mark the field not present */
    2135           7 :         TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
    2136             :     }
    2137             : 
    2138             :     /* Direct libjpeg output to libtiff's output buffer */
    2139        2200 :     TIFFjpeg_data_dest(sp, tif);
    2140             : 
    2141        2201 :     return (1);
    2142             : }
    2143             : 
    2144             : /*
    2145             :  * Set encoding state at the start of a strip or tile.
    2146             :  */
    2147        4208 : static int JPEGPreEncode(TIFF *tif, uint16_t s)
    2148             : {
    2149        4208 :     JPEGState *sp = JState(tif);
    2150        4208 :     TIFFDirectory *td = &tif->tif_dir;
    2151             :     static const char module[] = "JPEGPreEncode";
    2152             :     uint32_t segment_width, segment_height;
    2153             :     int downsampled_input;
    2154             : 
    2155        4208 :     assert(sp != NULL);
    2156             : 
    2157        4208 :     if (sp->cinfo.comm.is_decompressor == 1)
    2158             :     {
    2159           2 :         tif->tif_setupencode(tif);
    2160             :     }
    2161             : 
    2162        4208 :     assert(!sp->cinfo.comm.is_decompressor);
    2163             :     /*
    2164             :      * Set encoding parameters for this strip/tile.
    2165             :      */
    2166        4208 :     if (isTiled(tif))
    2167             :     {
    2168         516 :         segment_width = td->td_tilewidth;
    2169         516 :         segment_height = td->td_tilelength;
    2170         516 :         sp->bytesperline = TIFFTileRowSize(tif);
    2171             :     }
    2172             :     else
    2173             :     {
    2174        3692 :         segment_width = td->td_imagewidth;
    2175        3692 :         segment_height = td->td_imagelength - tif->tif_row;
    2176        3692 :         if (segment_height > td->td_rowsperstrip)
    2177        1544 :             segment_height = td->td_rowsperstrip;
    2178        3692 :         sp->bytesperline = TIFFScanlineSize(tif);
    2179             :     }
    2180        4207 :     if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0)
    2181             :     {
    2182             :         /* for PC 2, scale down the strip/tile size
    2183             :          * to match a downsampled component
    2184             :          */
    2185         221 :         if (sp->h_sampling == 0 || sp->v_sampling == 0)
    2186             :         {
    2187           0 :             TIFFErrorExtR(tif, module,
    2188             :                           "JPEG horizontal or vertical sampling is zero");
    2189           0 :             return (0);
    2190             :         }
    2191         221 :         segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
    2192         221 :         segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
    2193             :     }
    2194        4207 :     if (segment_width > (uint32_t)JPEG_MAX_DIMENSION ||
    2195             :         segment_height > (uint32_t)JPEG_MAX_DIMENSION)
    2196             :     {
    2197           0 :         TIFFErrorExtR(tif, module,
    2198             :                       "Strip/tile too large for JPEG. Maximum dimension is %d",
    2199             :                       (int)JPEG_MAX_DIMENSION);
    2200           0 :         return (0);
    2201             :     }
    2202        4207 :     sp->cinfo.c.image_width = segment_width;
    2203        4207 :     sp->cinfo.c.image_height = segment_height;
    2204        4207 :     downsampled_input = FALSE;
    2205        4207 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG)
    2206             :     {
    2207        3877 :         sp->cinfo.c.input_components = td->td_samplesperpixel;
    2208        3877 :         if (sp->photometric == PHOTOMETRIC_YCBCR)
    2209             :         {
    2210        1998 :             if (sp->otherSettings.jpegcolormode != JPEGCOLORMODE_RGB)
    2211             :             {
    2212           0 :                 if (sp->h_sampling != 1 || sp->v_sampling != 1)
    2213           0 :                     downsampled_input = TRUE;
    2214             :             }
    2215        1998 :             if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
    2216           0 :                 return (0);
    2217             :             /*
    2218             :              * Set Y sampling factors;
    2219             :              * we assume jpeg_set_colorspace() set the rest to 1
    2220             :              */
    2221        1998 :             sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
    2222        1998 :             sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
    2223             :         }
    2224             :         else
    2225             :         {
    2226        1879 :             if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space))
    2227           0 :                 return (0);
    2228             :             /* jpeg_set_colorspace set all sampling factors to 1 */
    2229             :         }
    2230             :     }
    2231             :     else
    2232             :     {
    2233         330 :         if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
    2234           0 :             return (0);
    2235         330 :         sp->cinfo.c.comp_info[0].component_id = s;
    2236             :         /* jpeg_set_colorspace() set sampling factors to 1 */
    2237         330 :         if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0)
    2238             :         {
    2239           0 :             sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
    2240           0 :             sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
    2241           0 :             sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
    2242             :         }
    2243             :     }
    2244             :     /* ensure libjpeg won't write any extraneous markers */
    2245        4207 :     sp->cinfo.c.write_JFIF_header = FALSE;
    2246        4207 :     sp->cinfo.c.write_Adobe_marker = FALSE;
    2247             :     /* set up table handling correctly */
    2248             :     /* calling TIFFjpeg_set_quality() causes quantization tables to be flagged
    2249             :      */
    2250             :     /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT
    2251             :      */
    2252             :     /* mode, so we must manually suppress them. However TIFFjpeg_set_quality()
    2253             :      */
    2254             :     /* should really be called when dealing with files with directories with */
    2255             :     /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
    2256        4207 :     if (!TIFFjpeg_set_quality(sp, sp->otherSettings.jpegquality, FALSE))
    2257           0 :         return (0);
    2258        4208 :     if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_QUANT)
    2259             :     {
    2260        4147 :         suppress_quant_table(sp, 0);
    2261        4146 :         suppress_quant_table(sp, 1);
    2262             :     }
    2263             :     else
    2264             :     {
    2265          61 :         unsuppress_quant_table(sp, 0);
    2266          61 :         unsuppress_quant_table(sp, 1);
    2267             :     }
    2268        4207 :     if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF)
    2269             :     {
    2270             :         /* Explicit suppression is only needed if we did not go through the */
    2271             :         /* prepare_JPEGTables() code path, which may be the case if updating */
    2272             :         /* an existing file */
    2273         935 :         suppress_huff_table(sp, 0);
    2274         935 :         suppress_huff_table(sp, 1);
    2275         935 :         sp->cinfo.c.optimize_coding = FALSE;
    2276             :     }
    2277             :     else
    2278        3272 :         sp->cinfo.c.optimize_coding = TRUE;
    2279        4207 :     if (downsampled_input)
    2280             :     {
    2281             :         /* Need to use raw-data interface to libjpeg */
    2282           0 :         sp->cinfo.c.raw_data_in = TRUE;
    2283           0 :         tif->tif_encoderow = JPEGEncodeRaw;
    2284           0 :         tif->tif_encodestrip = JPEGEncodeRaw;
    2285           0 :         tif->tif_encodetile = JPEGEncodeRaw;
    2286             :     }
    2287             :     else
    2288             :     {
    2289             :         /* Use normal interface to libjpeg */
    2290        4207 :         sp->cinfo.c.raw_data_in = FALSE;
    2291        4207 :         tif->tif_encoderow = JPEGEncode;
    2292        4207 :         tif->tif_encodestrip = JPEGEncode;
    2293        4207 :         tif->tif_encodetile = JPEGEncode;
    2294             :     }
    2295             :     /* Start JPEG compressor */
    2296        4207 :     if (!TIFFjpeg_start_compress(sp, FALSE))
    2297           0 :         return (0);
    2298             :     /* Allocate downsampled-data buffers if needed */
    2299        4208 :     if (downsampled_input)
    2300             :     {
    2301           0 :         if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
    2302             :                                        sp->cinfo.c.num_components))
    2303           0 :             return (0);
    2304             :     }
    2305        4208 :     sp->scancount = 0;
    2306             : 
    2307        4208 :     return (1);
    2308             : }
    2309             : 
    2310             : /*
    2311             :  * Encode a chunk of pixels.
    2312             :  * "Standard" case: incoming data is not downsampled.
    2313             :  */
    2314        8255 : static int JPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
    2315             : {
    2316        8255 :     JPEGState *sp = JState(tif);
    2317             :     tmsize_t nrows;
    2318             :     TIFF_JSAMPROW bufptr[1];
    2319        8255 :     short *line16 = NULL;
    2320        8255 :     int line16_count = 0;
    2321             : 
    2322             :     (void)s;
    2323        8255 :     assert(sp != NULL);
    2324             :     /* data is expected to be supplied in multiples of a scanline */
    2325        8255 :     nrows = cc / sp->bytesperline;
    2326        8255 :     if (cc % sp->bytesperline)
    2327           0 :         TIFFWarningExtR(tif, tif->tif_name, "fractional scanline discarded");
    2328             : 
    2329             :     /* The last strip will be limited to image size */
    2330        8255 :     if (!isTiled(tif) && tif->tif_row + nrows > tif->tif_dir.td_imagelength)
    2331           0 :         nrows = tif->tif_dir.td_imagelength - tif->tif_row;
    2332             : 
    2333        8255 :     if (sp->cinfo.c.data_precision == 12)
    2334             :     {
    2335        1181 :         line16_count = (int)((sp->bytesperline * 2) / 3);
    2336        1181 :         line16 = (short *)_TIFFmallocExt(tif, sizeof(short) * line16_count);
    2337        1181 :         if (!line16)
    2338             :         {
    2339           0 :             TIFFErrorExtR(tif, "JPEGEncode", "Failed to allocate memory");
    2340             : 
    2341           0 :             return 0;
    2342             :         }
    2343             :     }
    2344             : 
    2345      185107 :     while (nrows-- > 0)
    2346             :     {
    2347             : 
    2348      176849 :         if (sp->cinfo.c.data_precision == 12)
    2349             :         {
    2350             : 
    2351       19200 :             int value_pairs = line16_count / 2;
    2352             :             int iPair;
    2353             : 
    2354       19200 :             bufptr[0] = (TIFF_JSAMPROW)line16;
    2355             : 
    2356      495872 :             for (iPair = 0; iPair < value_pairs; iPair++)
    2357             :             {
    2358      476672 :                 unsigned char *in_ptr = ((unsigned char *)buf) + iPair * 3;
    2359      476672 :                 TIFF_JSAMPLE *out_ptr = (TIFF_JSAMPLE *)(line16 + iPair * 2);
    2360             : 
    2361      476672 :                 out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4);
    2362      476672 :                 out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2];
    2363             :             }
    2364             :         }
    2365             :         else
    2366             :         {
    2367      157649 :             bufptr[0] = (TIFF_JSAMPROW)buf;
    2368             :         }
    2369      176849 :         if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
    2370           0 :             return (0);
    2371      176852 :         if (nrows > 0)
    2372      168596 :             tif->tif_row++;
    2373      176852 :         buf += sp->bytesperline;
    2374             :     }
    2375             : 
    2376        8258 :     if (sp->cinfo.c.data_precision == 12)
    2377             :     {
    2378        1181 :         _TIFFfreeExt(tif, line16);
    2379             :     }
    2380             : 
    2381        8254 :     return (1);
    2382             : }
    2383             : 
    2384             : /*
    2385             :  * Encode a chunk of pixels.
    2386             :  * Incoming data is expected to be downsampled per sampling factors.
    2387             :  */
    2388           0 : static int JPEGEncodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
    2389             : {
    2390           0 :     JPEGState *sp = JState(tif);
    2391             :     TIFF_JSAMPLE *inptr;
    2392             :     TIFF_JSAMPLE *outptr;
    2393             :     tmsize_t nrows;
    2394             :     JDIMENSION clumps_per_line, nclump;
    2395             :     int clumpoffset, ci, xpos, ypos;
    2396             :     jpeg_component_info *compptr;
    2397           0 :     int samples_per_clump = sp->samplesperclump;
    2398             :     tmsize_t bytesperclumpline;
    2399             : 
    2400             :     (void)s;
    2401           0 :     assert(sp != NULL);
    2402             :     /* data is expected to be supplied in multiples of a clumpline */
    2403             :     /* a clumpline is equivalent to v_sampling desubsampled scanlines */
    2404             :     /* TODO: the following calculation of bytesperclumpline, should substitute
    2405             :      * calculation of sp->bytesperline, except that it is per v_sampling lines
    2406             :      */
    2407           0 :     bytesperclumpline =
    2408           0 :         ((((tmsize_t)sp->cinfo.c.image_width + sp->h_sampling - 1) /
    2409           0 :           sp->h_sampling) *
    2410           0 :              ((tmsize_t)sp->h_sampling * sp->v_sampling + 2) *
    2411           0 :              sp->cinfo.c.data_precision +
    2412             :          7) /
    2413             :         8;
    2414             : 
    2415           0 :     nrows = (cc / bytesperclumpline) * sp->v_sampling;
    2416           0 :     if (cc % bytesperclumpline)
    2417           0 :         TIFFWarningExtR(tif, tif->tif_name, "fractional scanline discarded");
    2418             : 
    2419             :     /* Cb,Cr both have sampling factors 1, so this is correct */
    2420           0 :     clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
    2421             : 
    2422           0 :     while (nrows > 0)
    2423             :     {
    2424             :         /*
    2425             :          * Fastest way to separate the data is to make one pass
    2426             :          * over the scanline for each row of each component.
    2427             :          */
    2428           0 :         clumpoffset = 0; /* first sample in clump */
    2429           0 :         for (ci = 0, compptr = sp->cinfo.c.comp_info;
    2430           0 :              ci < sp->cinfo.c.num_components; ci++, compptr++)
    2431             :         {
    2432           0 :             int hsamp = compptr->h_samp_factor;
    2433           0 :             int vsamp = compptr->v_samp_factor;
    2434           0 :             int padding = (int)(compptr->width_in_blocks * DCTSIZE -
    2435           0 :                                 clumps_per_line * hsamp);
    2436           0 :             for (ypos = 0; ypos < vsamp; ypos++)
    2437             :             {
    2438           0 :                 inptr = ((TIFF_JSAMPLE *)buf) + clumpoffset;
    2439           0 :                 outptr = sp->ds_buffer[ci][sp->scancount * vsamp + ypos];
    2440           0 :                 if (hsamp == 1)
    2441             :                 {
    2442             :                     /* fast path for at least Cb and Cr */
    2443           0 :                     for (nclump = clumps_per_line; nclump-- > 0;)
    2444             :                     {
    2445           0 :                         *outptr++ = inptr[0];
    2446           0 :                         inptr += samples_per_clump;
    2447             :                     }
    2448             :                 }
    2449             :                 else
    2450             :                 {
    2451             :                     /* general case */
    2452           0 :                     for (nclump = clumps_per_line; nclump-- > 0;)
    2453             :                     {
    2454           0 :                         for (xpos = 0; xpos < hsamp; xpos++)
    2455           0 :                             *outptr++ = inptr[xpos];
    2456           0 :                         inptr += samples_per_clump;
    2457             :                     }
    2458             :                 }
    2459             :                 /* pad each scanline as needed */
    2460           0 :                 for (xpos = 0; xpos < padding; xpos++)
    2461             :                 {
    2462           0 :                     *outptr = outptr[-1];
    2463           0 :                     outptr++;
    2464             :                 }
    2465           0 :                 clumpoffset += hsamp;
    2466             :             }
    2467             :         }
    2468           0 :         sp->scancount++;
    2469           0 :         if (sp->scancount >= DCTSIZE)
    2470             :         {
    2471           0 :             int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
    2472           0 :             if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
    2473           0 :                 return (0);
    2474           0 :             sp->scancount = 0;
    2475             :         }
    2476           0 :         tif->tif_row += sp->v_sampling;
    2477           0 :         buf += bytesperclumpline;
    2478           0 :         nrows -= sp->v_sampling;
    2479             :     }
    2480           0 :     return (1);
    2481             : }
    2482             : 
    2483             : /*
    2484             :  * Finish up at the end of a strip or tile.
    2485             :  */
    2486        4208 : static int JPEGPostEncode(TIFF *tif)
    2487             : {
    2488        4208 :     JPEGState *sp = JState(tif);
    2489             : 
    2490        4208 :     if (sp->scancount > 0)
    2491             :     {
    2492             :         /*
    2493             :          * Need to emit a partial bufferload of downsampled data.
    2494             :          * Pad the data vertically.
    2495             :          */
    2496             :         int ci, ypos, n;
    2497             :         jpeg_component_info *compptr;
    2498             : 
    2499           0 :         for (ci = 0, compptr = sp->cinfo.c.comp_info;
    2500           0 :              ci < sp->cinfo.c.num_components; ci++, compptr++)
    2501             :         {
    2502           0 :             int vsamp = compptr->v_samp_factor;
    2503           0 :             tmsize_t row_width =
    2504           0 :                 compptr->width_in_blocks * DCTSIZE * sizeof(JSAMPLE);
    2505           0 :             for (ypos = sp->scancount * vsamp; ypos < DCTSIZE * vsamp; ypos++)
    2506             :             {
    2507           0 :                 _TIFFmemcpy((void *)sp->ds_buffer[ci][ypos],
    2508           0 :                             (void *)sp->ds_buffer[ci][ypos - 1], row_width);
    2509             :             }
    2510             :         }
    2511           0 :         n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
    2512           0 :         if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
    2513           0 :             return (0);
    2514             :     }
    2515             : 
    2516        4208 :     return (TIFFjpeg_finish_compress(JState(tif)));
    2517             : }
    2518             : 
    2519        5380 : static void JPEGCleanup(TIFF *tif)
    2520             : {
    2521        5380 :     JPEGState *sp = JState(tif);
    2522             : 
    2523        5380 :     assert(sp != 0);
    2524             : 
    2525        5380 :     tif->tif_tagmethods.vgetfield = sp->otherSettings.vgetparent;
    2526        5380 :     tif->tif_tagmethods.vsetfield = sp->otherSettings.vsetparent;
    2527        5380 :     tif->tif_tagmethods.printdir = sp->otherSettings.printdir;
    2528        5380 :     if (sp->cinfo_initialized)
    2529        2357 :         TIFFjpeg_destroy(sp);         /* release libjpeg resources */
    2530        5381 :     if (sp->otherSettings.jpegtables) /* tag value */
    2531        5349 :         _TIFFfreeExt(tif, sp->otherSettings.jpegtables);
    2532        5381 :     _TIFFfreeExt(tif, tif->tif_data); /* release local state */
    2533        5379 :     tif->tif_data = NULL;
    2534             : 
    2535        5379 :     _TIFFSetDefaultCompressionState(tif);
    2536        5379 : }
    2537             : 
    2538        4577 : static void JPEGResetUpsampled(TIFF *tif)
    2539             : {
    2540        4577 :     JPEGState *sp = JState(tif);
    2541        4577 :     TIFFDirectory *td = &tif->tif_dir;
    2542             : 
    2543             :     /*
    2544             :      * Mark whether returned data is up-sampled or not so TIFFStripSize
    2545             :      * and TIFFTileSize return values that reflect the true amount of
    2546             :      * data.
    2547             :      */
    2548        4577 :     tif->tif_flags &= ~TIFF_UPSAMPLED;
    2549        4577 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG)
    2550             :     {
    2551        4531 :         if (td->td_photometric == PHOTOMETRIC_YCBCR &&
    2552        2787 :             sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
    2553             :         {
    2554        1232 :             tif->tif_flags |= TIFF_UPSAMPLED;
    2555             :         }
    2556             :         else
    2557             :         {
    2558             : #ifdef notdef
    2559             :             if (td->td_ycbcrsubsampling[0] != 1 ||
    2560             :                 td->td_ycbcrsubsampling[1] != 1)
    2561             :                 ; /* XXX what about up-sampling? */
    2562             : #endif
    2563             :         }
    2564             :     }
    2565             : 
    2566             :     /*
    2567             :      * Must recalculate cached tile size in case sampling state changed.
    2568             :      * Should we really be doing this now if image size isn't set?
    2569             :      */
    2570        4577 :     if (tif->tif_tilesize > 0)
    2571         640 :         tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
    2572        4577 :     if (tif->tif_scanlinesize > 0)
    2573        3757 :         tif->tif_scanlinesize = TIFFScanlineSize(tif);
    2574        4577 : }
    2575             : 
    2576       43976 : static int JPEGVSetField(TIFF *tif, uint32_t tag, va_list ap)
    2577             : {
    2578       43976 :     JPEGState *sp = JState(tif);
    2579             :     const TIFFField *fip;
    2580             :     uint32_t v32;
    2581             : 
    2582       43976 :     assert(sp != NULL);
    2583             : 
    2584       43976 :     switch (tag)
    2585             :     {
    2586        3107 :         case TIFFTAG_JPEGTABLES:
    2587        3107 :             v32 = (uint32_t)va_arg(ap, uint32_t);
    2588        3107 :             if (v32 == 0)
    2589             :             {
    2590             :                 /* XXX */
    2591           0 :                 return (0);
    2592             :             }
    2593        3107 :             _TIFFsetByteArrayExt(tif, &sp->otherSettings.jpegtables,
    2594        3107 :                                  va_arg(ap, void *), v32);
    2595        3107 :             sp->otherSettings.jpegtables_length = v32;
    2596        3107 :             TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
    2597        3107 :             break;
    2598        3222 :         case TIFFTAG_JPEGQUALITY:
    2599        3222 :             sp->otherSettings.jpegquality = (int)va_arg(ap, int);
    2600        3222 :             return (1); /* pseudo tag */
    2601        1277 :         case TIFFTAG_JPEGCOLORMODE:
    2602        1277 :             sp->otherSettings.jpegcolormode = (int)va_arg(ap, int);
    2603        1277 :             JPEGResetUpsampled(tif);
    2604        1277 :             return (1); /* pseudo tag */
    2605        3300 :         case TIFFTAG_PHOTOMETRIC:
    2606             :         {
    2607        3300 :             int ret_value = (*sp->otherSettings.vsetparent)(tif, tag, ap);
    2608        3300 :             JPEGResetUpsampled(tif);
    2609        3300 :             return ret_value;
    2610             :         }
    2611        3699 :         case TIFFTAG_JPEGTABLESMODE:
    2612        3699 :             sp->otherSettings.jpegtablesmode = (int)va_arg(ap, int);
    2613        3699 :             return (1); /* pseudo tag */
    2614        1430 :         case TIFFTAG_YCBCRSUBSAMPLING:
    2615             :             /* mark the fact that we have a real ycbcrsubsampling! */
    2616        1430 :             sp->otherSettings.ycbcrsampling_fetched = 1;
    2617             :             /* should we be recomputing upsampling info here? */
    2618        1430 :             return (*sp->otherSettings.vsetparent)(tif, tag, ap);
    2619       27941 :         default:
    2620       27941 :             return (*sp->otherSettings.vsetparent)(tif, tag, ap);
    2621             :     }
    2622             : 
    2623        3107 :     if ((fip = TIFFFieldWithTag(tif, tag)) != NULL)
    2624             :     {
    2625        3107 :         TIFFSetFieldBit(tif, fip->field_bit);
    2626             :     }
    2627             :     else
    2628             :     {
    2629           0 :         return (0);
    2630             :     }
    2631             : 
    2632        3107 :     tif->tif_flags |= TIFF_DIRTYDIRECT;
    2633        3107 :     return (1);
    2634             : }
    2635             : 
    2636       33352 : static int JPEGVGetField(TIFF *tif, uint32_t tag, va_list ap)
    2637             : {
    2638       33352 :     JPEGState *sp = JState(tif);
    2639             : 
    2640       33352 :     assert(sp != NULL);
    2641             : 
    2642       33352 :     switch (tag)
    2643             :     {
    2644        6973 :         case TIFFTAG_JPEGTABLES:
    2645        6973 :             *va_arg(ap, uint32_t *) = sp->otherSettings.jpegtables_length;
    2646        6973 :             *va_arg(ap, const void **) = sp->otherSettings.jpegtables;
    2647        6973 :             break;
    2648           0 :         case TIFFTAG_JPEGQUALITY:
    2649           0 :             *va_arg(ap, int *) = sp->otherSettings.jpegquality;
    2650           0 :             break;
    2651         558 :         case TIFFTAG_JPEGCOLORMODE:
    2652         558 :             *va_arg(ap, int *) = sp->otherSettings.jpegcolormode;
    2653         558 :             break;
    2654        1070 :         case TIFFTAG_JPEGTABLESMODE:
    2655        1070 :             *va_arg(ap, int *) = sp->otherSettings.jpegtablesmode;
    2656        1070 :             break;
    2657       24751 :         default:
    2658       24751 :             return (*sp->otherSettings.vgetparent)(tif, tag, ap);
    2659             :     }
    2660        8601 :     return (1);
    2661             : }
    2662             : 
    2663           0 : static void JPEGPrintDir(TIFF *tif, FILE *fd, long flags)
    2664             : {
    2665           0 :     JPEGState *sp = JState(tif);
    2666             : 
    2667           0 :     assert(sp != NULL);
    2668             :     (void)flags;
    2669             : 
    2670           0 :     if (sp != NULL)
    2671             :     {
    2672           0 :         if (TIFFFieldSet(tif, FIELD_JPEGTABLES))
    2673           0 :             fprintf(fd, "  JPEG Tables: (%" PRIu32 " bytes)\n",
    2674             :                     sp->otherSettings.jpegtables_length);
    2675           0 :         if (sp->otherSettings.printdir)
    2676           0 :             (*sp->otherSettings.printdir)(tif, fd, flags);
    2677             :     }
    2678           0 : }
    2679             : 
    2680          53 : static uint32_t JPEGDefaultStripSize(TIFF *tif, uint32_t s)
    2681             : {
    2682          53 :     JPEGState *sp = JState(tif);
    2683          53 :     TIFFDirectory *td = &tif->tif_dir;
    2684             : 
    2685          53 :     s = (*sp->otherSettings.defsparent)(tif, s);
    2686          53 :     if (s < td->td_imagelength)
    2687          36 :         s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
    2688          53 :     return (s);
    2689             : }
    2690             : 
    2691           0 : static void JPEGDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
    2692             : {
    2693           0 :     JPEGState *sp = JState(tif);
    2694           0 :     TIFFDirectory *td = &tif->tif_dir;
    2695             : 
    2696           0 :     (*sp->otherSettings.deftparent)(tif, tw, th);
    2697           0 :     *tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
    2698           0 :     *th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
    2699           0 : }
    2700             : 
    2701             : /*
    2702             :  * The JPEG library initialized used to be done in TIFFInitJPEG(), but
    2703             :  * now that we allow a TIFF file to be opened in update mode it is necessary
    2704             :  * to have some way of deciding whether compression or decompression is
    2705             :  * desired other than looking at tif->tif_mode.  We accomplish this by
    2706             :  * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
    2707             :  * If so, we assume decompression is desired.
    2708             :  *
    2709             :  * This is tricky, because TIFFInitJPEG() is called while the directory is
    2710             :  * being read, and generally speaking the BYTECOUNTS tag won't have been read
    2711             :  * at that point.  So we try to defer jpeg library initialization till we
    2712             :  * do have that tag ... basically any access that might require the compressor
    2713             :  * or decompressor that occurs after the reading of the directory.
    2714             :  *
    2715             :  * In an ideal world compressors or decompressors would be setup
    2716             :  * at the point where a single tile or strip was accessed (for read or write)
    2717             :  * so that stuff like update of missing tiles, or replacement of tiles could
    2718             :  * be done. However, we aren't trying to crack that nut just yet ...
    2719             :  *
    2720             :  * NFW, Feb 3rd, 2003.
    2721             :  */
    2722             : 
    2723        2374 : static int JPEGInitializeLibJPEG(TIFF *tif, int decompress)
    2724             : {
    2725        2374 :     JPEGState *sp = JState(tif);
    2726             : 
    2727        2374 :     if (sp->cinfo_initialized)
    2728             :     {
    2729          16 :         if (!decompress && sp->cinfo.comm.is_decompressor)
    2730           2 :             TIFFjpeg_destroy(sp);
    2731          14 :         else if (decompress && !sp->cinfo.comm.is_decompressor)
    2732          14 :             TIFFjpeg_destroy(sp);
    2733             :         else
    2734           0 :             return 1;
    2735             : 
    2736          16 :         sp->cinfo_initialized = 0;
    2737             :     }
    2738             : 
    2739             :     /*
    2740             :      * Initialize libjpeg.
    2741             :      */
    2742        2374 :     if (decompress)
    2743             :     {
    2744         173 :         if (!TIFFjpeg_create_decompress(sp))
    2745           0 :             return (0);
    2746             :     }
    2747             :     else
    2748             :     {
    2749        2201 :         if (!TIFFjpeg_create_compress(sp))
    2750           0 :             return (0);
    2751             : #ifndef TIFF_JPEG_MAX_MEMORY_TO_USE
    2752             : #define TIFF_JPEG_MAX_MEMORY_TO_USE (10 * 1024 * 1024)
    2753             : #endif
    2754             :         /* libjpeg turbo 1.5.2 honours max_memory_to_use, but has no backing */
    2755             :         /* store implementation, so better not set max_memory_to_use ourselves.
    2756             :          */
    2757             :         /* See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/162 */
    2758        2201 :         if (sp->cinfo.c.mem->max_memory_to_use > 0)
    2759             :         {
    2760             :             /* This is to address bug related in ticket GDAL #1795. */
    2761          30 :             if (getenv("JPEGMEM") == NULL)
    2762             :             {
    2763             :                 /* Increase the max memory usable. This helps when creating
    2764             :                  * files */
    2765             :                 /* with "big" tile, without using libjpeg temporary files. */
    2766             :                 /* For example a 512x512 tile with 3 bands */
    2767             :                 /* requires 1.5 MB which is above libjpeg 1MB default */
    2768           0 :                 if (sp->cinfo.c.mem->max_memory_to_use <
    2769             :                     TIFF_JPEG_MAX_MEMORY_TO_USE)
    2770           0 :                     sp->cinfo.c.mem->max_memory_to_use =
    2771             :                         TIFF_JPEG_MAX_MEMORY_TO_USE;
    2772             :             }
    2773             :         }
    2774             :     }
    2775             : 
    2776        2374 :     sp->cinfo_initialized = TRUE;
    2777             : 
    2778        2374 :     return 1;
    2779             : }
    2780             : 
    2781             : /* Common to tif_jpeg.c and tif_jpeg_12.c */
    2782        6568 : static void TIFFInitJPEGCommon(TIFF *tif)
    2783             : {
    2784             :     JPEGState *sp;
    2785             : 
    2786        6568 :     sp = JState(tif);
    2787        6568 :     sp->tif = tif; /* back link */
    2788             : 
    2789             :     /* Default values for codec-specific fields */
    2790        6568 :     sp->otherSettings.jpegtables = NULL;
    2791        6568 :     sp->otherSettings.jpegtables_length = 0;
    2792        6568 :     sp->otherSettings.jpegquality = 75; /* Default IJG quality */
    2793        6568 :     sp->otherSettings.jpegcolormode = JPEGCOLORMODE_RAW;
    2794        6568 :     sp->otherSettings.jpegtablesmode =
    2795             :         JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
    2796        6568 :     sp->otherSettings.ycbcrsampling_fetched = 0;
    2797             : 
    2798        6568 :     tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
    2799        6568 :     tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
    2800        6568 :     tif->tif_tagmethods.printdir = JPEGPrintDir;   /* hook for codec tags */
    2801             : 
    2802             :     /*
    2803             :      * Install codec methods.
    2804             :      */
    2805        6568 :     tif->tif_fixuptags = JPEGFixupTags;
    2806        6568 :     tif->tif_setupdecode = JPEGSetupDecode;
    2807        6568 :     tif->tif_predecode = JPEGPreDecode;
    2808        6568 :     tif->tif_decoderow = JPEGDecode;
    2809        6568 :     tif->tif_decodestrip = JPEGDecode;
    2810        6568 :     tif->tif_decodetile = JPEGDecode;
    2811        6568 :     tif->tif_setupencode = JPEGSetupEncode;
    2812        6568 :     tif->tif_preencode = JPEGPreEncode;
    2813        6568 :     tif->tif_postencode = JPEGPostEncode;
    2814        6568 :     tif->tif_encoderow = JPEGEncode;
    2815        6568 :     tif->tif_encodestrip = JPEGEncode;
    2816        6568 :     tif->tif_encodetile = JPEGEncode;
    2817        6568 :     tif->tif_cleanup = JPEGCleanup;
    2818             : 
    2819        6568 :     tif->tif_defstripsize = JPEGDefaultStripSize;
    2820        6568 :     tif->tif_deftilesize = JPEGDefaultTileSize;
    2821        6568 :     tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
    2822        6568 :     sp->cinfo_initialized = FALSE;
    2823        6568 : }
    2824             : 
    2825        5380 : int TIFFInitJPEG(TIFF *tif, int scheme)
    2826             : {
    2827             :     JPEGState *sp;
    2828             : 
    2829             :     (void)scheme;
    2830        5380 :     assert(scheme == COMPRESSION_JPEG);
    2831             : 
    2832             :     /*
    2833             :      * Merge codec-specific tag information.
    2834             :      */
    2835        5380 :     if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields)))
    2836             :     {
    2837           0 :         TIFFErrorExtR(tif, "TIFFInitJPEG",
    2838             :                       "Merging JPEG codec-specific tags failed");
    2839           0 :         return 0;
    2840             :     }
    2841             : 
    2842             :     /*
    2843             :      * Allocate state block so tag methods have storage to record values.
    2844             :      */
    2845        5380 :     tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(JPEGState));
    2846             : 
    2847        5380 :     if (tif->tif_data == NULL)
    2848             :     {
    2849           0 :         TIFFErrorExtR(tif, "TIFFInitJPEG", "No space for JPEG state block");
    2850           0 :         return 0;
    2851             :     }
    2852        5380 :     _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
    2853             : 
    2854        5380 :     sp = JState(tif);
    2855             :     /*
    2856             :      * Override parent get/set field methods.
    2857             :      */
    2858        5380 :     sp->otherSettings.vgetparent = tif->tif_tagmethods.vgetfield;
    2859        5380 :     sp->otherSettings.vsetparent = tif->tif_tagmethods.vsetfield;
    2860        5380 :     sp->otherSettings.printdir = tif->tif_tagmethods.printdir;
    2861             : 
    2862        5380 :     sp->otherSettings.defsparent = tif->tif_defstripsize;
    2863        5380 :     sp->otherSettings.deftparent = tif->tif_deftilesize;
    2864             : 
    2865        5380 :     TIFFInitJPEGCommon(tif);
    2866             : 
    2867             :     /*
    2868             :     ** Create a JPEGTables field if no directory has yet been created.
    2869             :     ** We do this just to ensure that sufficient space is reserved for
    2870             :     ** the JPEGTables field.  It will be properly created the right
    2871             :     ** size later.
    2872             :     */
    2873        5380 :     if (tif->tif_diroff == 0)
    2874             :     {
    2875             : #define SIZE_OF_JPEGTABLES 2000
    2876             :         /*
    2877             :         The following line assumes incorrectly that all JPEG-in-TIFF files will
    2878             :         have a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags
    2879             :         to be written when the JPEG data is placed with TIFFWriteRawStrip.  The
    2880             :         field bit should be set, anyway, later when actual JPEGTABLES header is
    2881             :         generated, so removing it here hopefully is harmless.
    2882             :         TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
    2883             :         */
    2884        2268 :         sp->otherSettings.jpegtables_length = SIZE_OF_JPEGTABLES;
    2885        2268 :         sp->otherSettings.jpegtables =
    2886        2268 :             (void *)_TIFFmallocExt(tif, sp->otherSettings.jpegtables_length);
    2887        2268 :         if (sp->otherSettings.jpegtables)
    2888             :         {
    2889        2268 :             _TIFFmemset(sp->otherSettings.jpegtables, 0, SIZE_OF_JPEGTABLES);
    2890             :         }
    2891             :         else
    2892             :         {
    2893           0 :             TIFFErrorExtR(tif, "TIFFInitJPEG",
    2894             :                           "Failed to allocate memory for JPEG tables");
    2895           0 :             return 0;
    2896             :         }
    2897             : #undef SIZE_OF_JPEGTABLES
    2898             :     }
    2899        5380 :     return 1;
    2900             : }
    2901             : #endif /* JPEG_SUPPORT */

Generated by: LCOV version 1.14