opj_thread_pool_setup(): fix infinite waiting if a thread creation failed
[openjpeg.git] / thirdparty / libtiff / tif_zip.c
1 /* $Id: tif_zip.c,v 1.33 2014-12-25 18:29:11 erouault Exp $ */
2
3 /*
4  * Copyright (c) 1995-1997 Sam Leffler
5  * Copyright (c) 1995-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and 
8  * its documentation for any purpose is hereby granted without fee, provided
9  * that (i) the above copyright notices and this permission notice appear in
10  * all copies of the software and related documentation, and (ii) the names of
11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  * 
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
18  * 
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
24  * OF THIS SOFTWARE.
25  */
26
27 #include "tiffiop.h"
28 #ifdef ZIP_SUPPORT
29 /*
30  * TIFF Library.
31  *
32  * ZIP (aka Deflate) Compression Support
33  *
34  * This file is simply an interface to the zlib library written by
35  * Jean-loup Gailly and Mark Adler.  You must use version 1.0 or later
36  * of the library: this code assumes the 1.0 API and also depends on
37  * the ability to write the zlib header multiple times (one per strip)
38  * which was not possible with versions prior to 0.95.  Note also that
39  * older versions of this codec avoided this bug by suppressing the header
40  * entirely.  This means that files written with the old library cannot
41  * be read; they should be converted to a different compression scheme
42  * and then reconverted.
43  *
44  * The data format used by the zlib library is described in the files
45  * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the
46  * directory ftp://ftp.uu.net/pub/archiving/zip/doc.  The library was
47  * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz.
48  */
49 #include "tif_predict.h"
50 #include "zlib.h"
51
52 #include <stdio.h>
53
54 /*
55  * Sigh, ZLIB_VERSION is defined as a string so there's no
56  * way to do a proper check here.  Instead we guess based
57  * on the presence of #defines that were added between the
58  * 0.95 and 1.0 distributions.
59  */
60 #if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED)
61 #error "Antiquated ZLIB software; you must use version 1.0 or later"
62 #endif
63
64 #define SAFE_MSG(sp)   ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg)
65
66 /*
67  * State block for each open TIFF
68  * file using ZIP compression/decompression.
69  */
70 typedef struct {
71         TIFFPredictorState predict;
72         z_stream        stream;
73         int             zipquality;            /* compression level */
74         int             state;                 /* state flags */
75 #define ZSTATE_INIT_DECODE 0x01
76 #define ZSTATE_INIT_ENCODE 0x02
77
78         TIFFVGetMethod  vgetparent;            /* super-class method */
79         TIFFVSetMethod  vsetparent;            /* super-class method */
80 } ZIPState;
81
82 #define ZState(tif)             ((ZIPState*) (tif)->tif_data)
83 #define DecoderState(tif)       ZState(tif)
84 #define EncoderState(tif)       ZState(tif)
85
86 static int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
87 static int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
88
89 static int
90 ZIPFixupTags(TIFF* tif)
91 {
92         (void) tif;
93         return (1);
94 }
95
96 static int
97 ZIPSetupDecode(TIFF* tif)
98 {
99         static const char module[] = "ZIPSetupDecode";
100         ZIPState* sp = DecoderState(tif);
101
102         assert(sp != NULL);
103         
104         /* if we were last encoding, terminate this mode */
105         if (sp->state & ZSTATE_INIT_ENCODE) {
106             deflateEnd(&sp->stream);
107             sp->state = 0;
108         }
109
110         if (inflateInit(&sp->stream) != Z_OK) {
111                 TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
112                 return (0);
113         } else {
114                 sp->state |= ZSTATE_INIT_DECODE;
115                 return (1);
116         }
117 }
118
119 /*
120  * Setup state for decoding a strip.
121  */
122 static int
123 ZIPPreDecode(TIFF* tif, uint16 s)
124 {
125         static const char module[] = "ZIPPreDecode";
126         ZIPState* sp = DecoderState(tif);
127
128         (void) s;
129         assert(sp != NULL);
130
131         if( (sp->state & ZSTATE_INIT_DECODE) == 0 )
132             tif->tif_setupdecode( tif );
133
134         sp->stream.next_in = tif->tif_rawdata;
135         assert(sizeof(sp->stream.avail_in)==4);  /* if this assert gets raised,
136             we need to simplify this code to reflect a ZLib that is likely updated
137             to deal with 8byte memory sizes, though this code will respond
138             apropriately even before we simplify it */
139         sp->stream.avail_in = (uInt) tif->tif_rawcc;
140         if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
141         {
142                 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
143                 return (0);
144         }
145         return (inflateReset(&sp->stream) == Z_OK);
146 }
147
148 static int
149 ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
150 {
151         static const char module[] = "ZIPDecode";
152         ZIPState* sp = DecoderState(tif);
153
154         (void) s;
155         assert(sp != NULL);
156         assert(sp->state == ZSTATE_INIT_DECODE);
157
158         sp->stream.next_in = tif->tif_rawcp;
159         sp->stream.avail_in = (uInt) tif->tif_rawcc;
160         
161         sp->stream.next_out = op;
162         assert(sizeof(sp->stream.avail_out)==4);  /* if this assert gets raised,
163             we need to simplify this code to reflect a ZLib that is likely updated
164             to deal with 8byte memory sizes, though this code will respond
165             apropriately even before we simplify it */
166         sp->stream.avail_out = (uInt) occ;
167         if ((tmsize_t)sp->stream.avail_out != occ)
168         {
169                 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
170                 return (0);
171         }
172         do {
173                 int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
174                 if (state == Z_STREAM_END)
175                         break;
176                 if (state == Z_DATA_ERROR) {
177                         TIFFErrorExt(tif->tif_clientdata, module,
178                             "Decoding error at scanline %lu, %s",
179                              (unsigned long) tif->tif_row, SAFE_MSG(sp));
180                         if (inflateSync(&sp->stream) != Z_OK)
181                                 return (0);
182                         continue;
183                 }
184                 if (state != Z_OK) {
185                         TIFFErrorExt(tif->tif_clientdata, module, 
186                                      "ZLib error: %s", SAFE_MSG(sp));
187                         return (0);
188                 }
189         } while (sp->stream.avail_out > 0);
190         if (sp->stream.avail_out != 0) {
191                 TIFFErrorExt(tif->tif_clientdata, module,
192                     "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)",
193                     (unsigned long) tif->tif_row, (TIFF_UINT64_T) sp->stream.avail_out);
194                 return (0);
195         }
196
197         tif->tif_rawcp = sp->stream.next_in;
198         tif->tif_rawcc = sp->stream.avail_in;
199
200         return (1);
201 }
202
203 static int
204 ZIPSetupEncode(TIFF* tif)
205 {
206         static const char module[] = "ZIPSetupEncode";
207         ZIPState* sp = EncoderState(tif);
208
209         assert(sp != NULL);
210         if (sp->state & ZSTATE_INIT_DECODE) {
211                 inflateEnd(&sp->stream);
212                 sp->state = 0;
213         }
214
215         if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) {
216                 TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
217                 return (0);
218         } else {
219                 sp->state |= ZSTATE_INIT_ENCODE;
220                 return (1);
221         }
222 }
223
224 /*
225  * Reset encoding state at the start of a strip.
226  */
227 static int
228 ZIPPreEncode(TIFF* tif, uint16 s)
229 {
230         static const char module[] = "ZIPPreEncode";
231         ZIPState *sp = EncoderState(tif);
232
233         (void) s;
234         assert(sp != NULL);
235         if( sp->state != ZSTATE_INIT_ENCODE )
236             tif->tif_setupencode( tif );
237
238         sp->stream.next_out = tif->tif_rawdata;
239         assert(sizeof(sp->stream.avail_out)==4);  /* if this assert gets raised,
240             we need to simplify this code to reflect a ZLib that is likely updated
241             to deal with 8byte memory sizes, though this code will respond
242             apropriately even before we simplify it */
243         sp->stream.avail_out = tif->tif_rawdatasize;
244         if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
245         {
246                 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
247                 return (0);
248         }
249         return (deflateReset(&sp->stream) == Z_OK);
250 }
251
252 /*
253  * Encode a chunk of pixels.
254  */
255 static int
256 ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
257 {
258         static const char module[] = "ZIPEncode";
259         ZIPState *sp = EncoderState(tif);
260
261         assert(sp != NULL);
262         assert(sp->state == ZSTATE_INIT_ENCODE);
263
264         (void) s;
265         sp->stream.next_in = bp;
266         assert(sizeof(sp->stream.avail_in)==4);  /* if this assert gets raised,
267             we need to simplify this code to reflect a ZLib that is likely updated
268             to deal with 8byte memory sizes, though this code will respond
269             apropriately even before we simplify it */
270         sp->stream.avail_in = (uInt) cc;
271         if ((tmsize_t)sp->stream.avail_in != cc)
272         {
273                 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
274                 return (0);
275         }
276         do {
277                 if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
278                         TIFFErrorExt(tif->tif_clientdata, module, 
279                                      "Encoder error: %s",
280                                      SAFE_MSG(sp));
281                         return (0);
282                 }
283                 if (sp->stream.avail_out == 0) {
284                         tif->tif_rawcc = tif->tif_rawdatasize;
285                         TIFFFlushData1(tif);
286                         sp->stream.next_out = tif->tif_rawdata;
287                         sp->stream.avail_out = (uInt) tif->tif_rawdatasize;  /* this is a safe typecast, as check is made already in ZIPPreEncode */
288                 }
289         } while (sp->stream.avail_in > 0);
290         return (1);
291 }
292
293 /*
294  * Finish off an encoded strip by flushing the last
295  * string and tacking on an End Of Information code.
296  */
297 static int
298 ZIPPostEncode(TIFF* tif)
299 {
300         static const char module[] = "ZIPPostEncode";
301         ZIPState *sp = EncoderState(tif);
302         int state;
303
304         sp->stream.avail_in = 0;
305         do {
306                 state = deflate(&sp->stream, Z_FINISH);
307                 switch (state) {
308                 case Z_STREAM_END:
309                 case Z_OK:
310                         if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
311                         {
312                                 tif->tif_rawcc =  tif->tif_rawdatasize - sp->stream.avail_out;
313                                 TIFFFlushData1(tif);
314                                 sp->stream.next_out = tif->tif_rawdata;
315                                 sp->stream.avail_out = (uInt) tif->tif_rawdatasize;  /* this is a safe typecast, as check is made already in ZIPPreEncode */
316                         }
317                         break;
318                 default:
319                         TIFFErrorExt(tif->tif_clientdata, module, 
320                                      "ZLib error: %s", SAFE_MSG(sp));
321                         return (0);
322                 }
323         } while (state != Z_STREAM_END);
324         return (1);
325 }
326
327 static void
328 ZIPCleanup(TIFF* tif)
329 {
330         ZIPState* sp = ZState(tif);
331
332         assert(sp != 0);
333
334         (void)TIFFPredictorCleanup(tif);
335
336         tif->tif_tagmethods.vgetfield = sp->vgetparent;
337         tif->tif_tagmethods.vsetfield = sp->vsetparent;
338
339         if (sp->state & ZSTATE_INIT_ENCODE) {
340                 deflateEnd(&sp->stream);
341                 sp->state = 0;
342         } else if( sp->state & ZSTATE_INIT_DECODE) {
343                 inflateEnd(&sp->stream);
344                 sp->state = 0;
345         }
346         _TIFFfree(sp);
347         tif->tif_data = NULL;
348
349         _TIFFSetDefaultCompressionState(tif);
350 }
351
352 static int
353 ZIPVSetField(TIFF* tif, uint32 tag, va_list ap)
354 {
355         static const char module[] = "ZIPVSetField";
356         ZIPState* sp = ZState(tif);
357
358         switch (tag) {
359         case TIFFTAG_ZIPQUALITY:
360                 sp->zipquality = (int) va_arg(ap, int);
361                 if ( sp->state&ZSTATE_INIT_ENCODE ) {
362                         if (deflateParams(&sp->stream,
363                             sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) {
364                                 TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
365                                              SAFE_MSG(sp));
366                                 return (0);
367                         }
368                 }
369                 return (1);
370         default:
371                 return (*sp->vsetparent)(tif, tag, ap);
372         }
373         /*NOTREACHED*/
374 }
375
376 static int
377 ZIPVGetField(TIFF* tif, uint32 tag, va_list ap)
378 {
379         ZIPState* sp = ZState(tif);
380
381         switch (tag) {
382         case TIFFTAG_ZIPQUALITY:
383                 *va_arg(ap, int*) = sp->zipquality;
384                 break;
385         default:
386                 return (*sp->vgetparent)(tif, tag, ap);
387         }
388         return (1);
389 }
390
391 static const TIFFField zipFields[] = {
392     { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
393 };
394
395 int
396 TIFFInitZIP(TIFF* tif, int scheme)
397 {
398         static const char module[] = "TIFFInitZIP";
399         ZIPState* sp;
400
401         assert( (scheme == COMPRESSION_DEFLATE)
402                 || (scheme == COMPRESSION_ADOBE_DEFLATE));
403
404         /*
405          * Merge codec-specific tag information.
406          */
407         if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields))) {
408                 TIFFErrorExt(tif->tif_clientdata, module,
409                              "Merging Deflate codec-specific tags failed");
410                 return 0;
411         }
412
413         /*
414          * Allocate state block so tag methods have storage to record values.
415          */
416         tif->tif_data = (uint8*) _TIFFmalloc(sizeof (ZIPState));
417         if (tif->tif_data == NULL)
418                 goto bad;
419         sp = ZState(tif);
420         sp->stream.zalloc = NULL;
421         sp->stream.zfree = NULL;
422         sp->stream.opaque = NULL;
423         sp->stream.data_type = Z_BINARY;
424
425         /*
426          * Override parent get/set field methods.
427          */
428         sp->vgetparent = tif->tif_tagmethods.vgetfield;
429         tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */
430         sp->vsetparent = tif->tif_tagmethods.vsetfield;
431         tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */
432
433         /* Default values for codec-specific fields */
434         sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
435         sp->state = 0;
436
437         /*
438          * Install codec methods.
439          */
440         tif->tif_fixuptags = ZIPFixupTags; 
441         tif->tif_setupdecode = ZIPSetupDecode;
442         tif->tif_predecode = ZIPPreDecode;
443         tif->tif_decoderow = ZIPDecode;
444         tif->tif_decodestrip = ZIPDecode;
445         tif->tif_decodetile = ZIPDecode;  
446         tif->tif_setupencode = ZIPSetupEncode;
447         tif->tif_preencode = ZIPPreEncode;
448         tif->tif_postencode = ZIPPostEncode;
449         tif->tif_encoderow = ZIPEncode;
450         tif->tif_encodestrip = ZIPEncode;
451         tif->tif_encodetile = ZIPEncode;
452         tif->tif_cleanup = ZIPCleanup;
453         /*
454          * Setup predictor setup.
455          */
456         (void) TIFFPredictorInit(tif);
457         return (1);
458 bad:
459         TIFFErrorExt(tif->tif_clientdata, module,
460                      "No space for ZIP state block");
461         return (0);
462 }
463 #endif /* ZIP_SUPORT */
464
465 /* vim: set ts=8 sts=8 sw=8 noet: */
466 /*
467  * Local Variables:
468  * mode: c
469  * c-basic-offset: 8
470  * fill-column: 78
471  * End:
472  */