| OLD | NEW |
| 1 /* $Id: tif_jpeg.c,v 1.111 2012-07-06 18:48:04 bfriesen Exp $ */ | 1 /* $Id: tif_jpeg.c,v 1.119 2015-08-15 20:13:07 bfriesen Exp $ */ |
| 2 | 2 |
| 3 /* | 3 /* |
| 4 * Copyright (c) 1994-1997 Sam Leffler | 4 * Copyright (c) 1994-1997 Sam Leffler |
| 5 * Copyright (c) 1994-1997 Silicon Graphics, Inc. | 5 * Copyright (c) 1994-1997 Silicon Graphics, Inc. |
| 6 * | 6 * |
| 7 * Permission to use, copy, modify, distribute, and sell this software and | 7 * Permission to use, copy, modify, distribute, and sell this software and |
| 8 * its documentation for any purpose is hereby granted without fee, provided | 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 | 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 | 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 | 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 | 12 * publicity relating to the software without the specific, prior written |
| 13 * permission of Sam Leffler and Silicon Graphics. | 13 * permission of Sam Leffler and Silicon Graphics. |
| 14 * | 14 * |
| 15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, | 15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, |
| 16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY | 16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY |
| 17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | 17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
| 18 * | 18 * |
| 19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR | 19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR |
| 20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, | 20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, |
| 21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 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 | 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 | 23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
| 24 * OF THIS SOFTWARE. | 24 * OF THIS SOFTWARE. |
| 25 */ | 25 */ |
| 26 |
| 26 #define WIN32_LEAN_AND_MEAN | 27 #define WIN32_LEAN_AND_MEAN |
| 27 #define VC_EXTRALEAN | 28 #define VC_EXTRALEAN |
| 28 | 29 |
| 29 #include "tiffiop.h" | 30 #include "tiffiop.h" |
| 30 #ifdef JPEG_SUPPORT | 31 #ifdef JPEG_SUPPORT |
| 31 | 32 |
| 32 /* | 33 /* |
| 33 * TIFF Library | 34 * TIFF Library |
| 34 * | 35 * |
| 35 * JPEG Compression support per TIFF Technical Note #2 | 36 * JPEG Compression support per TIFF Technical Note #2 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 way. That causes errors of the following type: | 71 way. That causes errors of the following type: |
| 71 | 72 |
| 72 "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432, | 73 "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432, |
| 73 caller expects 464" | 74 caller expects 464" |
| 74 | 75 |
| 75 For such users we wil fix the problem here. See install.doc file from | 76 For such users we wil fix the problem here. See install.doc file from |
| 76 the JPEG library distribution for details. | 77 the JPEG library distribution for details. |
| 77 */ | 78 */ |
| 78 | 79 |
| 79 /* Define "boolean" as unsigned char, not int, per Windows custom. */ | 80 /* Define "boolean" as unsigned char, not int, per Windows custom. */ |
| 80 #if defined(WIN32) && !defined(__MINGW32__) | 81 #if defined(__WIN32__) && !defined(__MINGW32__) |
| 81 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ | 82 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ |
| 82 typedef unsigned char boolean; | 83 typedef unsigned char boolean; |
| 83 # endif | 84 # endif |
| 84 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ | 85 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ |
| 85 #endif | 86 #endif |
| 86 | 87 |
| 87 #if defined(USE_SYSTEM_LIBJPEG) | 88 #if defined(USE_SYSTEM_LIBJPEG) |
| 88 #include <jerror.h> | 89 #include <jerror.h> |
| 89 #include <jpeglib.h> | 90 #include <jpeglib.h> |
| 90 #elif defined(USE_LIBJPEG_TURBO) | 91 #elif defined(USE_LIBJPEG_TURBO) |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1)) | 253 #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1)) |
| 253 | 254 |
| 254 static int | 255 static int |
| 255 TIFFjpeg_create_compress(JPEGState* sp) | 256 TIFFjpeg_create_compress(JPEGState* sp) |
| 256 { | 257 { |
| 257 /* initialize JPEG error handling */ | 258 /* initialize JPEG error handling */ |
| 258 sp->cinfo.c.err = jpeg_std_error(&sp->err); | 259 sp->cinfo.c.err = jpeg_std_error(&sp->err); |
| 259 sp->err.error_exit = TIFFjpeg_error_exit; | 260 sp->err.error_exit = TIFFjpeg_error_exit; |
| 260 sp->err.output_message = TIFFjpeg_output_message; | 261 sp->err.output_message = TIFFjpeg_output_message; |
| 261 | 262 |
| 263 /* set client_data to avoid UMR warning from tools like Purify */ |
| 264 sp->cinfo.c.client_data = NULL; |
| 265 |
| 262 return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); | 266 return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); |
| 263 } | 267 } |
| 264 | 268 |
| 265 static int | 269 static int |
| 266 TIFFjpeg_create_decompress(JPEGState* sp) | 270 TIFFjpeg_create_decompress(JPEGState* sp) |
| 267 { | 271 { |
| 268 /* initialize JPEG error handling */ | 272 /* initialize JPEG error handling */ |
| 269 sp->cinfo.d.err = jpeg_std_error(&sp->err); | 273 sp->cinfo.d.err = jpeg_std_error(&sp->err); |
| 270 sp->err.error_exit = TIFFjpeg_error_exit; | 274 sp->err.error_exit = TIFFjpeg_error_exit; |
| 271 sp->err.output_message = TIFFjpeg_output_message; | 275 sp->err.output_message = TIFFjpeg_output_message; |
| 272 | 276 |
| 277 /* set client_data to avoid UMR warning from tools like Purify */ |
| 278 sp->cinfo.d.client_data = NULL; |
| 279 |
| 273 return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); | 280 return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); |
| 274 } | 281 } |
| 275 | 282 |
| 276 static int | 283 static int |
| 277 TIFFjpeg_set_defaults(JPEGState* sp) | 284 TIFFjpeg_set_defaults(JPEGState* sp) |
| 278 { | 285 { |
| 279 return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c)); | 286 return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c)); |
| 280 } | 287 } |
| 281 | 288 |
| 282 static int | 289 static int |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 | 665 |
| 659 | 666 |
| 660 /* | 667 /* |
| 661 * JPEG Decoding. | 668 * JPEG Decoding. |
| 662 */ | 669 */ |
| 663 | 670 |
| 664 #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING | 671 #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING |
| 665 | 672 |
| 666 #define JPEG_MARKER_SOF0 0xC0 | 673 #define JPEG_MARKER_SOF0 0xC0 |
| 667 #define JPEG_MARKER_SOF1 0xC1 | 674 #define JPEG_MARKER_SOF1 0xC1 |
| 668 #define JPEG_MARKER_SOF3 0xC3 | 675 #define JPEG_MARKER_SOF2 0xC2 |
| 676 #define JPEG_MARKER_SOF9 0xC9 |
| 677 #define JPEG_MARKER_SOF10 0xCA |
| 669 #define JPEG_MARKER_DHT 0xC4 | 678 #define JPEG_MARKER_DHT 0xC4 |
| 670 #define JPEG_MARKER_SOI 0xD8 | 679 #define JPEG_MARKER_SOI 0xD8 |
| 671 #define JPEG_MARKER_SOS 0xDA | 680 #define JPEG_MARKER_SOS 0xDA |
| 672 #define JPEG_MARKER_DQT 0xDB | 681 #define JPEG_MARKER_DQT 0xDB |
| 673 #define JPEG_MARKER_DRI 0xDD | 682 #define JPEG_MARKER_DRI 0xDD |
| 674 #define JPEG_MARKER_APP0 0xE0 | 683 #define JPEG_MARKER_APP0 0xE0 |
| 675 #define JPEG_MARKER_COM 0xFE | 684 #define JPEG_MARKER_COM 0xFE |
| 676 struct JPEGFixupTagsSubsamplingData | 685 struct JPEGFixupTagsSubsamplingData |
| 677 { | 686 { |
| 678 TIFF* tif; | 687 TIFF* tif; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 * | 738 * |
| 730 * Frank Warmerdam, July 2002 | 739 * Frank Warmerdam, July 2002 |
| 731 * Joris Van Damme, May 2007 | 740 * Joris Van Damme, May 2007 |
| 732 */ | 741 */ |
| 733 static const char module[] = "JPEGFixupTagsSubsampling"; | 742 static const char module[] = "JPEGFixupTagsSubsampling"; |
| 734 struct JPEGFixupTagsSubsamplingData m; | 743 struct JPEGFixupTagsSubsamplingData m; |
| 735 | 744 |
| 736 _TIFFFillStriles( tif ); | 745 _TIFFFillStriles( tif ); |
| 737 | 746 |
| 738 if( tif->tif_dir.td_stripbytecount == NULL | 747 if( tif->tif_dir.td_stripbytecount == NULL |
| 748 || tif->tif_dir.td_stripoffset == NULL |
| 739 || tif->tif_dir.td_stripbytecount[0] == 0 ) | 749 || tif->tif_dir.td_stripbytecount[0] == 0 ) |
| 740 { | 750 { |
| 741 /* Do not even try to check if the first strip/tile does not | 751 /* Do not even try to check if the first strip/tile does not |
| 742 yet exist, as occurs when GDAL has created a new NULL file | 752 yet exist, as occurs when GDAL has created a new NULL file |
| 743 for instance. */ | 753 for instance. */ |
| 744 return; | 754 return; |
| 745 } | 755 } |
| 746 | 756 |
| 747 m.tif=tif; | 757 m.tif=tif; |
| 748 m.buffersize=2048; | 758 m.buffersize=2048; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 uint16 n; | 826 uint16 n; |
| 817 if (!JPEGFixupTagsSubsamplingReadWord(da
ta,&n)) | 827 if (!JPEGFixupTagsSubsamplingReadWord(da
ta,&n)) |
| 818 return(0); | 828 return(0); |
| 819 if (n<2) | 829 if (n<2) |
| 820 return(0); | 830 return(0); |
| 821 n-=2; | 831 n-=2; |
| 822 if (n>0) | 832 if (n>0) |
| 823 JPEGFixupTagsSubsamplingSkip(dat
a,n); | 833 JPEGFixupTagsSubsamplingSkip(dat
a,n); |
| 824 } | 834 } |
| 825 break; | 835 break; |
| 826 » » » case JPEG_MARKER_SOF0: | 836 » » » case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */ |
| 827 » » » case JPEG_MARKER_SOF1: | 837 » » » case JPEG_MARKER_SOF1: /* Extended sequential Huffman */ |
| 838 » » » case JPEG_MARKER_SOF2: /* Progressive Huffman: normally
not allowed by TechNote, but that doesn't hurt supporting it */ |
| 839 » » » case JPEG_MARKER_SOF9: /* Extended sequential arithmetic
*/ |
| 840 » » » case JPEG_MARKER_SOF10: /* Progressive arithmetic: norma
lly not allowed by TechNote, but that doesn't hurt supporting it */ |
| 828 /* this marker contains the subsampling factors
we're scanning for */ | 841 /* this marker contains the subsampling factors
we're scanning for */ |
| 829 { | 842 { |
| 830 uint16 n; | 843 uint16 n; |
| 831 uint16 o; | 844 uint16 o; |
| 832 uint8 p; | 845 uint8 p; |
| 833 uint8 ph,pv; | 846 uint8 ph,pv; |
| 834 if (!JPEGFixupTagsSubsamplingReadWord(da
ta,&n)) | 847 if (!JPEGFixupTagsSubsamplingReadWord(da
ta,&n)) |
| 835 return(0); | 848 return(0); |
| 836 if (n!=8+data->tif->tif_dir.td_samplespe
rpixel*3) | 849 if (n!=8+data->tif->tif_dir.td_samplespe
rpixel*3) |
| 837 return(0); | 850 return(0); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 | 1005 |
| 993 /* Set up for reading normal data */ | 1006 /* Set up for reading normal data */ |
| 994 TIFFjpeg_data_src(sp, tif); | 1007 TIFFjpeg_data_src(sp, tif); |
| 995 tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */ | 1008 tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */ |
| 996 return (1); | 1009 return (1); |
| 997 } | 1010 } |
| 998 | 1011 |
| 999 /* | 1012 /* |
| 1000 * Set up for decoding a strip or tile. | 1013 * Set up for decoding a strip or tile. |
| 1001 */ | 1014 */ |
| 1002 static int | 1015 /*ARGSUSED*/ static int |
| 1003 JPEGPreDecode(TIFF* tif, uint16 s) | 1016 JPEGPreDecode(TIFF* tif, uint16 s) |
| 1004 { | 1017 { |
| 1005 JPEGState *sp = JState(tif); | 1018 JPEGState *sp = JState(tif); |
| 1006 TIFFDirectory *td = &tif->tif_dir; | 1019 TIFFDirectory *td = &tif->tif_dir; |
| 1007 static const char module[] = "JPEGPreDecode"; | 1020 static const char module[] = "JPEGPreDecode"; |
| 1008 uint32 segment_width, segment_height; | 1021 uint32 segment_width, segment_height; |
| 1009 int downsampled_output; | 1022 int downsampled_output; |
| 1010 int ci; | 1023 int ci; |
| 1011 | 1024 |
| 1012 assert(sp != NULL); | 1025 assert(sp != NULL); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 return (0); | 1181 return (0); |
| 1169 sp->scancount = DCTSIZE; /* mark buffer empty */ | 1182 sp->scancount = DCTSIZE; /* mark buffer empty */ |
| 1170 } | 1183 } |
| 1171 return (1); | 1184 return (1); |
| 1172 } | 1185 } |
| 1173 | 1186 |
| 1174 /* | 1187 /* |
| 1175 * Decode a chunk of pixels. | 1188 * Decode a chunk of pixels. |
| 1176 * "Standard" case: returned data is not downsampled. | 1189 * "Standard" case: returned data is not downsampled. |
| 1177 */ | 1190 */ |
| 1178 /*ARGSUSED*/ static int | 1191 #if !JPEG_LIB_MK1_OR_12BIT |
| 1192 static int |
| 1179 JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) | 1193 JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) |
| 1180 { | 1194 { |
| 1181 JPEGState *sp = JState(tif); | 1195 JPEGState *sp = JState(tif); |
| 1182 tmsize_t nrows; | 1196 tmsize_t nrows; |
| 1183 (void) s; | 1197 (void) s; |
| 1184 | 1198 |
| 1185 /* | 1199 /* |
| 1186 ** Update available information, buffer may have been refilled | 1200 ** Update available information, buffer may have been refilled |
| 1187 ** between decode requests | 1201 ** between decode requests |
| 1188 */ | 1202 */ |
| 1189 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp; | 1203 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp; |
| 1190 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; | 1204 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; |
| 1191 | 1205 |
| 1192 if( sp->bytesperline == 0 ) | 1206 if( sp->bytesperline == 0 ) |
| 1193 return 0; | 1207 return 0; |
| 1194 | 1208 |
| 1195 nrows = cc / sp->bytesperline; | 1209 nrows = cc / sp->bytesperline; |
| 1196 if (cc % sp->bytesperline) | 1210 if (cc % sp->bytesperline) |
| 1197 » » TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional s
canline not read"); | 1211 » » TIFFWarningExt(tif->tif_clientdata, tif->tif_name, |
| 1212 "fractional scanline not read"); |
| 1198 | 1213 |
| 1199 if( nrows > (tmsize_t) sp->cinfo.d.image_height ) | 1214 if( nrows > (tmsize_t) sp->cinfo.d.image_height ) |
| 1200 nrows = sp->cinfo.d.image_height; | 1215 nrows = sp->cinfo.d.image_height; |
| 1201 | 1216 |
| 1202 /* data is expected to be read in multiples of a scanline */ | 1217 /* data is expected to be read in multiples of a scanline */ |
| 1203 if (nrows) | 1218 if (nrows) |
| 1204 » { | 1219 { |
| 1205 » » JSAMPROW line_work_buf = NULL; | 1220 do |
| 1221 { |
| 1222 /* |
| 1223 * In the libjpeg6b-9a 8bit case. We read directly into |
| 1224 * the TIFF buffer. |
| 1225 */ |
| 1226 JSAMPROW bufptr = (JSAMPROW)buf; |
| 1206 | 1227 |
| 1207 » » /* | 1228 if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) |
| 1208 » » * For 6B, only use temporary buffer for 12 bit imagery. | 1229 return (0); |
| 1209 » » * For Mk1 always use it. | |
| 1210 » » */ | |
| 1211 #if !defined(JPEG_LIB_MK1) | |
| 1212 » » if( sp->cinfo.d.data_precision == 12 ) | |
| 1213 #endif | |
| 1214 » » { | |
| 1215 » » » line_work_buf = (JSAMPROW) | |
| 1216 » » » _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width | |
| 1217 » » » * sp->cinfo.d.num_components ); | |
| 1218 » » } | |
| 1219 | 1230 |
| 1220 » » do { | 1231 ++tif->tif_row; |
| 1221 » » » if( line_work_buf != NULL ) | 1232 buf += sp->bytesperline; |
| 1222 » » » { | 1233 cc -= sp->bytesperline; |
| 1223 » » » » /* | 1234 } while (--nrows > 0); |
| 1224 » » » » * In the MK1 case, we aways read into a 16bit b
uffer, and then | 1235 } |
| 1225 » » » » * pack down to 12bit or 8bit. In 6B case we on
ly read into 16 | |
| 1226 » » » » * bit buffer for 12bit data, which we need to r
epack. | |
| 1227 » » » » */ | |
| 1228 » » » » if (TIFFjpeg_read_scanlines(sp, &line_work_buf,
1) != 1) | |
| 1229 » » » » » return (0); | |
| 1230 | |
| 1231 » » » » if( sp->cinfo.d.data_precision == 12 ) | |
| 1232 » » » » { | |
| 1233 » » » » » int value_pairs = (sp->cinfo.d.output_wi
dth | |
| 1234 » » » » » * sp->cinfo.d.num_components) / 2; | |
| 1235 » » » » » int iPair; | |
| 1236 | |
| 1237 » » » » » for( iPair = 0; iPair < value_pairs; iPa
ir++ ) | |
| 1238 » » » » » { | |
| 1239 » » » » » » unsigned char *out_ptr = | |
| 1240 » » » » » » ((unsigned char *) buf) + iP
air * 3; | |
| 1241 » » » » » » JSAMPLE *in_ptr = line_work_buf
+ iPair * 2; | |
| 1242 | |
| 1243 » » » » » » out_ptr[0] = (in_ptr[0] & 0xff0)
>> 4; | |
| 1244 » » » » » » out_ptr[1] = ((in_ptr[0] & 0xf)
<< 4) | |
| 1245 » » » » » » | ((in_ptr[1] & 0xf00) >> 8)
; | |
| 1246 » » » » » » out_ptr[2] = ((in_ptr[1] & 0xff)
>> 0); | |
| 1247 » » » » » } | |
| 1248 » » » » } | |
| 1249 » » » » else if( sp->cinfo.d.data_precision == 8 ) | |
| 1250 » » » » { | |
| 1251 » » » » » int value_count = (sp->cinfo.d.output_wi
dth | |
| 1252 » » » » » * sp->cinfo.d.num_components); | |
| 1253 » » » » » int iValue; | |
| 1254 | |
| 1255 » » » » » for( iValue = 0; iValue < value_count; i
Value++ ) | |
| 1256 » » » » » { | |
| 1257 » » » » » » ((unsigned char *) buf)[iValue]
= | |
| 1258 » » » » » » line_work_buf[iValue] & 0xff
; | |
| 1259 » » » » » } | |
| 1260 » » » » } | |
| 1261 » » » } | |
| 1262 » » » else | |
| 1263 » » » { | |
| 1264 » » » » /* | |
| 1265 » » » » * In the libjpeg6b 8bit case. We read directly
into the | |
| 1266 » » » » * TIFF buffer. | |
| 1267 » » » » */ | |
| 1268 » » » » JSAMPROW bufptr = (JSAMPROW)buf; | |
| 1269 | |
| 1270 » » » » if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1
) | |
| 1271 » » » » » return (0); | |
| 1272 » » » } | |
| 1273 | |
| 1274 » » » ++tif->tif_row; | |
| 1275 » » » buf += sp->bytesperline; | |
| 1276 » » » cc -= sp->bytesperline; | |
| 1277 » » } while (--nrows > 0); | |
| 1278 | |
| 1279 » » if( line_work_buf != NULL ) | |
| 1280 » » » _TIFFfree( line_work_buf ); | |
| 1281 » } | |
| 1282 | 1236 |
| 1283 /* Update information on consumed data */ | 1237 /* Update information on consumed data */ |
| 1284 tif->tif_rawcp = (uint8*) sp->src.next_input_byte; | 1238 tif->tif_rawcp = (uint8*) sp->src.next_input_byte; |
| 1239 tif->tif_rawcc = sp->src.bytes_in_buffer; |
| 1240 |
| 1241 /* Close down the decompressor if we've finished the strip or tile. */ |
| 1242 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height |
| 1243 || TIFFjpeg_finish_decompress(sp); |
| 1244 } |
| 1245 #endif /* !JPEG_LIB_MK1_OR_12BIT */ |
| 1246 |
| 1247 #if JPEG_LIB_MK1_OR_12BIT |
| 1248 /*ARGSUSED*/ static int |
| 1249 JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) |
| 1250 { |
| 1251 JPEGState *sp = JState(tif); |
| 1252 tmsize_t nrows; |
| 1253 (void) s; |
| 1254 |
| 1255 /* |
| 1256 ** Update available information, buffer may have been refilled |
| 1257 ** between decode requests |
| 1258 */ |
| 1259 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp; |
| 1260 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; |
| 1261 |
| 1262 if( sp->bytesperline == 0 ) |
| 1263 return 0; |
| 1264 |
| 1265 nrows = cc / sp->bytesperline; |
| 1266 if (cc % sp->bytesperline) |
| 1267 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, |
| 1268 "fractional scanline not read"); |
| 1269 |
| 1270 if( nrows > (tmsize_t) sp->cinfo.d.image_height ) |
| 1271 nrows = sp->cinfo.d.image_height; |
| 1272 |
| 1273 /* data is expected to be read in multiples of a scanline */ |
| 1274 if (nrows) |
| 1275 { |
| 1276 JSAMPROW line_work_buf = NULL; |
| 1277 |
| 1278 /* |
| 1279 * For 6B, only use temporary buffer for 12 bit imagery. |
| 1280 * For Mk1 always use it. |
| 1281 */ |
| 1282 if( sp->cinfo.d.data_precision == 12 ) |
| 1283 { |
| 1284 line_work_buf = (JSAMPROW) |
| 1285 _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_w
idth |
| 1286 * sp->cinfo.d.num_components ); |
| 1287 } |
| 1288 |
| 1289 do |
| 1290 { |
| 1291 if( line_work_buf != NULL ) |
| 1292 { |
| 1293 /* |
| 1294 * In the MK1 case, we aways read into a 16bit |
| 1295 * buffer, and then pack down to 12bit or 8bit. |
| 1296 * In 6B case we only read into 16 bit buffer |
| 1297 * for 12bit data, which we need to repack. |
| 1298 */ |
| 1299 if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1
) != 1) |
| 1300 return (0); |
| 1301 |
| 1302 if( sp->cinfo.d.data_precision == 12 ) |
| 1303 { |
| 1304 int value_pairs = (sp->cinfo.d.output_wid
th |
| 1305 * sp->cinfo.d.num_comp
onents) / 2; |
| 1306 int iPair; |
| 1307 |
| 1308 for( iPair = 0; iPair < value_pairs; iPai
r++ ) |
| 1309 { |
| 1310 unsigned char *out_ptr = |
| 1311 ((unsigned char *) buf) +
iPair * 3; |
| 1312 JSAMPLE *in_ptr = line_work_buf +
iPair * 2; |
| 1313 |
| 1314 out_ptr[0] = (in_ptr[0] & 0xff0)
>> 4; |
| 1315 out_ptr[1] = ((in_ptr[0] & 0xf) <
< 4) |
| 1316 | ((in_ptr[1] & 0xf00) >>
8); |
| 1317 out_ptr[2] = ((in_ptr[1] & 0xff)
>> 0); |
| 1318 } |
| 1319 } |
| 1320 else if( sp->cinfo.d.data_precision == 8 ) |
| 1321 { |
| 1322 int value_count = (sp->cinfo.d.output_wid
th |
| 1323 * sp->cinfo.d.num_comp
onents); |
| 1324 int iValue; |
| 1325 |
| 1326 for( iValue = 0; iValue < value_count; iV
alue++ ) |
| 1327 { |
| 1328 ((unsigned char *) buf)[iValue] = |
| 1329 line_work_buf[iValue] & 0
xff; |
| 1330 } |
| 1331 } |
| 1332 } |
| 1333 |
| 1334 ++tif->tif_row; |
| 1335 buf += sp->bytesperline; |
| 1336 cc -= sp->bytesperline; |
| 1337 } while (--nrows > 0); |
| 1338 |
| 1339 if( line_work_buf != NULL ) |
| 1340 _TIFFfree( line_work_buf ); |
| 1341 } |
| 1342 |
| 1343 /* Update information on consumed data */ |
| 1344 tif->tif_rawcp = (uint8*) sp->src.next_input_byte; |
| 1285 tif->tif_rawcc = sp->src.bytes_in_buffer; | 1345 tif->tif_rawcc = sp->src.bytes_in_buffer; |
| 1286 | 1346 |
| 1287 /* Close down the decompressor if we've finished the strip or tile. */ | 1347 /* Close down the decompressor if we've finished the strip or tile. */ |
| 1288 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height | 1348 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height |
| 1289 » || TIFFjpeg_finish_decompress(sp); | 1349 || TIFFjpeg_finish_decompress(sp); |
| 1290 } | 1350 } |
| 1351 #endif /* JPEG_LIB_MK1_OR_12BIT */ |
| 1291 | 1352 |
| 1292 /*ARGSUSED*/ static int | 1353 /*ARGSUSED*/ static int |
| 1293 DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) | 1354 DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) |
| 1294 | 1355 |
| 1295 { | 1356 { |
| 1296 (void) buf; | 1357 (void) buf; |
| 1297 (void) cc; | 1358 (void) cc; |
| 1298 (void) s; | 1359 (void) s; |
| 1299 | 1360 |
| 1300 TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline", | 1361 TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline", |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1451 static void | 1512 static void |
| 1452 unsuppress_quant_table (JPEGState* sp, int tblno) | 1513 unsuppress_quant_table (JPEGState* sp, int tblno) |
| 1453 { | 1514 { |
| 1454 JQUANT_TBL* qtbl; | 1515 JQUANT_TBL* qtbl; |
| 1455 | 1516 |
| 1456 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) | 1517 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) |
| 1457 qtbl->sent_table = FALSE; | 1518 qtbl->sent_table = FALSE; |
| 1458 } | 1519 } |
| 1459 | 1520 |
| 1460 static void | 1521 static void |
| 1522 suppress_quant_table (JPEGState* sp, int tblno) |
| 1523 { |
| 1524 JQUANT_TBL* qtbl; |
| 1525 |
| 1526 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) |
| 1527 qtbl->sent_table = TRUE; |
| 1528 } |
| 1529 |
| 1530 static void |
| 1461 unsuppress_huff_table (JPEGState* sp, int tblno) | 1531 unsuppress_huff_table (JPEGState* sp, int tblno) |
| 1462 { | 1532 { |
| 1463 JHUFF_TBL* htbl; | 1533 JHUFF_TBL* htbl; |
| 1464 | 1534 |
| 1465 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) | 1535 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) |
| 1466 htbl->sent_table = FALSE; | 1536 htbl->sent_table = FALSE; |
| 1467 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) | 1537 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) |
| 1468 htbl->sent_table = FALSE; | 1538 htbl->sent_table = FALSE; |
| 1469 } | 1539 } |
| 1470 | 1540 |
| 1541 static void |
| 1542 suppress_huff_table (JPEGState* sp, int tblno) |
| 1543 { |
| 1544 JHUFF_TBL* htbl; |
| 1545 |
| 1546 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) |
| 1547 htbl->sent_table = TRUE; |
| 1548 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) |
| 1549 htbl->sent_table = TRUE; |
| 1550 } |
| 1551 |
| 1471 static int | 1552 static int |
| 1472 prepare_JPEGTables(TIFF* tif) | 1553 prepare_JPEGTables(TIFF* tif) |
| 1473 { | 1554 { |
| 1474 JPEGState* sp = JState(tif); | 1555 JPEGState* sp = JState(tif); |
| 1475 | 1556 |
| 1476 /* Initialize quant tables for current quality setting */ | 1557 /* Initialize quant tables for current quality setting */ |
| 1477 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) | 1558 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) |
| 1478 return (0); | 1559 return (0); |
| 1479 /* Mark only the tables we want for output */ | 1560 /* Mark only the tables we want for output */ |
| 1480 /* NB: chrominance tables are currently used only with YCbCr */ | 1561 /* NB: chrominance tables are currently used only with YCbCr */ |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1510 #if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG) | 1591 #if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG) |
| 1511 if( tif->tif_dir.td_bitspersample == 12 ) | 1592 if( tif->tif_dir.td_bitspersample == 12 ) |
| 1512 return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 ); | 1593 return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 ); |
| 1513 #endif | 1594 #endif |
| 1514 | 1595 |
| 1515 JPEGInitializeLibJPEG( tif, FALSE ); | 1596 JPEGInitializeLibJPEG( tif, FALSE ); |
| 1516 | 1597 |
| 1517 assert(sp != NULL); | 1598 assert(sp != NULL); |
| 1518 assert(!sp->cinfo.comm.is_decompressor); | 1599 assert(!sp->cinfo.comm.is_decompressor); |
| 1519 | 1600 |
| 1601 sp->photometric = td->td_photometric; |
| 1602 |
| 1520 /* | 1603 /* |
| 1521 * Initialize all JPEG parameters to default values. | 1604 * Initialize all JPEG parameters to default values. |
| 1522 * Note that jpeg_set_defaults needs legal values for | 1605 * Note that jpeg_set_defaults needs legal values for |
| 1523 * in_color_space and input_components. | 1606 * in_color_space and input_components. |
| 1524 */ | 1607 */ |
| 1525 » sp->cinfo.c.in_color_space = JCS_UNKNOWN; | 1608 » if (td->td_planarconfig == PLANARCONFIG_CONTIG) { |
| 1526 » sp->cinfo.c.input_components = 1; | 1609 » » sp->cinfo.c.input_components = td->td_samplesperpixel; |
| 1610 » » if (sp->photometric == PHOTOMETRIC_YCBCR) { |
| 1611 » » » if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { |
| 1612 » » » » sp->cinfo.c.in_color_space = JCS_RGB; |
| 1613 » » » } else { |
| 1614 » » » » sp->cinfo.c.in_color_space = JCS_YCbCr; |
| 1615 » » » } |
| 1616 » » } else { |
| 1617 » » » if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td-
>td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1) |
| 1618 » » » » sp->cinfo.c.in_color_space = JCS_GRAYSCALE; |
| 1619 » » » else if (td->td_photometric == PHOTOMETRIC_RGB && td->td
_samplesperpixel == 3) |
| 1620 » » » » sp->cinfo.c.in_color_space = JCS_RGB; |
| 1621 » » » else if (td->td_photometric == PHOTOMETRIC_SEPARATED &&
td->td_samplesperpixel == 4) |
| 1622 » » » » sp->cinfo.c.in_color_space = JCS_CMYK; |
| 1623 » » » else |
| 1624 » » » » sp->cinfo.c.in_color_space = JCS_UNKNOWN; |
| 1625 » » } |
| 1626 » } else { |
| 1627 » » sp->cinfo.c.input_components = 1; |
| 1628 » » sp->cinfo.c.in_color_space = JCS_UNKNOWN; |
| 1629 » } |
| 1527 if (!TIFFjpeg_set_defaults(sp)) | 1630 if (!TIFFjpeg_set_defaults(sp)) |
| 1528 return (0); | 1631 return (0); |
| 1529 /* Set per-file parameters */ | 1632 /* Set per-file parameters */ |
| 1530 sp->photometric = td->td_photometric; | |
| 1531 switch (sp->photometric) { | 1633 switch (sp->photometric) { |
| 1532 case PHOTOMETRIC_YCBCR: | 1634 case PHOTOMETRIC_YCBCR: |
| 1533 sp->h_sampling = td->td_ycbcrsubsampling[0]; | 1635 sp->h_sampling = td->td_ycbcrsubsampling[0]; |
| 1534 sp->v_sampling = td->td_ycbcrsubsampling[1]; | 1636 sp->v_sampling = td->td_ycbcrsubsampling[1]; |
| 1535 /* | 1637 /* |
| 1536 * A ReferenceBlackWhite field *must* be present since the | 1638 * A ReferenceBlackWhite field *must* be present since the |
| 1537 * default value is inappropriate for YCbCr. Fill in the | 1639 * default value is inappropriate for YCbCr. Fill in the |
| 1538 * proper value if application didn't set it. | 1640 * proper value if application didn't set it. |
| 1539 */ | 1641 */ |
| 1540 { | 1642 { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1680 if (segment_width > 65535 || segment_height > 65535) { | 1782 if (segment_width > 65535 || segment_height > 65535) { |
| 1681 TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large
for JPEG"); | 1783 TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large
for JPEG"); |
| 1682 return (0); | 1784 return (0); |
| 1683 } | 1785 } |
| 1684 sp->cinfo.c.image_width = segment_width; | 1786 sp->cinfo.c.image_width = segment_width; |
| 1685 sp->cinfo.c.image_height = segment_height; | 1787 sp->cinfo.c.image_height = segment_height; |
| 1686 downsampled_input = FALSE; | 1788 downsampled_input = FALSE; |
| 1687 if (td->td_planarconfig == PLANARCONFIG_CONTIG) { | 1789 if (td->td_planarconfig == PLANARCONFIG_CONTIG) { |
| 1688 sp->cinfo.c.input_components = td->td_samplesperpixel; | 1790 sp->cinfo.c.input_components = td->td_samplesperpixel; |
| 1689 if (sp->photometric == PHOTOMETRIC_YCBCR) { | 1791 if (sp->photometric == PHOTOMETRIC_YCBCR) { |
| 1690 » » » if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { | 1792 » » » if (sp->jpegcolormode != JPEGCOLORMODE_RGB) { |
| 1691 » » » » sp->cinfo.c.in_color_space = JCS_RGB; | |
| 1692 » » » } else { | |
| 1693 » » » » sp->cinfo.c.in_color_space = JCS_YCbCr; | |
| 1694 if (sp->h_sampling != 1 || sp->v_sampling != 1) | 1793 if (sp->h_sampling != 1 || sp->v_sampling != 1) |
| 1695 downsampled_input = TRUE; | 1794 downsampled_input = TRUE; |
| 1696 } | 1795 } |
| 1697 if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr)) | 1796 if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr)) |
| 1698 return (0); | 1797 return (0); |
| 1699 /* | 1798 /* |
| 1700 * Set Y sampling factors; | 1799 * Set Y sampling factors; |
| 1701 * we assume jpeg_set_colorspace() set the rest to 1 | 1800 * we assume jpeg_set_colorspace() set the rest to 1 |
| 1702 */ | 1801 */ |
| 1703 sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; | 1802 sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; |
| 1704 sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; | 1803 sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; |
| 1705 } else { | 1804 } else { |
| 1706 if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td-
>td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1) | |
| 1707 sp->cinfo.c.in_color_space = JCS_GRAYSCALE; | |
| 1708 else if (td->td_photometric == PHOTOMETRIC_RGB && td->td
_samplesperpixel == 3) | |
| 1709 sp->cinfo.c.in_color_space = JCS_RGB; | |
| 1710 else if (td->td_photometric == PHOTOMETRIC_SEPARATED &&
td->td_samplesperpixel == 4) | |
| 1711 sp->cinfo.c.in_color_space = JCS_CMYK; | |
| 1712 else | |
| 1713 sp->cinfo.c.in_color_space = JCS_UNKNOWN; | |
| 1714 if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_sp
ace)) | 1805 if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_sp
ace)) |
| 1715 return (0); | 1806 return (0); |
| 1716 /* jpeg_set_colorspace set all sampling factors to 1 */ | 1807 /* jpeg_set_colorspace set all sampling factors to 1 */ |
| 1717 } | 1808 } |
| 1718 } else { | 1809 } else { |
| 1719 sp->cinfo.c.input_components = 1; | |
| 1720 sp->cinfo.c.in_color_space = JCS_UNKNOWN; | |
| 1721 if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) | 1810 if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) |
| 1722 return (0); | 1811 return (0); |
| 1723 sp->cinfo.c.comp_info[0].component_id = s; | 1812 sp->cinfo.c.comp_info[0].component_id = s; |
| 1724 /* jpeg_set_colorspace() set sampling factors to 1 */ | 1813 /* jpeg_set_colorspace() set sampling factors to 1 */ |
| 1725 if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) { | 1814 if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) { |
| 1726 sp->cinfo.c.comp_info[0].quant_tbl_no = 1; | 1815 sp->cinfo.c.comp_info[0].quant_tbl_no = 1; |
| 1727 sp->cinfo.c.comp_info[0].dc_tbl_no = 1; | 1816 sp->cinfo.c.comp_info[0].dc_tbl_no = 1; |
| 1728 sp->cinfo.c.comp_info[0].ac_tbl_no = 1; | 1817 sp->cinfo.c.comp_info[0].ac_tbl_no = 1; |
| 1729 } | 1818 } |
| 1730 } | 1819 } |
| 1731 /* ensure libjpeg won't write any extraneous markers */ | 1820 /* ensure libjpeg won't write any extraneous markers */ |
| 1732 sp->cinfo.c.write_JFIF_header = FALSE; | 1821 sp->cinfo.c.write_JFIF_header = FALSE; |
| 1733 sp->cinfo.c.write_Adobe_marker = FALSE; | 1822 sp->cinfo.c.write_Adobe_marker = FALSE; |
| 1734 /* set up table handling correctly */ | 1823 /* set up table handling correctly */ |
| 1735 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) | 1824 » /* calling TIFFjpeg_set_quality() causes quantization tables to be flagg
ed */ |
| 1825 » /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUA
NT */ |
| 1826 » /* mode, so we must manually suppress them. However TIFFjpeg_set_quality
() */ |
| 1827 » /* should really be called when dealing with files with directories with
*/ |
| 1828 » /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */ |
| 1829 » if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) |
| 1736 return (0); | 1830 return (0); |
| 1737 » if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) { | 1831 » if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { |
| 1832 » » suppress_quant_table(sp, 0); |
| 1833 » » suppress_quant_table(sp, 1); |
| 1834 » } |
| 1835 » else { |
| 1738 unsuppress_quant_table(sp, 0); | 1836 unsuppress_quant_table(sp, 0); |
| 1739 unsuppress_quant_table(sp, 1); | 1837 unsuppress_quant_table(sp, 1); |
| 1740 } | 1838 } |
| 1741 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) | 1839 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) |
| 1840 { |
| 1841 /* Explicit suppression is only needed if we did not go through
the */ |
| 1842 /* prepare_JPEGTables() code path, which may be the case if upda
ting */ |
| 1843 /* an existing file */ |
| 1844 suppress_huff_table(sp, 0); |
| 1845 suppress_huff_table(sp, 1); |
| 1742 sp->cinfo.c.optimize_coding = FALSE; | 1846 sp->cinfo.c.optimize_coding = FALSE; |
| 1847 } |
| 1743 else | 1848 else |
| 1744 sp->cinfo.c.optimize_coding = TRUE; | 1849 sp->cinfo.c.optimize_coding = TRUE; |
| 1745 if (downsampled_input) { | 1850 if (downsampled_input) { |
| 1746 /* Need to use raw-data interface to libjpeg */ | 1851 /* Need to use raw-data interface to libjpeg */ |
| 1747 sp->cinfo.c.raw_data_in = TRUE; | 1852 sp->cinfo.c.raw_data_in = TRUE; |
| 1748 tif->tif_encoderow = JPEGEncodeRaw; | 1853 tif->tif_encoderow = JPEGEncodeRaw; |
| 1749 tif->tif_encodestrip = JPEGEncodeRaw; | 1854 tif->tif_encodestrip = JPEGEncodeRaw; |
| 1750 tif->tif_encodetile = JPEGEncodeRaw; | 1855 tif->tif_encodetile = JPEGEncodeRaw; |
| 1751 } else { | 1856 } else { |
| 1752 /* Use normal interface to libjpeg */ | 1857 /* Use normal interface to libjpeg */ |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1789 if (cc % sp->bytesperline) | 1894 if (cc % sp->bytesperline) |
| 1790 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, | 1895 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, |
| 1791 "fractional scanline discarded"); | 1896 "fractional scanline discarded"); |
| 1792 | 1897 |
| 1793 /* The last strip will be limited to image size */ | 1898 /* The last strip will be limited to image size */ |
| 1794 if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength ) | 1899 if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength ) |
| 1795 nrows = tif->tif_dir.td_imagelength - tif->tif_row; | 1900 nrows = tif->tif_dir.td_imagelength - tif->tif_row; |
| 1796 | 1901 |
| 1797 if( sp->cinfo.c.data_precision == 12 ) | 1902 if( sp->cinfo.c.data_precision == 12 ) |
| 1798 { | 1903 { |
| 1799 line16_count = (int)((sp->bytesperline * 2) / 3); | 1904 line16_count = (sp->bytesperline * 2) / 3; |
| 1800 line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count); | 1905 line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count); |
| 1801 » // FIXME: undiagnosed malloc failure | 1906 if (!line16) |
| 1907 { |
| 1908 TIFFErrorExt(tif->tif_clientdata, |
| 1909 » » » "JPEGEncode", |
| 1910 "Failed to allocate memory"); |
| 1911 |
| 1912 return 0; |
| 1913 } |
| 1802 } | 1914 } |
| 1803 | 1915 |
| 1804 while (nrows-- > 0) { | 1916 while (nrows-- > 0) { |
| 1805 | 1917 |
| 1806 if( sp->cinfo.c.data_precision == 12 ) | 1918 if( sp->cinfo.c.data_precision == 12 ) |
| 1807 { | 1919 { |
| 1808 | 1920 |
| 1809 int value_pairs = line16_count / 2; | 1921 int value_pairs = line16_count / 2; |
| 1810 int iPair; | 1922 int iPair; |
| 1811 | 1923 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1966 static void | 2078 static void |
| 1967 JPEGCleanup(TIFF* tif) | 2079 JPEGCleanup(TIFF* tif) |
| 1968 { | 2080 { |
| 1969 JPEGState *sp = JState(tif); | 2081 JPEGState *sp = JState(tif); |
| 1970 | 2082 |
| 1971 assert(sp != 0); | 2083 assert(sp != 0); |
| 1972 | 2084 |
| 1973 tif->tif_tagmethods.vgetfield = sp->vgetparent; | 2085 tif->tif_tagmethods.vgetfield = sp->vgetparent; |
| 1974 tif->tif_tagmethods.vsetfield = sp->vsetparent; | 2086 tif->tif_tagmethods.vsetfield = sp->vsetparent; |
| 1975 tif->tif_tagmethods.printdir = sp->printdir; | 2087 tif->tif_tagmethods.printdir = sp->printdir; |
| 1976 | 2088 if( sp->cinfo_initialized ) |
| 1977 » if( sp != NULL ) { | 2089 TIFFjpeg_destroy(sp);» /* release libjpeg resources */ |
| 1978 » » if( sp->cinfo_initialized ) | 2090 if (sp->jpegtables)» » /* tag value */ |
| 1979 » » TIFFjpeg_destroy(sp);» /* release libjpeg resources */ | 2091 _TIFFfree(sp->jpegtables); |
| 1980 » » if (sp->jpegtables)» » /* tag value */ | |
| 1981 » » » _TIFFfree(sp->jpegtables); | |
| 1982 » } | |
| 1983 _TIFFfree(tif->tif_data); /* release local state */ | 2092 _TIFFfree(tif->tif_data); /* release local state */ |
| 1984 tif->tif_data = NULL; | 2093 tif->tif_data = NULL; |
| 1985 | 2094 |
| 1986 _TIFFSetDefaultCompressionState(tif); | 2095 _TIFFSetDefaultCompressionState(tif); |
| 1987 } | 2096 } |
| 1988 | 2097 |
| 1989 static void | 2098 static void |
| 1990 JPEGResetUpsampled( TIFF* tif ) | 2099 JPEGResetUpsampled( TIFF* tif ) |
| 1991 { | 2100 { |
| 1992 JPEGState* sp = JState(tif); | 2101 JPEGState* sp = JState(tif); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2284 /* | 2393 /* |
| 2285 The following line assumes incorrectly that all JPEG-in-TIFF files will have | 2394 The following line assumes incorrectly that all JPEG-in-TIFF files will have |
| 2286 a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written | 2395 a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written |
| 2287 when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be | 2396 when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be |
| 2288 set, anyway, later when actual JPEGTABLES header is generated, so removing it | 2397 set, anyway, later when actual JPEGTABLES header is generated, so removing it |
| 2289 here hopefully is harmless. | 2398 here hopefully is harmless. |
| 2290 TIFFSetFieldBit(tif, FIELD_JPEGTABLES); | 2399 TIFFSetFieldBit(tif, FIELD_JPEGTABLES); |
| 2291 */ | 2400 */ |
| 2292 sp->jpegtables_length = SIZE_OF_JPEGTABLES; | 2401 sp->jpegtables_length = SIZE_OF_JPEGTABLES; |
| 2293 sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length); | 2402 sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length); |
| 2294 » // FIXME: NULL-deref after malloc failure | 2403 if (sp->jpegtables) |
| 2295 » _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES); | 2404 { |
| 2405 _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES); |
| 2406 } |
| 2407 else |
| 2408 { |
| 2409 TIFFErrorExt(tif->tif_clientdata, |
| 2410 » » » "TIFFInitJPEG", |
| 2411 "Failed to allocate memory for JPEG tables"); |
| 2412 return 0; |
| 2413 } |
| 2296 #undef SIZE_OF_JPEGTABLES | 2414 #undef SIZE_OF_JPEGTABLES |
| 2297 } | 2415 } |
| 2298 | 2416 |
| 2299 return 1; | 2417 return 1; |
| 2300 } | 2418 } |
| 2301 #endif /* JPEG_SUPPORT */ | 2419 #endif /* JPEG_SUPPORT */ |
| 2302 | 2420 |
| 2303 /* vim: set ts=8 sts=8 sw=8 noet: */ | 2421 /* vim: set ts=8 sts=8 sw=8 noet: */ |
| 2304 | 2422 |
| 2305 /* | 2423 /* |
| 2306 * Local Variables: | 2424 * Local Variables: |
| 2307 * mode: c | 2425 * mode: c |
| 2308 * c-basic-offset: 8 | 2426 * c-basic-offset: 8 |
| 2309 * fill-column: 78 | 2427 * fill-column: 78 |
| 2310 * End: | 2428 * End: |
| 2311 */ | 2429 */ |
| 2312 | |
| OLD | NEW |