OLD | NEW |
1 /* $Id: tif_ojpeg.c,v 1.56 2012-05-24 03:15:18 fwarmerdam Exp $ */ | 1 /* $Id: tif_ojpeg.c,v 1.60 2015-05-31 00:38:46 bfriesen Exp $ */ |
2 | 2 |
3 /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 | 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 | 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 | 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 | 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 | 7 to write such files. Writing new-style JPEG compressed TIFFs is implemented |
8 in tif_jpeg.c. | 8 in tif_jpeg.c. |
9 | 9 |
10 The code is carefully crafted to robustly read all gathered JPEG-in-TIFF | 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 | 11 testfiles, and anticipate as much as possible all other... But still, it may |
(...skipping 20 matching lines...) Expand all Loading... |
32 library. | 32 library. |
33 | 33 |
34 IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR | 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, | 35 ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, |
36 OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 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 | 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 | 38 LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
39 OF THIS SOFTWARE. | 39 OF THIS SOFTWARE. |
40 | 40 |
41 Joris Van Damme and/or AWare Systems may be available for custom | 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, | 42 development. If you like what you see, and need anything similar or related, |
43 contact <info@awaresystems.be>. | 43 contact <info@awaresystems.be>. |
44 */ | 44 */ |
45 | 45 |
46 /* What is what, and what is not? | 46 /* What is what, and what is not? |
47 | 47 |
48 This decoder starts with an input stream, that is essentially the JpegInterch
angeFormat | 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 | 49 stream, if any, followed by the strile data, if any. This stream is read in |
50 OJPEGReadByte and related functions. | 50 OJPEGReadByte and related functions. |
51 | 51 |
52 It analyzes the start of this stream, until it encounters non-marker data, i.
e. | 52 It analyzes the start of this stream, until it encounters non-marker data, i.
e. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 planarconfig is not separate (vast majority). We may one day use that to buil
d | 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. | 114 converters to JPEG, and/or to new-style JPEG compression inside TIFF. |
115 | 115 |
116 A dissadvantage is the lack of random access to the individual striles. This
is the | 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. | 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 | 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 | 119 a single sequential scan of the input stream, and no restarting of LibJpeg de
coding |
120 session. | 120 session. |
121 */ | 121 */ |
122 | 122 |
123 | |
124 #define WIN32_LEAN_AND_MEAN | 123 #define WIN32_LEAN_AND_MEAN |
125 #define VC_EXTRALEAN | 124 #define VC_EXTRALEAN |
126 | 125 |
127 #include "tiffiop.h" | 126 #include "tiffiop.h" |
128 #ifdef OJPEG_SUPPORT | 127 #ifdef OJPEG_SUPPORT |
129 | 128 |
130 /* Configuration defines here are: | 129 /* Configuration defines here are: |
131 * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some e
nvironments, | 130 * 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 | 131 * 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 | 132 * libjpeg, with longjump stuff, are encapsulated in dedicated functions. W
hen |
134 * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declar
ed external | 133 * 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. | 134 * 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 | 135 * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encap
sulators |
137 * here, internally, with normal longjump. | 136 * here, internally, with normal longjump. |
138 * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent
is | 137 * 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 | 138 * 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 | 139 * 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. | 140 * 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 | 141 * 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 | 142 * 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 | 143 * 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 | 144 * » bytes to accommodate some structures (this is verified in asserts), but
it would not be |
146 * sensible to make it this small anyway, and it should be at most 64K sinc
e it is indexed | 145 * 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. | 146 * with uint16. We recommend 2K. |
148 * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used any
where and has | 147 * 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. | 148 * absolutely no effect. That is why most people insist the EGYPTIANWALK is
a bit silly. |
150 */ | 149 */ |
151 | 150 |
152 /* define LIBJPEG_ENCAP_EXTERNAL */ | 151 /* define LIBJPEG_ENCAP_EXTERNAL */ |
153 #define SETJMP(jbuf) setjmp(jbuf) | 152 #define SETJMP(jbuf) setjmp(jbuf) |
154 #define LONGJMP(jbuf,code) longjmp(jbuf,code) | 153 #define LONGJMP(jbuf,code) longjmp(jbuf,code) |
155 #define JMP_BUF jmp_buf | 154 #define JMP_BUF jmp_buf |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 | 208 |
210 /* Define "boolean" as unsigned char, not int, per Windows custom. */ | 209 /* Define "boolean" as unsigned char, not int, per Windows custom. */ |
211 #if defined(__WIN32__) && !defined(__MINGW32__) | 210 #if defined(__WIN32__) && !defined(__MINGW32__) |
212 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ | 211 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ |
213 typedef unsigned char boolean; | 212 typedef unsigned char boolean; |
214 # endif | 213 # endif |
215 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ | 214 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ |
216 #endif | 215 #endif |
217 | 216 |
218 #if defined(USE_SYSTEM_LIBJPEG) | 217 #if defined(USE_SYSTEM_LIBJPEG) |
| 218 #include <jerror.h> |
219 #include <jpeglib.h> | 219 #include <jpeglib.h> |
220 #elif defined(USE_LIBJPEG_TURBO) | 220 #elif defined(USE_LIBJPEG_TURBO) |
| 221 #include "third_party/libjpeg_turbo/jerror.h" |
221 #include "third_party/libjpeg_turbo/jpeglib.h" | 222 #include "third_party/libjpeg_turbo/jpeglib.h" |
222 #else | 223 #else |
| 224 #include "third_party/libjpeg/jerror.h" |
223 #include "third_party/libjpeg/jpeglib.h" | 225 #include "third_party/libjpeg/jpeglib.h" |
224 #endif | 226 #endif |
225 | 227 |
| 228 |
226 typedef struct jpeg_error_mgr jpeg_error_mgr; | 229 typedef struct jpeg_error_mgr jpeg_error_mgr; |
227 typedef struct jpeg_common_struct jpeg_common_struct; | 230 typedef struct jpeg_common_struct jpeg_common_struct; |
228 typedef struct jpeg_decompress_struct jpeg_decompress_struct; | 231 typedef struct jpeg_decompress_struct jpeg_decompress_struct; |
229 typedef struct jpeg_source_mgr jpeg_source_mgr; | 232 typedef struct jpeg_source_mgr jpeg_source_mgr; |
230 | 233 |
231 typedef enum { | 234 typedef enum { |
232 osibsNotSetYet, | 235 osibsNotSetYet, |
233 osibsJpegInterchangeFormat, | 236 osibsJpegInterchangeFormat, |
234 osibsStrile, | 237 osibsStrile, |
235 osibsEof | 238 osibsEof |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 /* | 435 /* |
433 * Merge codec-specific tag information. | 436 * Merge codec-specific tag information. |
434 */ | 437 */ |
435 if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) { | 438 if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) { |
436 TIFFErrorExt(tif->tif_clientdata, module, | 439 TIFFErrorExt(tif->tif_clientdata, module, |
437 "Merging Old JPEG codec-specific tags failed"); | 440 "Merging Old JPEG codec-specific tags failed"); |
438 return 0; | 441 return 0; |
439 } | 442 } |
440 | 443 |
441 /* state block */ | 444 /* state block */ |
442 » sp = (OJPEGState*)_TIFFmalloc(sizeof(OJPEGState));» » // // ad
d (OJPEGState*) cast | 445 » sp=_TIFFmalloc(sizeof(OJPEGState)); |
443 » if (sp == NULL) | 446 » if (sp==NULL) |
444 { | 447 { |
445 TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG stat
e block"); | 448 TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG stat
e block"); |
446 return(0); | 449 return(0); |
447 } | 450 } |
448 _TIFFmemset(sp,0,sizeof(OJPEGState)); | 451 _TIFFmemset(sp,0,sizeof(OJPEGState)); |
449 sp->tif=tif; | 452 sp->tif=tif; |
450 sp->jpeg_proc=1; | 453 sp->jpeg_proc=1; |
451 sp->subsampling_hor=2; | 454 sp->subsampling_hor=2; |
452 sp->subsampling_ver=2; | 455 sp->subsampling_ver=2; |
453 TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2); | 456 TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 } | 530 } |
528 | 531 |
529 static int | 532 static int |
530 OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) | 533 OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) |
531 { | 534 { |
532 static const char module[]="OJPEGVSetField"; | 535 static const char module[]="OJPEGVSetField"; |
533 OJPEGState* sp=(OJPEGState*)tif->tif_data; | 536 OJPEGState* sp=(OJPEGState*)tif->tif_data; |
534 uint32 ma; | 537 uint32 ma; |
535 uint64* mb; | 538 uint64* mb; |
536 uint32 n; | 539 uint32 n; |
| 540 const TIFFField* fip; |
| 541 |
537 switch(tag) | 542 switch(tag) |
538 { | 543 { |
539 case TIFFTAG_JPEGIFOFFSET: | 544 case TIFFTAG_JPEGIFOFFSET: |
540 sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64); | 545 sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64); |
541 break; | 546 break; |
542 case TIFFTAG_JPEGIFBYTECOUNT: | 547 case TIFFTAG_JPEGIFBYTECOUNT: |
543 sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uin
t64); | 548 sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uin
t64); |
544 break; | 549 break; |
545 case TIFFTAG_YCBCRSUBSAMPLING: | 550 case TIFFTAG_YCBCRSUBSAMPLING: |
546 sp->subsampling_tag=1; | 551 sp->subsampling_tag=1; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 break; | 601 break; |
597 case TIFFTAG_JPEGPROC: | 602 case TIFFTAG_JPEGPROC: |
598 sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap); | 603 sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap); |
599 break; | 604 break; |
600 case TIFFTAG_JPEGRESTARTINTERVAL: | 605 case TIFFTAG_JPEGRESTARTINTERVAL: |
601 sp->restart_interval=(uint16)va_arg(ap,uint16_vap); | 606 sp->restart_interval=(uint16)va_arg(ap,uint16_vap); |
602 break; | 607 break; |
603 default: | 608 default: |
604 return (*sp->vsetparent)(tif,tag,ap); | 609 return (*sp->vsetparent)(tif,tag,ap); |
605 } | 610 } |
606 » TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit); | 611 » fip = TIFFFieldWithTag(tif,tag); |
| 612 » if( fip == NULL ) /* shouldn't happen */ |
| 613 » return(0); |
| 614 » TIFFSetFieldBit(tif,fip->field_bit); |
607 tif->tif_flags|=TIFF_DIRTYDIRECT; | 615 tif->tif_flags|=TIFF_DIRTYDIRECT; |
608 return(1); | 616 return(1); |
609 } | 617 } |
610 | 618 |
611 static void | 619 static void |
612 OJPEGPrintDir(TIFF* tif, FILE* fd, long flags) | 620 OJPEGPrintDir(TIFF* tif, FILE* fd, long flags) |
613 { | 621 { |
614 OJPEGState* sp=(OJPEGState*)tif->tif_data; | 622 OJPEGState* sp=(OJPEGState*)tif->tif_data; |
615 uint8 m; | 623 uint8 m; |
616 (void)flags; | 624 (void)flags; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 } | 768 } |
761 | 769 |
762 static int | 770 static int |
763 OJPEGPreDecodeSkipScanlines(TIFF* tif) | 771 OJPEGPreDecodeSkipScanlines(TIFF* tif) |
764 { | 772 { |
765 static const char module[]="OJPEGPreDecodeSkipScanlines"; | 773 static const char module[]="OJPEGPreDecodeSkipScanlines"; |
766 OJPEGState* sp=(OJPEGState*)tif->tif_data; | 774 OJPEGState* sp=(OJPEGState*)tif->tif_data; |
767 uint32 m; | 775 uint32 m; |
768 if (sp->skip_buffer==NULL) | 776 if (sp->skip_buffer==NULL) |
769 { | 777 { |
770 » » // add (uint8*) cast | 778 » » sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line); |
771 » » sp->skip_buffer = (uint8*)_TIFFmalloc(sp->bytes_per_line); | 779 » » if (sp->skip_buffer==NULL) |
772 » » if (sp->skip_buffer == NULL) | |
773 { | 780 { |
774 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; | 781 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; |
775 return(0); | 782 return(0); |
776 } | 783 } |
777 } | 784 } |
778 for (m=0; m<sp->lines_per_strile; m++) | 785 for (m=0; m<sp->lines_per_strile; m++) |
779 { | 786 { |
780 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_s
truct),&sp->skip_buffer,1)==0) | 787 if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_s
truct),&sp->skip_buffer,1)==0) |
781 return(0); | 788 return(0); |
782 } | 789 } |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 { | 1193 { |
1187 assert(sp->subsampling_convert_ycbcrbuf==0); | 1194 assert(sp->subsampling_convert_ycbcrbuf==0); |
1188 assert(sp->subsampling_convert_ycbcrimage==0); | 1195 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); | 1196 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; | 1197 sp->subsampling_convert_ylines=sp->subsampling_ver*8; |
1191 sp->subsampling_convert_clinelen=sp->subsampling_convert
_ylinelen/sp->subsampling_hor; | 1198 sp->subsampling_convert_clinelen=sp->subsampling_convert
_ylinelen/sp->subsampling_hor; |
1192 sp->subsampling_convert_clines=8; | 1199 sp->subsampling_convert_clines=8; |
1193 sp->subsampling_convert_ybuflen=sp->subsampling_convert_
ylinelen*sp->subsampling_convert_ylines; | 1200 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; | 1201 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; | 1202 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 | 1203 » » » sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsamp
ling_convert_ycbcrbuflen); |
1197 if (sp->subsampling_convert_ycbcrbuf==0) | 1204 if (sp->subsampling_convert_ycbcrbuf==0) |
1198 { | 1205 { |
1199 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1206 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1200 return(0); | 1207 return(0); |
1201 } | 1208 } |
1202 sp->subsampling_convert_ybuf=sp->subsampling_convert_ycb
crbuf; | 1209 sp->subsampling_convert_ybuf=sp->subsampling_convert_ycb
crbuf; |
1203 sp->subsampling_convert_cbbuf=sp->subsampling_convert_yb
uf+sp->subsampling_convert_ybuflen; | 1210 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; | 1211 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; | 1212 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 | 1213 » » » sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsa
mpling_convert_ycbcrimagelen*sizeof(uint8*)); |
1207 if (sp->subsampling_convert_ycbcrimage==0) | 1214 if (sp->subsampling_convert_ycbcrimage==0) |
1208 { | 1215 { |
1209 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1216 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1210 return(0); | 1217 return(0); |
1211 } | 1218 } |
1212 m=sp->subsampling_convert_ycbcrimage; | 1219 m=sp->subsampling_convert_ycbcrimage; |
1213 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3); | 1220 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3); |
1214 *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->s
ubsampling_convert_ylines); | 1221 *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); | 1222 *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++) | 1223 for (n=0; n<sp->subsampling_convert_ylines; n++) |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 else | 1430 else |
1424 { | 1431 { |
1425 m-=2; | 1432 m-=2; |
1426 do | 1433 do |
1427 { | 1434 { |
1428 if (m<65) | 1435 if (m<65) |
1429 { | 1436 { |
1430 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DQT marker in JPEG data"); | 1437 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DQT marker in JPEG data"); |
1431 return(0); | 1438 return(0); |
1432 } | 1439 } |
1433 » » » na = sizeof(uint32) + 69; | 1440 » » » na=sizeof(uint32)+69; |
1434 » » » nb = (uint8*)_TIFFmalloc(na);» // add (uint8*) cast | 1441 » » » nb=_TIFFmalloc(na); |
1435 » » » if (nb == 0) | 1442 » » » if (nb==0) |
1436 { | 1443 { |
1437 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1444 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1438 return(0); | 1445 return(0); |
1439 } | 1446 } |
1440 *(uint32*)nb=na; | 1447 *(uint32*)nb=na; |
1441 nb[sizeof(uint32)]=255; | 1448 nb[sizeof(uint32)]=255; |
1442 nb[sizeof(uint32)+1]=JPEG_MARKER_DQT; | 1449 nb[sizeof(uint32)+1]=JPEG_MARKER_DQT; |
1443 nb[sizeof(uint32)+2]=0; | 1450 nb[sizeof(uint32)+2]=0; |
1444 nb[sizeof(uint32)+3]=67; | 1451 nb[sizeof(uint32)+3]=67; |
1445 if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) { | 1452 if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1480 if (sp->subsamplingcorrect==0) | 1487 if (sp->subsamplingcorrect==0) |
1481 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT mar
ker in JPEG data"); | 1488 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT mar
ker in JPEG data"); |
1482 return(0); | 1489 return(0); |
1483 } | 1490 } |
1484 if (sp->subsamplingcorrect!=0) | 1491 if (sp->subsamplingcorrect!=0) |
1485 { | 1492 { |
1486 OJPEGReadSkip(sp,m-2); | 1493 OJPEGReadSkip(sp,m-2); |
1487 } | 1494 } |
1488 else | 1495 else |
1489 { | 1496 { |
1490 » » na = sizeof(uint32) + 2 + m; | 1497 » » na=sizeof(uint32)+2+m; |
1491 » » nb = (uint8*)_TIFFmalloc(na);» // add (uint8*) cast | 1498 » » nb=_TIFFmalloc(na); |
1492 » » if (nb == 0) | 1499 » » if (nb==0) |
1493 { | 1500 { |
1494 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; | 1501 TIFFErrorExt(tif->tif_clientdata,module,"Out of memory")
; |
1495 return(0); | 1502 return(0); |
1496 } | 1503 } |
1497 *(uint32*)nb=na; | 1504 *(uint32*)nb=na; |
1498 nb[sizeof(uint32)]=255; | 1505 nb[sizeof(uint32)]=255; |
1499 nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | 1506 nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; |
1500 nb[sizeof(uint32)+2]=(m>>8); | 1507 nb[sizeof(uint32)+2]=(m>>8); |
1501 nb[sizeof(uint32)+3]=(m&255); | 1508 nb[sizeof(uint32)+3]=(m&255); |
1502 » » if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) | 1509 » » if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) { |
| 1510 _TIFFfree(nb); |
1503 return(0); | 1511 return(0); |
| 1512 } |
1504 o=nb[sizeof(uint32)+4]; | 1513 o=nb[sizeof(uint32)+4]; |
1505 if ((o&240)==0) | 1514 if ((o&240)==0) |
1506 { | 1515 { |
1507 if (3<o) | 1516 if (3<o) |
1508 { | 1517 { |
1509 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | 1518 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); |
| 1519 _TIFFfree(nb); |
1510 return(0); | 1520 return(0); |
1511 } | 1521 } |
1512 if (sp->dctable[o]!=0) | 1522 if (sp->dctable[o]!=0) |
1513 _TIFFfree(sp->dctable[o]); | 1523 _TIFFfree(sp->dctable[o]); |
1514 sp->dctable[o]=nb; | 1524 sp->dctable[o]=nb; |
1515 } | 1525 } |
1516 else | 1526 else |
1517 { | 1527 { |
1518 if ((o&240)!=16) | 1528 if ((o&240)!=16) |
1519 { | 1529 { |
1520 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | 1530 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); |
| 1531 _TIFFfree(nb); |
1521 return(0); | 1532 return(0); |
1522 } | 1533 } |
1523 o&=15; | 1534 o&=15; |
1524 if (3<o) | 1535 if (3<o) |
1525 { | 1536 { |
1526 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); | 1537 TIFFErrorExt(tif->tif_clientdata,module,"Corrupt
DHT marker in JPEG data"); |
| 1538 _TIFFfree(nb); |
1527 return(0); | 1539 return(0); |
1528 } | 1540 } |
1529 if (sp->actable[o]!=0) | 1541 if (sp->actable[o]!=0) |
1530 _TIFFfree(sp->actable[o]); | 1542 _TIFFfree(sp->actable[o]); |
1531 sp->actable[o]=nb; | 1543 sp->actable[o]=nb; |
1532 } | 1544 } |
1533 } | 1545 } |
1534 return(1); | 1546 return(1); |
1535 } | 1547 } |
1536 | 1548 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 { | 1768 { |
1757 for (n=0; n<m-1; n++) | 1769 for (n=0; n<m-1; n++) |
1758 { | 1770 { |
1759 if (sp->qtable_offset[m]==sp->qtable_offset[n]) | 1771 if (sp->qtable_offset[m]==sp->qtable_offset[n]) |
1760 { | 1772 { |
1761 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegQTables tag value"); | 1773 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegQTables tag value"); |
1762 return(0); | 1774 return(0); |
1763 } | 1775 } |
1764 } | 1776 } |
1765 oa=sizeof(uint32)+69; | 1777 oa=sizeof(uint32)+69; |
1766 » » » ob = (uint8*)_TIFFmalloc(oa);» // add (uint8*) cast | 1778 » » » ob=_TIFFmalloc(oa); |
1767 if (ob==0) | 1779 if (ob==0) |
1768 { | 1780 { |
1769 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1781 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1770 return(0); | 1782 return(0); |
1771 } | 1783 } |
1772 *(uint32*)ob=oa; | 1784 *(uint32*)ob=oa; |
1773 ob[sizeof(uint32)]=255; | 1785 ob[sizeof(uint32)]=255; |
1774 ob[sizeof(uint32)+1]=JPEG_MARKER_DQT; | 1786 ob[sizeof(uint32)+1]=JPEG_MARKER_DQT; |
1775 ob[sizeof(uint32)+2]=0; | 1787 ob[sizeof(uint32)+2]=0; |
1776 ob[sizeof(uint32)+3]=67; | 1788 ob[sizeof(uint32)+3]=67; |
1777 ob[sizeof(uint32)+4]=m; | 1789 ob[sizeof(uint32)+4]=m; |
1778 TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); | 1790 TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); |
1779 » » » p=(uint32)TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); | 1791 » » » p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); |
1780 if (p!=64) | 1792 if (p!=64) |
1781 return(0); | 1793 return(0); |
1782 sp->qtable[m]=ob; | 1794 sp->qtable[m]=ob; |
1783 sp->sof_tq[m]=m; | 1795 sp->sof_tq[m]=m; |
1784 } | 1796 } |
1785 else | 1797 else |
1786 sp->sof_tq[m]=sp->sof_tq[m-1]; | 1798 sp->sof_tq[m]=sp->sof_tq[m-1]; |
1787 } | 1799 } |
1788 return(1); | 1800 return(1); |
1789 } | 1801 } |
(...skipping 22 matching lines...) Expand all Loading... |
1812 { | 1824 { |
1813 for (n=0; n<m-1; n++) | 1825 for (n=0; n<m-1; n++) |
1814 { | 1826 { |
1815 if (sp->dctable_offset[m]==sp->dctable_offset[n]
) | 1827 if (sp->dctable_offset[m]==sp->dctable_offset[n]
) |
1816 { | 1828 { |
1817 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegDcTables tag value"); | 1829 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegDcTables tag value"); |
1818 return(0); | 1830 return(0); |
1819 } | 1831 } |
1820 } | 1832 } |
1821 TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); | 1833 TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); |
1822 » » » p=(uint32)TIFFReadFile(tif,o,16); | 1834 » » » p=TIFFReadFile(tif,o,16); |
1823 if (p!=16) | 1835 if (p!=16) |
1824 return(0); | 1836 return(0); |
1825 q=0; | 1837 q=0; |
1826 for (n=0; n<16; n++) | 1838 for (n=0; n<16; n++) |
1827 q+=o[n]; | 1839 q+=o[n]; |
1828 ra=sizeof(uint32)+21+q; | 1840 ra=sizeof(uint32)+21+q; |
1829 » » » rb = (uint8*)_TIFFmalloc(ra);» // add (uint8*) cast | 1841 » » » rb=_TIFFmalloc(ra); |
1830 if (rb==0) | 1842 if (rb==0) |
1831 { | 1843 { |
1832 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1844 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1833 return(0); | 1845 return(0); |
1834 } | 1846 } |
1835 *(uint32*)rb=ra; | 1847 *(uint32*)rb=ra; |
1836 rb[sizeof(uint32)]=255; | 1848 rb[sizeof(uint32)]=255; |
1837 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | 1849 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; |
1838 rb[sizeof(uint32)+2]=((19+q)>>8); | 1850 rb[sizeof(uint32)+2]=((19+q)>>8); |
1839 rb[sizeof(uint32)+3]=((19+q)&255); | 1851 rb[sizeof(uint32)+3]=((19+q)&255); |
1840 rb[sizeof(uint32)+4]=m; | 1852 rb[sizeof(uint32)+4]=m; |
1841 for (n=0; n<16; n++) | 1853 for (n=0; n<16; n++) |
1842 rb[sizeof(uint32)+5+n]=o[n]; | 1854 rb[sizeof(uint32)+5+n]=o[n]; |
1843 » » » p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); | 1855 » » » p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); |
1844 if (p!=q) | 1856 if (p!=q) |
1845 return(0); | 1857 return(0); |
1846 sp->dctable[m]=rb; | 1858 sp->dctable[m]=rb; |
1847 sp->sos_tda[m]=(m<<4); | 1859 sp->sos_tda[m]=(m<<4); |
1848 } | 1860 } |
1849 else | 1861 else |
1850 sp->sos_tda[m]=sp->sos_tda[m-1]; | 1862 sp->sos_tda[m]=sp->sos_tda[m-1]; |
1851 } | 1863 } |
1852 return(1); | 1864 return(1); |
1853 } | 1865 } |
(...skipping 22 matching lines...) Expand all Loading... |
1876 { | 1888 { |
1877 for (n=0; n<m-1; n++) | 1889 for (n=0; n<m-1; n++) |
1878 { | 1890 { |
1879 if (sp->actable_offset[m]==sp->actable_offset[n]
) | 1891 if (sp->actable_offset[m]==sp->actable_offset[n]
) |
1880 { | 1892 { |
1881 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegAcTables tag value"); | 1893 TIFFErrorExt(tif->tif_clientdata,module,
"Corrupt JpegAcTables tag value"); |
1882 return(0); | 1894 return(0); |
1883 } | 1895 } |
1884 } | 1896 } |
1885 TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); | 1897 TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); |
1886 » » » p=(uint32)TIFFReadFile(tif,o,16); | 1898 » » » p=TIFFReadFile(tif,o,16); |
1887 if (p!=16) | 1899 if (p!=16) |
1888 return(0); | 1900 return(0); |
1889 q=0; | 1901 q=0; |
1890 for (n=0; n<16; n++) | 1902 for (n=0; n<16; n++) |
1891 q+=o[n]; | 1903 q+=o[n]; |
1892 ra=sizeof(uint32)+21+q; | 1904 ra=sizeof(uint32)+21+q; |
1893 » » » rb = (uint8*)_TIFFmalloc(ra);» // add (uint8*) cast | 1905 » » » rb=_TIFFmalloc(ra); |
1894 if (rb==0) | 1906 if (rb==0) |
1895 { | 1907 { |
1896 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); | 1908 TIFFErrorExt(tif->tif_clientdata,module,"Out of
memory"); |
1897 return(0); | 1909 return(0); |
1898 } | 1910 } |
1899 *(uint32*)rb=ra; | 1911 *(uint32*)rb=ra; |
1900 rb[sizeof(uint32)]=255; | 1912 rb[sizeof(uint32)]=255; |
1901 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; | 1913 rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; |
1902 rb[sizeof(uint32)+2]=((19+q)>>8); | 1914 rb[sizeof(uint32)+2]=((19+q)>>8); |
1903 rb[sizeof(uint32)+3]=((19+q)&255); | 1915 rb[sizeof(uint32)+3]=((19+q)&255); |
1904 rb[sizeof(uint32)+4]=(16|m); | 1916 rb[sizeof(uint32)+4]=(16|m); |
1905 for (n=0; n<16; n++) | 1917 for (n=0; n<16; n++) |
1906 rb[sizeof(uint32)+5+n]=o[n]; | 1918 rb[sizeof(uint32)+5+n]=o[n]; |
1907 » » » p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); | 1919 » » » p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); |
1908 if (p!=q) | 1920 if (p!=q) |
1909 return(0); | 1921 return(0); |
1910 sp->actable[m]=rb; | 1922 sp->actable[m]=rb; |
1911 sp->sos_tda[m]=(sp->sos_tda[m]|m); | 1923 sp->sos_tda[m]=(sp->sos_tda[m]|m); |
1912 } | 1924 } |
1913 else | 1925 else |
1914 sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15)); | 1926 sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15)); |
1915 } | 1927 } |
1916 return(1); | 1928 return(1); |
1917 } | 1929 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1955 case osibsNotSetYet: | 1967 case osibsNotSetYet: |
1956 if (sp->jpeg_interchange_format!=0) | 1968 if (sp->jpeg_interchange_format!=0) |
1957 { | 1969 { |
1958 sp->in_buffer_file_pos=sp->jpeg_intercha
nge_format; | 1970 sp->in_buffer_file_pos=sp->jpeg_intercha
nge_format; |
1959 sp->in_buffer_file_togo=sp->jpeg_interch
ange_format_length; | 1971 sp->in_buffer_file_togo=sp->jpeg_interch
ange_format_length; |
1960 } | 1972 } |
1961 sp->in_buffer_source=osibsJpegInterchangeFormat; | 1973 sp->in_buffer_source=osibsJpegInterchangeFormat; |
1962 break; | 1974 break; |
1963 case osibsJpegInterchangeFormat: | 1975 case osibsJpegInterchangeFormat: |
1964 sp->in_buffer_source=osibsStrile; | 1976 sp->in_buffer_source=osibsStrile; |
| 1977 break; |
1965 case osibsStrile: | 1978 case osibsStrile: |
1966 if (!_TIFFFillStriles( sp->tif ) | 1979 if (!_TIFFFillStriles( sp->tif ) |
1967 || sp->tif->tif_dir.td_stripoffset == NULL | 1980 || sp->tif->tif_dir.td_stripoffset == NULL |
1968 || sp->tif->tif_dir.td_stripbytecount == NUL
L) | 1981 || sp->tif->tif_dir.td_stripbytecount == NUL
L) |
1969 return 0; | 1982 return 0; |
1970 | 1983 |
1971 if (sp->in_buffer_next_strile==sp->in_buffer_str
ile_count) | 1984 if (sp->in_buffer_next_strile==sp->in_buffer_str
ile_count) |
1972 sp->in_buffer_source=osibsEof; | 1985 sp->in_buffer_source=osibsEof; |
1973 else | 1986 else |
1974 { | 1987 { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 } | 2065 } |
2053 | 2066 |
2054 static int | 2067 static int |
2055 OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) | 2068 OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) |
2056 { | 2069 { |
2057 uint16 mlen; | 2070 uint16 mlen; |
2058 uint8* mmem; | 2071 uint8* mmem; |
2059 uint16 n; | 2072 uint16 n; |
2060 assert(len>0); | 2073 assert(len>0); |
2061 mlen=len; | 2074 mlen=len; |
2062 » mmem = (uint8*)mem;» » // add (uint8*) cast | 2075 » mmem=mem; |
2063 do | 2076 do |
2064 { | 2077 { |
2065 if (sp->in_buffer_togo==0) | 2078 if (sp->in_buffer_togo==0) |
2066 { | 2079 { |
2067 if (OJPEGReadBufferFill(sp)==0) | 2080 if (OJPEGReadBufferFill(sp)==0) |
2068 return(0); | 2081 return(0); |
2069 assert(sp->in_buffer_togo>0); | 2082 assert(sp->in_buffer_togo>0); |
2070 } | 2083 } |
2071 n=mlen; | 2084 n=mlen; |
2072 if (n>sp->in_buffer_togo) | 2085 if (n>sp->in_buffer_togo) |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2454 { | 2467 { |
2455 TIFF* tif=(TIFF*)cinfo->client_data; | 2468 TIFF* tif=(TIFF*)cinfo->client_data; |
2456 OJPEGState* sp=(OJPEGState*)tif->tif_data; | 2469 OJPEGState* sp=(OJPEGState*)tif->tif_data; |
2457 void* mem=0; | 2470 void* mem=0; |
2458 uint32 len=0U; | 2471 uint32 len=0U; |
2459 if (OJPEGWriteStream(tif,&mem,&len)==0) | 2472 if (OJPEGWriteStream(tif,&mem,&len)==0) |
2460 { | 2473 { |
2461 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPE
G data"); | 2474 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPE
G data"); |
2462 jpeg_encap_unwind(tif); | 2475 jpeg_encap_unwind(tif); |
2463 } | 2476 } |
2464 » sp->libjpeg_jpeg_source_mgr.bytes_in_buffer = len; | 2477 » 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 | 2478 » sp->libjpeg_jpeg_source_mgr.next_input_byte=mem; |
2466 return(1); | 2479 return(1); |
2467 } | 2480 } |
2468 | 2481 |
2469 static void | 2482 static void |
2470 OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_b
ytes) | 2483 OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_b
ytes) |
2471 { | 2484 { |
2472 TIFF* tif=(TIFF*)cinfo->client_data; | 2485 TIFF* tif=(TIFF*)cinfo->client_data; |
2473 (void)num_bytes; | 2486 (void)num_bytes; |
2474 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); | 2487 TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); |
2475 jpeg_encap_unwind(tif); | 2488 jpeg_encap_unwind(tif); |
(...skipping 18 matching lines...) Expand all Loading... |
2494 #endif | 2507 #endif |
2495 | 2508 |
2496 | 2509 |
2497 /* | 2510 /* |
2498 * Local Variables: | 2511 * Local Variables: |
2499 * mode: c | 2512 * mode: c |
2500 * c-basic-offset: 8 | 2513 * c-basic-offset: 8 |
2501 * fill-column: 78 | 2514 * fill-column: 78 |
2502 * End: | 2515 * End: |
2503 */ | 2516 */ |
2504 | |
OLD | NEW |