LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_jpeg.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 741 1192 62.2 %
Date: 2026-08-22 15:37:05 Functions: 58 78 74.4 %

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

Generated by: LCOV version 1.14