| OLD | NEW |
| (Empty) |
| 1 /* $Id: tif_ojpeg.c,v 1.56 2012-05-24 03:15:18 fwarmerdam Exp $ */ | |
| 2 | |
| 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 | |
| 8 in tif_jpeg.c. | |
| 9 | |
| 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>. | |
| 14 | |
| 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. | |
| 22 | |
| 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. | |
| 27 | |
| 28 Copyright (c) Joris Van Damme <info@awaresystems.be> | |
| 29 Copyright (c) AWare Systems <http://www.awaresystems.be/> | |
| 30 | |
| 31 The licence agreement for this file is the same as the rest of the LibTiff | |
| 32 library. | |
| 33 | |
| 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 | |
| 39 OF THIS SOFTWARE. | |
| 40 | |
| 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>. | |
| 44 */ | |
| 45 | |
| 46 /* What is what, and what is not? | |
| 47 | |
| 48 This decoder starts with an input stream, that is essentially the JpegInterch
angeFormat | |
| 49 stream, if any, followed by the strile data, if any. This stream is read in | |
| 50 OJPEGReadByte and related functions. | |
| 51 | |
| 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 cont
ent, | |
| 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 informatio
n | |
| 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 OJPEGReadHeaderInfoSecSt
reamXxx | |
| 58 functions. | |
| 59 | |
| 60 Some OJPEG imagery contains no valid JPEG header markers. This situation is p
icked | |
| 61 up on if we've seen no SOF marker when we're at the start of the compressed i
mage | |
| 62 data. In this case, the tables are read from JpegXxxTables tags, and the othe
r | |
| 63 bits and pieces of information is initialized to its most basic value. This i
s | |
| 64 implemented in the OJPEGReadHeaderInfoSecTablesXxx functions. | |
| 65 | |
| 66 When this is complete, a good and valid JPEG header can be assembled, and thi
s is | |
| 67 passed through to LibJpeg. When that's done, the remainder of the input strea
m, i.e. | |
| 68 the compressed image data, can be passed through unchanged. This is done in | |
| 69 OJPEGWriteStream functions. | |
| 70 | |
| 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 YCbCrsubsam
pling | |
| 73 tag is notoriously unreliable. To correct these tag values with the ones insi
de | |
| 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 warni
ngs | |
| 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 spe
ed | |
| 78 in correcting these values is important enough to warrant this sacrifice. All
though | |
| 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. | |
| 83 | |
| 84 The restart interval and restart markers are the most tricky part... The rest
art | |
| 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 diff
erent | |
| 88 striles, as is also probably the most likely interpretation of the original T
IFF 6.0 | |
| 89 specification. With all this setting of interval, and actual use of markers t
hat 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 be
en able | |
| 93 to discover ways that seem to work. | |
| 94 | |
| 95 Some special provision is made for planarconfig separate OJPEG files. These s
eem | |
| 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 a
nd don't | |
| 98 care. We want LibTiff to be able to access the planes individually, without h
uge | |
| 99 buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, i
n 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 subsequ
ent | |
| 102 planes, is done inside OJPEGReadSecondarySos. | |
| 103 | |
| 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 o
f | |
| 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 | |
| 110 of the data. | |
| 111 | |
| 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 buil
d | |
| 114 converters to JPEG, and/or to new-style JPEG compression inside TIFF. | |
| 115 | |
| 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 OJPEGPre
Decode. | |
| 118 Applications would do well accessing all striles in order, as this will resul
t in | |
| 119 a single sequential scan of the input stream, and no restarting of LibJpeg de
coding | |
| 120 session. | |
| 121 */ | |
| 122 | |
| 123 | |
| 124 #define WIN32_LEAN_AND_MEAN | |
| 125 #define VC_EXTRALEAN | |
| 126 | |
| 127 #include "tiffiop.h" | |
| 128 #ifdef OJPEG_SUPPORT | |
| 129 | |
| 130 /* Configuration defines here are: | |
| 131 * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some e
nvironments, | |
| 132 * like eg LibTiffDelphi, this is not possible. For this reason, the actual
calls to | |
| 133 * libjpeg, with longjump stuff, are encapsulated in dedicated functions. W
hen | |
| 134 * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declar
ed external | |
| 135 * to this unit, and can be defined elsewhere to use stuff other then longj
ump. | |
| 136 * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encap
sulators | |
| 137 * here, internally, with normal longjump. | |
| 138 * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent
is | |
| 139 * conviniently available, but still it may be worthwhile to use _setjmp or
sigsetjmp | |
| 140 * in place of plain setjmp. These macros will make it easier. It is useles
s | |
| 141 * to fiddle with these if you define JPEG_ENCAP_EXTERNAL. | |
| 142 * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small eno
ugh so as to guarantee | |
| 143 * instant processing, optimal streaming and optimal use of processor cache
, but also big | |
| 144 * enough so as to not result in significant call overhead. It should be at
least a few | |
| 145 * bytes to accomodate some structures (this is verified in asserts), but i
t would not be | |
| 146 * sensible to make it this small anyway, and it should be at most 64K sinc
e it is indexed | |
| 147 * with uint16. We recommend 2K. | |
| 148 * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used any
where and has | |
| 149 * absolutely no effect. That is why most people insist the EGYPTIANWALK is
a bit silly. | |
| 150 */ | |
| 151 | |
| 152 /* define LIBJPEG_ENCAP_EXTERNAL */ | |
| 153 #define SETJMP(jbuf) setjmp(jbuf) | |
| 154 #define LONGJMP(jbuf,code) longjmp(jbuf,code) | |
| 155 #define JMP_BUF jmp_buf | |
| 156 #define OJPEG_BUFFER 2048 | |
| 157 /* define EGYPTIANWALK */ | |
| 158 | |
| 159 #define JPEG_MARKER_SOF0 0xC0 | |
| 160 #define JPEG_MARKER_SOF1 0xC1 | |
| 161 #define JPEG_MARKER_SOF3 0xC3 | |
| 162 #define JPEG_MARKER_DHT 0xC4 | |
| 163 #define JPEG_MARKER_RST0 0XD0 | |
| 164 #define JPEG_MARKER_SOI 0xD8 | |
| 165 #define JPEG_MARKER_EOI 0xD9 | |
| 166 #define JPEG_MARKER_SOS 0xDA | |
| 167 #define JPEG_MARKER_DQT 0xDB | |
| 168 #define JPEG_MARKER_DRI 0xDD | |
| 169 #define JPEG_MARKER_APP0 0xE0 | |
| 170 #define JPEG_MARKER_COM 0xFE | |
| 171 | |
| 172 #define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0) | |
| 173 #define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1) | |
| 174 #define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2) | |
| 175 #define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3) | |
| 176 #define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4) | |
| 177 #define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5) | |
| 178 #define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6) | |
| 179 | |
| 180 static const TIFFField ojpegFields[] = { | |
| 181 {TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UN
DEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NUL
L}, | |
| 182 {TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET
_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFo
rmatLength",NULL}, | |
| 183 {TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SET
GET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTa
bles",NULL}, | |
| 184 {TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SE
TGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegD
cTables",NULL}, | |
| 185 {TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SE
TGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegA
cTables",NULL}, | |
| 186 {TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFI
NED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL}, | |
| 187 {TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SE
TGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval"
,NULL}, | |
| 188 }; | |
| 189 | |
| 190 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 191 #include <setjmp.h> | |
| 192 #endif | |
| 193 | |
| 194 /* We undefine FAR to avoid conflict with JPEG definition */ | |
| 195 | |
| 196 #ifdef FAR | |
| 197 #undef FAR | |
| 198 #endif | |
| 199 | |
| 200 /* | |
| 201 Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is | |
| 202 not defined. Unfortunately, the MinGW and Borland compilers include | |
| 203 a typedef for INT32, which causes a conflict. MSVC does not include | |
| 204 a conficting typedef given the headers which are included. | |
| 205 */ | |
| 206 #if defined(__BORLANDC__) || defined(__MINGW32__) | |
| 207 # define XMD_H 1 | |
| 208 #endif | |
| 209 | |
| 210 /* Define "boolean" as unsigned char, not int, per Windows custom. */ | |
| 211 #if defined(__WIN32__) && !defined(__MINGW32__) | |
| 212 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ | |
| 213 typedef unsigned char boolean; | |
| 214 # endif | |
| 215 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ | |
| 216 #endif | |
| 217 | |
| 218 #if defined(USE_SYSTEM_LIBJPEG) | |
| 219 #include <jpeglib.h> | |
| 220 #elif defined(USE_LIBJPEG_TURBO) | |
| 221 #include "third_party/libjpeg_turbo/jpeglib.h" | |
| 222 #else | |
| 223 #include "third_party/libjpeg/jpeglib.h" | |
| 224 #endif | |
| 225 | |
| 226 typedef struct jpeg_error_mgr jpeg_error_mgr; | |
| 227 typedef struct jpeg_common_struct jpeg_common_struct; | |
| 228 typedef struct jpeg_decompress_struct jpeg_decompress_struct; | |
| 229 typedef struct jpeg_source_mgr jpeg_source_mgr; | |
| 230 | |
| 231 typedef enum { | |
| 232 osibsNotSetYet, | |
| 233 osibsJpegInterchangeFormat, | |
| 234 osibsStrile, | |
| 235 osibsEof | |
| 236 } OJPEGStateInBufferSource; | |
| 237 | |
| 238 typedef enum { | |
| 239 ososSoi, | |
| 240 ososQTable0,ososQTable1,ososQTable2,ososQTable3, | |
| 241 ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3, | |
| 242 ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3, | |
| 243 ososDri, | |
| 244 ososSof, | |
| 245 ososSos, | |
| 246 ososCompressed, | |
| 247 ososRst, | |
| 248 ososEoi | |
| 249 } OJPEGStateOutState; | |
| 250 | |
| 251 typedef struct { | |
| 252 TIFF* tif; | |
| 253 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 254 JMP_BUF exit_jmpbuf; | |
| 255 #endif | |
| 256 TIFFVGetMethod vgetparent; | |
| 257 TIFFVSetMethod vsetparent; | |
| 258 TIFFPrintMethod printdir; | |
| 259 uint64 file_size; | |
| 260 uint32 image_width; | |
| 261 uint32 image_length; | |
| 262 uint32 strile_width; | |
| 263 uint32 strile_length; | |
| 264 uint32 strile_length_total; | |
| 265 uint8 samples_per_pixel; | |
| 266 uint8 plane_sample_offset; | |
| 267 uint8 samples_per_pixel_per_plane; | |
| 268 uint64 jpeg_interchange_format; | |
| 269 uint64 jpeg_interchange_format_length; | |
| 270 uint8 jpeg_proc; | |
| 271 uint8 subsamplingcorrect; | |
| 272 uint8 subsamplingcorrect_done; | |
| 273 uint8 subsampling_tag; | |
| 274 uint8 subsampling_hor; | |
| 275 uint8 subsampling_ver; | |
| 276 uint8 subsampling_force_desubsampling_inside_decompression; | |
| 277 uint8 qtable_offset_count; | |
| 278 uint8 dctable_offset_count; | |
| 279 uint8 actable_offset_count; | |
| 280 uint64 qtable_offset[3]; | |
| 281 uint64 dctable_offset[3]; | |
| 282 uint64 actable_offset[3]; | |
| 283 uint8* qtable[4]; | |
| 284 uint8* dctable[4]; | |
| 285 uint8* actable[4]; | |
| 286 uint16 restart_interval; | |
| 287 uint8 restart_index; | |
| 288 uint8 sof_log; | |
| 289 uint8 sof_marker_id; | |
| 290 uint32 sof_x; | |
| 291 uint32 sof_y; | |
| 292 uint8 sof_c[3]; | |
| 293 uint8 sof_hv[3]; | |
| 294 uint8 sof_tq[3]; | |
| 295 uint8 sos_cs[3]; | |
| 296 uint8 sos_tda[3]; | |
| 297 struct { | |
| 298 uint8 log; | |
| 299 OJPEGStateInBufferSource in_buffer_source; | |
| 300 uint32 in_buffer_next_strile; | |
| 301 uint64 in_buffer_file_pos; | |
| 302 uint64 in_buffer_file_togo; | |
| 303 } sos_end[3]; | |
| 304 uint8 readheader_done; | |
| 305 uint8 writeheader_done; | |
| 306 uint16 write_cursample; | |
| 307 uint32 write_curstrile; | |
| 308 uint8 libjpeg_session_active; | |
| 309 uint8 libjpeg_jpeg_query_style; | |
| 310 jpeg_error_mgr libjpeg_jpeg_error_mgr; | |
| 311 jpeg_decompress_struct libjpeg_jpeg_decompress_struct; | |
| 312 jpeg_source_mgr libjpeg_jpeg_source_mgr; | |
| 313 uint8 subsampling_convert_log; | |
| 314 uint32 subsampling_convert_ylinelen; | |
| 315 uint32 subsampling_convert_ylines; | |
| 316 uint32 subsampling_convert_clinelen; | |
| 317 uint32 subsampling_convert_clines; | |
| 318 uint32 subsampling_convert_ybuflen; | |
| 319 uint32 subsampling_convert_cbuflen; | |
| 320 uint32 subsampling_convert_ycbcrbuflen; | |
| 321 uint8* subsampling_convert_ycbcrbuf; | |
| 322 uint8* subsampling_convert_ybuf; | |
| 323 uint8* subsampling_convert_cbbuf; | |
| 324 uint8* subsampling_convert_crbuf; | |
| 325 uint32 subsampling_convert_ycbcrimagelen; | |
| 326 uint8** subsampling_convert_ycbcrimage; | |
| 327 uint32 subsampling_convert_clinelenout; | |
| 328 uint32 subsampling_convert_state; | |
| 329 uint32 bytes_per_line; /* if the codec outputs subsampled data, a 'lin
e' in bytes_per_line */ | |
| 330 uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver d
esubsampled rows */ | |
| 331 OJPEGStateInBufferSource in_buffer_source; | |
| 332 uint32 in_buffer_next_strile; | |
| 333 uint32 in_buffer_strile_count; | |
| 334 uint64 in_buffer_file_pos; | |
| 335 uint8 in_buffer_file_pos_log; | |
| 336 uint64 in_buffer_file_togo; | |
| 337 uint16 in_buffer_togo; | |
| 338 uint8* in_buffer_cur; | |
| 339 uint8 in_buffer[OJPEG_BUFFER]; | |
| 340 OJPEGStateOutState out_state; | |
| 341 uint8 out_buffer[OJPEG_BUFFER]; | |
| 342 uint8* skip_buffer; | |
| 343 } OJPEGState; | |
| 344 | |
| 345 static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap); | |
| 346 static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap); | |
| 347 static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags); | |
| 348 | |
| 349 static int OJPEGFixupTags(TIFF* tif); | |
| 350 static int OJPEGSetupDecode(TIFF* tif); | |
| 351 static int OJPEGPreDecode(TIFF* tif, uint16 s); | |
| 352 static int OJPEGPreDecodeSkipRaw(TIFF* tif); | |
| 353 static int OJPEGPreDecodeSkipScanlines(TIFF* tif); | |
| 354 static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); | |
| 355 static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc); | |
| 356 static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc); | |
| 357 static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc); | |
| 358 static int OJPEGSetupEncode(TIFF* tif); | |
| 359 static int OJPEGPreEncode(TIFF* tif, uint16 s); | |
| 360 static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); | |
| 361 static int OJPEGPostEncode(TIFF* tif); | |
| 362 static void OJPEGCleanup(TIFF* tif); | |
| 363 | |
| 364 static void OJPEGSubsamplingCorrect(TIFF* tif); | |
| 365 static int OJPEGReadHeaderInfo(TIFF* tif); | |
| 366 static int OJPEGReadSecondarySos(TIFF* tif, uint16 s); | |
| 367 static int OJPEGWriteHeaderInfo(TIFF* tif); | |
| 368 static void OJPEGLibjpegSessionAbort(TIFF* tif); | |
| 369 | |
| 370 static int OJPEGReadHeaderInfoSec(TIFF* tif); | |
| 371 static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif); | |
| 372 static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif); | |
| 373 static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif); | |
| 374 static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id); | |
| 375 static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif); | |
| 376 static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif); | |
| 377 static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif); | |
| 378 static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif); | |
| 379 | |
| 380 static int OJPEGReadBufferFill(OJPEGState* sp); | |
| 381 static int OJPEGReadByte(OJPEGState* sp, uint8* byte); | |
| 382 static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte); | |
| 383 static void OJPEGReadByteAdvance(OJPEGState* sp); | |
| 384 static int OJPEGReadWord(OJPEGState* sp, uint16* word); | |
| 385 static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem); | |
| 386 static void OJPEGReadSkip(OJPEGState* sp, uint16 len); | |
| 387 | |
| 388 static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len); | |
| 389 static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len); | |
| 390 static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uin
t32* len); | |
| 391 static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, ui
nt32* len); | |
| 392 static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, ui
nt32* len); | |
| 393 static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len); | |
| 394 static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len); | |
| 395 static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len); | |
| 396 static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len); | |
| 397 static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len); | |
| 398 static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len); | |
| 399 | |
| 400 #ifdef LIBJPEG_ENCAP_EXTERNAL | |
| 401 extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct*
cinfo); | |
| 402 extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo,
uint8 require_image); | |
| 403 extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* c
info); | |
| 404 extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cin
fo, void* scanlines, uint32 max_lines); | |
| 405 extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinf
o, void* data, uint32 max_lines); | |
| 406 extern void jpeg_encap_unwind(TIFF* tif); | |
| 407 #else | |
| 408 static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct*
j); | |
| 409 static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo,
uint8 require_image); | |
| 410 static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* c
info); | |
| 411 static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cin
fo, void* scanlines, uint32 max_lines); | |
| 412 static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinf
o, void* data, uint32 max_lines); | |
| 413 static void jpeg_encap_unwind(TIFF* tif); | |
| 414 #endif | |
| 415 | |
| 416 static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo); | |
| 417 static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo); | |
| 418 static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo); | |
| 419 static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct*
cinfo); | |
| 420 static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo
, long num_bytes); | |
| 421 static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct*
cinfo, int desired); | |
| 422 static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo); | |
| 423 | |
| 424 int | |
| 425 TIFFInitOJPEG(TIFF* tif, int scheme) | |
| 426 { | |
| 427 static const char module[]="TIFFInitOJPEG"; | |
| 428 OJPEGState* sp; | |
| 429 | |
| 430 assert(scheme==COMPRESSION_OJPEG); | |
| 431 | |
| 432 /* | |
| 433 * Merge codec-specific tag information. | |
| 434 */ | |
| 435 if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) { | |
| 436 TIFFErrorExt(tif->tif_clientdata, module, | |
| 437 "Merging Old JPEG codec-specific tags failed"); | |
| 438 return 0; | |
| 439 } | |
| 440 | |
| 441 /* state block */ | |
| 442 sp = (OJPEGState*)_TIFFmalloc(sizeof(OJPEGState)); // // ad
d (OJPEGState*) cast | |
| 443 if (sp == NULL) | |
| 444 { | |
| 445 TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG stat
e block"); | |
| 446 return(0); | |
| 447 } | |
| 448 _TIFFmemset(sp,0,sizeof(OJPEGState)); | |
| 449 sp->tif=tif; | |
| 450 sp->jpeg_proc=1; | |
| 451 sp->subsampling_hor=2; | |
| 452 sp->subsampling_ver=2; | |
| 453 TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2); | |
| 454 /* tif codec methods */ | |
| 455 tif->tif_fixuptags=OJPEGFixupTags; | |
| 456 tif->tif_setupdecode=OJPEGSetupDecode; | |
| 457 tif->tif_predecode=OJPEGPreDecode; | |
| 458 tif->tif_postdecode=OJPEGPostDecode; | |
| 459 tif->tif_decoderow=OJPEGDecode; | |
| 460 tif->tif_decodestrip=OJPEGDecode; | |
| 461 tif->tif_decodetile=OJPEGDecode; | |
| 462 tif->tif_setupencode=OJPEGSetupEncode; | |
| 463 tif->tif_preencode=OJPEGPreEncode; | |
| 464 tif->tif_postencode=OJPEGPostEncode; | |
| 465 tif->tif_encoderow=OJPEGEncode; | |
| 466 tif->tif_encodestrip=OJPEGEncode; | |
| 467 tif->tif_encodetile=OJPEGEncode; | |
| 468 tif->tif_cleanup=OJPEGCleanup; | |
| 469 tif->tif_data=(uint8*)sp; | |
| 470 /* tif tag methods */ | |
| 471 sp->vgetparent=tif->tif_tagmethods.vgetfield; | |
| 472 tif->tif_tagmethods.vgetfield=OJPEGVGetField; | |
| 473 sp->vsetparent=tif->tif_tagmethods.vsetfield; | |
| 474 tif->tif_tagmethods.vsetfield=OJPEGVSetField; | |
| 475 sp->printdir=tif->tif_tagmethods.printdir; | |
| 476 tif->tif_tagmethods.printdir=OJPEGPrintDir; | |
| 477 /* Some OJPEG files don't have strip or tile offsets or bytecounts tags. | |
| 478 Some others do, but have totally meaningless or corrupt values | |
| 479 in these tags. In these cases, the JpegInterchangeFormat stream is | |
| 480 reliable. In any case, this decoder reads the compressed data itself, | |
| 481 from the most reliable locations, and we need to notify encapsulating | |
| 482 LibTiff not to read raw strips or tiles for us. */ | |
| 483 tif->tif_flags|=TIFF_NOREADRAW; | |
| 484 return(1); | |
| 485 } | |
| 486 | |
| 487 static int | |
| 488 OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap) | |
| 489 { | |
| 490 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 491 switch(tag) | |
| 492 { | |
| 493 case TIFFTAG_JPEGIFOFFSET: | |
| 494 *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format; | |
| 495 break; | |
| 496 case TIFFTAG_JPEGIFBYTECOUNT: | |
| 497 *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_
length; | |
| 498 break; | |
| 499 case TIFFTAG_YCBCRSUBSAMPLING: | |
| 500 if (sp->subsamplingcorrect_done==0) | |
| 501 OJPEGSubsamplingCorrect(tif); | |
| 502 *va_arg(ap,uint16*)=(uint16)sp->subsampling_hor; | |
| 503 *va_arg(ap,uint16*)=(uint16)sp->subsampling_ver; | |
| 504 break; | |
| 505 case TIFFTAG_JPEGQTABLES: | |
| 506 *va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count; | |
| 507 *va_arg(ap,void**)=(void*)sp->qtable_offset; | |
| 508 break; | |
| 509 case TIFFTAG_JPEGDCTABLES: | |
| 510 *va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count; | |
| 511 *va_arg(ap,void**)=(void*)sp->dctable_offset; | |
| 512 break; | |
| 513 case TIFFTAG_JPEGACTABLES: | |
| 514 *va_arg(ap,uint32*)=(uint32)sp->actable_offset_count; | |
| 515 *va_arg(ap,void**)=(void*)sp->actable_offset; | |
| 516 break; | |
| 517 case TIFFTAG_JPEGPROC: | |
| 518 *va_arg(ap,uint16*)=(uint16)sp->jpeg_proc; | |
| 519 break; | |
| 520 case TIFFTAG_JPEGRESTARTINTERVAL: | |
| 521 *va_arg(ap,uint16*)=sp->restart_interval; | |
| 522 break; | |
| 523 default: | |
| 524 return (*sp->vgetparent)(tif,tag,ap); | |
| 525 } | |
| 526 return (1); | |
| 527 } | |
| 528 | |
| 529 static int | |
| 530 OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) | |
| 531 { | |
| 532 static const char module[]="OJPEGVSetField"; | |
| 533 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 534 uint32 ma; | |
| 535 uint64* mb; | |
| 536 uint32 n; | |
| 537 switch(tag) | |
| 538 { | |
| 539 case TIFFTAG_JPEGIFOFFSET: | |
| 540 sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64); | |
| 541 break; | |
| 542 case TIFFTAG_JPEGIFBYTECOUNT: | |
| 543 sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uin
t64); | |
| 544 break; | |
| 545 case TIFFTAG_YCBCRSUBSAMPLING: | |
| 546 sp->subsampling_tag=1; | |
| 547 sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap); | |
| 548 sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap); | |
| 549 tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor; | |
| 550 tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver; | |
| 551 break; | |
| 552 case TIFFTAG_JPEGQTABLES: | |
| 553 ma=(uint32)va_arg(ap,uint32); | |
| 554 if (ma!=0) | |
| 555 { | |
| 556 if (ma>3) | |
| 557 { | |
| 558 TIFFErrorExt(tif->tif_clientdata,module,
"JpegQTables tag has incorrect count"); | |
| 559 return(0); | |
| 560 } | |
| 561 sp->qtable_offset_count=(uint8)ma; | |
| 562 mb=(uint64*)va_arg(ap,uint64*); | |
| 563 for (n=0; n<ma; n++) | |
| 564 sp->qtable_offset[n]=mb[n]; | |
| 565 } | |
| 566 break; | |
| 567 case TIFFTAG_JPEGDCTABLES: | |
| 568 ma=(uint32)va_arg(ap,uint32); | |
| 569 if (ma!=0) | |
| 570 { | |
| 571 if (ma>3) | |
| 572 { | |
| 573 TIFFErrorExt(tif->tif_clientdata,module,
"JpegDcTables tag has incorrect count"); | |
| 574 return(0); | |
| 575 } | |
| 576 sp->dctable_offset_count=(uint8)ma; | |
| 577 mb=(uint64*)va_arg(ap,uint64*); | |
| 578 for (n=0; n<ma; n++) | |
| 579 sp->dctable_offset[n]=mb[n]; | |
| 580 } | |
| 581 break; | |
| 582 case TIFFTAG_JPEGACTABLES: | |
| 583 ma=(uint32)va_arg(ap,uint32); | |
| 584 if (ma!=0) | |
| 585 { | |
| 586 if (ma>3) | |
| 587 { | |
| 588 TIFFErrorExt(tif->tif_clientdata,module,
"JpegAcTables tag has incorrect count"); | |
| 589 return(0); | |
| 590 } | |
| 591 sp->actable_offset_count=(uint8)ma; | |
| 592 mb=(uint64*)va_arg(ap,uint64*); | |
| 593 for (n=0; n<ma; n++) | |
| 594 sp->actable_offset[n]=mb[n]; | |
| 595 } | |
| 596 break; | |
| 597 case TIFFTAG_JPEGPROC: | |
| 598 sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap); | |
| 599 break; | |
| 600 case TIFFTAG_JPEGRESTARTINTERVAL: | |
| 601 sp->restart_interval=(uint16)va_arg(ap,uint16_vap); | |
| 602 break; | |
| 603 default: | |
| 604 return (*sp->vsetparent)(tif,tag,ap); | |
| 605 } | |
| 606 TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit); | |
| 607 tif->tif_flags|=TIFF_DIRTYDIRECT; | |
| 608 return(1); | |
| 609 } | |
| 610 | |
| 611 static void | |
| 612 OJPEGPrintDir(TIFF* tif, FILE* fd, long flags) | |
| 613 { | |
| 614 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 615 uint8 m; | |
| 616 (void)flags; | |
| 617 assert(sp!=NULL); | |
| 618 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT)) | |
| 619 fprintf(fd," JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(
TIFF_UINT64_T)sp->jpeg_interchange_format); | |
| 620 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH)) | |
| 621 fprintf(fd," JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT
"\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length); | |
| 622 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES)) | |
| 623 { | |
| 624 fprintf(fd," JpegQTables:"); | |
| 625 for (m=0; m<sp->qtable_offset_count; m++) | |
| 626 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qta
ble_offset[m]); | |
| 627 fprintf(fd,"\n"); | |
| 628 } | |
| 629 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES)) | |
| 630 { | |
| 631 fprintf(fd," JpegDcTables:"); | |
| 632 for (m=0; m<sp->dctable_offset_count; m++) | |
| 633 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dct
able_offset[m]); | |
| 634 fprintf(fd,"\n"); | |
| 635 } | |
| 636 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES)) | |
| 637 { | |
| 638 fprintf(fd," JpegAcTables:"); | |
| 639 for (m=0; m<sp->actable_offset_count; m++) | |
| 640 fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->act
able_offset[m]); | |
| 641 fprintf(fd,"\n"); | |
| 642 } | |
| 643 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC)) | |
| 644 fprintf(fd," JpegProc: %u\n",(unsigned int)sp->jpeg_proc); | |
| 645 if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL)) | |
| 646 fprintf(fd," JpegRestartInterval: %u\n",(unsigned int)sp->resta
rt_interval); | |
| 647 if (sp->printdir) | |
| 648 (*sp->printdir)(tif, fd, flags); | |
| 649 } | |
| 650 | |
| 651 static int | |
| 652 OJPEGFixupTags(TIFF* tif) | |
| 653 { | |
| 654 (void) tif; | |
| 655 return(1); | |
| 656 } | |
| 657 | |
| 658 static int | |
| 659 OJPEGSetupDecode(TIFF* tif) | |
| 660 { | |
| 661 static const char module[]="OJPEGSetupDecode"; | |
| 662 TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome o
ld-style JPEG compression mode, please convert to new-style JPEG compression and
notify vendor of writing software"); | |
| 663 return(1); | |
| 664 } | |
| 665 | |
| 666 static int | |
| 667 OJPEGPreDecode(TIFF* tif, uint16 s) | |
| 668 { | |
| 669 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 670 uint32 m; | |
| 671 if (sp->subsamplingcorrect_done==0) | |
| 672 OJPEGSubsamplingCorrect(tif); | |
| 673 if (sp->readheader_done==0) | |
| 674 { | |
| 675 if (OJPEGReadHeaderInfo(tif)==0) | |
| 676 return(0); | |
| 677 } | |
| 678 if (sp->sos_end[s].log==0) | |
| 679 { | |
| 680 if (OJPEGReadSecondarySos(tif,s)==0) | |
| 681 return(0); | |
| 682 } | |
| 683 if isTiled(tif) | |
| 684 m=tif->tif_curtile; | |
| 685 else | |
| 686 m=tif->tif_curstrip; | |
| 687 if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write
_curstrile>m))) | |
| 688 { | |
| 689 if (sp->libjpeg_session_active!=0) | |
| 690 OJPEGLibjpegSessionAbort(tif); | |
| 691 sp->writeheader_done=0; | |
| 692 } | |
| 693 if (sp->writeheader_done==0) | |
| 694 { | |
| 695 sp->plane_sample_offset=(uint8)s; | |
| 696 sp->write_cursample=s; | |
| 697 sp->write_curstrile=s*tif->tif_dir.td_stripsperimage; | |
| 698 if ((sp->in_buffer_file_pos_log==0) || | |
| 699 (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].i
n_buffer_file_pos)) | |
| 700 { | |
| 701 sp->in_buffer_source=sp->sos_end[s].in_buffer_source; | |
| 702 sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_
strile; | |
| 703 sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos
; | |
| 704 sp->in_buffer_file_pos_log=0; | |
| 705 sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_to
go; | |
| 706 sp->in_buffer_togo=0; | |
| 707 sp->in_buffer_cur=0; | |
| 708 } | |
| 709 if (OJPEGWriteHeaderInfo(tif)==0) | |
| 710 return(0); | |
| 711 } | |
| 712 while (sp->write_curstrile<m) | |
| 713 { | |
| 714 if (sp->libjpeg_jpeg_query_style==0) | |
| 715 { | |
| 716 if (OJPEGPreDecodeSkipRaw(tif)==0) | |
| 717 return(0); | |
| 718 } | |
| 719 else | |
| 720 { | |
| 721 if (OJPEGPreDecodeSkipScanlines(tif)==0) | |
| 722 return(0); | |
| 723 } | |
| 724 sp->write_curstrile++; | |
| 725 } | |
| 726 return(1); | |
| 727 } | |
| 728 | |
| 729 static int | |
| 730 OJPEGPreDecodeSkipRaw(TIFF* tif) | |
| 731 { | |
| 732 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 733 uint32 m; | |
| 734 m=sp->lines_per_strile; | |
| 735 if (sp->subsampling_convert_state!=0) | |
| 736 { | |
| 737 if (sp->subsampling_convert_clines-sp->subsampling_convert_state
>=m) | |
| 738 { | |
| 739 sp->subsampling_convert_state+=m; | |
| 740 if (sp->subsampling_convert_state==sp->subsampling_conve
rt_clines) | |
| 741 sp->subsampling_convert_state=0; | |
| 742 return(1); | |
| 743 } | |
| 744 m-=sp->subsampling_convert_clines-sp->subsampling_convert_state; | |
| 745 sp->subsampling_convert_state=0; | |
| 746 } | |
| 747 while (m>=sp->subsampling_convert_clines) | |
| 748 { | |
| 749 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_st
ruct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) | |
| 750 return(0); | |
| 751 m-=sp->subsampling_convert_clines; | |
| 752 } | |
| 753 if (m>0) | |
| 754 { | |
| 755 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_st
ruct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) | |
| 756 return(0); | |
| 757 sp->subsampling_convert_state=m; | |
| 758 } | |
| 759 return(1); | |
| 760 } | |
| 761 | |
| 762 static int | |
| 763 OJPEGPreDecodeSkipScanlines(TIFF* tif) | |
| 764 { | |
| 765 static const char module[]="OJPEGPreDecodeSkipScanlines"; | |
| 766 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 767 uint32 m; | |
| 768 if (sp->skip_buffer==NULL) | |
| 769 { | |
| 770 // add (uint8*) cast | |
| 771 sp->skip_buffer = (uint8*)_TIFFmalloc(sp->bytes_per_line); | |
| 772 if (sp->skip_buffer == NULL) | |
| 773 { | |
| 774 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; | |
| 775 return(0); | |
| 776 } | |
| 777 } | |
| 778 for (m=0; m<sp->lines_per_strile; m++) | |
| 779 { | |
| 780 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_s
truct),&sp->skip_buffer,1)==0) | |
| 781 return(0); | |
| 782 } | |
| 783 return(1); | |
| 784 } | |
| 785 | |
| 786 static int | |
| 787 OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) | |
| 788 { | |
| 789 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 790 (void)s; | |
| 791 if (sp->libjpeg_jpeg_query_style==0) | |
| 792 { | |
| 793 if (OJPEGDecodeRaw(tif,buf,cc)==0) | |
| 794 return(0); | |
| 795 } | |
| 796 else | |
| 797 { | |
| 798 if (OJPEGDecodeScanlines(tif,buf,cc)==0) | |
| 799 return(0); | |
| 800 } | |
| 801 return(1); | |
| 802 } | |
| 803 | |
| 804 static int | |
| 805 OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc) | |
| 806 { | |
| 807 static const char module[]="OJPEGDecodeRaw"; | |
| 808 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 809 uint8* m; | |
| 810 tmsize_t n; | |
| 811 uint8* oy; | |
| 812 uint8* ocb; | |
| 813 uint8* ocr; | |
| 814 uint8* p; | |
| 815 uint32 q; | |
| 816 uint8* r; | |
| 817 uint8 sx,sy; | |
| 818 if (cc%sp->bytes_per_line!=0) | |
| 819 { | |
| 820 TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not
read"); | |
| 821 return(0); | |
| 822 } | |
| 823 assert(cc>0); | |
| 824 m=buf; | |
| 825 n=cc; | |
| 826 do | |
| 827 { | |
| 828 if (sp->subsampling_convert_state==0) | |
| 829 { | |
| 830 if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decom
press_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) | |
| 831 return(0); | |
| 832 } | |
| 833 oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp
->subsampling_ver*sp->subsampling_convert_ylinelen; | |
| 834 ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*
sp->subsampling_convert_clinelen; | |
| 835 ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*
sp->subsampling_convert_clinelen; | |
| 836 p=m; | |
| 837 for (q=0; q<sp->subsampling_convert_clinelenout; q++) | |
| 838 { | |
| 839 r=oy; | |
| 840 for (sy=0; sy<sp->subsampling_ver; sy++) | |
| 841 { | |
| 842 for (sx=0; sx<sp->subsampling_hor; sx++) | |
| 843 *p++=*r++; | |
| 844 r+=sp->subsampling_convert_ylinelen-sp->subsampl
ing_hor; | |
| 845 } | |
| 846 oy+=sp->subsampling_hor; | |
| 847 *p++=*ocb++; | |
| 848 *p++=*ocr++; | |
| 849 } | |
| 850 sp->subsampling_convert_state++; | |
| 851 if (sp->subsampling_convert_state==sp->subsampling_convert_cline
s) | |
| 852 sp->subsampling_convert_state=0; | |
| 853 m+=sp->bytes_per_line; | |
| 854 n-=sp->bytes_per_line; | |
| 855 } while(n>0); | |
| 856 return(1); | |
| 857 } | |
| 858 | |
| 859 static int | |
| 860 OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc) | |
| 861 { | |
| 862 static const char module[]="OJPEGDecodeScanlines"; | |
| 863 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 864 uint8* m; | |
| 865 tmsize_t n; | |
| 866 if (cc%sp->bytes_per_line!=0) | |
| 867 { | |
| 868 TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not
read"); | |
| 869 return(0); | |
| 870 } | |
| 871 assert(cc>0); | |
| 872 m=buf; | |
| 873 n=cc; | |
| 874 do | |
| 875 { | |
| 876 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_s
truct),&m,1)==0) | |
| 877 return(0); | |
| 878 m+=sp->bytes_per_line; | |
| 879 n-=sp->bytes_per_line; | |
| 880 } while(n>0); | |
| 881 return(1); | |
| 882 } | |
| 883 | |
| 884 static void | |
| 885 OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc) | |
| 886 { | |
| 887 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 888 (void)buf; | |
| 889 (void)cc; | |
| 890 sp->write_curstrile++; | |
| 891 if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0) | |
| 892 { | |
| 893 assert(sp->libjpeg_session_active!=0); | |
| 894 OJPEGLibjpegSessionAbort(tif); | |
| 895 sp->writeheader_done=0; | |
| 896 } | |
| 897 } | |
| 898 | |
| 899 static int | |
| 900 OJPEGSetupEncode(TIFF* tif) | |
| 901 { | |
| 902 static const char module[]="OJPEGSetupEncode"; | |
| 903 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; u
se new-style JPEG compression instead"); | |
| 904 return(0); | |
| 905 } | |
| 906 | |
| 907 static int | |
| 908 OJPEGPreEncode(TIFF* tif, uint16 s) | |
| 909 { | |
| 910 static const char module[]="OJPEGPreEncode"; | |
| 911 (void)s; | |
| 912 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; u
se new-style JPEG compression instead"); | |
| 913 return(0); | |
| 914 } | |
| 915 | |
| 916 static int | |
| 917 OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) | |
| 918 { | |
| 919 static const char module[]="OJPEGEncode"; | |
| 920 (void)buf; | |
| 921 (void)cc; | |
| 922 (void)s; | |
| 923 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; u
se new-style JPEG compression instead"); | |
| 924 return(0); | |
| 925 } | |
| 926 | |
| 927 static int | |
| 928 OJPEGPostEncode(TIFF* tif) | |
| 929 { | |
| 930 static const char module[]="OJPEGPostEncode"; | |
| 931 TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; u
se new-style JPEG compression instead"); | |
| 932 return(0); | |
| 933 } | |
| 934 | |
| 935 static void | |
| 936 OJPEGCleanup(TIFF* tif) | |
| 937 { | |
| 938 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 939 if (sp!=0) | |
| 940 { | |
| 941 tif->tif_tagmethods.vgetfield=sp->vgetparent; | |
| 942 tif->tif_tagmethods.vsetfield=sp->vsetparent; | |
| 943 tif->tif_tagmethods.printdir=sp->printdir; | |
| 944 if (sp->qtable[0]!=0) | |
| 945 _TIFFfree(sp->qtable[0]); | |
| 946 if (sp->qtable[1]!=0) | |
| 947 _TIFFfree(sp->qtable[1]); | |
| 948 if (sp->qtable[2]!=0) | |
| 949 _TIFFfree(sp->qtable[2]); | |
| 950 if (sp->qtable[3]!=0) | |
| 951 _TIFFfree(sp->qtable[3]); | |
| 952 if (sp->dctable[0]!=0) | |
| 953 _TIFFfree(sp->dctable[0]); | |
| 954 if (sp->dctable[1]!=0) | |
| 955 _TIFFfree(sp->dctable[1]); | |
| 956 if (sp->dctable[2]!=0) | |
| 957 _TIFFfree(sp->dctable[2]); | |
| 958 if (sp->dctable[3]!=0) | |
| 959 _TIFFfree(sp->dctable[3]); | |
| 960 if (sp->actable[0]!=0) | |
| 961 _TIFFfree(sp->actable[0]); | |
| 962 if (sp->actable[1]!=0) | |
| 963 _TIFFfree(sp->actable[1]); | |
| 964 if (sp->actable[2]!=0) | |
| 965 _TIFFfree(sp->actable[2]); | |
| 966 if (sp->actable[3]!=0) | |
| 967 _TIFFfree(sp->actable[3]); | |
| 968 if (sp->libjpeg_session_active!=0) | |
| 969 OJPEGLibjpegSessionAbort(tif); | |
| 970 if (sp->subsampling_convert_ycbcrbuf!=0) | |
| 971 _TIFFfree(sp->subsampling_convert_ycbcrbuf); | |
| 972 if (sp->subsampling_convert_ycbcrimage!=0) | |
| 973 _TIFFfree(sp->subsampling_convert_ycbcrimage); | |
| 974 if (sp->skip_buffer!=0) | |
| 975 _TIFFfree(sp->skip_buffer); | |
| 976 _TIFFfree(sp); | |
| 977 tif->tif_data=NULL; | |
| 978 _TIFFSetDefaultCompressionState(tif); | |
| 979 } | |
| 980 } | |
| 981 | |
| 982 static void | |
| 983 OJPEGSubsamplingCorrect(TIFF* tif) | |
| 984 { | |
| 985 static const char module[]="OJPEGSubsamplingCorrect"; | |
| 986 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 987 uint8 mh; | |
| 988 uint8 mv; | |
| 989 _TIFFFillStriles( tif ); | |
| 990 | |
| 991 assert(sp->subsamplingcorrect_done==0); | |
| 992 if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometri
c!=PHOTOMETRIC_YCBCR) && | |
| 993 (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB))) | |
| 994 { | |
| 995 if (sp->subsampling_tag!=0) | |
| 996 TIFFWarningExt(tif->tif_clientdata,module,"Subsampling t
ag not appropriate for this Photometric and/or SamplesPerPixel"); | |
| 997 sp->subsampling_hor=1; | |
| 998 sp->subsampling_ver=1; | |
| 999 sp->subsampling_force_desubsampling_inside_decompression=0; | |
| 1000 } | |
| 1001 else | |
| 1002 { | |
| 1003 sp->subsamplingcorrect_done=1; | |
| 1004 mh=sp->subsampling_hor; | |
| 1005 mv=sp->subsampling_ver; | |
| 1006 sp->subsamplingcorrect=1; | |
| 1007 OJPEGReadHeaderInfoSec(tif); | |
| 1008 if (sp->subsampling_force_desubsampling_inside_decompression!=0) | |
| 1009 { | |
| 1010 sp->subsampling_hor=1; | |
| 1011 sp->subsampling_ver=1; | |
| 1012 } | |
| 1013 sp->subsamplingcorrect=0; | |
| 1014 if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) &&
(sp->subsampling_force_desubsampling_inside_decompression==0)) | |
| 1015 { | |
| 1016 if (sp->subsampling_tag==0) | |
| 1017 TIFFWarningExt(tif->tif_clientdata,module,"Subsa
mpling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match d
efault values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsa
mpling_hor,sp->subsampling_ver); | |
| 1018 else | |
| 1019 TIFFWarningExt(tif->tif_clientdata,module,"Subsa
mpling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; a
ssuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsamp
ling_ver,mh,mv); | |
| 1020 } | |
| 1021 if (sp->subsampling_force_desubsampling_inside_decompression!=0) | |
| 1022 { | |
| 1023 if (sp->subsampling_tag==0) | |
| 1024 TIFFWarningExt(tif->tif_clientdata,module,"Subsa
mpling tag is not set, yet subsampling inside JPEG data does not match default v
alues [2,2] (nor any other values allowed in TIFF); assuming subsampling inside
JPEG data is correct and desubsampling inside JPEG decompression"); | |
| 1025 else | |
| 1026 TIFFWarningExt(tif->tif_clientdata,module,"Subsa
mpling inside JPEG data does not match subsampling tag values [%d,%d] (nor any o
ther values allowed in TIFF); assuming subsampling inside JPEG data is correct a
nd desubsampling inside JPEG decompression",mh,mv); | |
| 1027 } | |
| 1028 if (sp->subsampling_force_desubsampling_inside_decompression==0) | |
| 1029 { | |
| 1030 if (sp->subsampling_hor<sp->subsampling_ver) | |
| 1031 TIFFWarningExt(tif->tif_clientdata,module,"Subsa
mpling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampli
ng_ver); | |
| 1032 } | |
| 1033 } | |
| 1034 sp->subsamplingcorrect_done=1; | |
| 1035 } | |
| 1036 | |
| 1037 static int | |
| 1038 OJPEGReadHeaderInfo(TIFF* tif) | |
| 1039 { | |
| 1040 static const char module[]="OJPEGReadHeaderInfo"; | |
| 1041 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1042 assert(sp->readheader_done==0); | |
| 1043 sp->image_width=tif->tif_dir.td_imagewidth; | |
| 1044 sp->image_length=tif->tif_dir.td_imagelength; | |
| 1045 if isTiled(tif) | |
| 1046 { | |
| 1047 sp->strile_width=tif->tif_dir.td_tilewidth; | |
| 1048 sp->strile_length=tif->tif_dir.td_tilelength; | |
| 1049 sp->strile_length_total=((sp->image_length+sp->strile_length-1)/
sp->strile_length)*sp->strile_length; | |
| 1050 } | |
| 1051 else | |
| 1052 { | |
| 1053 sp->strile_width=sp->image_width; | |
| 1054 sp->strile_length=tif->tif_dir.td_rowsperstrip; | |
| 1055 sp->strile_length_total=sp->image_length; | |
| 1056 } | |
| 1057 if (tif->tif_dir.td_samplesperpixel==1) | |
| 1058 { | |
| 1059 sp->samples_per_pixel=1; | |
| 1060 sp->plane_sample_offset=0; | |
| 1061 sp->samples_per_pixel_per_plane=sp->samples_per_pixel; | |
| 1062 sp->subsampling_hor=1; | |
| 1063 sp->subsampling_ver=1; | |
| 1064 } | |
| 1065 else | |
| 1066 { | |
| 1067 if (tif->tif_dir.td_samplesperpixel!=3) | |
| 1068 { | |
| 1069 TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel
%d not supported for this compression scheme",sp->samples_per_pixel); | |
| 1070 return(0); | |
| 1071 } | |
| 1072 sp->samples_per_pixel=3; | |
| 1073 sp->plane_sample_offset=0; | |
| 1074 if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG) | |
| 1075 sp->samples_per_pixel_per_plane=3; | |
| 1076 else | |
| 1077 sp->samples_per_pixel_per_plane=1; | |
| 1078 } | |
| 1079 if (sp->strile_length<sp->image_length) | |
| 1080 { | |
| 1081 if (sp->strile_length%(sp->subsampling_ver*8)!=0) | |
| 1082 { | |
| 1083 TIFFErrorExt(tif->tif_clientdata,module,"Incompatible ve
rtical subsampling and image strip/tile length"); | |
| 1084 return(0); | |
| 1085 } | |
| 1086 sp->restart_interval=((sp->strile_width+sp->subsampling_hor*8-1)
/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8)); | |
| 1087 } | |
| 1088 if (OJPEGReadHeaderInfoSec(tif)==0) | |
| 1089 return(0); | |
| 1090 sp->sos_end[0].log=1; | |
| 1091 sp->sos_end[0].in_buffer_source=sp->in_buffer_source; | |
| 1092 sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile; | |
| 1093 sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_t
ogo; | |
| 1094 sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer
_togo; | |
| 1095 sp->readheader_done=1; | |
| 1096 return(1); | |
| 1097 } | |
| 1098 | |
| 1099 static int | |
| 1100 OJPEGReadSecondarySos(TIFF* tif, uint16 s) | |
| 1101 { | |
| 1102 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1103 uint8 m; | |
| 1104 assert(s>0); | |
| 1105 assert(s<3); | |
| 1106 assert(sp->sos_end[0].log!=0); | |
| 1107 assert(sp->sos_end[s].log==0); | |
| 1108 sp->plane_sample_offset=s-1; | |
| 1109 while(sp->sos_end[sp->plane_sample_offset].log==0) | |
| 1110 sp->plane_sample_offset--; | |
| 1111 sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_sour
ce; | |
| 1112 sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer
_next_strile; | |
| 1113 sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_fi
le_pos; | |
| 1114 sp->in_buffer_file_pos_log=0; | |
| 1115 sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_f
ile_togo; | |
| 1116 sp->in_buffer_togo=0; | |
| 1117 sp->in_buffer_cur=0; | |
| 1118 while(sp->plane_sample_offset<s) | |
| 1119 { | |
| 1120 do | |
| 1121 { | |
| 1122 if (OJPEGReadByte(sp,&m)==0) | |
| 1123 return(0); | |
| 1124 if (m==255) | |
| 1125 { | |
| 1126 do | |
| 1127 { | |
| 1128 if (OJPEGReadByte(sp,&m)==0) | |
| 1129 return(0); | |
| 1130 if (m!=255) | |
| 1131 break; | |
| 1132 } while(1); | |
| 1133 if (m==JPEG_MARKER_SOS) | |
| 1134 break; | |
| 1135 } | |
| 1136 } while(1); | |
| 1137 sp->plane_sample_offset++; | |
| 1138 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) | |
| 1139 return(0); | |
| 1140 sp->sos_end[sp->plane_sample_offset].log=1; | |
| 1141 sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buf
fer_source; | |
| 1142 sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->i
n_buffer_next_strile; | |
| 1143 sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_b
uffer_file_pos-sp->in_buffer_togo; | |
| 1144 sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_
buffer_file_togo+sp->in_buffer_togo; | |
| 1145 } | |
| 1146 return(1); | |
| 1147 } | |
| 1148 | |
| 1149 static int | |
| 1150 OJPEGWriteHeaderInfo(TIFF* tif) | |
| 1151 { | |
| 1152 static const char module[]="OJPEGWriteHeaderInfo"; | |
| 1153 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1154 uint8** m; | |
| 1155 uint32 n; | |
| 1156 /* if a previous attempt failed, don't try again */ | |
| 1157 if (sp->libjpeg_session_active != 0) | |
| 1158 return 0; | |
| 1159 sp->out_state=ososSoi; | |
| 1160 sp->restart_index=0; | |
| 1161 jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr)); | |
| 1162 sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutput
Message; | |
| 1163 sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit; | |
| 1164 sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr); | |
| 1165 sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif; | |
| 1166 if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct
))==0) | |
| 1167 return(0); | |
| 1168 sp->libjpeg_session_active=1; | |
| 1169 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0; | |
| 1170 sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSou
rce; | |
| 1171 sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrF
illInputBuffer; | |
| 1172 sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSki
pInputData; | |
| 1173 sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrR
esyncToRestart; | |
| 1174 sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSou
rce; | |
| 1175 sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr); | |
| 1176 if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==
0) | |
| 1177 return(0); | |
| 1178 if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp
->samples_per_pixel_per_plane>1)) | |
| 1179 { | |
| 1180 sp->libjpeg_jpeg_decompress_struct.raw_data_out=1; | |
| 1181 #if JPEG_LIB_VERSION >= 70 | |
| 1182 sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE; | |
| 1183 #endif | |
| 1184 sp->libjpeg_jpeg_query_style=0; | |
| 1185 if (sp->subsampling_convert_log==0) | |
| 1186 { | |
| 1187 assert(sp->subsampling_convert_ycbcrbuf==0); | |
| 1188 assert(sp->subsampling_convert_ycbcrimage==0); | |
| 1189 sp->subsampling_convert_ylinelen=((sp->strile_width+sp->
subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8); | |
| 1190 sp->subsampling_convert_ylines=sp->subsampling_ver*8; | |
| 1191 sp->subsampling_convert_clinelen=sp->subsampling_convert
_ylinelen/sp->subsampling_hor; | |
| 1192 sp->subsampling_convert_clines=8; | |
| 1193 sp->subsampling_convert_ybuflen=sp->subsampling_convert_
ylinelen*sp->subsampling_convert_ylines; | |
| 1194 sp->subsampling_convert_cbuflen=sp->subsampling_convert_
clinelen*sp->subsampling_convert_clines; | |
| 1195 sp->subsampling_convert_ycbcrbuflen=sp->subsampling_conv
ert_ybuflen+2*sp->subsampling_convert_cbuflen; | |
| 1196 sp->subsampling_convert_ycbcrbuf = (uint8*)_TIFFmalloc(s
p->subsampling_convert_ycbcrbuflen); // add (uint8*) cast | |
| 1197 if (sp->subsampling_convert_ycbcrbuf==0) | |
| 1198 { | |
| 1199 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1200 return(0); | |
| 1201 } | |
| 1202 sp->subsampling_convert_ybuf=sp->subsampling_convert_ycb
crbuf; | |
| 1203 sp->subsampling_convert_cbbuf=sp->subsampling_convert_yb
uf+sp->subsampling_convert_ybuflen; | |
| 1204 sp->subsampling_convert_crbuf=sp->subsampling_convert_cb
buf+sp->subsampling_convert_cbuflen; | |
| 1205 sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_
convert_ylines+2*sp->subsampling_convert_clines; | |
| 1206 sp->subsampling_convert_ycbcrimage = (uint8**)_TIFFmallo
c(sp->subsampling_convert_ycbcrimagelen * sizeof(uint8*));// add (uint8**) cast | |
| 1207 if (sp->subsampling_convert_ycbcrimage==0) | |
| 1208 { | |
| 1209 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1210 return(0); | |
| 1211 } | |
| 1212 m=sp->subsampling_convert_ycbcrimage; | |
| 1213 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3); | |
| 1214 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->s
ubsampling_convert_ylines); | |
| 1215 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->s
ubsampling_convert_ylines+sp->subsampling_convert_clines); | |
| 1216 for (n=0; n<sp->subsampling_convert_ylines; n++) | |
| 1217 *m++=sp->subsampling_convert_ybuf+n*sp->subsampl
ing_convert_ylinelen; | |
| 1218 for (n=0; n<sp->subsampling_convert_clines; n++) | |
| 1219 *m++=sp->subsampling_convert_cbbuf+n*sp->subsamp
ling_convert_clinelen; | |
| 1220 for (n=0; n<sp->subsampling_convert_clines; n++) | |
| 1221 *m++=sp->subsampling_convert_crbuf+n*sp->subsamp
ling_convert_clinelen; | |
| 1222 sp->subsampling_convert_clinelenout=((sp->strile_width+s
p->subsampling_hor-1)/sp->subsampling_hor); | |
| 1223 sp->subsampling_convert_state=0; | |
| 1224 sp->bytes_per_line=sp->subsampling_convert_clinelenout*(
sp->subsampling_ver*sp->subsampling_hor+2); | |
| 1225 sp->lines_per_strile=((sp->strile_length+sp->subsampling
_ver-1)/sp->subsampling_ver); | |
| 1226 sp->subsampling_convert_log=1; | |
| 1227 } | |
| 1228 } | |
| 1229 else | |
| 1230 { | |
| 1231 sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN; | |
| 1232 sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN; | |
| 1233 sp->libjpeg_jpeg_query_style=1; | |
| 1234 sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_wi
dth; | |
| 1235 sp->lines_per_strile=sp->strile_length; | |
| 1236 } | |
| 1237 if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct)
)==0) | |
| 1238 return(0); | |
| 1239 sp->writeheader_done=1; | |
| 1240 return(1); | |
| 1241 } | |
| 1242 | |
| 1243 static void | |
| 1244 OJPEGLibjpegSessionAbort(TIFF* tif) | |
| 1245 { | |
| 1246 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1247 assert(sp->libjpeg_session_active!=0); | |
| 1248 jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct)
)); | |
| 1249 sp->libjpeg_session_active=0; | |
| 1250 } | |
| 1251 | |
| 1252 static int | |
| 1253 OJPEGReadHeaderInfoSec(TIFF* tif) | |
| 1254 { | |
| 1255 static const char module[]="OJPEGReadHeaderInfoSec"; | |
| 1256 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1257 uint8 m; | |
| 1258 uint16 n; | |
| 1259 uint8 o; | |
| 1260 if (sp->file_size==0) | |
| 1261 sp->file_size=TIFFGetFileSize(tif); | |
| 1262 if (sp->jpeg_interchange_format!=0) | |
| 1263 { | |
| 1264 if (sp->jpeg_interchange_format>=sp->file_size) | |
| 1265 { | |
| 1266 sp->jpeg_interchange_format=0; | |
| 1267 sp->jpeg_interchange_format_length=0; | |
| 1268 } | |
| 1269 else | |
| 1270 { | |
| 1271 if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg
_interchange_format+sp->jpeg_interchange_format_length>sp->file_size)) | |
| 1272 sp->jpeg_interchange_format_length=sp->file_size
-sp->jpeg_interchange_format; | |
| 1273 } | |
| 1274 } | |
| 1275 sp->in_buffer_source=osibsNotSetYet; | |
| 1276 sp->in_buffer_next_strile=0; | |
| 1277 sp->in_buffer_strile_count=tif->tif_dir.td_nstrips; | |
| 1278 sp->in_buffer_file_togo=0; | |
| 1279 sp->in_buffer_togo=0; | |
| 1280 do | |
| 1281 { | |
| 1282 if (OJPEGReadBytePeek(sp,&m)==0) | |
| 1283 return(0); | |
| 1284 if (m!=255) | |
| 1285 break; | |
| 1286 OJPEGReadByteAdvance(sp); | |
| 1287 do | |
| 1288 { | |
| 1289 if (OJPEGReadByte(sp,&m)==0) | |
| 1290 return(0); | |
| 1291 } while(m==255); | |
| 1292 switch(m) | |
| 1293 { | |
| 1294 case JPEG_MARKER_SOI: | |
| 1295 /* this type of marker has no data, and should b
e skipped */ | |
| 1296 break; | |
| 1297 case JPEG_MARKER_COM: | |
| 1298 case JPEG_MARKER_APP0: | |
| 1299 case JPEG_MARKER_APP0+1: | |
| 1300 case JPEG_MARKER_APP0+2: | |
| 1301 case JPEG_MARKER_APP0+3: | |
| 1302 case JPEG_MARKER_APP0+4: | |
| 1303 case JPEG_MARKER_APP0+5: | |
| 1304 case JPEG_MARKER_APP0+6: | |
| 1305 case JPEG_MARKER_APP0+7: | |
| 1306 case JPEG_MARKER_APP0+8: | |
| 1307 case JPEG_MARKER_APP0+9: | |
| 1308 case JPEG_MARKER_APP0+10: | |
| 1309 case JPEG_MARKER_APP0+11: | |
| 1310 case JPEG_MARKER_APP0+12: | |
| 1311 case JPEG_MARKER_APP0+13: | |
| 1312 case JPEG_MARKER_APP0+14: | |
| 1313 case JPEG_MARKER_APP0+15: | |
| 1314 /* this type of marker has data, but it has no u
se to us (and no place here) and should be skipped */ | |
| 1315 if (OJPEGReadWord(sp,&n)==0) | |
| 1316 return(0); | |
| 1317 if (n<2) | |
| 1318 { | |
| 1319 if (sp->subsamplingcorrect==0) | |
| 1320 TIFFErrorExt(tif->tif_clientdata
,module,"Corrupt JPEG data"); | |
| 1321 return(0); | |
| 1322 } | |
| 1323 if (n>2) | |
| 1324 OJPEGReadSkip(sp,n-2); | |
| 1325 break; | |
| 1326 case JPEG_MARKER_DRI: | |
| 1327 if (OJPEGReadHeaderInfoSecStreamDri(tif)==0) | |
| 1328 return(0); | |
| 1329 break; | |
| 1330 case JPEG_MARKER_DQT: | |
| 1331 if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0) | |
| 1332 return(0); | |
| 1333 break; | |
| 1334 case JPEG_MARKER_DHT: | |
| 1335 if (OJPEGReadHeaderInfoSecStreamDht(tif)==0) | |
| 1336 return(0); | |
| 1337 break; | |
| 1338 case JPEG_MARKER_SOF0: | |
| 1339 case JPEG_MARKER_SOF1: | |
| 1340 case JPEG_MARKER_SOF3: | |
| 1341 if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0) | |
| 1342 return(0); | |
| 1343 if (sp->subsamplingcorrect!=0) | |
| 1344 return(1); | |
| 1345 break; | |
| 1346 case JPEG_MARKER_SOS: | |
| 1347 if (sp->subsamplingcorrect!=0) | |
| 1348 return(1); | |
| 1349 assert(sp->plane_sample_offset==0); | |
| 1350 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) | |
| 1351 return(0); | |
| 1352 break; | |
| 1353 default: | |
| 1354 TIFFErrorExt(tif->tif_clientdata,module,"Unknown
marker type %d in JPEG data",m); | |
| 1355 return(0); | |
| 1356 } | |
| 1357 } while(m!=JPEG_MARKER_SOS); | |
| 1358 if (sp->subsamplingcorrect) | |
| 1359 return(1); | |
| 1360 if (sp->sof_log==0) | |
| 1361 { | |
| 1362 if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0) | |
| 1363 return(0); | |
| 1364 sp->sof_marker_id=JPEG_MARKER_SOF0; | |
| 1365 for (o=0; o<sp->samples_per_pixel; o++) | |
| 1366 sp->sof_c[o]=o; | |
| 1367 sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver); | |
| 1368 for (o=1; o<sp->samples_per_pixel; o++) | |
| 1369 sp->sof_hv[o]=17; | |
| 1370 sp->sof_x=sp->strile_width; | |
| 1371 sp->sof_y=sp->strile_length_total; | |
| 1372 sp->sof_log=1; | |
| 1373 if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0) | |
| 1374 return(0); | |
| 1375 if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0) | |
| 1376 return(0); | |
| 1377 for (o=1; o<sp->samples_per_pixel; o++) | |
| 1378 sp->sos_cs[o]=o; | |
| 1379 } | |
| 1380 return(1); | |
| 1381 } | |
| 1382 | |
| 1383 static int | |
| 1384 OJPEGReadHeaderInfoSecStreamDri(TIFF* tif) | |
| 1385 { | |
| 1386 /* this could easilly cause trouble in some cases... but no such cases h
ave occured sofar */ | |
| 1387 static const char module[]="OJPEGReadHeaderInfoSecStreamDri"; | |
| 1388 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1389 uint16 m; | |
| 1390 if (OJPEGReadWord(sp,&m)==0) | |
| 1391 return(0); | |
| 1392 if (m!=4) | |
| 1393 { | |
| 1394 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in J
PEG data"); | |
| 1395 return(0); | |
| 1396 } | |
| 1397 if (OJPEGReadWord(sp,&m)==0) | |
| 1398 return(0); | |
| 1399 sp->restart_interval=m; | |
| 1400 return(1); | |
| 1401 } | |
| 1402 | |
| 1403 static int | |
| 1404 OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif) | |
| 1405 { | |
| 1406 /* this is a table marker, and it is to be saved as a whole for exact pu
shing on the jpeg stream later on */ | |
| 1407 static const char module[]="OJPEGReadHeaderInfoSecStreamDqt"; | |
| 1408 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1409 uint16 m; | |
| 1410 uint32 na; | |
| 1411 uint8* nb; | |
| 1412 uint8 o; | |
| 1413 if (OJPEGReadWord(sp,&m)==0) | |
| 1414 return(0); | |
| 1415 if (m<=2) | |
| 1416 { | |
| 1417 if (sp->subsamplingcorrect==0) | |
| 1418 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT mar
ker in JPEG data"); | |
| 1419 return(0); | |
| 1420 } | |
| 1421 if (sp->subsamplingcorrect!=0) | |
| 1422 OJPEGReadSkip(sp,m-2); | |
| 1423 else | |
| 1424 { | |
| 1425 m-=2; | |
| 1426 do | |
| 1427 { | |
| 1428 if (m<65) | |
| 1429 { | |
| 1430 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DQT marker in JPEG data"); | |
| 1431 return(0); | |
| 1432 } | |
| 1433 na = sizeof(uint32) + 69; | |
| 1434 nb = (uint8*)_TIFFmalloc(na); // add (uint8*) cast | |
| 1435 if (nb == 0) | |
| 1436 { | |
| 1437 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1438 return(0); | |
| 1439 } | |
| 1440 *(uint32*)nb=na; | |
| 1441 nb[sizeof(uint32)]=255; | |
| 1442 nb[sizeof(uint32)+1]=JPEG_MARKER_DQT; | |
| 1443 nb[sizeof(uint32)+2]=0; | |
| 1444 nb[sizeof(uint32)+3]=67; | |
| 1445 if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) { | |
| 1446 _TIFFfree(nb); | |
| 1447 return(0); | |
| 1448 } | |
| 1449 o=nb[sizeof(uint32)+4]&15; | |
| 1450 if (3<o) | |
| 1451 { | |
| 1452 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DQT marker in JPEG data"); | |
| 1453 _TIFFfree(nb); | |
| 1454 return(0); | |
| 1455 } | |
| 1456 if (sp->qtable[o]!=0) | |
| 1457 _TIFFfree(sp->qtable[o]); | |
| 1458 sp->qtable[o]=nb; | |
| 1459 m-=65; | |
| 1460 } while(m>0); | |
| 1461 } | |
| 1462 return(1); | |
| 1463 } | |
| 1464 | |
| 1465 static int | |
| 1466 OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) | |
| 1467 { | |
| 1468 /* this is a table marker, and it is to be saved as a whole for exact pu
shing on the jpeg stream later on */ | |
| 1469 /* TODO: the following assumes there is only one table in this marker...
but i'm not quite sure that assumption is guaranteed correct */ | |
| 1470 static const char module[]="OJPEGReadHeaderInfoSecStreamDht"; | |
| 1471 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1472 uint16 m; | |
| 1473 uint32 na; | |
| 1474 uint8* nb; | |
| 1475 uint8 o; | |
| 1476 if (OJPEGReadWord(sp,&m)==0) | |
| 1477 return(0); | |
| 1478 if (m<=2) | |
| 1479 { | |
| 1480 if (sp->subsamplingcorrect==0) | |
| 1481 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT mar
ker in JPEG data"); | |
| 1482 return(0); | |
| 1483 } | |
| 1484 if (sp->subsamplingcorrect!=0) | |
| 1485 { | |
| 1486 OJPEGReadSkip(sp,m-2); | |
| 1487 } | |
| 1488 else | |
| 1489 { | |
| 1490 na = sizeof(uint32) + 2 + m; | |
| 1491 nb = (uint8*)_TIFFmalloc(na); // add (uint8*) cast | |
| 1492 if (nb == 0) | |
| 1493 { | |
| 1494 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; | |
| 1495 return(0); | |
| 1496 } | |
| 1497 *(uint32*)nb=na; | |
| 1498 nb[sizeof(uint32)]=255; | |
| 1499 nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | |
| 1500 nb[sizeof(uint32)+2]=(m>>8); | |
| 1501 nb[sizeof(uint32)+3]=(m&255); | |
| 1502 if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) | |
| 1503 return(0); | |
| 1504 o=nb[sizeof(uint32)+4]; | |
| 1505 if ((o&240)==0) | |
| 1506 { | |
| 1507 if (3<o) | |
| 1508 { | |
| 1509 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | |
| 1510 return(0); | |
| 1511 } | |
| 1512 if (sp->dctable[o]!=0) | |
| 1513 _TIFFfree(sp->dctable[o]); | |
| 1514 sp->dctable[o]=nb; | |
| 1515 } | |
| 1516 else | |
| 1517 { | |
| 1518 if ((o&240)!=16) | |
| 1519 { | |
| 1520 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | |
| 1521 return(0); | |
| 1522 } | |
| 1523 o&=15; | |
| 1524 if (3<o) | |
| 1525 { | |
| 1526 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | |
| 1527 return(0); | |
| 1528 } | |
| 1529 if (sp->actable[o]!=0) | |
| 1530 _TIFFfree(sp->actable[o]); | |
| 1531 sp->actable[o]=nb; | |
| 1532 } | |
| 1533 } | |
| 1534 return(1); | |
| 1535 } | |
| 1536 | |
| 1537 static int | |
| 1538 OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id) | |
| 1539 { | |
| 1540 /* this marker needs to be checked, and part of its data needs to be sav
ed for regeneration later on */ | |
| 1541 static const char module[]="OJPEGReadHeaderInfoSecStreamSof"; | |
| 1542 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1543 uint16 m; | |
| 1544 uint16 n; | |
| 1545 uint8 o; | |
| 1546 uint16 p; | |
| 1547 uint16 q; | |
| 1548 if (sp->sof_log!=0) | |
| 1549 { | |
| 1550 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data"); | |
| 1551 return(0); | |
| 1552 } | |
| 1553 if (sp->subsamplingcorrect==0) | |
| 1554 sp->sof_marker_id=marker_id; | |
| 1555 /* Lf: data length */ | |
| 1556 if (OJPEGReadWord(sp,&m)==0) | |
| 1557 return(0); | |
| 1558 if (m<11) | |
| 1559 { | |
| 1560 if (sp->subsamplingcorrect==0) | |
| 1561 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF mar
ker in JPEG data"); | |
| 1562 return(0); | |
| 1563 } | |
| 1564 m-=8; | |
| 1565 if (m%3!=0) | |
| 1566 { | |
| 1567 if (sp->subsamplingcorrect==0) | |
| 1568 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF mar
ker in JPEG data"); | |
| 1569 return(0); | |
| 1570 } | |
| 1571 n=m/3; | |
| 1572 if (sp->subsamplingcorrect==0) | |
| 1573 { | |
| 1574 if (n!=sp->samples_per_pixel) | |
| 1575 { | |
| 1576 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed
data indicates unexpected number of samples"); | |
| 1577 return(0); | |
| 1578 } | |
| 1579 } | |
| 1580 /* P: Sample precision */ | |
| 1581 if (OJPEGReadByte(sp,&o)==0) | |
| 1582 return(0); | |
| 1583 if (o!=8) | |
| 1584 { | |
| 1585 if (sp->subsamplingcorrect==0) | |
| 1586 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed
data indicates unexpected number of bits per sample"); | |
| 1587 return(0); | |
| 1588 } | |
| 1589 /* Y: Number of lines, X: Number of samples per line */ | |
| 1590 if (sp->subsamplingcorrect) | |
| 1591 OJPEGReadSkip(sp,4); | |
| 1592 else | |
| 1593 { | |
| 1594 /* Y: Number of lines */ | |
| 1595 if (OJPEGReadWord(sp,&p)==0) | |
| 1596 return(0); | |
| 1597 if (((uint32)p<sp->image_length) && ((uint32)p<sp->strile_length
_total)) | |
| 1598 { | |
| 1599 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed
data indicates unexpected height"); | |
| 1600 return(0); | |
| 1601 } | |
| 1602 sp->sof_y=p; | |
| 1603 /* X: Number of samples per line */ | |
| 1604 if (OJPEGReadWord(sp,&p)==0) | |
| 1605 return(0); | |
| 1606 if (((uint32)p<sp->image_width) && ((uint32)p<sp->strile_width)) | |
| 1607 { | |
| 1608 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed
data indicates unexpected width"); | |
| 1609 return(0); | |
| 1610 } | |
| 1611 if ((uint32)p>sp->strile_width) | |
| 1612 { | |
| 1613 TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed
data image width exceeds expected image width"); | |
| 1614 return(0); | |
| 1615 } | |
| 1616 sp->sof_x=p; | |
| 1617 } | |
| 1618 /* Nf: Number of image components in frame */ | |
| 1619 if (OJPEGReadByte(sp,&o)==0) | |
| 1620 return(0); | |
| 1621 if (o!=n) | |
| 1622 { | |
| 1623 if (sp->subsamplingcorrect==0) | |
| 1624 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF mar
ker in JPEG data"); | |
| 1625 return(0); | |
| 1626 } | |
| 1627 /* per component stuff */ | |
| 1628 /* TODO: double-check that flow implies that n cannot be as big as to ma
ke us overflow sof_c, sof_hv and sof_tq arrays */ | |
| 1629 for (q=0; q<n; q++) | |
| 1630 { | |
| 1631 /* C: Component identifier */ | |
| 1632 if (OJPEGReadByte(sp,&o)==0) | |
| 1633 return(0); | |
| 1634 if (sp->subsamplingcorrect==0) | |
| 1635 sp->sof_c[q]=o; | |
| 1636 /* H: Horizontal sampling factor, and V: Vertical sampling facto
r */ | |
| 1637 if (OJPEGReadByte(sp,&o)==0) | |
| 1638 return(0); | |
| 1639 if (sp->subsamplingcorrect!=0) | |
| 1640 { | |
| 1641 if (q==0) | |
| 1642 { | |
| 1643 sp->subsampling_hor=(o>>4); | |
| 1644 sp->subsampling_ver=(o&15); | |
| 1645 if (((sp->subsampling_hor!=1) && (sp->subsamplin
g_hor!=2) && (sp->subsampling_hor!=4)) || | |
| 1646 ((sp->subsampling_ver!=1) && (sp->subsam
pling_ver!=2) && (sp->subsampling_ver!=4))) | |
| 1647 sp->subsampling_force_desubsampling_insi
de_decompression=1; | |
| 1648 } | |
| 1649 else | |
| 1650 { | |
| 1651 if (o!=17) | |
| 1652 sp->subsampling_force_desubsampling_insi
de_decompression=1; | |
| 1653 } | |
| 1654 } | |
| 1655 else | |
| 1656 { | |
| 1657 sp->sof_hv[q]=o; | |
| 1658 if (sp->subsampling_force_desubsampling_inside_decompres
sion==0) | |
| 1659 { | |
| 1660 if (q==0) | |
| 1661 { | |
| 1662 if (o!=((sp->subsampling_hor<<4)|sp->sub
sampling_ver)) | |
| 1663 { | |
| 1664 TIFFErrorExt(tif->tif_clientdata
,module,"JPEG compressed data indicates unexpected subsampling values"); | |
| 1665 return(0); | |
| 1666 } | |
| 1667 } | |
| 1668 else | |
| 1669 { | |
| 1670 if (o!=17) | |
| 1671 { | |
| 1672 TIFFErrorExt(tif->tif_clientdata
,module,"JPEG compressed data indicates unexpected subsampling values"); | |
| 1673 return(0); | |
| 1674 } | |
| 1675 } | |
| 1676 } | |
| 1677 } | |
| 1678 /* Tq: Quantization table destination selector */ | |
| 1679 if (OJPEGReadByte(sp,&o)==0) | |
| 1680 return(0); | |
| 1681 if (sp->subsamplingcorrect==0) | |
| 1682 sp->sof_tq[q]=o; | |
| 1683 } | |
| 1684 if (sp->subsamplingcorrect==0) | |
| 1685 sp->sof_log=1; | |
| 1686 return(1); | |
| 1687 } | |
| 1688 | |
| 1689 static int | |
| 1690 OJPEGReadHeaderInfoSecStreamSos(TIFF* tif) | |
| 1691 { | |
| 1692 /* this marker needs to be checked, and part of its data needs to be sav
ed for regeneration later on */ | |
| 1693 static const char module[]="OJPEGReadHeaderInfoSecStreamSos"; | |
| 1694 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1695 uint16 m; | |
| 1696 uint8 n; | |
| 1697 uint8 o; | |
| 1698 assert(sp->subsamplingcorrect==0); | |
| 1699 if (sp->sof_log==0) | |
| 1700 { | |
| 1701 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in J
PEG data"); | |
| 1702 return(0); | |
| 1703 } | |
| 1704 /* Ls */ | |
| 1705 if (OJPEGReadWord(sp,&m)==0) | |
| 1706 return(0); | |
| 1707 if (m!=6+sp->samples_per_pixel_per_plane*2) | |
| 1708 { | |
| 1709 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in J
PEG data"); | |
| 1710 return(0); | |
| 1711 } | |
| 1712 /* Ns */ | |
| 1713 if (OJPEGReadByte(sp,&n)==0) | |
| 1714 return(0); | |
| 1715 if (n!=sp->samples_per_pixel_per_plane) | |
| 1716 { | |
| 1717 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in J
PEG data"); | |
| 1718 return(0); | |
| 1719 } | |
| 1720 /* Cs, Td, and Ta */ | |
| 1721 for (o=0; o<sp->samples_per_pixel_per_plane; o++) | |
| 1722 { | |
| 1723 /* Cs */ | |
| 1724 if (OJPEGReadByte(sp,&n)==0) | |
| 1725 return(0); | |
| 1726 sp->sos_cs[sp->plane_sample_offset+o]=n; | |
| 1727 /* Td and Ta */ | |
| 1728 if (OJPEGReadByte(sp,&n)==0) | |
| 1729 return(0); | |
| 1730 sp->sos_tda[sp->plane_sample_offset+o]=n; | |
| 1731 } | |
| 1732 /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, a
s per LibJpeg source */ | |
| 1733 OJPEGReadSkip(sp,3); | |
| 1734 return(1); | |
| 1735 } | |
| 1736 | |
| 1737 static int | |
| 1738 OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif) | |
| 1739 { | |
| 1740 static const char module[]="OJPEGReadHeaderInfoSecTablesQTable"; | |
| 1741 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1742 uint8 m; | |
| 1743 uint8 n; | |
| 1744 uint32 oa; | |
| 1745 uint8* ob; | |
| 1746 uint32 p; | |
| 1747 if (sp->qtable_offset[0]==0) | |
| 1748 { | |
| 1749 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); | |
| 1750 return(0); | |
| 1751 } | |
| 1752 sp->in_buffer_file_pos_log=0; | |
| 1753 for (m=0; m<sp->samples_per_pixel; m++) | |
| 1754 { | |
| 1755 if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m
]!=sp->qtable_offset[m-1]))) | |
| 1756 { | |
| 1757 for (n=0; n<m-1; n++) | |
| 1758 { | |
| 1759 if (sp->qtable_offset[m]==sp->qtable_offset[n]) | |
| 1760 { | |
| 1761 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegQTables tag value"); | |
| 1762 return(0); | |
| 1763 } | |
| 1764 } | |
| 1765 oa=sizeof(uint32)+69; | |
| 1766 ob = (uint8*)_TIFFmalloc(oa); // add (uint8*) cast | |
| 1767 if (ob==0) | |
| 1768 { | |
| 1769 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1770 return(0); | |
| 1771 } | |
| 1772 *(uint32*)ob=oa; | |
| 1773 ob[sizeof(uint32)]=255; | |
| 1774 ob[sizeof(uint32)+1]=JPEG_MARKER_DQT; | |
| 1775 ob[sizeof(uint32)+2]=0; | |
| 1776 ob[sizeof(uint32)+3]=67; | |
| 1777 ob[sizeof(uint32)+4]=m; | |
| 1778 TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); | |
| 1779 p=(uint32)TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); | |
| 1780 if (p!=64) | |
| 1781 return(0); | |
| 1782 sp->qtable[m]=ob; | |
| 1783 sp->sof_tq[m]=m; | |
| 1784 } | |
| 1785 else | |
| 1786 sp->sof_tq[m]=sp->sof_tq[m-1]; | |
| 1787 } | |
| 1788 return(1); | |
| 1789 } | |
| 1790 | |
| 1791 static int | |
| 1792 OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif) | |
| 1793 { | |
| 1794 static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable"; | |
| 1795 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1796 uint8 m; | |
| 1797 uint8 n; | |
| 1798 uint8 o[16]; | |
| 1799 uint32 p; | |
| 1800 uint32 q; | |
| 1801 uint32 ra; | |
| 1802 uint8* rb; | |
| 1803 if (sp->dctable_offset[0]==0) | |
| 1804 { | |
| 1805 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); | |
| 1806 return(0); | |
| 1807 } | |
| 1808 sp->in_buffer_file_pos_log=0; | |
| 1809 for (m=0; m<sp->samples_per_pixel; m++) | |
| 1810 { | |
| 1811 if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset
[m]!=sp->dctable_offset[m-1]))) | |
| 1812 { | |
| 1813 for (n=0; n<m-1; n++) | |
| 1814 { | |
| 1815 if (sp->dctable_offset[m]==sp->dctable_offset[n]
) | |
| 1816 { | |
| 1817 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegDcTables tag value"); | |
| 1818 return(0); | |
| 1819 } | |
| 1820 } | |
| 1821 TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); | |
| 1822 p=(uint32)TIFFReadFile(tif,o,16); | |
| 1823 if (p!=16) | |
| 1824 return(0); | |
| 1825 q=0; | |
| 1826 for (n=0; n<16; n++) | |
| 1827 q+=o[n]; | |
| 1828 ra=sizeof(uint32)+21+q; | |
| 1829 rb = (uint8*)_TIFFmalloc(ra); // add (uint8*) cast | |
| 1830 if (rb==0) | |
| 1831 { | |
| 1832 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1833 return(0); | |
| 1834 } | |
| 1835 *(uint32*)rb=ra; | |
| 1836 rb[sizeof(uint32)]=255; | |
| 1837 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | |
| 1838 rb[sizeof(uint32)+2]=((19+q)>>8); | |
| 1839 rb[sizeof(uint32)+3]=((19+q)&255); | |
| 1840 rb[sizeof(uint32)+4]=m; | |
| 1841 for (n=0; n<16; n++) | |
| 1842 rb[sizeof(uint32)+5+n]=o[n]; | |
| 1843 p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); | |
| 1844 if (p!=q) | |
| 1845 return(0); | |
| 1846 sp->dctable[m]=rb; | |
| 1847 sp->sos_tda[m]=(m<<4); | |
| 1848 } | |
| 1849 else | |
| 1850 sp->sos_tda[m]=sp->sos_tda[m-1]; | |
| 1851 } | |
| 1852 return(1); | |
| 1853 } | |
| 1854 | |
| 1855 static int | |
| 1856 OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif) | |
| 1857 { | |
| 1858 static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable"; | |
| 1859 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 1860 uint8 m; | |
| 1861 uint8 n; | |
| 1862 uint8 o[16]; | |
| 1863 uint32 p; | |
| 1864 uint32 q; | |
| 1865 uint32 ra; | |
| 1866 uint8* rb; | |
| 1867 if (sp->actable_offset[0]==0) | |
| 1868 { | |
| 1869 TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); | |
| 1870 return(0); | |
| 1871 } | |
| 1872 sp->in_buffer_file_pos_log=0; | |
| 1873 for (m=0; m<sp->samples_per_pixel; m++) | |
| 1874 { | |
| 1875 if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset
[m]!=sp->actable_offset[m-1]))) | |
| 1876 { | |
| 1877 for (n=0; n<m-1; n++) | |
| 1878 { | |
| 1879 if (sp->actable_offset[m]==sp->actable_offset[n]
) | |
| 1880 { | |
| 1881 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegAcTables tag value"); | |
| 1882 return(0); | |
| 1883 } | |
| 1884 } | |
| 1885 TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); | |
| 1886 p=(uint32)TIFFReadFile(tif,o,16); | |
| 1887 if (p!=16) | |
| 1888 return(0); | |
| 1889 q=0; | |
| 1890 for (n=0; n<16; n++) | |
| 1891 q+=o[n]; | |
| 1892 ra=sizeof(uint32)+21+q; | |
| 1893 rb = (uint8*)_TIFFmalloc(ra); // add (uint8*) cast | |
| 1894 if (rb==0) | |
| 1895 { | |
| 1896 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | |
| 1897 return(0); | |
| 1898 } | |
| 1899 *(uint32*)rb=ra; | |
| 1900 rb[sizeof(uint32)]=255; | |
| 1901 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | |
| 1902 rb[sizeof(uint32)+2]=((19+q)>>8); | |
| 1903 rb[sizeof(uint32)+3]=((19+q)&255); | |
| 1904 rb[sizeof(uint32)+4]=(16|m); | |
| 1905 for (n=0; n<16; n++) | |
| 1906 rb[sizeof(uint32)+5+n]=o[n]; | |
| 1907 p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); | |
| 1908 if (p!=q) | |
| 1909 return(0); | |
| 1910 sp->actable[m]=rb; | |
| 1911 sp->sos_tda[m]=(sp->sos_tda[m]|m); | |
| 1912 } | |
| 1913 else | |
| 1914 sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15)); | |
| 1915 } | |
| 1916 return(1); | |
| 1917 } | |
| 1918 | |
| 1919 static int | |
| 1920 OJPEGReadBufferFill(OJPEGState* sp) | |
| 1921 { | |
| 1922 uint16 m; | |
| 1923 tmsize_t n; | |
| 1924 /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFEr
rorExt or TIFFWarningExt should be made | |
| 1925 * in any other case, seek or read errors should be passed through */ | |
| 1926 do | |
| 1927 { | |
| 1928 if (sp->in_buffer_file_togo!=0) | |
| 1929 { | |
| 1930 if (sp->in_buffer_file_pos_log==0) | |
| 1931 { | |
| 1932 TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK
_SET); | |
| 1933 sp->in_buffer_file_pos_log=1; | |
| 1934 } | |
| 1935 m=OJPEG_BUFFER; | |
| 1936 if ((uint64)m>sp->in_buffer_file_togo) | |
| 1937 m=(uint16)sp->in_buffer_file_togo; | |
| 1938 n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m); | |
| 1939 if (n==0) | |
| 1940 return(0); | |
| 1941 assert(n>0); | |
| 1942 assert(n<=OJPEG_BUFFER); | |
| 1943 assert(n<65536); | |
| 1944 assert((uint64)n<=sp->in_buffer_file_togo); | |
| 1945 m=(uint16)n; | |
| 1946 sp->in_buffer_togo=m; | |
| 1947 sp->in_buffer_cur=sp->in_buffer; | |
| 1948 sp->in_buffer_file_togo-=m; | |
| 1949 sp->in_buffer_file_pos+=m; | |
| 1950 break; | |
| 1951 } | |
| 1952 sp->in_buffer_file_pos_log=0; | |
| 1953 switch(sp->in_buffer_source) | |
| 1954 { | |
| 1955 case osibsNotSetYet: | |
| 1956 if (sp->jpeg_interchange_format!=0) | |
| 1957 { | |
| 1958 sp->in_buffer_file_pos=sp->jpeg_intercha
nge_format; | |
| 1959 sp->in_buffer_file_togo=sp->jpeg_interch
ange_format_length; | |
| 1960 } | |
| 1961 sp->in_buffer_source=osibsJpegInterchangeFormat; | |
| 1962 break; | |
| 1963 case osibsJpegInterchangeFormat: | |
| 1964 sp->in_buffer_source=osibsStrile; | |
| 1965 case osibsStrile: | |
| 1966 if (!_TIFFFillStriles( sp->tif ) | |
| 1967 || sp->tif->tif_dir.td_stripoffset == NULL | |
| 1968 || sp->tif->tif_dir.td_stripbytecount == NUL
L) | |
| 1969 return 0; | |
| 1970 | |
| 1971 if (sp->in_buffer_next_strile==sp->in_buffer_str
ile_count) | |
| 1972 sp->in_buffer_source=osibsEof; | |
| 1973 else | |
| 1974 { | |
| 1975 sp->in_buffer_file_pos=sp->tif->tif_dir.
td_stripoffset[sp->in_buffer_next_strile]; | |
| 1976 if (sp->in_buffer_file_pos!=0) | |
| 1977 { | |
| 1978 if (sp->in_buffer_file_pos>=sp->
file_size) | |
| 1979 sp->in_buffer_file_pos=0
; | |
| 1980 else if (sp->tif->tif_dir.td_str
ipbytecount==NULL) | |
| 1981 sp->in_buffer_file_togo=
sp->file_size-sp->in_buffer_file_pos; | |
| 1982 else | |
| 1983 { | |
| 1984 if (sp->tif->tif_dir.td_
stripbytecount == 0) { | |
| 1985 TIFFErrorExt(sp-
>tif->tif_clientdata,sp->tif->tif_name,"Strip byte counts are missing"); | |
| 1986 return(0); | |
| 1987 } | |
| 1988 sp->in_buffer_file_togo=
sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile]; | |
| 1989 if (sp->in_buffer_file_t
ogo==0) | |
| 1990 sp->in_buffer_fi
le_pos=0; | |
| 1991 else if (sp->in_buffer_f
ile_pos+sp->in_buffer_file_togo>sp->file_size) | |
| 1992 sp->in_buffer_fi
le_togo=sp->file_size-sp->in_buffer_file_pos; | |
| 1993 } | |
| 1994 } | |
| 1995 sp->in_buffer_next_strile++; | |
| 1996 } | |
| 1997 break; | |
| 1998 default: | |
| 1999 return(0); | |
| 2000 } | |
| 2001 } while (1); | |
| 2002 return(1); | |
| 2003 } | |
| 2004 | |
| 2005 static int | |
| 2006 OJPEGReadByte(OJPEGState* sp, uint8* byte) | |
| 2007 { | |
| 2008 if (sp->in_buffer_togo==0) | |
| 2009 { | |
| 2010 if (OJPEGReadBufferFill(sp)==0) | |
| 2011 return(0); | |
| 2012 assert(sp->in_buffer_togo>0); | |
| 2013 } | |
| 2014 *byte=*(sp->in_buffer_cur); | |
| 2015 sp->in_buffer_cur++; | |
| 2016 sp->in_buffer_togo--; | |
| 2017 return(1); | |
| 2018 } | |
| 2019 | |
| 2020 static int | |
| 2021 OJPEGReadBytePeek(OJPEGState* sp, uint8* byte) | |
| 2022 { | |
| 2023 if (sp->in_buffer_togo==0) | |
| 2024 { | |
| 2025 if (OJPEGReadBufferFill(sp)==0) | |
| 2026 return(0); | |
| 2027 assert(sp->in_buffer_togo>0); | |
| 2028 } | |
| 2029 *byte=*(sp->in_buffer_cur); | |
| 2030 return(1); | |
| 2031 } | |
| 2032 | |
| 2033 static void | |
| 2034 OJPEGReadByteAdvance(OJPEGState* sp) | |
| 2035 { | |
| 2036 assert(sp->in_buffer_togo>0); | |
| 2037 sp->in_buffer_cur++; | |
| 2038 sp->in_buffer_togo--; | |
| 2039 } | |
| 2040 | |
| 2041 static int | |
| 2042 OJPEGReadWord(OJPEGState* sp, uint16* word) | |
| 2043 { | |
| 2044 uint8 m; | |
| 2045 if (OJPEGReadByte(sp,&m)==0) | |
| 2046 return(0); | |
| 2047 *word=(m<<8); | |
| 2048 if (OJPEGReadByte(sp,&m)==0) | |
| 2049 return(0); | |
| 2050 *word|=m; | |
| 2051 return(1); | |
| 2052 } | |
| 2053 | |
| 2054 static int | |
| 2055 OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) | |
| 2056 { | |
| 2057 uint16 mlen; | |
| 2058 uint8* mmem; | |
| 2059 uint16 n; | |
| 2060 assert(len>0); | |
| 2061 mlen=len; | |
| 2062 mmem = (uint8*)mem; // add (uint8*) cast | |
| 2063 do | |
| 2064 { | |
| 2065 if (sp->in_buffer_togo==0) | |
| 2066 { | |
| 2067 if (OJPEGReadBufferFill(sp)==0) | |
| 2068 return(0); | |
| 2069 assert(sp->in_buffer_togo>0); | |
| 2070 } | |
| 2071 n=mlen; | |
| 2072 if (n>sp->in_buffer_togo) | |
| 2073 n=sp->in_buffer_togo; | |
| 2074 _TIFFmemcpy(mmem,sp->in_buffer_cur,n); | |
| 2075 sp->in_buffer_cur+=n; | |
| 2076 sp->in_buffer_togo-=n; | |
| 2077 mlen-=n; | |
| 2078 mmem+=n; | |
| 2079 } while(mlen>0); | |
| 2080 return(1); | |
| 2081 } | |
| 2082 | |
| 2083 static void | |
| 2084 OJPEGReadSkip(OJPEGState* sp, uint16 len) | |
| 2085 { | |
| 2086 uint16 m; | |
| 2087 uint16 n; | |
| 2088 m=len; | |
| 2089 n=m; | |
| 2090 if (n>sp->in_buffer_togo) | |
| 2091 n=sp->in_buffer_togo; | |
| 2092 sp->in_buffer_cur+=n; | |
| 2093 sp->in_buffer_togo-=n; | |
| 2094 m-=n; | |
| 2095 if (m>0) | |
| 2096 { | |
| 2097 assert(sp->in_buffer_togo==0); | |
| 2098 n=m; | |
| 2099 if ((uint64)n>sp->in_buffer_file_togo) | |
| 2100 n=(uint16)sp->in_buffer_file_togo; | |
| 2101 sp->in_buffer_file_pos+=n; | |
| 2102 sp->in_buffer_file_togo-=n; | |
| 2103 sp->in_buffer_file_pos_log=0; | |
| 2104 /* we don't skip past jpeginterchangeformat/strile block... | |
| 2105 * if that is asked from us, we're dealing with totally bazurk | |
| 2106 * data anyway, and we've not seen this happening on any | |
| 2107 * testfile, so we might as well likely cause some other | |
| 2108 * meaningless error to be passed at some later time | |
| 2109 */ | |
| 2110 } | |
| 2111 } | |
| 2112 | |
| 2113 static int | |
| 2114 OJPEGWriteStream(TIFF* tif, void** mem, uint32* len) | |
| 2115 { | |
| 2116 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2117 *len=0; | |
| 2118 do | |
| 2119 { | |
| 2120 assert(sp->out_state<=ososEoi); | |
| 2121 switch(sp->out_state) | |
| 2122 { | |
| 2123 case ososSoi: | |
| 2124 OJPEGWriteStreamSoi(tif,mem,len); | |
| 2125 break; | |
| 2126 case ososQTable0: | |
| 2127 OJPEGWriteStreamQTable(tif,0,mem,len); | |
| 2128 break; | |
| 2129 case ososQTable1: | |
| 2130 OJPEGWriteStreamQTable(tif,1,mem,len); | |
| 2131 break; | |
| 2132 case ososQTable2: | |
| 2133 OJPEGWriteStreamQTable(tif,2,mem,len); | |
| 2134 break; | |
| 2135 case ososQTable3: | |
| 2136 OJPEGWriteStreamQTable(tif,3,mem,len); | |
| 2137 break; | |
| 2138 case ososDcTable0: | |
| 2139 OJPEGWriteStreamDcTable(tif,0,mem,len); | |
| 2140 break; | |
| 2141 case ososDcTable1: | |
| 2142 OJPEGWriteStreamDcTable(tif,1,mem,len); | |
| 2143 break; | |
| 2144 case ososDcTable2: | |
| 2145 OJPEGWriteStreamDcTable(tif,2,mem,len); | |
| 2146 break; | |
| 2147 case ososDcTable3: | |
| 2148 OJPEGWriteStreamDcTable(tif,3,mem,len); | |
| 2149 break; | |
| 2150 case ososAcTable0: | |
| 2151 OJPEGWriteStreamAcTable(tif,0,mem,len); | |
| 2152 break; | |
| 2153 case ososAcTable1: | |
| 2154 OJPEGWriteStreamAcTable(tif,1,mem,len); | |
| 2155 break; | |
| 2156 case ososAcTable2: | |
| 2157 OJPEGWriteStreamAcTable(tif,2,mem,len); | |
| 2158 break; | |
| 2159 case ososAcTable3: | |
| 2160 OJPEGWriteStreamAcTable(tif,3,mem,len); | |
| 2161 break; | |
| 2162 case ososDri: | |
| 2163 OJPEGWriteStreamDri(tif,mem,len); | |
| 2164 break; | |
| 2165 case ososSof: | |
| 2166 OJPEGWriteStreamSof(tif,mem,len); | |
| 2167 break; | |
| 2168 case ososSos: | |
| 2169 OJPEGWriteStreamSos(tif,mem,len); | |
| 2170 break; | |
| 2171 case ososCompressed: | |
| 2172 if (OJPEGWriteStreamCompressed(tif,mem,len)==0) | |
| 2173 return(0); | |
| 2174 break; | |
| 2175 case ososRst: | |
| 2176 OJPEGWriteStreamRst(tif,mem,len); | |
| 2177 break; | |
| 2178 case ososEoi: | |
| 2179 OJPEGWriteStreamEoi(tif,mem,len); | |
| 2180 break; | |
| 2181 } | |
| 2182 } while (*len==0); | |
| 2183 return(1); | |
| 2184 } | |
| 2185 | |
| 2186 static void | |
| 2187 OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len) | |
| 2188 { | |
| 2189 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2190 assert(OJPEG_BUFFER>=2); | |
| 2191 sp->out_buffer[0]=255; | |
| 2192 sp->out_buffer[1]=JPEG_MARKER_SOI; | |
| 2193 *len=2; | |
| 2194 *mem=(void*)sp->out_buffer; | |
| 2195 sp->out_state++; | |
| 2196 } | |
| 2197 | |
| 2198 static void | |
| 2199 OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) | |
| 2200 { | |
| 2201 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2202 if (sp->qtable[table_index]!=0) | |
| 2203 { | |
| 2204 *mem=(void*)(sp->qtable[table_index]+sizeof(uint32)); | |
| 2205 *len=*((uint32*)sp->qtable[table_index])-sizeof(uint32); | |
| 2206 } | |
| 2207 sp->out_state++; | |
| 2208 } | |
| 2209 | |
| 2210 static void | |
| 2211 OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) | |
| 2212 { | |
| 2213 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2214 if (sp->dctable[table_index]!=0) | |
| 2215 { | |
| 2216 *mem=(void*)(sp->dctable[table_index]+sizeof(uint32)); | |
| 2217 *len=*((uint32*)sp->dctable[table_index])-sizeof(uint32); | |
| 2218 } | |
| 2219 sp->out_state++; | |
| 2220 } | |
| 2221 | |
| 2222 static void | |
| 2223 OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) | |
| 2224 { | |
| 2225 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2226 if (sp->actable[table_index]!=0) | |
| 2227 { | |
| 2228 *mem=(void*)(sp->actable[table_index]+sizeof(uint32)); | |
| 2229 *len=*((uint32*)sp->actable[table_index])-sizeof(uint32); | |
| 2230 } | |
| 2231 sp->out_state++; | |
| 2232 } | |
| 2233 | |
| 2234 static void | |
| 2235 OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len) | |
| 2236 { | |
| 2237 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2238 assert(OJPEG_BUFFER>=6); | |
| 2239 if (sp->restart_interval!=0) | |
| 2240 { | |
| 2241 sp->out_buffer[0]=255; | |
| 2242 sp->out_buffer[1]=JPEG_MARKER_DRI; | |
| 2243 sp->out_buffer[2]=0; | |
| 2244 sp->out_buffer[3]=4; | |
| 2245 sp->out_buffer[4]=(sp->restart_interval>>8); | |
| 2246 sp->out_buffer[5]=(sp->restart_interval&255); | |
| 2247 *len=6; | |
| 2248 *mem=(void*)sp->out_buffer; | |
| 2249 } | |
| 2250 sp->out_state++; | |
| 2251 } | |
| 2252 | |
| 2253 static void | |
| 2254 OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len) | |
| 2255 { | |
| 2256 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2257 uint8 m; | |
| 2258 assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3); | |
| 2259 assert(255>=8+sp->samples_per_pixel_per_plane*3); | |
| 2260 sp->out_buffer[0]=255; | |
| 2261 sp->out_buffer[1]=sp->sof_marker_id; | |
| 2262 /* Lf */ | |
| 2263 sp->out_buffer[2]=0; | |
| 2264 sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3; | |
| 2265 /* P */ | |
| 2266 sp->out_buffer[4]=8; | |
| 2267 /* Y */ | |
| 2268 sp->out_buffer[5]=(sp->sof_y>>8); | |
| 2269 sp->out_buffer[6]=(sp->sof_y&255); | |
| 2270 /* X */ | |
| 2271 sp->out_buffer[7]=(sp->sof_x>>8); | |
| 2272 sp->out_buffer[8]=(sp->sof_x&255); | |
| 2273 /* Nf */ | |
| 2274 sp->out_buffer[9]=sp->samples_per_pixel_per_plane; | |
| 2275 for (m=0; m<sp->samples_per_pixel_per_plane; m++) | |
| 2276 { | |
| 2277 /* C */ | |
| 2278 sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m]; | |
| 2279 /* H and V */ | |
| 2280 sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m]; | |
| 2281 /* Tq */ | |
| 2282 sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m]; | |
| 2283 } | |
| 2284 *len=10+sp->samples_per_pixel_per_plane*3; | |
| 2285 *mem=(void*)sp->out_buffer; | |
| 2286 sp->out_state++; | |
| 2287 } | |
| 2288 | |
| 2289 static void | |
| 2290 OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len) | |
| 2291 { | |
| 2292 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2293 uint8 m; | |
| 2294 assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2); | |
| 2295 assert(255>=6+sp->samples_per_pixel_per_plane*2); | |
| 2296 sp->out_buffer[0]=255; | |
| 2297 sp->out_buffer[1]=JPEG_MARKER_SOS; | |
| 2298 /* Ls */ | |
| 2299 sp->out_buffer[2]=0; | |
| 2300 sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2; | |
| 2301 /* Ns */ | |
| 2302 sp->out_buffer[4]=sp->samples_per_pixel_per_plane; | |
| 2303 for (m=0; m<sp->samples_per_pixel_per_plane; m++) | |
| 2304 { | |
| 2305 /* Cs */ | |
| 2306 sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m]; | |
| 2307 /* Td and Ta */ | |
| 2308 sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m]; | |
| 2309 } | |
| 2310 /* Ss */ | |
| 2311 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0; | |
| 2312 /* Se */ | |
| 2313 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63; | |
| 2314 /* Ah and Al */ | |
| 2315 sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0; | |
| 2316 *len=8+sp->samples_per_pixel_per_plane*2; | |
| 2317 *mem=(void*)sp->out_buffer; | |
| 2318 sp->out_state++; | |
| 2319 } | |
| 2320 | |
| 2321 static int | |
| 2322 OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len) | |
| 2323 { | |
| 2324 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2325 if (sp->in_buffer_togo==0) | |
| 2326 { | |
| 2327 if (OJPEGReadBufferFill(sp)==0) | |
| 2328 return(0); | |
| 2329 assert(sp->in_buffer_togo>0); | |
| 2330 } | |
| 2331 *len=sp->in_buffer_togo; | |
| 2332 *mem=(void*)sp->in_buffer_cur; | |
| 2333 sp->in_buffer_togo=0; | |
| 2334 if (sp->in_buffer_file_togo==0) | |
| 2335 { | |
| 2336 switch(sp->in_buffer_source) | |
| 2337 { | |
| 2338 case osibsStrile: | |
| 2339 if (sp->in_buffer_next_strile<sp->in_buffer_stri
le_count) | |
| 2340 sp->out_state=ososRst; | |
| 2341 else | |
| 2342 sp->out_state=ososEoi; | |
| 2343 break; | |
| 2344 case osibsEof: | |
| 2345 sp->out_state=ososEoi; | |
| 2346 break; | |
| 2347 default: | |
| 2348 break; | |
| 2349 } | |
| 2350 } | |
| 2351 return(1); | |
| 2352 } | |
| 2353 | |
| 2354 static void | |
| 2355 OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len) | |
| 2356 { | |
| 2357 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2358 assert(OJPEG_BUFFER>=2); | |
| 2359 sp->out_buffer[0]=255; | |
| 2360 sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index; | |
| 2361 sp->restart_index++; | |
| 2362 if (sp->restart_index==8) | |
| 2363 sp->restart_index=0; | |
| 2364 *len=2; | |
| 2365 *mem=(void*)sp->out_buffer; | |
| 2366 sp->out_state=ososCompressed; | |
| 2367 } | |
| 2368 | |
| 2369 static void | |
| 2370 OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len) | |
| 2371 { | |
| 2372 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2373 assert(OJPEG_BUFFER>=2); | |
| 2374 sp->out_buffer[0]=255; | |
| 2375 sp->out_buffer[1]=JPEG_MARKER_EOI; | |
| 2376 *len=2; | |
| 2377 *mem=(void*)sp->out_buffer; | |
| 2378 } | |
| 2379 | |
| 2380 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2381 static int | |
| 2382 jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) | |
| 2383 { | |
| 2384 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_create_decompress(cinfo),1)); | |
| 2385 } | |
| 2386 #endif | |
| 2387 | |
| 2388 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2389 static int | |
| 2390 jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 requ
ire_image) | |
| 2391 { | |
| 2392 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_header(cinfo,require_image),
1)); | |
| 2393 } | |
| 2394 #endif | |
| 2395 | |
| 2396 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2397 static int | |
| 2398 jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) | |
| 2399 { | |
| 2400 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_start_decompress(cinfo),1)); | |
| 2401 } | |
| 2402 #endif | |
| 2403 | |
| 2404 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2405 static int | |
| 2406 jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* s
canlines, uint32 max_lines) | |
| 2407 { | |
| 2408 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_scanlines(cinfo,scanlines,ma
x_lines),1)); | |
| 2409 } | |
| 2410 #endif | |
| 2411 | |
| 2412 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2413 static int | |
| 2414 jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* da
ta, uint32 max_lines) | |
| 2415 { | |
| 2416 return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_raw_data(cinfo,data,max_line
s),1)); | |
| 2417 } | |
| 2418 #endif | |
| 2419 | |
| 2420 #ifndef LIBJPEG_ENCAP_EXTERNAL | |
| 2421 static void | |
| 2422 jpeg_encap_unwind(TIFF* tif) | |
| 2423 { | |
| 2424 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2425 LONGJMP(sp->exit_jmpbuf,1); | |
| 2426 } | |
| 2427 #endif | |
| 2428 | |
| 2429 static void | |
| 2430 OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo) | |
| 2431 { | |
| 2432 char buffer[JMSG_LENGTH_MAX]; | |
| 2433 (*cinfo->err->format_message)(cinfo,buffer); | |
| 2434 TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","
%s",buffer); | |
| 2435 } | |
| 2436 | |
| 2437 static void | |
| 2438 OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo) | |
| 2439 { | |
| 2440 char buffer[JMSG_LENGTH_MAX]; | |
| 2441 (*cinfo->err->format_message)(cinfo,buffer); | |
| 2442 TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s
",buffer); | |
| 2443 jpeg_encap_unwind((TIFF*)(cinfo->client_data)); | |
| 2444 } | |
| 2445 | |
| 2446 static void | |
| 2447 OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo) | |
| 2448 { | |
| 2449 (void)cinfo; | |
| 2450 } | |
| 2451 | |
| 2452 static boolean | |
| 2453 OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo) | |
| 2454 { | |
| 2455 TIFF* tif=(TIFF*)cinfo->client_data; | |
| 2456 OJPEGState* sp=(OJPEGState*)tif->tif_data; | |
| 2457 void* mem=0; | |
| 2458 uint32 len=0U; | |
| 2459 if (OJPEGWriteStream(tif,&mem,&len)==0) | |
| 2460 { | |
| 2461 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPE
G data"); | |
| 2462 jpeg_encap_unwind(tif); | |
| 2463 } | |
| 2464 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer = len; | |
| 2465 sp->libjpeg_jpeg_source_mgr.next_input_byte = (const JOCTET * )mem;
// add (const JOCTET * ) cast | |
| 2466 return(1); | |
| 2467 } | |
| 2468 | |
| 2469 static void | |
| 2470 OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_b
ytes) | |
| 2471 { | |
| 2472 TIFF* tif=(TIFF*)cinfo->client_data; | |
| 2473 (void)num_bytes; | |
| 2474 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); | |
| 2475 jpeg_encap_unwind(tif); | |
| 2476 } | |
| 2477 | |
| 2478 static boolean | |
| 2479 OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desi
red) | |
| 2480 { | |
| 2481 TIFF* tif=(TIFF*)cinfo->client_data; | |
| 2482 (void)desired; | |
| 2483 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); | |
| 2484 jpeg_encap_unwind(tif); | |
| 2485 return(0); | |
| 2486 } | |
| 2487 | |
| 2488 static void | |
| 2489 OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo) | |
| 2490 { | |
| 2491 (void)cinfo; | |
| 2492 } | |
| 2493 | |
| 2494 #endif | |
| 2495 | |
| 2496 | |
| 2497 /* | |
| 2498 * Local Variables: | |
| 2499 * mode: c | |
| 2500 * c-basic-offset: 8 | |
| 2501 * fill-column: 78 | |
| 2502 * End: | |
| 2503 */ | |
| 2504 | |
| OLD | NEW |