1 /* $Id: tif_ojpeg.c,v 1.54 2011-05-31 17:05:07 bfriesen Exp $ */
3 /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0
4 specification is now totally obsolete and deprecated for new applications and
5 images. This file was was created solely in order to read unconverted images
6 still present on some users' computer systems. It will never be extended
7 to write such files. Writing new-style JPEG compressed TIFFs is implemented
10 The code is carefully crafted to robustly read all gathered JPEG-in-TIFF
11 testfiles, and anticipate as much as possible all other... But still, it may
12 fail on some. If you encounter problems, please report them on the TIFF
13 mailing list and/or to Joris Van Damme <info@awaresystems.be>.
15 Please read the file called "TIFF Technical Note #2" if you need to be
16 convinced this compression scheme is bad and breaks TIFF. That document
17 is linked to from the LibTiff site <http://www.remotesensing.org/libtiff/>
18 and from AWare Systems' TIFF section
19 <http://www.awaresystems.be/imaging/tiff.html>. It is also absorbed
20 in Adobe's specification supplements, marked "draft" up to this day, but
21 supported by the TIFF community.
23 This file interfaces with Release 6B of the JPEG Library written by the
24 Independent JPEG Group. Previous versions of this file required a hack inside
25 the LibJpeg library. This version no longer requires that. Remember to
26 remove the hack if you update from the old version.
28 Copyright (c) Joris Van Damme <info@awaresystems.be>
29 Copyright (c) AWare Systems <http://www.awaresystems.be/>
31 The licence agreement for this file is the same as the rest of the LibTiff
34 IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR
35 ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
36 OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
37 WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
38 LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
41 Joris Van Damme and/or AWare Systems may be available for custom
42 developement. If you like what you see, and need anything similar or related,
43 contact <info@awaresystems.be>.
46 /* What is what, and what is not?
48 This decoder starts with an input stream, that is essentially the JpegInterchangeFormat
49 stream, if any, followed by the strile data, if any. This stream is read in
50 OJPEGReadByte and related functions.
52 It analyzes the start of this stream, until it encounters non-marker data, i.e.
53 compressed image data. Some of the header markers it sees have no actual content,
54 like the SOI marker, and APP/COM markers that really shouldn't even be there. Some
55 other markers do have content, and the valuable bits and pieces of information
56 in these markers are saved, checking all to verify that the stream is more or
57 less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx
60 Some OJPEG imagery contains no valid JPEG header markers. This situation is picked
61 up on if we've seen no SOF marker when we're at the start of the compressed image
62 data. In this case, the tables are read from JpegXxxTables tags, and the other
63 bits and pieces of information is initialized to its most basic value. This is
64 implemented in the OJPEGReadHeaderInfoSecTablesXxx functions.
66 When this is complete, a good and valid JPEG header can be assembled, and this is
67 passed through to LibJpeg. When that's done, the remainder of the input stream, i.e.
68 the compressed image data, can be passed through unchanged. This is done in
69 OJPEGWriteStream functions.
71 LibTiff rightly expects to know the subsampling values before decompression. Just like
72 in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling
73 tag is notoriously unreliable. To correct these tag values with the ones inside
74 the JPEG stream, the first part of the input stream is pre-scanned in
75 OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings
76 or errors, up to the point where either these values are read, or it's clear they
77 aren't there. This means that some of the data is read twice, but we feel speed
78 in correcting these values is important enough to warrant this sacrifice. Allthough
79 there is currently no define or other configuration mechanism to disable this behaviour,
80 the actual header scanning is build to robustly respond with error report if it
81 should encounter an uncorrected mismatch of subsampling values. See
82 OJPEGReadHeaderInfoSecStreamSof.
84 The restart interval and restart markers are the most tricky part... The restart
85 interval can be specified in a tag. It can also be set inside the input JPEG stream.
86 It can be used inside the input JPEG stream. If reading from strile data, we've
87 consistenly discovered the need to insert restart markers in between the different
88 striles, as is also probably the most likely interpretation of the original TIFF 6.0
89 specification. With all this setting of interval, and actual use of markers that is not
90 predictable at the time of valid JPEG header assembly, the restart thing may turn
91 out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors
92 succeed in reading back what they write, which may be the reason why we've been able
93 to discover ways that seem to work.
95 Some special provision is made for planarconfig separate OJPEG files. These seem
96 to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS,
97 and plane. This may or may not be a valid JPEG configuration, we don't know and don't
98 care. We want LibTiff to be able to access the planes individually, without huge
99 buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this
100 case, that allow us to pass a single plane such that LibJpeg sees a valid
101 single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent
102 planes, is done inside OJPEGReadSecondarySos.
104 The benefit of the scheme is... that it works, basically. We know of no other that
105 does. It works without checking software tag, or otherwise going about things in an
106 OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases
107 with and without JpegInterchangeFormat, with and without striles, with part of
108 the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving
109 and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out
112 Another nice side-effect is that a complete JPEG single valid stream is build if
113 planarconfig is not separate (vast majority). We may one day use that to build
114 converters to JPEG, and/or to new-style JPEG compression inside TIFF.
116 A dissadvantage is the lack of random access to the individual striles. This is the
117 reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode.
118 Applications would do well accessing all striles in order, as this will result in
119 a single sequential scan of the input stream, and no restarting of LibJpeg decoding
123 #define WIN32_LEAN_AND_MEAN
129 /* Configuration defines here are:
130 * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments,
131 * like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to
132 * libjpeg, with longjump stuff, are encapsulated in dedicated functions. When
133 * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external
134 * to this unit, and can be defined elsewhere to use stuff other then longjump.
135 * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators
136 * here, internally, with normal longjump.
137 * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is
138 * conviniently available, but still it may be worthwhile to use _setjmp or sigsetjmp
139 * in place of plain setjmp. These macros will make it easier. It is useless
140 * to fiddle with these if you define JPEG_ENCAP_EXTERNAL.
141 * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee
142 * instant processing, optimal streaming and optimal use of processor cache, but also big
143 * enough so as to not result in significant call overhead. It should be at least a few
144 * bytes to accomodate some structures (this is verified in asserts), but it would not be
145 * sensible to make it this small anyway, and it should be at most 64K since it is indexed
146 * with uint16. We recommend 2K.
147 * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has
148 * absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly.
151 /* define LIBJPEG_ENCAP_EXTERNAL */
152 #define SETJMP(jbuf) setjmp(jbuf)
153 #define LONGJMP(jbuf,code) longjmp(jbuf,code)
154 #define JMP_BUF jmp_buf
155 #define OJPEG_BUFFER 2048
156 /* define EGYPTIANWALK */
158 #define JPEG_MARKER_SOF0 0xC0
159 #define JPEG_MARKER_SOF1 0xC1
160 #define JPEG_MARKER_SOF3 0xC3
161 #define JPEG_MARKER_DHT 0xC4
162 #define JPEG_MARKER_RST0 0XD0
163 #define JPEG_MARKER_SOI 0xD8
164 #define JPEG_MARKER_EOI 0xD9
165 #define JPEG_MARKER_SOS 0xDA
166 #define JPEG_MARKER_DQT 0xDB
167 #define JPEG_MARKER_DRI 0xDD
168 #define JPEG_MARKER_APP0 0xE0
169 #define JPEG_MARKER_COM 0xFE
171 #define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0)
172 #define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1)
173 #define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2)
174 #define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3)
175 #define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4)
176 #define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5)
177 #define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6)
179 static const TIFFField ojpegFields[] = {
180 {TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NULL},
181 {TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength",NULL},
182 {TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables",NULL},
183 {TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables",NULL},
184 {TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables",NULL},
185 {TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL},
186 {TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval",NULL},
189 #ifndef LIBJPEG_ENCAP_EXTERNAL
193 /* We undefine FAR to avoid conflict with JPEG definition */
200 Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is
201 not defined. Unfortunately, the MinGW and Borland compilers include
202 a typedef for INT32, which causes a conflict. MSVC does not include
203 a conficting typedef given the headers which are included.
205 #if defined(__BORLANDC__) || defined(__MINGW32__)
209 /* Define "boolean" as unsigned char, not int, per Windows custom. */
210 #if defined(__WIN32__) && !defined(__MINGW32__)
211 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
212 typedef unsigned char boolean;
214 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
220 typedef struct jpeg_error_mgr jpeg_error_mgr;
221 typedef struct jpeg_common_struct jpeg_common_struct;
222 typedef struct jpeg_decompress_struct jpeg_decompress_struct;
223 typedef struct jpeg_source_mgr jpeg_source_mgr;
227 osibsJpegInterchangeFormat,
230 } OJPEGStateInBufferSource;
234 ososQTable0,ososQTable1,ososQTable2,ososQTable3,
235 ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
236 ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
243 } OJPEGStateOutState;
247 #ifndef LIBJPEG_ENCAP_EXTERNAL
250 TIFFVGetMethod vgetparent;
251 TIFFVSetMethod vsetparent;
252 TIFFPrintMethod printdir;
257 uint32 strile_length;
258 uint32 strile_length_total;
259 uint8 samples_per_pixel;
260 uint8 plane_sample_offset;
261 uint8 samples_per_pixel_per_plane;
262 uint64 jpeg_interchange_format;
263 uint64 jpeg_interchange_format_length;
265 uint8 subsamplingcorrect;
266 uint8 subsamplingcorrect_done;
267 uint8 subsampling_tag;
268 uint8 subsampling_hor;
269 uint8 subsampling_ver;
270 uint8 subsampling_force_desubsampling_inside_decompression;
271 uint8 qtable_offset_count;
272 uint8 dctable_offset_count;
273 uint8 actable_offset_count;
274 uint64 qtable_offset[3];
275 uint64 dctable_offset[3];
276 uint64 actable_offset[3];
280 uint16 restart_interval;
293 OJPEGStateInBufferSource in_buffer_source;
294 uint32 in_buffer_next_strile;
295 uint64 in_buffer_file_pos;
296 uint64 in_buffer_file_togo;
298 uint8 readheader_done;
299 uint8 writeheader_done;
300 uint16 write_cursample;
301 uint32 write_curstrile;
302 uint8 libjpeg_session_active;
303 uint8 libjpeg_jpeg_query_style;
304 jpeg_error_mgr libjpeg_jpeg_error_mgr;
305 jpeg_decompress_struct libjpeg_jpeg_decompress_struct;
306 jpeg_source_mgr libjpeg_jpeg_source_mgr;
307 uint8 subsampling_convert_log;
308 uint32 subsampling_convert_ylinelen;
309 uint32 subsampling_convert_ylines;
310 uint32 subsampling_convert_clinelen;
311 uint32 subsampling_convert_clines;
312 uint32 subsampling_convert_ybuflen;
313 uint32 subsampling_convert_cbuflen;
314 uint32 subsampling_convert_ycbcrbuflen;
315 uint8* subsampling_convert_ycbcrbuf;
316 uint8* subsampling_convert_ybuf;
317 uint8* subsampling_convert_cbbuf;
318 uint8* subsampling_convert_crbuf;
319 uint32 subsampling_convert_ycbcrimagelen;
320 uint8** subsampling_convert_ycbcrimage;
321 uint32 subsampling_convert_clinelenout;
322 uint32 subsampling_convert_state;
323 uint32 bytes_per_line; /* if the codec outputs subsampled data, a 'line' in bytes_per_line */
324 uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows */
325 OJPEGStateInBufferSource in_buffer_source;
326 uint32 in_buffer_next_strile;
327 uint32 in_buffer_strile_count;
328 uint64 in_buffer_file_pos;
329 uint8 in_buffer_file_pos_log;
330 uint64 in_buffer_file_togo;
331 uint16 in_buffer_togo;
332 uint8* in_buffer_cur;
333 uint8 in_buffer[OJPEG_BUFFER];
334 OJPEGStateOutState out_state;
335 uint8 out_buffer[OJPEG_BUFFER];
339 static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap);
340 static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap);
341 static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags);
343 static int OJPEGFixupTags(TIFF* tif);
344 static int OJPEGSetupDecode(TIFF* tif);
345 static int OJPEGPreDecode(TIFF* tif, uint16 s);
346 static int OJPEGPreDecodeSkipRaw(TIFF* tif);
347 static int OJPEGPreDecodeSkipScanlines(TIFF* tif);
348 static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
349 static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc);
350 static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc);
351 static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
352 static int OJPEGSetupEncode(TIFF* tif);
353 static int OJPEGPreEncode(TIFF* tif, uint16 s);
354 static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
355 static int OJPEGPostEncode(TIFF* tif);
356 static void OJPEGCleanup(TIFF* tif);
358 static void OJPEGSubsamplingCorrect(TIFF* tif);
359 static int OJPEGReadHeaderInfo(TIFF* tif);
360 static int OJPEGReadSecondarySos(TIFF* tif, uint16 s);
361 static int OJPEGWriteHeaderInfo(TIFF* tif);
362 static void OJPEGLibjpegSessionAbort(TIFF* tif);
364 static int OJPEGReadHeaderInfoSec(TIFF* tif);
365 static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif);
366 static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif);
367 static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif);
368 static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id);
369 static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif);
370 static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif);
371 static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif);
372 static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif);
374 static int OJPEGReadBufferFill(OJPEGState* sp);
375 static int OJPEGReadByte(OJPEGState* sp, uint8* byte);
376 static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte);
377 static void OJPEGReadByteAdvance(OJPEGState* sp);
378 static int OJPEGReadWord(OJPEGState* sp, uint16* word);
379 static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem);
380 static void OJPEGReadSkip(OJPEGState* sp, uint16 len);
382 static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len);
383 static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len);
384 static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
385 static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
386 static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
387 static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len);
388 static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len);
389 static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len);
390 static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len);
391 static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len);
392 static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len);
394 #ifdef LIBJPEG_ENCAP_EXTERNAL
395 extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
396 extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
397 extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
398 extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
399 extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
400 extern void jpeg_encap_unwind(TIFF* tif);
402 static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j);
403 static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
404 static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
405 static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
406 static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
407 static void jpeg_encap_unwind(TIFF* tif);
410 static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo);
411 static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo);
412 static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo);
413 static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo);
414 static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes);
415 static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired);
416 static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo);
419 TIFFInitOJPEG(TIFF* tif, int scheme)
421 static const char module[]="TIFFInitOJPEG";
424 assert(scheme==COMPRESSION_OJPEG);
427 * Merge codec-specific tag information.
429 if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) {
430 TIFFErrorExt(tif->tif_clientdata, module,
431 "Merging Old JPEG codec-specific tags failed");
436 sp=_TIFFmalloc(sizeof(OJPEGState));
439 TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block");
442 _TIFFmemset(sp,0,sizeof(OJPEGState));
445 sp->subsampling_hor=2;
446 sp->subsampling_ver=2;
447 TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2);
448 /* tif codec methods */
449 tif->tif_fixuptags=OJPEGFixupTags;
450 tif->tif_setupdecode=OJPEGSetupDecode;
451 tif->tif_predecode=OJPEGPreDecode;
452 tif->tif_postdecode=OJPEGPostDecode;
453 tif->tif_decoderow=OJPEGDecode;
454 tif->tif_decodestrip=OJPEGDecode;
455 tif->tif_decodetile=OJPEGDecode;
456 tif->tif_setupencode=OJPEGSetupEncode;
457 tif->tif_preencode=OJPEGPreEncode;
458 tif->tif_postencode=OJPEGPostEncode;
459 tif->tif_encoderow=OJPEGEncode;
460 tif->tif_encodestrip=OJPEGEncode;
461 tif->tif_encodetile=OJPEGEncode;
462 tif->tif_cleanup=OJPEGCleanup;
463 tif->tif_data=(uint8*)sp;
464 /* tif tag methods */
465 sp->vgetparent=tif->tif_tagmethods.vgetfield;
466 tif->tif_tagmethods.vgetfield=OJPEGVGetField;
467 sp->vsetparent=tif->tif_tagmethods.vsetfield;
468 tif->tif_tagmethods.vsetfield=OJPEGVSetField;
469 sp->printdir=tif->tif_tagmethods.printdir;
470 tif->tif_tagmethods.printdir=OJPEGPrintDir;
471 /* Some OJPEG files don't have strip or tile offsets or bytecounts tags.
472 Some others do, but have totally meaningless or corrupt values
473 in these tags. In these cases, the JpegInterchangeFormat stream is
474 reliable. In any case, this decoder reads the compressed data itself,
475 from the most reliable locations, and we need to notify encapsulating
476 LibTiff not to read raw strips or tiles for us. */
477 tif->tif_flags|=TIFF_NOREADRAW;
482 OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
484 OJPEGState* sp=(OJPEGState*)tif->tif_data;
487 case TIFFTAG_JPEGIFOFFSET:
488 *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format;
490 case TIFFTAG_JPEGIFBYTECOUNT:
491 *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_length;
493 case TIFFTAG_YCBCRSUBSAMPLING:
494 if (sp->subsamplingcorrect_done==0)
495 OJPEGSubsamplingCorrect(tif);
496 *va_arg(ap,uint16*)=(uint16)sp->subsampling_hor;
497 *va_arg(ap,uint16*)=(uint16)sp->subsampling_ver;
499 case TIFFTAG_JPEGQTABLES:
500 *va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count;
501 *va_arg(ap,void**)=(void*)sp->qtable_offset;
503 case TIFFTAG_JPEGDCTABLES:
504 *va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count;
505 *va_arg(ap,void**)=(void*)sp->dctable_offset;
507 case TIFFTAG_JPEGACTABLES:
508 *va_arg(ap,uint32*)=(uint32)sp->actable_offset_count;
509 *va_arg(ap,void**)=(void*)sp->actable_offset;
511 case TIFFTAG_JPEGPROC:
512 *va_arg(ap,uint16*)=(uint16)sp->jpeg_proc;
514 case TIFFTAG_JPEGRESTARTINTERVAL:
515 *va_arg(ap,uint16*)=sp->restart_interval;
518 return (*sp->vgetparent)(tif,tag,ap);
524 OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
526 static const char module[]="OJPEGVSetField";
527 OJPEGState* sp=(OJPEGState*)tif->tif_data;
533 case TIFFTAG_JPEGIFOFFSET:
534 sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64);
536 case TIFFTAG_JPEGIFBYTECOUNT:
537 sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uint64);
539 case TIFFTAG_YCBCRSUBSAMPLING:
540 sp->subsampling_tag=1;
541 sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap);
542 sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap);
543 tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor;
544 tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver;
546 case TIFFTAG_JPEGQTABLES:
547 ma=(uint32)va_arg(ap,uint32);
552 TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count");
555 sp->qtable_offset_count=(uint8)ma;
556 mb=(uint64*)va_arg(ap,uint64*);
558 sp->qtable_offset[n]=mb[n];
561 case TIFFTAG_JPEGDCTABLES:
562 ma=(uint32)va_arg(ap,uint32);
567 TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count");
570 sp->dctable_offset_count=(uint8)ma;
571 mb=(uint64*)va_arg(ap,uint64*);
573 sp->dctable_offset[n]=mb[n];
576 case TIFFTAG_JPEGACTABLES:
577 ma=(uint32)va_arg(ap,uint32);
582 TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count");
585 sp->actable_offset_count=(uint8)ma;
586 mb=(uint64*)va_arg(ap,uint64*);
588 sp->actable_offset[n]=mb[n];
591 case TIFFTAG_JPEGPROC:
592 sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap);
594 case TIFFTAG_JPEGRESTARTINTERVAL:
595 sp->restart_interval=(uint16)va_arg(ap,uint16_vap);
598 return (*sp->vsetparent)(tif,tag,ap);
600 TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit);
601 tif->tif_flags|=TIFF_DIRTYDIRECT;
606 OJPEGPrintDir(TIFF* tif, FILE* fd, long flags)
608 OJPEGState* sp=(OJPEGState*)tif->tif_data;
612 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
613 fprintf(fd," JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format);
614 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
615 fprintf(fd," JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length);
616 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES))
618 fprintf(fd," JpegQTables:");
619 for (m=0; m<sp->qtable_offset_count; m++)
620 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qtable_offset[m]);
623 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES))
625 fprintf(fd," JpegDcTables:");
626 for (m=0; m<sp->dctable_offset_count; m++)
627 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dctable_offset[m]);
630 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES))
632 fprintf(fd," JpegAcTables:");
633 for (m=0; m<sp->actable_offset_count; m++)
634 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->actable_offset[m]);
637 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC))
638 fprintf(fd," JpegProc: %u\n",(unsigned int)sp->jpeg_proc);
639 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL))
640 fprintf(fd," JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval);
642 (*sp->printdir)(tif, fd, flags);
646 OJPEGFixupTags(TIFF* tif)
653 OJPEGSetupDecode(TIFF* tif)
655 static const char module[]="OJPEGSetupDecode";
656 TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software");
661 OJPEGPreDecode(TIFF* tif, uint16 s)
663 OJPEGState* sp=(OJPEGState*)tif->tif_data;
665 if (sp->subsamplingcorrect_done==0)
666 OJPEGSubsamplingCorrect(tif);
667 if (sp->readheader_done==0)
669 if (OJPEGReadHeaderInfo(tif)==0)
672 if (sp->sos_end[s].log==0)
674 if (OJPEGReadSecondarySos(tif,s)==0)
681 if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m)))
683 if (sp->libjpeg_session_active!=0)
684 OJPEGLibjpegSessionAbort(tif);
685 sp->writeheader_done=0;
687 if (sp->writeheader_done==0)
689 sp->plane_sample_offset=(uint8)s;
690 sp->write_cursample=s;
691 sp->write_curstrile=s*tif->tif_dir.td_stripsperimage;
692 if ((sp->in_buffer_file_pos_log==0) ||
693 (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos))
695 sp->in_buffer_source=sp->sos_end[s].in_buffer_source;
696 sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile;
697 sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos;
698 sp->in_buffer_file_pos_log=0;
699 sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo;
700 sp->in_buffer_togo=0;
703 if (OJPEGWriteHeaderInfo(tif)==0)
706 while (sp->write_curstrile<m)
708 if (sp->libjpeg_jpeg_query_style==0)
710 if (OJPEGPreDecodeSkipRaw(tif)==0)
715 if (OJPEGPreDecodeSkipScanlines(tif)==0)
718 sp->write_curstrile++;
724 OJPEGPreDecodeSkipRaw(TIFF* tif)
726 OJPEGState* sp=(OJPEGState*)tif->tif_data;
728 m=sp->lines_per_strile;
729 if (sp->subsampling_convert_state!=0)
731 if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m)
733 sp->subsampling_convert_state+=m;
734 if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
735 sp->subsampling_convert_state=0;
738 m-=sp->subsampling_convert_clines-sp->subsampling_convert_state;
739 sp->subsampling_convert_state=0;
741 while (m>=sp->subsampling_convert_clines)
743 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
745 m-=sp->subsampling_convert_clines;
749 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
751 sp->subsampling_convert_state=m;
757 OJPEGPreDecodeSkipScanlines(TIFF* tif)
759 static const char module[]="OJPEGPreDecodeSkipScanlines";
760 OJPEGState* sp=(OJPEGState*)tif->tif_data;
762 if (sp->skip_buffer==NULL)
764 sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line);
765 if (sp->skip_buffer==NULL)
767 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
771 for (m=0; m<sp->lines_per_strile; m++)
773 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0)
780 OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
782 OJPEGState* sp=(OJPEGState*)tif->tif_data;
784 if (sp->libjpeg_jpeg_query_style==0)
786 if (OJPEGDecodeRaw(tif,buf,cc)==0)
791 if (OJPEGDecodeScanlines(tif,buf,cc)==0)
798 OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc)
800 static const char module[]="OJPEGDecodeRaw";
801 OJPEGState* sp=(OJPEGState*)tif->tif_data;
811 if (cc%sp->bytes_per_line!=0)
813 TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
821 if (sp->subsampling_convert_state==0)
823 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
826 oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen;
827 ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
828 ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
830 for (q=0; q<sp->subsampling_convert_clinelenout; q++)
833 for (sy=0; sy<sp->subsampling_ver; sy++)
835 for (sx=0; sx<sp->subsampling_hor; sx++)
837 r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor;
839 oy+=sp->subsampling_hor;
843 sp->subsampling_convert_state++;
844 if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
845 sp->subsampling_convert_state=0;
846 m+=sp->bytes_per_line;
847 n-=sp->bytes_per_line;
853 OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc)
855 static const char module[]="OJPEGDecodeScanlines";
856 OJPEGState* sp=(OJPEGState*)tif->tif_data;
859 if (cc%sp->bytes_per_line!=0)
861 TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
869 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0)
871 m+=sp->bytes_per_line;
872 n-=sp->bytes_per_line;
878 OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
880 OJPEGState* sp=(OJPEGState*)tif->tif_data;
883 sp->write_curstrile++;
884 if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0)
886 assert(sp->libjpeg_session_active!=0);
887 OJPEGLibjpegSessionAbort(tif);
888 sp->writeheader_done=0;
893 OJPEGSetupEncode(TIFF* tif)
895 static const char module[]="OJPEGSetupEncode";
896 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
901 OJPEGPreEncode(TIFF* tif, uint16 s)
903 static const char module[]="OJPEGPreEncode";
905 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
910 OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
912 static const char module[]="OJPEGEncode";
916 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
921 OJPEGPostEncode(TIFF* tif)
923 static const char module[]="OJPEGPostEncode";
924 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
929 OJPEGCleanup(TIFF* tif)
931 OJPEGState* sp=(OJPEGState*)tif->tif_data;
934 tif->tif_tagmethods.vgetfield=sp->vgetparent;
935 tif->tif_tagmethods.vsetfield=sp->vsetparent;
936 tif->tif_tagmethods.printdir=sp->printdir;
937 if (sp->qtable[0]!=0)
938 _TIFFfree(sp->qtable[0]);
939 if (sp->qtable[1]!=0)
940 _TIFFfree(sp->qtable[1]);
941 if (sp->qtable[2]!=0)
942 _TIFFfree(sp->qtable[2]);
943 if (sp->qtable[3]!=0)
944 _TIFFfree(sp->qtable[3]);
945 if (sp->dctable[0]!=0)
946 _TIFFfree(sp->dctable[0]);
947 if (sp->dctable[1]!=0)
948 _TIFFfree(sp->dctable[1]);
949 if (sp->dctable[2]!=0)
950 _TIFFfree(sp->dctable[2]);
951 if (sp->dctable[3]!=0)
952 _TIFFfree(sp->dctable[3]);
953 if (sp->actable[0]!=0)
954 _TIFFfree(sp->actable[0]);
955 if (sp->actable[1]!=0)
956 _TIFFfree(sp->actable[1]);
957 if (sp->actable[2]!=0)
958 _TIFFfree(sp->actable[2]);
959 if (sp->actable[3]!=0)
960 _TIFFfree(sp->actable[3]);
961 if (sp->libjpeg_session_active!=0)
962 OJPEGLibjpegSessionAbort(tif);
963 if (sp->subsampling_convert_ycbcrbuf!=0)
964 _TIFFfree(sp->subsampling_convert_ycbcrbuf);
965 if (sp->subsampling_convert_ycbcrimage!=0)
966 _TIFFfree(sp->subsampling_convert_ycbcrimage);
967 if (sp->skip_buffer!=0)
968 _TIFFfree(sp->skip_buffer);
971 _TIFFSetDefaultCompressionState(tif);
976 OJPEGSubsamplingCorrect(TIFF* tif)
978 static const char module[]="OJPEGSubsamplingCorrect";
979 OJPEGState* sp=(OJPEGState*)tif->tif_data;
982 _TIFFFillStriles( tif );
984 assert(sp->subsamplingcorrect_done==0);
985 if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) &&
986 (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB)))
988 if (sp->subsampling_tag!=0)
989 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel");
990 sp->subsampling_hor=1;
991 sp->subsampling_ver=1;
992 sp->subsampling_force_desubsampling_inside_decompression=0;
996 sp->subsamplingcorrect_done=1;
997 mh=sp->subsampling_hor;
998 mv=sp->subsampling_ver;
999 sp->subsamplingcorrect=1;
1000 OJPEGReadHeaderInfoSec(tif);
1001 if (sp->subsampling_force_desubsampling_inside_decompression!=0)
1003 sp->subsampling_hor=1;
1004 sp->subsampling_ver=1;
1006 sp->subsamplingcorrect=0;
1007 if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0))
1009 if (sp->subsampling_tag==0)
1010 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver);
1012 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver,mh,mv);
1014 if (sp->subsampling_force_desubsampling_inside_decompression!=0)
1016 if (sp->subsampling_tag==0)
1017 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression");
1019 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv);
1021 if (sp->subsampling_force_desubsampling_inside_decompression==0)
1023 if (sp->subsampling_hor<sp->subsampling_ver)
1024 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver);
1027 sp->subsamplingcorrect_done=1;
1031 OJPEGReadHeaderInfo(TIFF* tif)
1033 static const char module[]="OJPEGReadHeaderInfo";
1034 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1035 assert(sp->readheader_done==0);
1036 sp->image_width=tif->tif_dir.td_imagewidth;
1037 sp->image_length=tif->tif_dir.td_imagelength;
1040 sp->strile_width=tif->tif_dir.td_tilewidth;
1041 sp->strile_length=tif->tif_dir.td_tilelength;
1042 sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length;
1046 sp->strile_width=sp->image_width;
1047 sp->strile_length=tif->tif_dir.td_rowsperstrip;
1048 sp->strile_length_total=sp->image_length;
1050 if (tif->tif_dir.td_samplesperpixel==1)
1052 sp->samples_per_pixel=1;
1053 sp->plane_sample_offset=0;
1054 sp->samples_per_pixel_per_plane=sp->samples_per_pixel;
1055 sp->subsampling_hor=1;
1056 sp->subsampling_ver=1;
1060 if (tif->tif_dir.td_samplesperpixel!=3)
1062 TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel);
1065 sp->samples_per_pixel=3;
1066 sp->plane_sample_offset=0;
1067 if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)
1068 sp->samples_per_pixel_per_plane=3;
1070 sp->samples_per_pixel_per_plane=1;
1072 if (sp->strile_length<sp->image_length)
1074 if (sp->strile_length%(sp->subsampling_ver*8)!=0)
1076 TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length");
1079 sp->restart_interval=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8));
1081 if (OJPEGReadHeaderInfoSec(tif)==0)
1083 sp->sos_end[0].log=1;
1084 sp->sos_end[0].in_buffer_source=sp->in_buffer_source;
1085 sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile;
1086 sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
1087 sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
1088 sp->readheader_done=1;
1093 OJPEGReadSecondarySos(TIFF* tif, uint16 s)
1095 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1099 assert(sp->sos_end[0].log!=0);
1100 assert(sp->sos_end[s].log==0);
1101 sp->plane_sample_offset=s-1;
1102 while(sp->sos_end[sp->plane_sample_offset].log==0)
1103 sp->plane_sample_offset--;
1104 sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source;
1105 sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile;
1106 sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos;
1107 sp->in_buffer_file_pos_log=0;
1108 sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo;
1109 sp->in_buffer_togo=0;
1110 sp->in_buffer_cur=0;
1111 while(sp->plane_sample_offset<s)
1115 if (OJPEGReadByte(sp,&m)==0)
1121 if (OJPEGReadByte(sp,&m)==0)
1126 if (m==JPEG_MARKER_SOS)
1130 sp->plane_sample_offset++;
1131 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
1133 sp->sos_end[sp->plane_sample_offset].log=1;
1134 sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source;
1135 sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile;
1136 sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
1137 sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
1143 OJPEGWriteHeaderInfo(TIFF* tif)
1145 static const char module[]="OJPEGWriteHeaderInfo";
1146 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1149 assert(sp->libjpeg_session_active==0);
1150 sp->out_state=ososSoi;
1151 sp->restart_index=0;
1152 jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr));
1153 sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
1154 sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
1155 sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr);
1156 sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif;
1157 if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
1159 sp->libjpeg_session_active=1;
1160 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0;
1161 sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource;
1162 sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer;
1163 sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData;
1164 sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart;
1165 sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource;
1166 sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr);
1167 if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0)
1169 if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1))
1171 sp->libjpeg_jpeg_decompress_struct.raw_data_out=1;
1172 #if JPEG_LIB_VERSION >= 70
1173 sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE;
1175 sp->libjpeg_jpeg_query_style=0;
1176 if (sp->subsampling_convert_log==0)
1178 assert(sp->subsampling_convert_ycbcrbuf==0);
1179 assert(sp->subsampling_convert_ycbcrimage==0);
1180 sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8);
1181 sp->subsampling_convert_ylines=sp->subsampling_ver*8;
1182 sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor;
1183 sp->subsampling_convert_clines=8;
1184 sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines;
1185 sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines;
1186 sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen;
1187 sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen);
1188 if (sp->subsampling_convert_ycbcrbuf==0)
1190 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1193 sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf;
1194 sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen;
1195 sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen;
1196 sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines;
1197 sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*));
1198 if (sp->subsampling_convert_ycbcrimage==0)
1200 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1203 m=sp->subsampling_convert_ycbcrimage;
1204 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3);
1205 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines);
1206 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines);
1207 for (n=0; n<sp->subsampling_convert_ylines; n++)
1208 *m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen;
1209 for (n=0; n<sp->subsampling_convert_clines; n++)
1210 *m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen;
1211 for (n=0; n<sp->subsampling_convert_clines; n++)
1212 *m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen;
1213 sp->subsampling_convert_clinelenout=((sp->strile_width+sp->subsampling_hor-1)/sp->subsampling_hor);
1214 sp->subsampling_convert_state=0;
1215 sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2);
1216 sp->lines_per_strile=((sp->strile_length+sp->subsampling_ver-1)/sp->subsampling_ver);
1217 sp->subsampling_convert_log=1;
1222 sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN;
1223 sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN;
1224 sp->libjpeg_jpeg_query_style=1;
1225 sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width;
1226 sp->lines_per_strile=sp->strile_length;
1228 if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
1230 sp->writeheader_done=1;
1235 OJPEGLibjpegSessionAbort(TIFF* tif)
1237 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1238 assert(sp->libjpeg_session_active!=0);
1239 jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct)));
1240 sp->libjpeg_session_active=0;
1244 OJPEGReadHeaderInfoSec(TIFF* tif)
1246 static const char module[]="OJPEGReadHeaderInfoSec";
1247 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1251 if (sp->file_size==0)
1252 sp->file_size=TIFFGetFileSize(tif);
1253 if (sp->jpeg_interchange_format!=0)
1255 if (sp->jpeg_interchange_format>=sp->file_size)
1257 sp->jpeg_interchange_format=0;
1258 sp->jpeg_interchange_format_length=0;
1262 if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size))
1263 sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format;
1266 sp->in_buffer_source=osibsNotSetYet;
1267 sp->in_buffer_next_strile=0;
1268 sp->in_buffer_strile_count=tif->tif_dir.td_nstrips;
1269 sp->in_buffer_file_togo=0;
1270 sp->in_buffer_togo=0;
1273 if (OJPEGReadBytePeek(sp,&m)==0)
1277 OJPEGReadByteAdvance(sp);
1280 if (OJPEGReadByte(sp,&m)==0)
1285 case JPEG_MARKER_SOI:
1286 /* this type of marker has no data, and should be skipped */
1288 case JPEG_MARKER_COM:
1289 case JPEG_MARKER_APP0:
1290 case JPEG_MARKER_APP0+1:
1291 case JPEG_MARKER_APP0+2:
1292 case JPEG_MARKER_APP0+3:
1293 case JPEG_MARKER_APP0+4:
1294 case JPEG_MARKER_APP0+5:
1295 case JPEG_MARKER_APP0+6:
1296 case JPEG_MARKER_APP0+7:
1297 case JPEG_MARKER_APP0+8:
1298 case JPEG_MARKER_APP0+9:
1299 case JPEG_MARKER_APP0+10:
1300 case JPEG_MARKER_APP0+11:
1301 case JPEG_MARKER_APP0+12:
1302 case JPEG_MARKER_APP0+13:
1303 case JPEG_MARKER_APP0+14:
1304 case JPEG_MARKER_APP0+15:
1305 /* this type of marker has data, but it has no use to us (and no place here) and should be skipped */
1306 if (OJPEGReadWord(sp,&n)==0)
1310 if (sp->subsamplingcorrect==0)
1311 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
1315 OJPEGReadSkip(sp,n-2);
1317 case JPEG_MARKER_DRI:
1318 if (OJPEGReadHeaderInfoSecStreamDri(tif)==0)
1321 case JPEG_MARKER_DQT:
1322 if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0)
1325 case JPEG_MARKER_DHT:
1326 if (OJPEGReadHeaderInfoSecStreamDht(tif)==0)
1329 case JPEG_MARKER_SOF0:
1330 case JPEG_MARKER_SOF1:
1331 case JPEG_MARKER_SOF3:
1332 if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0)
1334 if (sp->subsamplingcorrect!=0)
1337 case JPEG_MARKER_SOS:
1338 if (sp->subsamplingcorrect!=0)
1340 assert(sp->plane_sample_offset==0);
1341 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
1345 TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m);
1348 } while(m!=JPEG_MARKER_SOS);
1349 if (sp->subsamplingcorrect)
1353 if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0)
1355 sp->sof_marker_id=JPEG_MARKER_SOF0;
1356 for (o=0; o<sp->samples_per_pixel; o++)
1358 sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver);
1359 for (o=1; o<sp->samples_per_pixel; o++)
1361 sp->sof_x=sp->strile_width;
1362 sp->sof_y=sp->strile_length_total;
1364 if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0)
1366 if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0)
1368 for (o=1; o<sp->samples_per_pixel; o++)
1375 OJPEGReadHeaderInfoSecStreamDri(TIFF* tif)
1377 /* this could easilly cause trouble in some cases... but no such cases have occured sofar */
1378 static const char module[]="OJPEGReadHeaderInfoSecStreamDri";
1379 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1381 if (OJPEGReadWord(sp,&m)==0)
1385 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data");
1388 if (OJPEGReadWord(sp,&m)==0)
1390 sp->restart_interval=m;
1395 OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif)
1397 /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
1398 static const char module[]="OJPEGReadHeaderInfoSecStreamDqt";
1399 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1404 if (OJPEGReadWord(sp,&m)==0)
1408 if (sp->subsamplingcorrect==0)
1409 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
1412 if (sp->subsamplingcorrect!=0)
1413 OJPEGReadSkip(sp,m-2);
1421 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
1424 na=sizeof(uint32)+69;
1428 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1432 nb[sizeof(uint32)]=255;
1433 nb[sizeof(uint32)+1]=JPEG_MARKER_DQT;
1434 nb[sizeof(uint32)+2]=0;
1435 nb[sizeof(uint32)+3]=67;
1436 if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) {
1440 o=nb[sizeof(uint32)+4]&15;
1443 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
1447 if (sp->qtable[o]!=0)
1448 _TIFFfree(sp->qtable[o]);
1457 OJPEGReadHeaderInfoSecStreamDht(TIFF* tif)
1459 /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
1460 /* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */
1461 static const char module[]="OJPEGReadHeaderInfoSecStreamDht";
1462 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1467 if (OJPEGReadWord(sp,&m)==0)
1471 if (sp->subsamplingcorrect==0)
1472 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
1475 if (sp->subsamplingcorrect!=0)
1477 OJPEGReadSkip(sp,m-2);
1481 na=sizeof(uint32)+2+m;
1485 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1489 nb[sizeof(uint32)]=255;
1490 nb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
1491 nb[sizeof(uint32)+2]=(m>>8);
1492 nb[sizeof(uint32)+3]=(m&255);
1493 if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0)
1495 o=nb[sizeof(uint32)+4];
1500 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
1503 if (sp->dctable[o]!=0)
1504 _TIFFfree(sp->dctable[o]);
1511 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
1517 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
1520 if (sp->actable[o]!=0)
1521 _TIFFfree(sp->actable[o]);
1529 OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id)
1531 /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
1532 static const char module[]="OJPEGReadHeaderInfoSecStreamSof";
1533 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1541 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
1544 if (sp->subsamplingcorrect==0)
1545 sp->sof_marker_id=marker_id;
1546 /* Lf: data length */
1547 if (OJPEGReadWord(sp,&m)==0)
1551 if (sp->subsamplingcorrect==0)
1552 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
1558 if (sp->subsamplingcorrect==0)
1559 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
1563 if (sp->subsamplingcorrect==0)
1565 if (n!=sp->samples_per_pixel)
1567 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples");
1571 /* P: Sample precision */
1572 if (OJPEGReadByte(sp,&o)==0)
1576 if (sp->subsamplingcorrect==0)
1577 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample");
1580 /* Y: Number of lines, X: Number of samples per line */
1581 if (sp->subsamplingcorrect)
1582 OJPEGReadSkip(sp,4);
1585 /* Y: Number of lines */
1586 if (OJPEGReadWord(sp,&p)==0)
1588 if (((uint32)p<sp->image_length) && ((uint32)p<sp->strile_length_total))
1590 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height");
1594 /* X: Number of samples per line */
1595 if (OJPEGReadWord(sp,&p)==0)
1597 if (((uint32)p<sp->image_width) && ((uint32)p<sp->strile_width))
1599 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width");
1602 if ((uint32)p>sp->strile_width)
1604 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data image width exceeds expected image width");
1609 /* Nf: Number of image components in frame */
1610 if (OJPEGReadByte(sp,&o)==0)
1614 if (sp->subsamplingcorrect==0)
1615 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
1618 /* per component stuff */
1619 /* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */
1622 /* C: Component identifier */
1623 if (OJPEGReadByte(sp,&o)==0)
1625 if (sp->subsamplingcorrect==0)
1627 /* H: Horizontal sampling factor, and V: Vertical sampling factor */
1628 if (OJPEGReadByte(sp,&o)==0)
1630 if (sp->subsamplingcorrect!=0)
1634 sp->subsampling_hor=(o>>4);
1635 sp->subsampling_ver=(o&15);
1636 if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) ||
1637 ((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4)))
1638 sp->subsampling_force_desubsampling_inside_decompression=1;
1643 sp->subsampling_force_desubsampling_inside_decompression=1;
1649 if (sp->subsampling_force_desubsampling_inside_decompression==0)
1653 if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver))
1655 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
1663 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
1669 /* Tq: Quantization table destination selector */
1670 if (OJPEGReadByte(sp,&o)==0)
1672 if (sp->subsamplingcorrect==0)
1675 if (sp->subsamplingcorrect==0)
1681 OJPEGReadHeaderInfoSecStreamSos(TIFF* tif)
1683 /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
1684 static const char module[]="OJPEGReadHeaderInfoSecStreamSos";
1685 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1689 assert(sp->subsamplingcorrect==0);
1692 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
1696 if (OJPEGReadWord(sp,&m)==0)
1698 if (m!=6+sp->samples_per_pixel_per_plane*2)
1700 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
1704 if (OJPEGReadByte(sp,&n)==0)
1706 if (n!=sp->samples_per_pixel_per_plane)
1708 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
1711 /* Cs, Td, and Ta */
1712 for (o=0; o<sp->samples_per_pixel_per_plane; o++)
1715 if (OJPEGReadByte(sp,&n)==0)
1717 sp->sos_cs[sp->plane_sample_offset+o]=n;
1719 if (OJPEGReadByte(sp,&n)==0)
1721 sp->sos_tda[sp->plane_sample_offset+o]=n;
1723 /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */
1724 OJPEGReadSkip(sp,3);
1729 OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif)
1731 static const char module[]="OJPEGReadHeaderInfoSecTablesQTable";
1732 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1738 if (sp->qtable_offset[0]==0)
1740 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
1743 sp->in_buffer_file_pos_log=0;
1744 for (m=0; m<sp->samples_per_pixel; m++)
1746 if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1])))
1748 for (n=0; n<m-1; n++)
1750 if (sp->qtable_offset[m]==sp->qtable_offset[n])
1752 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value");
1756 oa=sizeof(uint32)+69;
1760 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1764 ob[sizeof(uint32)]=255;
1765 ob[sizeof(uint32)+1]=JPEG_MARKER_DQT;
1766 ob[sizeof(uint32)+2]=0;
1767 ob[sizeof(uint32)+3]=67;
1768 ob[sizeof(uint32)+4]=m;
1769 TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET);
1770 p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64);
1777 sp->sof_tq[m]=sp->sof_tq[m-1];
1783 OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif)
1785 static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable";
1786 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1794 if (sp->dctable_offset[0]==0)
1796 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
1799 sp->in_buffer_file_pos_log=0;
1800 for (m=0; m<sp->samples_per_pixel; m++)
1802 if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1])))
1804 for (n=0; n<m-1; n++)
1806 if (sp->dctable_offset[m]==sp->dctable_offset[n])
1808 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value");
1812 TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET);
1813 p=TIFFReadFile(tif,o,16);
1817 for (n=0; n<16; n++)
1819 ra=sizeof(uint32)+21+q;
1823 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1827 rb[sizeof(uint32)]=255;
1828 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
1829 rb[sizeof(uint32)+2]=((19+q)>>8);
1830 rb[sizeof(uint32)+3]=((19+q)&255);
1831 rb[sizeof(uint32)+4]=m;
1832 for (n=0; n<16; n++)
1833 rb[sizeof(uint32)+5+n]=o[n];
1834 p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
1838 sp->sos_tda[m]=(m<<4);
1841 sp->sos_tda[m]=sp->sos_tda[m-1];
1847 OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif)
1849 static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable";
1850 OJPEGState* sp=(OJPEGState*)tif->tif_data;
1858 if (sp->actable_offset[0]==0)
1860 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
1863 sp->in_buffer_file_pos_log=0;
1864 for (m=0; m<sp->samples_per_pixel; m++)
1866 if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1])))
1868 for (n=0; n<m-1; n++)
1870 if (sp->actable_offset[m]==sp->actable_offset[n])
1872 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value");
1876 TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET);
1877 p=TIFFReadFile(tif,o,16);
1881 for (n=0; n<16; n++)
1883 ra=sizeof(uint32)+21+q;
1887 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1891 rb[sizeof(uint32)]=255;
1892 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
1893 rb[sizeof(uint32)+2]=((19+q)>>8);
1894 rb[sizeof(uint32)+3]=((19+q)&255);
1895 rb[sizeof(uint32)+4]=(16|m);
1896 for (n=0; n<16; n++)
1897 rb[sizeof(uint32)+5+n]=o[n];
1898 p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
1902 sp->sos_tda[m]=(sp->sos_tda[m]|m);
1905 sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15));
1911 OJPEGReadBufferFill(OJPEGState* sp)
1915 /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made
1916 * in any other case, seek or read errors should be passed through */
1919 if (sp->in_buffer_file_togo!=0)
1921 if (sp->in_buffer_file_pos_log==0)
1923 TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET);
1924 sp->in_buffer_file_pos_log=1;
1927 if ((uint64)m>sp->in_buffer_file_togo)
1928 m=(uint16)sp->in_buffer_file_togo;
1929 n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m);
1933 assert(n<=OJPEG_BUFFER);
1935 assert((uint64)n<=sp->in_buffer_file_togo);
1937 sp->in_buffer_togo=m;
1938 sp->in_buffer_cur=sp->in_buffer;
1939 sp->in_buffer_file_togo-=m;
1940 sp->in_buffer_file_pos+=m;
1943 sp->in_buffer_file_pos_log=0;
1944 switch(sp->in_buffer_source)
1946 case osibsNotSetYet:
1947 if (sp->jpeg_interchange_format!=0)
1949 sp->in_buffer_file_pos=sp->jpeg_interchange_format;
1950 sp->in_buffer_file_togo=sp->jpeg_interchange_format_length;
1952 sp->in_buffer_source=osibsJpegInterchangeFormat;
1954 case osibsJpegInterchangeFormat:
1955 sp->in_buffer_source=osibsStrile;
1957 if (sp->in_buffer_next_strile==sp->in_buffer_strile_count)
1958 sp->in_buffer_source=osibsEof;
1961 sp->in_buffer_file_pos=sp->tif->tif_dir.td_stripoffset[sp->in_buffer_next_strile];
1962 if (sp->in_buffer_file_pos!=0)
1964 if (sp->in_buffer_file_pos>=sp->file_size)
1965 sp->in_buffer_file_pos=0;
1966 else if (sp->tif->tif_dir.td_stripbytecount==NULL)
1967 sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
1970 if (sp->tif->tif_dir.td_stripbytecount == 0) {
1971 TIFFErrorExt(sp->tif->tif_clientdata,sp->tif->tif_name,"Strip byte counts are missing");
1974 sp->in_buffer_file_togo=sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile];
1975 if (sp->in_buffer_file_togo==0)
1976 sp->in_buffer_file_pos=0;
1977 else if (sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size)
1978 sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
1981 sp->in_buffer_next_strile++;
1992 OJPEGReadByte(OJPEGState* sp, uint8* byte)
1994 if (sp->in_buffer_togo==0)
1996 if (OJPEGReadBufferFill(sp)==0)
1998 assert(sp->in_buffer_togo>0);
2000 *byte=*(sp->in_buffer_cur);
2001 sp->in_buffer_cur++;
2002 sp->in_buffer_togo--;
2007 OJPEGReadBytePeek(OJPEGState* sp, uint8* byte)
2009 if (sp->in_buffer_togo==0)
2011 if (OJPEGReadBufferFill(sp)==0)
2013 assert(sp->in_buffer_togo>0);
2015 *byte=*(sp->in_buffer_cur);
2020 OJPEGReadByteAdvance(OJPEGState* sp)
2022 assert(sp->in_buffer_togo>0);
2023 sp->in_buffer_cur++;
2024 sp->in_buffer_togo--;
2028 OJPEGReadWord(OJPEGState* sp, uint16* word)
2031 if (OJPEGReadByte(sp,&m)==0)
2034 if (OJPEGReadByte(sp,&m)==0)
2041 OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem)
2051 if (sp->in_buffer_togo==0)
2053 if (OJPEGReadBufferFill(sp)==0)
2055 assert(sp->in_buffer_togo>0);
2058 if (n>sp->in_buffer_togo)
2059 n=sp->in_buffer_togo;
2060 _TIFFmemcpy(mmem,sp->in_buffer_cur,n);
2061 sp->in_buffer_cur+=n;
2062 sp->in_buffer_togo-=n;
2070 OJPEGReadSkip(OJPEGState* sp, uint16 len)
2076 if (n>sp->in_buffer_togo)
2077 n=sp->in_buffer_togo;
2078 sp->in_buffer_cur+=n;
2079 sp->in_buffer_togo-=n;
2083 assert(sp->in_buffer_togo==0);
2085 if ((uint64)n>sp->in_buffer_file_togo)
2086 n=(uint16)sp->in_buffer_file_togo;
2087 sp->in_buffer_file_pos+=n;
2088 sp->in_buffer_file_togo-=n;
2089 sp->in_buffer_file_pos_log=0;
2090 /* we don't skip past jpeginterchangeformat/strile block...
2091 * if that is asked from us, we're dealing with totally bazurk
2092 * data anyway, and we've not seen this happening on any
2093 * testfile, so we might as well likely cause some other
2094 * meaningless error to be passed at some later time
2100 OJPEGWriteStream(TIFF* tif, void** mem, uint32* len)
2102 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2106 assert(sp->out_state<=ososEoi);
2107 switch(sp->out_state)
2110 OJPEGWriteStreamSoi(tif,mem,len);
2113 OJPEGWriteStreamQTable(tif,0,mem,len);
2116 OJPEGWriteStreamQTable(tif,1,mem,len);
2119 OJPEGWriteStreamQTable(tif,2,mem,len);
2122 OJPEGWriteStreamQTable(tif,3,mem,len);
2125 OJPEGWriteStreamDcTable(tif,0,mem,len);
2128 OJPEGWriteStreamDcTable(tif,1,mem,len);
2131 OJPEGWriteStreamDcTable(tif,2,mem,len);
2134 OJPEGWriteStreamDcTable(tif,3,mem,len);
2137 OJPEGWriteStreamAcTable(tif,0,mem,len);
2140 OJPEGWriteStreamAcTable(tif,1,mem,len);
2143 OJPEGWriteStreamAcTable(tif,2,mem,len);
2146 OJPEGWriteStreamAcTable(tif,3,mem,len);
2149 OJPEGWriteStreamDri(tif,mem,len);
2152 OJPEGWriteStreamSof(tif,mem,len);
2155 OJPEGWriteStreamSos(tif,mem,len);
2157 case ososCompressed:
2158 if (OJPEGWriteStreamCompressed(tif,mem,len)==0)
2162 OJPEGWriteStreamRst(tif,mem,len);
2165 OJPEGWriteStreamEoi(tif,mem,len);
2173 OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len)
2175 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2176 assert(OJPEG_BUFFER>=2);
2177 sp->out_buffer[0]=255;
2178 sp->out_buffer[1]=JPEG_MARKER_SOI;
2180 *mem=(void*)sp->out_buffer;
2185 OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
2187 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2188 if (sp->qtable[table_index]!=0)
2190 *mem=(void*)(sp->qtable[table_index]+sizeof(uint32));
2191 *len=*((uint32*)sp->qtable[table_index])-sizeof(uint32);
2197 OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
2199 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2200 if (sp->dctable[table_index]!=0)
2202 *mem=(void*)(sp->dctable[table_index]+sizeof(uint32));
2203 *len=*((uint32*)sp->dctable[table_index])-sizeof(uint32);
2209 OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
2211 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2212 if (sp->actable[table_index]!=0)
2214 *mem=(void*)(sp->actable[table_index]+sizeof(uint32));
2215 *len=*((uint32*)sp->actable[table_index])-sizeof(uint32);
2221 OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len)
2223 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2224 assert(OJPEG_BUFFER>=6);
2225 if (sp->restart_interval!=0)
2227 sp->out_buffer[0]=255;
2228 sp->out_buffer[1]=JPEG_MARKER_DRI;
2229 sp->out_buffer[2]=0;
2230 sp->out_buffer[3]=4;
2231 sp->out_buffer[4]=(sp->restart_interval>>8);
2232 sp->out_buffer[5]=(sp->restart_interval&255);
2234 *mem=(void*)sp->out_buffer;
2240 OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len)
2242 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2244 assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3);
2245 assert(255>=8+sp->samples_per_pixel_per_plane*3);
2246 sp->out_buffer[0]=255;
2247 sp->out_buffer[1]=sp->sof_marker_id;
2249 sp->out_buffer[2]=0;
2250 sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3;
2252 sp->out_buffer[4]=8;
2254 sp->out_buffer[5]=(sp->sof_y>>8);
2255 sp->out_buffer[6]=(sp->sof_y&255);
2257 sp->out_buffer[7]=(sp->sof_x>>8);
2258 sp->out_buffer[8]=(sp->sof_x&255);
2260 sp->out_buffer[9]=sp->samples_per_pixel_per_plane;
2261 for (m=0; m<sp->samples_per_pixel_per_plane; m++)
2264 sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m];
2266 sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m];
2268 sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m];
2270 *len=10+sp->samples_per_pixel_per_plane*3;
2271 *mem=(void*)sp->out_buffer;
2276 OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len)
2278 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2280 assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2);
2281 assert(255>=6+sp->samples_per_pixel_per_plane*2);
2282 sp->out_buffer[0]=255;
2283 sp->out_buffer[1]=JPEG_MARKER_SOS;
2285 sp->out_buffer[2]=0;
2286 sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2;
2288 sp->out_buffer[4]=sp->samples_per_pixel_per_plane;
2289 for (m=0; m<sp->samples_per_pixel_per_plane; m++)
2292 sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m];
2294 sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m];
2297 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0;
2299 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63;
2301 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0;
2302 *len=8+sp->samples_per_pixel_per_plane*2;
2303 *mem=(void*)sp->out_buffer;
2308 OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len)
2310 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2311 if (sp->in_buffer_togo==0)
2313 if (OJPEGReadBufferFill(sp)==0)
2315 assert(sp->in_buffer_togo>0);
2317 *len=sp->in_buffer_togo;
2318 *mem=(void*)sp->in_buffer_cur;
2319 sp->in_buffer_togo=0;
2320 if (sp->in_buffer_file_togo==0)
2322 switch(sp->in_buffer_source)
2325 if (sp->in_buffer_next_strile<sp->in_buffer_strile_count)
2326 sp->out_state=ososRst;
2328 sp->out_state=ososEoi;
2331 sp->out_state=ososEoi;
2341 OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len)
2343 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2344 assert(OJPEG_BUFFER>=2);
2345 sp->out_buffer[0]=255;
2346 sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index;
2347 sp->restart_index++;
2348 if (sp->restart_index==8)
2349 sp->restart_index=0;
2351 *mem=(void*)sp->out_buffer;
2352 sp->out_state=ososCompressed;
2356 OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len)
2358 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2359 assert(OJPEG_BUFFER>=2);
2360 sp->out_buffer[0]=255;
2361 sp->out_buffer[1]=JPEG_MARKER_EOI;
2363 *mem=(void*)sp->out_buffer;
2366 #ifndef LIBJPEG_ENCAP_EXTERNAL
2368 jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
2370 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_create_decompress(cinfo),1));
2374 #ifndef LIBJPEG_ENCAP_EXTERNAL
2376 jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image)
2378 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_header(cinfo,require_image),1));
2382 #ifndef LIBJPEG_ENCAP_EXTERNAL
2384 jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
2386 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_start_decompress(cinfo),1));
2390 #ifndef LIBJPEG_ENCAP_EXTERNAL
2392 jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines)
2394 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_scanlines(cinfo,scanlines,max_lines),1));
2398 #ifndef LIBJPEG_ENCAP_EXTERNAL
2400 jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines)
2402 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_raw_data(cinfo,data,max_lines),1));
2406 #ifndef LIBJPEG_ENCAP_EXTERNAL
2408 jpeg_encap_unwind(TIFF* tif)
2410 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2411 LONGJMP(sp->exit_jmpbuf,1);
2416 OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo)
2418 char buffer[JMSG_LENGTH_MAX];
2419 (*cinfo->err->format_message)(cinfo,buffer);
2420 TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
2424 OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo)
2426 char buffer[JMSG_LENGTH_MAX];
2427 (*cinfo->err->format_message)(cinfo,buffer);
2428 TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
2429 jpeg_encap_unwind((TIFF*)(cinfo->client_data));
2433 OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo)
2439 OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
2441 TIFF* tif=(TIFF*)cinfo->client_data;
2442 OJPEGState* sp=(OJPEGState*)tif->tif_data;
2445 if (OJPEGWriteStream(tif,&mem,&len)==0)
2447 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data");
2448 jpeg_encap_unwind(tif);
2450 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len;
2451 sp->libjpeg_jpeg_source_mgr.next_input_byte=mem;
2456 OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes)
2458 TIFF* tif=(TIFF*)cinfo->client_data;
2460 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
2461 jpeg_encap_unwind(tif);
2465 OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired)
2467 TIFF* tif=(TIFF*)cinfo->client_data;
2469 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
2470 jpeg_encap_unwind(tif);
2475 OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo)