LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_jpeg.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 923 384 41.6 %
Date: 2011-12-18 Functions: 65 41 63.1 %

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

Generated by: LCOV version 1.7