LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_jpeg.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 739 1149 64.3 %
Date: 2026-06-25 09:54:50 Functions: 58 75 77.3 %

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

Generated by: LCOV version 1.14