121 #define WIN32_LEAN_AND_MEAN 150 #define SETJMP(jbuf) setjmp(jbuf) 151 #define LONGJMP(jbuf,code) longjmp(jbuf,code) 152 #define JMP_BUF jmp_buf 153 #define OJPEG_BUFFER 2048 156 #define JPEG_MARKER_SOF0 0xC0 157 #define JPEG_MARKER_SOF1 0xC1 158 #define JPEG_MARKER_SOF3 0xC3 159 #define JPEG_MARKER_DHT 0xC4 160 #define JPEG_MARKER_RST0 0XD0 161 #define JPEG_MARKER_SOI 0xD8 162 #define JPEG_MARKER_EOI 0xD9 163 #define JPEG_MARKER_SOS 0xDA 164 #define JPEG_MARKER_DQT 0xDB 165 #define JPEG_MARKER_DRI 0xDD 166 #define JPEG_MARKER_APP0 0xE0 167 #define JPEG_MARKER_COM 0xFE 169 #define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0) 170 #define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1) 171 #define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2) 172 #define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3) 173 #define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4) 174 #define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5) 175 #define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6) 178 {
TIFFTAG_JPEGIFOFFSET,1,1,
TIFF_LONG8,0,
TIFF_SETGET_UINT64,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,
TRUE,
FALSE,
"JpegInterchangeFormat",
NULL},
179 {
TIFFTAG_JPEGIFBYTECOUNT,1,1,
TIFF_LONG8,0,
TIFF_SETGET_UINT64,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,
TRUE,
FALSE,
"JpegInterchangeFormatLength",
NULL},
180 {
TIFFTAG_JPEGQTABLES,
TIFF_VARIABLE2,
TIFF_VARIABLE2,
TIFF_LONG8,0,
TIFF_SETGET_C32_UINT64,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,
FALSE,
TRUE,
"JpegQTables",
NULL},
181 {
TIFFTAG_JPEGDCTABLES,
TIFF_VARIABLE2,
TIFF_VARIABLE2,
TIFF_LONG8,0,
TIFF_SETGET_C32_UINT64,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,
FALSE,
TRUE,
"JpegDcTables",
NULL},
182 {
TIFFTAG_JPEGACTABLES,
TIFF_VARIABLE2,
TIFF_VARIABLE2,
TIFF_LONG8,0,
TIFF_SETGET_C32_UINT64,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,
FALSE,
TRUE,
"JpegAcTables",
NULL},
183 {
TIFFTAG_JPEGPROC,1,1,
TIFF_SHORT,0,
TIFF_SETGET_UINT16,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,
FALSE,
FALSE,
"JpegProc",
NULL},
184 {
TIFFTAG_JPEGRESTARTINTERVAL,1,1,
TIFF_SHORT,0,
TIFF_SETGET_UINT16,
TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,
FALSE,
FALSE,
"JpegRestartInterval",
NULL},
187 #ifndef LIBJPEG_ENCAP_EXTERNAL 203 #if defined(__BORLANDC__) || defined(__MINGW32__) 208 #if defined(__WIN32__) && !defined(__MINGW32__) 209 # ifndef __RPCNDR_H__ 212 # define HAVE_BOOLEAN 225 osibsJpegInterchangeFormat,
228 } OJPEGStateInBufferSource;
232 ososQTable0,ososQTable1,ososQTable2,ososQTable3,
233 ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
234 ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
241 } OJPEGStateOutState;
246 int error_in_raw_data_decoding;
247 #ifndef LIBJPEG_ENCAP_EXTERNAL 258 uint32 strile_length_total;
259 uint8 samples_per_pixel;
260 uint8 plane_sample_offset;
261 uint8 samples_per_pixel_per_plane;
262 uint64 jpeg_interchange_format;
263 uint64 jpeg_interchange_format_length;
265 uint8 subsamplingcorrect;
266 uint8 subsamplingcorrect_done;
267 uint8 subsampling_tag;
268 uint8 subsampling_hor;
269 uint8 subsampling_ver;
270 uint8 subsampling_force_desubsampling_inside_decompression;
271 uint8 qtable_offset_count;
272 uint8 dctable_offset_count;
273 uint8 actable_offset_count;
293 OJPEGStateInBufferSource in_buffer_source;
294 uint32 in_buffer_next_strile;
295 uint64 in_buffer_file_pos;
296 uint64 in_buffer_file_togo;
298 uint8 readheader_done;
299 uint8 writeheader_done;
302 uint8 libjpeg_session_active;
303 uint8 libjpeg_jpeg_query_style;
307 uint8 subsampling_convert_log;
308 uint32 subsampling_convert_ylinelen;
309 uint32 subsampling_convert_ylines;
310 uint32 subsampling_convert_clinelen;
311 uint32 subsampling_convert_clines;
312 uint32 subsampling_convert_ybuflen;
313 uint32 subsampling_convert_cbuflen;
314 uint32 subsampling_convert_ycbcrbuflen;
315 uint8* subsampling_convert_ycbcrbuf;
316 uint8* subsampling_convert_ybuf;
317 uint8* subsampling_convert_cbbuf;
318 uint8* subsampling_convert_crbuf;
319 uint32 subsampling_convert_ycbcrimagelen;
320 uint8** subsampling_convert_ycbcrimage;
321 uint32 subsampling_convert_clinelenout;
322 uint32 subsampling_convert_state;
325 OJPEGStateInBufferSource in_buffer_source;
326 uint32 in_buffer_next_strile;
327 uint32 in_buffer_strile_count;
328 uint64 in_buffer_file_pos;
329 uint8 in_buffer_file_pos_log;
330 uint64 in_buffer_file_togo;
332 uint8* in_buffer_cur;
334 OJPEGStateOutState out_state;
343 static int OJPEGFixupTags(
TIFF* tif);
344 static int OJPEGSetupDecode(
TIFF* tif);
346 static int OJPEGPreDecodeSkipRaw(
TIFF* tif);
347 static int OJPEGPreDecodeSkipScanlines(
TIFF* tif);
352 static int OJPEGSetupEncode(
TIFF* tif);
355 static int OJPEGPostEncode(
TIFF* tif);
356 static void OJPEGCleanup(
TIFF* tif);
358 static void OJPEGSubsamplingCorrect(
TIFF* tif);
359 static int OJPEGReadHeaderInfo(
TIFF* tif);
360 static int OJPEGReadSecondarySos(
TIFF* tif,
uint16 s);
361 static int OJPEGWriteHeaderInfo(
TIFF* tif);
362 static void OJPEGLibjpegSessionAbort(
TIFF* tif);
364 static int OJPEGReadHeaderInfoSec(
TIFF* tif);
365 static int OJPEGReadHeaderInfoSecStreamDri(
TIFF* tif);
366 static int OJPEGReadHeaderInfoSecStreamDqt(
TIFF* tif);
367 static int OJPEGReadHeaderInfoSecStreamDht(
TIFF* tif);
368 static int OJPEGReadHeaderInfoSecStreamSof(
TIFF* tif,
uint8 marker_id);
369 static int OJPEGReadHeaderInfoSecStreamSos(
TIFF* tif);
370 static int OJPEGReadHeaderInfoSecTablesQTable(
TIFF* tif);
371 static int OJPEGReadHeaderInfoSecTablesDcTable(
TIFF* tif);
372 static int OJPEGReadHeaderInfoSecTablesAcTable(
TIFF* tif);
374 static int OJPEGReadBufferFill(OJPEGState*
sp);
375 static int OJPEGReadByte(OJPEGState*
sp,
uint8*
byte);
376 static int OJPEGReadBytePeek(OJPEGState*
sp,
uint8*
byte);
377 static void OJPEGReadByteAdvance(OJPEGState*
sp);
380 static void OJPEGReadSkip(OJPEGState*
sp,
uint16 len);
394 #ifdef LIBJPEG_ENCAP_EXTERNAL 400 extern void jpeg_encap_unwind(
TIFF* tif);
407 static void jpeg_encap_unwind(
TIFF* tif);
421 static const char module[]=
"TIFFInitOJPEG";
431 "Merging Old JPEG codec-specific tags failed");
445 sp->subsampling_hor=2;
446 sp->subsampling_ver=2;
494 if (
sp->subsamplingcorrect_done==0)
495 OJPEGSubsamplingCorrect(tif);
518 return (*
sp->vgetparent)(tif,
tag,
ap);
526 static const char module[]=
"OJPEGVSetField";
542 sp->subsampling_tag=1;
557 sp->qtable_offset_count=(
uint8)ma;
560 sp->qtable_offset[
n]=mb[
n];
572 sp->dctable_offset_count=(
uint8)ma;
575 sp->dctable_offset[
n]=mb[
n];
587 sp->actable_offset_count=(
uint8)ma;
590 sp->actable_offset[
n]=mb[
n];
600 return (*
sp->vsetparent)(tif,
tag,
ap);
617 if (
TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
619 if (
TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
624 for (
m=0;
m<
sp->qtable_offset_count;
m++)
631 for (
m=0;
m<
sp->dctable_offset_count;
m++)
638 for (
m=0;
m<
sp->actable_offset_count;
m++)
643 fprintf(
fd,
" JpegProc: %u\n",(
unsigned int)
sp->jpeg_proc);
645 fprintf(
fd,
" JpegRestartInterval: %u\n",(
unsigned int)
sp->restart_interval);
651 OJPEGFixupTags(
TIFF* tif)
658 OJPEGSetupDecode(
TIFF* tif)
660 static const char module[]=
"OJPEGSetupDecode";
661 TIFFWarningExt(tif->
tif_clientdata,
module,
"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software");
670 if (
sp->subsamplingcorrect_done==0)
671 OJPEGSubsamplingCorrect(tif);
672 if (
sp->readheader_done==0)
674 if (OJPEGReadHeaderInfo(tif)==0)
677 if (
sp->sos_end[
s].log==0)
679 if (OJPEGReadSecondarySos(tif,
s)==0)
686 if ((
sp->writeheader_done!=0) && ((
sp->write_cursample!=
s) || (
sp->write_curstrile>
m)))
688 if (
sp->libjpeg_session_active!=0)
689 OJPEGLibjpegSessionAbort(tif);
690 sp->writeheader_done=0;
692 if (
sp->writeheader_done==0)
695 sp->write_cursample=
s;
697 if ((
sp->in_buffer_file_pos_log==0) ||
698 (
sp->in_buffer_file_pos-
sp->in_buffer_togo!=
sp->sos_end[
s].in_buffer_file_pos))
700 sp->in_buffer_source=
sp->sos_end[
s].in_buffer_source;
701 sp->in_buffer_next_strile=
sp->sos_end[
s].in_buffer_next_strile;
702 sp->in_buffer_file_pos=
sp->sos_end[
s].in_buffer_file_pos;
703 sp->in_buffer_file_pos_log=0;
704 sp->in_buffer_file_togo=
sp->sos_end[
s].in_buffer_file_togo;
705 sp->in_buffer_togo=0;
708 if (OJPEGWriteHeaderInfo(tif)==0)
711 while (
sp->write_curstrile<
m)
713 if (
sp->libjpeg_jpeg_query_style==0)
715 if (OJPEGPreDecodeSkipRaw(tif)==0)
720 if (OJPEGPreDecodeSkipScanlines(tif)==0)
723 sp->write_curstrile++;
730 OJPEGPreDecodeSkipRaw(
TIFF* tif)
734 m=
sp->lines_per_strile;
735 if (
sp->subsampling_convert_state!=0)
737 if (
sp->subsampling_convert_clines-
sp->subsampling_convert_state>=
m)
739 sp->subsampling_convert_state+=
m;
740 if (
sp->subsampling_convert_state==
sp->subsampling_convert_clines)
741 sp->subsampling_convert_state=0;
744 m-=
sp->subsampling_convert_clines-
sp->subsampling_convert_state;
745 sp->subsampling_convert_state=0;
746 sp->error_in_raw_data_decoding=0;
748 while (
m>=
sp->subsampling_convert_clines)
750 if (jpeg_read_raw_data_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),
sp->subsampling_convert_ycbcrimage,
sp->subsampling_ver*8)==0)
752 m-=
sp->subsampling_convert_clines;
756 if (jpeg_read_raw_data_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),
sp->subsampling_convert_ycbcrimage,
sp->subsampling_ver*8)==0)
758 sp->subsampling_convert_state=
m;
764 OJPEGPreDecodeSkipScanlines(
TIFF* tif)
766 static const char module[]=
"OJPEGPreDecodeSkipScanlines";
772 if (
sp->skip_buffer==
NULL)
778 for (
m=0;
m<
sp->lines_per_strile;
m++)
780 if (jpeg_read_scanlines_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),&
sp->skip_buffer,1)==0)
789 static const char module[]=
"OJPEGDecode";
792 if( !
sp->decoder_ok )
797 if(
sp->error_in_raw_data_decoding )
801 if (
sp->libjpeg_jpeg_query_style==0)
803 if (OJPEGDecodeRaw(tif,
buf,
cc)==0)
808 if (OJPEGDecodeScanlines(tif,
buf,
cc)==0)
817 static const char module[]=
"OJPEGDecodeRaw";
828 if (
cc%
sp->bytes_per_line!=0)
838 if (
sp->subsampling_convert_state==0)
842 int last_col_width = 0;
848 sp->error_in_raw_data_decoding = 1;
854 #if JPEG_LIB_VERSION >= 70 856 last_col_width +=
info->last_col_width *
info->DCT_h_scaled_size;
859 last_col_width +=
info->last_col_width *
info->DCT_scaled_size;
863 expected_bytes =
sp->subsampling_convert_clinelenout *
sp->subsampling_ver *
sp->subsampling_hor;
864 if (jpeg_bytes != expected_bytes)
867 sp->error_in_raw_data_decoding = 1;
870 if (jpeg_read_raw_data_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),
sp->subsampling_convert_ycbcrimage,
sp->subsampling_ver*8)==0)
872 sp->error_in_raw_data_decoding = 1;
876 oy=
sp->subsampling_convert_ybuf+
sp->subsampling_convert_state*
sp->subsampling_ver*
sp->subsampling_convert_ylinelen;
877 ocb=
sp->subsampling_convert_cbbuf+
sp->subsampling_convert_state*
sp->subsampling_convert_clinelen;
878 ocr=
sp->subsampling_convert_crbuf+
sp->subsampling_convert_state*
sp->subsampling_convert_clinelen;
880 for (
q=0;
q<
sp->subsampling_convert_clinelenout;
q++)
883 for (sy=0; sy<
sp->subsampling_ver; sy++)
885 for (sx=0; sx<
sp->subsampling_hor; sx++)
887 r+=
sp->subsampling_convert_ylinelen-
sp->subsampling_hor;
889 oy+=
sp->subsampling_hor;
893 sp->subsampling_convert_state++;
894 if (
sp->subsampling_convert_state==
sp->subsampling_convert_clines)
895 sp->subsampling_convert_state=0;
896 m+=
sp->bytes_per_line;
897 n-=
sp->bytes_per_line;
905 static const char module[]=
"OJPEGDecodeScanlines";
909 if (
cc%
sp->bytes_per_line!=0)
919 if (jpeg_read_scanlines_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),&
m,1)==0)
921 m+=
sp->bytes_per_line;
922 n-=
sp->bytes_per_line;
933 sp->write_curstrile++;
936 assert(
sp->libjpeg_session_active!=0);
937 OJPEGLibjpegSessionAbort(tif);
938 sp->writeheader_done=0;
943 OJPEGSetupEncode(
TIFF* tif)
945 static const char module[]=
"OJPEGSetupEncode";
953 static const char module[]=
"OJPEGPreEncode";
962 static const char module[]=
"OJPEGEncode";
971 OJPEGPostEncode(
TIFF* tif)
973 static const char module[]=
"OJPEGPostEncode";
979 OJPEGCleanup(
TIFF* tif)
987 if (
sp->qtable[0]!=0)
989 if (
sp->qtable[1]!=0)
991 if (
sp->qtable[2]!=0)
993 if (
sp->qtable[3]!=0)
995 if (
sp->dctable[0]!=0)
997 if (
sp->dctable[1]!=0)
999 if (
sp->dctable[2]!=0)
1001 if (
sp->dctable[3]!=0)
1003 if (
sp->actable[0]!=0)
1005 if (
sp->actable[1]!=0)
1007 if (
sp->actable[2]!=0)
1009 if (
sp->actable[3]!=0)
1011 if (
sp->libjpeg_session_active!=0)
1012 OJPEGLibjpegSessionAbort(tif);
1013 if (
sp->subsampling_convert_ycbcrbuf!=0)
1015 if (
sp->subsampling_convert_ycbcrimage!=0)
1017 if (
sp->skip_buffer!=0)
1026 OJPEGSubsamplingCorrect(
TIFF* tif)
1028 static const char module[]=
"OJPEGSubsamplingCorrect";
1033 assert(
sp->subsamplingcorrect_done==0);
1037 if (
sp->subsampling_tag!=0)
1039 sp->subsampling_hor=1;
1040 sp->subsampling_ver=1;
1041 sp->subsampling_force_desubsampling_inside_decompression=0;
1045 sp->subsamplingcorrect_done=1;
1046 mh=
sp->subsampling_hor;
1047 mv=
sp->subsampling_ver;
1048 sp->subsamplingcorrect=1;
1049 OJPEGReadHeaderInfoSec(tif);
1050 if (
sp->subsampling_force_desubsampling_inside_decompression!=0)
1052 sp->subsampling_hor=1;
1053 sp->subsampling_ver=1;
1055 sp->subsamplingcorrect=0;
1056 if (((
sp->subsampling_hor!=mh) || (
sp->subsampling_ver!=mv)) && (
sp->subsampling_force_desubsampling_inside_decompression==0))
1058 if (
sp->subsampling_tag==0)
1059 TIFFWarningExt(tif->
tif_clientdata,
module,
"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",
sp->subsampling_hor,
sp->subsampling_ver);
1061 TIFFWarningExt(tif->
tif_clientdata,
module,
"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",
sp->subsampling_hor,
sp->subsampling_ver,mh,mv);
1063 if (
sp->subsampling_force_desubsampling_inside_decompression!=0)
1065 if (
sp->subsampling_tag==0)
1066 TIFFWarningExt(tif->
tif_clientdata,
module,
"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression");
1068 TIFFWarningExt(tif->
tif_clientdata,
module,
"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv);
1070 if (
sp->subsampling_force_desubsampling_inside_decompression==0)
1072 if (
sp->subsampling_hor<
sp->subsampling_ver)
1076 sp->subsamplingcorrect_done=1;
1080 OJPEGReadHeaderInfo(
TIFF* tif)
1082 static const char module[]=
"OJPEGReadHeaderInfo";
1091 sp->strile_length_total=((
sp->image_length+
sp->strile_length-1)/
sp->strile_length)*
sp->strile_length;
1095 sp->strile_width=
sp->image_width;
1097 sp->strile_length_total=
sp->image_length;
1101 sp->samples_per_pixel=1;
1102 sp->plane_sample_offset=0;
1103 sp->samples_per_pixel_per_plane=
sp->samples_per_pixel;
1104 sp->subsampling_hor=1;
1105 sp->subsampling_ver=1;
1114 sp->samples_per_pixel=3;
1115 sp->plane_sample_offset=0;
1117 sp->samples_per_pixel_per_plane=3;
1119 sp->samples_per_pixel_per_plane=1;
1121 if (
sp->strile_length<
sp->image_length)
1123 if (((
sp->subsampling_hor!=1) && (
sp->subsampling_hor!=2) && (
sp->subsampling_hor!=4)) ||
1124 ((
sp->subsampling_ver!=1) && (
sp->subsampling_ver!=2) && (
sp->subsampling_ver!=4)))
1129 if (
sp->strile_length%(
sp->subsampling_ver*8)!=0)
1134 sp->restart_interval=(
uint16)(((
sp->strile_width+
sp->subsampling_hor*8-1)/(
sp->subsampling_hor*8))*(
sp->strile_length/(
sp->subsampling_ver*8)));
1136 if (OJPEGReadHeaderInfoSec(tif)==0)
1138 sp->sos_end[0].log=1;
1139 sp->sos_end[0].in_buffer_source=
sp->in_buffer_source;
1140 sp->sos_end[0].in_buffer_next_strile=
sp->in_buffer_next_strile;
1141 sp->sos_end[0].in_buffer_file_pos=
sp->in_buffer_file_pos-
sp->in_buffer_togo;
1142 sp->sos_end[0].in_buffer_file_togo=
sp->in_buffer_file_togo+
sp->in_buffer_togo;
1143 sp->readheader_done=1;
1156 sp->plane_sample_offset=(
uint8)(
s-1);
1157 while(
sp->sos_end[
sp->plane_sample_offset].log==0)
1158 sp->plane_sample_offset--;
1159 sp->in_buffer_source=
sp->sos_end[
sp->plane_sample_offset].in_buffer_source;
1160 sp->in_buffer_next_strile=
sp->sos_end[
sp->plane_sample_offset].in_buffer_next_strile;
1161 sp->in_buffer_file_pos=
sp->sos_end[
sp->plane_sample_offset].in_buffer_file_pos;
1162 sp->in_buffer_file_pos_log=0;
1163 sp->in_buffer_file_togo=
sp->sos_end[
sp->plane_sample_offset].in_buffer_file_togo;
1164 sp->in_buffer_togo=0;
1165 sp->in_buffer_cur=0;
1166 while(
sp->plane_sample_offset<
s)
1170 if (OJPEGReadByte(
sp,&
m)==0)
1176 if (OJPEGReadByte(
sp,&
m)==0)
1181 if (
m==JPEG_MARKER_SOS)
1185 sp->plane_sample_offset++;
1186 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
1188 sp->sos_end[
sp->plane_sample_offset].log=1;
1189 sp->sos_end[
sp->plane_sample_offset].in_buffer_source=
sp->in_buffer_source;
1190 sp->sos_end[
sp->plane_sample_offset].in_buffer_next_strile=
sp->in_buffer_next_strile;
1191 sp->sos_end[
sp->plane_sample_offset].in_buffer_file_pos=
sp->in_buffer_file_pos-
sp->in_buffer_togo;
1192 sp->sos_end[
sp->plane_sample_offset].in_buffer_file_togo=
sp->in_buffer_file_togo+
sp->in_buffer_togo;
1198 OJPEGWriteHeaderInfo(
TIFF* tif)
1200 static const char module[]=
"OJPEGWriteHeaderInfo";
1205 if (
sp->libjpeg_session_active != 0)
1207 sp->out_state=ososSoi;
1208 sp->restart_index=0;
1210 sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
1211 sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
1212 sp->libjpeg_jpeg_decompress_struct.err=&(
sp->libjpeg_jpeg_error_mgr);
1213 sp->libjpeg_jpeg_decompress_struct.client_data=(
void*)tif;
1214 if (jpeg_create_decompress_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct))==0)
1216 sp->libjpeg_session_active=1;
1217 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0;
1218 sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource;
1219 sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer;
1220 sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData;
1221 sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart;
1222 sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource;
1223 sp->libjpeg_jpeg_decompress_struct.src=&(
sp->libjpeg_jpeg_source_mgr);
1224 if (jpeg_read_header_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct),1)==0)
1226 if ((
sp->subsampling_force_desubsampling_inside_decompression==0) && (
sp->samples_per_pixel_per_plane>1))
1228 sp->libjpeg_jpeg_decompress_struct.raw_data_out=1;
1229 #if JPEG_LIB_VERSION >= 70 1230 sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=
FALSE;
1232 sp->libjpeg_jpeg_query_style=0;
1233 if (
sp->subsampling_convert_log==0)
1235 assert(
sp->subsampling_convert_ycbcrbuf==0);
1236 assert(
sp->subsampling_convert_ycbcrimage==0);
1237 sp->subsampling_convert_ylinelen=((
sp->strile_width+
sp->subsampling_hor*8-1)/(
sp->subsampling_hor*8)*
sp->subsampling_hor*8);
1238 sp->subsampling_convert_ylines=
sp->subsampling_ver*8;
1239 sp->subsampling_convert_clinelen=
sp->subsampling_convert_ylinelen/
sp->subsampling_hor;
1240 sp->subsampling_convert_clines=8;
1241 sp->subsampling_convert_ybuflen=
sp->subsampling_convert_ylinelen*
sp->subsampling_convert_ylines;
1242 sp->subsampling_convert_cbuflen=
sp->subsampling_convert_clinelen*
sp->subsampling_convert_clines;
1243 sp->subsampling_convert_ycbcrbuflen=
sp->subsampling_convert_ybuflen+2*
sp->subsampling_convert_cbuflen;
1250 sp->subsampling_convert_ycbcrbuf=
_TIFFcalloc(1,
sp->subsampling_convert_ycbcrbuflen);
1251 if (
sp->subsampling_convert_ycbcrbuf==0)
1256 sp->subsampling_convert_ybuf=
sp->subsampling_convert_ycbcrbuf;
1257 sp->subsampling_convert_cbbuf=
sp->subsampling_convert_ybuf+
sp->subsampling_convert_ybuflen;
1258 sp->subsampling_convert_crbuf=
sp->subsampling_convert_cbbuf+
sp->subsampling_convert_cbuflen;
1259 sp->subsampling_convert_ycbcrimagelen=3+
sp->subsampling_convert_ylines+2*
sp->subsampling_convert_clines;
1260 sp->subsampling_convert_ycbcrimage=
_TIFFmalloc(
sp->subsampling_convert_ycbcrimagelen*
sizeof(
uint8*));
1261 if (
sp->subsampling_convert_ycbcrimage==0)
1266 m=
sp->subsampling_convert_ycbcrimage;
1267 *
m++=(
uint8*)(
sp->subsampling_convert_ycbcrimage+3);
1268 *
m++=(
uint8*)(
sp->subsampling_convert_ycbcrimage+3+
sp->subsampling_convert_ylines);
1269 *
m++=(
uint8*)(
sp->subsampling_convert_ycbcrimage+3+
sp->subsampling_convert_ylines+
sp->subsampling_convert_clines);
1270 for (
n=0;
n<
sp->subsampling_convert_ylines;
n++)
1271 *
m++=
sp->subsampling_convert_ybuf+
n*
sp->subsampling_convert_ylinelen;
1272 for (
n=0;
n<
sp->subsampling_convert_clines;
n++)
1273 *
m++=
sp->subsampling_convert_cbbuf+
n*
sp->subsampling_convert_clinelen;
1274 for (
n=0;
n<
sp->subsampling_convert_clines;
n++)
1275 *
m++=
sp->subsampling_convert_crbuf+
n*
sp->subsampling_convert_clinelen;
1276 sp->subsampling_convert_clinelenout=
sp->strile_width/
sp->subsampling_hor + ((
sp->strile_width %
sp->subsampling_hor) != 0 ? 1 : 0);
1277 sp->subsampling_convert_state=0;
1278 sp->error_in_raw_data_decoding=0;
1279 sp->bytes_per_line=
sp->subsampling_convert_clinelenout*(
sp->subsampling_ver*
sp->subsampling_hor+2);
1280 sp->lines_per_strile=
sp->strile_length/
sp->subsampling_ver + ((
sp->strile_length %
sp->subsampling_ver) != 0 ? 1 : 0);
1281 sp->subsampling_convert_log=1;
1286 sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=
JCS_UNKNOWN;
1287 sp->libjpeg_jpeg_decompress_struct.out_color_space=
JCS_UNKNOWN;
1288 sp->libjpeg_jpeg_query_style=1;
1289 sp->bytes_per_line=
sp->samples_per_pixel_per_plane*
sp->strile_width;
1290 sp->lines_per_strile=
sp->strile_length;
1292 if (jpeg_start_decompress_encap(
sp,&(
sp->libjpeg_jpeg_decompress_struct))==0)
1294 sp->writeheader_done=1;
1299 OJPEGLibjpegSessionAbort(
TIFF* tif)
1302 assert(
sp->libjpeg_session_active!=0);
1304 sp->libjpeg_session_active=0;
1308 OJPEGReadHeaderInfoSec(
TIFF* tif)
1310 static const char module[]=
"OJPEGReadHeaderInfoSec";
1315 if (
sp->file_size==0)
1317 if (
sp->jpeg_interchange_format!=0)
1319 if (
sp->jpeg_interchange_format>=
sp->file_size)
1321 sp->jpeg_interchange_format=0;
1322 sp->jpeg_interchange_format_length=0;
1326 if ((
sp->jpeg_interchange_format_length==0) ||
1328 (
sp->jpeg_interchange_format+
sp->jpeg_interchange_format_length>
sp->file_size))
1329 sp->jpeg_interchange_format_length=
sp->file_size-
sp->jpeg_interchange_format;
1332 sp->in_buffer_source=osibsNotSetYet;
1333 sp->in_buffer_next_strile=0;
1335 sp->in_buffer_file_togo=0;
1336 sp->in_buffer_togo=0;
1339 if (OJPEGReadBytePeek(
sp,&
m)==0)
1343 OJPEGReadByteAdvance(
sp);
1346 if (OJPEGReadByte(
sp,&
m)==0)
1351 case JPEG_MARKER_SOI:
1354 case JPEG_MARKER_COM:
1355 case JPEG_MARKER_APP0:
1356 case JPEG_MARKER_APP0+1:
1357 case JPEG_MARKER_APP0+2:
1358 case JPEG_MARKER_APP0+3:
1359 case JPEG_MARKER_APP0+4:
1360 case JPEG_MARKER_APP0+5:
1361 case JPEG_MARKER_APP0+6:
1362 case JPEG_MARKER_APP0+7:
1363 case JPEG_MARKER_APP0+8:
1364 case JPEG_MARKER_APP0+9:
1365 case JPEG_MARKER_APP0+10:
1366 case JPEG_MARKER_APP0+11:
1367 case JPEG_MARKER_APP0+12:
1368 case JPEG_MARKER_APP0+13:
1369 case JPEG_MARKER_APP0+14:
1370 case JPEG_MARKER_APP0+15:
1372 if (OJPEGReadWord(
sp,&
n)==0)
1376 if (
sp->subsamplingcorrect==0)
1381 OJPEGReadSkip(
sp,
n-2);
1383 case JPEG_MARKER_DRI:
1384 if (OJPEGReadHeaderInfoSecStreamDri(tif)==0)
1387 case JPEG_MARKER_DQT:
1388 if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0)
1391 case JPEG_MARKER_DHT:
1392 if (OJPEGReadHeaderInfoSecStreamDht(tif)==0)
1395 case JPEG_MARKER_SOF0:
1396 case JPEG_MARKER_SOF1:
1397 case JPEG_MARKER_SOF3:
1398 if (OJPEGReadHeaderInfoSecStreamSof(tif,
m)==0)
1400 if (
sp->subsamplingcorrect!=0)
1403 case JPEG_MARKER_SOS:
1404 if (
sp->subsamplingcorrect!=0)
1406 assert(
sp->plane_sample_offset==0);
1407 if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
1414 }
while(
m!=JPEG_MARKER_SOS);
1415 if (
sp->subsamplingcorrect)
1419 if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0)
1421 sp->sof_marker_id=JPEG_MARKER_SOF0;
1422 for (o=0; o<
sp->samples_per_pixel; o++)
1424 sp->sof_hv[0]=((
sp->subsampling_hor<<4)|
sp->subsampling_ver);
1425 for (o=1; o<
sp->samples_per_pixel; o++)
1427 sp->sof_x=
sp->strile_width;
1428 sp->sof_y=
sp->strile_length_total;
1430 if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0)
1432 if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0)
1434 for (o=1; o<
sp->samples_per_pixel; o++)
1441 OJPEGReadHeaderInfoSecStreamDri(
TIFF* tif)
1445 static const char module[]=
"OJPEGReadHeaderInfoSecStreamDri";
1448 if (OJPEGReadWord(
sp,&
m)==0)
1455 if (OJPEGReadWord(
sp,&
m)==0)
1457 sp->restart_interval=
m;
1462 OJPEGReadHeaderInfoSecStreamDqt(
TIFF* tif)
1465 static const char module[]=
"OJPEGReadHeaderInfoSecStreamDqt";
1471 if (OJPEGReadWord(
sp,&
m)==0)
1475 if (
sp->subsamplingcorrect==0)
1479 if (
sp->subsamplingcorrect!=0)
1480 OJPEGReadSkip(
sp,
m-2);
1500 nb[
sizeof(
uint32)+1]=JPEG_MARKER_DQT;
1503 if (OJPEGReadBlock(
sp,65,&nb[
sizeof(
uint32)+4])==0) {
1507 o=nb[
sizeof(
uint32)+4]&15;
1514 if (
sp->qtable[o]!=0)
1524 OJPEGReadHeaderInfoSecStreamDht(
TIFF* tif)
1528 static const char module[]=
"OJPEGReadHeaderInfoSecStreamDht";
1534 if (OJPEGReadWord(
sp,&
m)==0)
1538 if (
sp->subsamplingcorrect==0)
1542 if (
sp->subsamplingcorrect!=0)
1544 OJPEGReadSkip(
sp,
m-2);
1557 nb[
sizeof(
uint32)+1]=JPEG_MARKER_DHT;
1560 if (OJPEGReadBlock(
sp,
m-2,&nb[
sizeof(
uint32)+4])==0) {
1573 if (
sp->dctable[o]!=0)
1592 if (
sp->actable[o]!=0)
1601 OJPEGReadHeaderInfoSecStreamSof(
TIFF* tif,
uint8 marker_id)
1604 static const char module[]=
"OJPEGReadHeaderInfoSecStreamSof";
1616 if (
sp->subsamplingcorrect==0)
1617 sp->sof_marker_id=marker_id;
1619 if (OJPEGReadWord(
sp,&
m)==0)
1623 if (
sp->subsamplingcorrect==0)
1630 if (
sp->subsamplingcorrect==0)
1635 if (
sp->subsamplingcorrect==0)
1637 if (
n!=
sp->samples_per_pixel)
1644 if (OJPEGReadByte(
sp,&o)==0)
1648 if (
sp->subsamplingcorrect==0)
1653 if (
sp->subsamplingcorrect)
1654 OJPEGReadSkip(
sp,4);
1658 if (OJPEGReadWord(
sp,&
p)==0)
1667 if (OJPEGReadWord(
sp,&
p)==0)
1682 if (OJPEGReadByte(
sp,&o)==0)
1686 if (
sp->subsamplingcorrect==0)
1695 if (OJPEGReadByte(
sp,&o)==0)
1697 if (
sp->subsamplingcorrect==0)
1700 if (OJPEGReadByte(
sp,&o)==0)
1702 if (
sp->subsamplingcorrect!=0)
1706 sp->subsampling_hor=(o>>4);
1707 sp->subsampling_ver=(o&15);
1708 if (((
sp->subsampling_hor!=1) && (
sp->subsampling_hor!=2) && (
sp->subsampling_hor!=4)) ||
1709 ((
sp->subsampling_ver!=1) && (
sp->subsampling_ver!=2) && (
sp->subsampling_ver!=4)))
1710 sp->subsampling_force_desubsampling_inside_decompression=1;
1715 sp->subsampling_force_desubsampling_inside_decompression=1;
1721 if (
sp->subsampling_force_desubsampling_inside_decompression==0)
1725 if (o!=((
sp->subsampling_hor<<4)|
sp->subsampling_ver))
1742 if (OJPEGReadByte(
sp,&o)==0)
1744 if (
sp->subsamplingcorrect==0)
1747 if (
sp->subsamplingcorrect==0)
1753 OJPEGReadHeaderInfoSecStreamSos(
TIFF* tif)
1756 static const char module[]=
"OJPEGReadHeaderInfoSecStreamSos";
1768 if (OJPEGReadWord(
sp,&
m)==0)
1770 if (
m!=6+
sp->samples_per_pixel_per_plane*2)
1776 if (OJPEGReadByte(
sp,&
n)==0)
1778 if (
n!=
sp->samples_per_pixel_per_plane)
1784 for (o=0; o<
sp->samples_per_pixel_per_plane; o++)
1787 if (OJPEGReadByte(
sp,&
n)==0)
1789 sp->sos_cs[
sp->plane_sample_offset+o]=
n;
1791 if (OJPEGReadByte(
sp,&
n)==0)
1793 sp->sos_tda[
sp->plane_sample_offset+o]=
n;
1796 OJPEGReadSkip(
sp,3);
1801 OJPEGReadHeaderInfoSecTablesQTable(
TIFF* tif)
1803 static const char module[]=
"OJPEGReadHeaderInfoSecTablesQTable";
1810 if (
sp->qtable_offset[0]==0)
1815 sp->in_buffer_file_pos_log=0;
1816 for (
m=0;
m<
sp->samples_per_pixel;
m++)
1818 if ((
sp->qtable_offset[
m]!=0) && ((
m==0) || (
sp->qtable_offset[
m]!=
sp->qtable_offset[
m-1])))
1820 for (
n=0;
n<
m-1;
n++)
1822 if (
sp->qtable_offset[
m]==
sp->qtable_offset[
n])
1837 ob[
sizeof(
uint32)+1]=JPEG_MARKER_DQT;
1848 if (
sp->qtable[
m]!=0)
1854 sp->sof_tq[
m]=
sp->sof_tq[
m-1];
1860 OJPEGReadHeaderInfoSecTablesDcTable(
TIFF* tif)
1862 static const char module[]=
"OJPEGReadHeaderInfoSecTablesDcTable";
1871 if (
sp->dctable_offset[0]==0)
1876 sp->in_buffer_file_pos_log=0;
1877 for (
m=0;
m<
sp->samples_per_pixel;
m++)
1879 if ((
sp->dctable_offset[
m]!=0) && ((
m==0) || (
sp->dctable_offset[
m]!=
sp->dctable_offset[
m-1])))
1881 for (
n=0;
n<
m-1;
n++)
1883 if (
sp->dctable_offset[
m]==
sp->dctable_offset[
n])
1894 for (
n=0;
n<16;
n++)
1905 rb[
sizeof(
uint32)+1]=JPEG_MARKER_DHT;
1907 rb[
sizeof(
uint32)+3]=((19+
q)&255);
1909 for (
n=0;
n<16;
n++)
1917 if (
sp->dctable[
m]!=0)
1920 sp->sos_tda[
m]=(
m<<4);
1923 sp->sos_tda[
m]=
sp->sos_tda[
m-1];
1929 OJPEGReadHeaderInfoSecTablesAcTable(
TIFF* tif)
1931 static const char module[]=
"OJPEGReadHeaderInfoSecTablesAcTable";
1940 if (
sp->actable_offset[0]==0)
1945 sp->in_buffer_file_pos_log=0;
1946 for (
m=0;
m<
sp->samples_per_pixel;
m++)
1948 if ((
sp->actable_offset[
m]!=0) && ((
m==0) || (
sp->actable_offset[
m]!=
sp->actable_offset[
m-1])))
1950 for (
n=0;
n<
m-1;
n++)
1952 if (
sp->actable_offset[
m]==
sp->actable_offset[
n])
1963 for (
n=0;
n<16;
n++)
1974 rb[
sizeof(
uint32)+1]=JPEG_MARKER_DHT;
1976 rb[
sizeof(
uint32)+3]=((19+
q)&255);
1978 for (
n=0;
n<16;
n++)
1986 if (
sp->actable[
m]!=0)
1989 sp->sos_tda[
m]=(
sp->sos_tda[
m]|
m);
1992 sp->sos_tda[
m]=(
sp->sos_tda[
m]|(
sp->sos_tda[
m-1]&15));
1998 OJPEGReadBufferFill(OJPEGState*
sp)
2006 if (
sp->in_buffer_file_togo!=0)
2008 if (
sp->in_buffer_file_pos_log==0)
2011 sp->in_buffer_file_pos_log=1;
2024 sp->in_buffer_togo=
m;
2025 sp->in_buffer_cur=
sp->in_buffer;
2026 sp->in_buffer_file_togo-=
m;
2027 sp->in_buffer_file_pos+=
m;
2030 sp->in_buffer_file_pos_log=0;
2031 switch(
sp->in_buffer_source)
2033 case osibsNotSetYet:
2034 if (
sp->jpeg_interchange_format!=0)
2036 sp->in_buffer_file_pos=
sp->jpeg_interchange_format;
2037 sp->in_buffer_file_togo=
sp->jpeg_interchange_format_length;
2039 sp->in_buffer_source=osibsJpegInterchangeFormat;
2041 case osibsJpegInterchangeFormat:
2042 sp->in_buffer_source=osibsStrile;
2045 if (
sp->in_buffer_next_strile==
sp->in_buffer_strile_count)
2046 sp->in_buffer_source=osibsEof;
2053 if (
sp->in_buffer_file_pos!=0)
2058 if (
sp->in_buffer_file_pos>=
sp->file_size)
2059 sp->in_buffer_file_pos=0;
2060 else if (bytecount==0)
2061 sp->in_buffer_file_togo=
sp->file_size-
sp->in_buffer_file_pos;
2064 sp->in_buffer_file_togo=bytecount;
2065 if (
sp->in_buffer_file_togo==0)
2066 sp->in_buffer_file_pos=0;
2068 sp->in_buffer_file_pos+
sp->in_buffer_file_togo>
sp->file_size)
2069 sp->in_buffer_file_togo=
sp->file_size-
sp->in_buffer_file_pos;
2072 sp->in_buffer_next_strile++;
2083 OJPEGReadByte(OJPEGState*
sp,
uint8*
byte)
2085 if (
sp->in_buffer_togo==0)
2087 if (OJPEGReadBufferFill(
sp)==0)
2091 *
byte=*(
sp->in_buffer_cur);
2092 sp->in_buffer_cur++;
2093 sp->in_buffer_togo--;
2098 OJPEGReadBytePeek(OJPEGState*
sp,
uint8*
byte)
2100 if (
sp->in_buffer_togo==0)
2102 if (OJPEGReadBufferFill(
sp)==0)
2106 *
byte=*(
sp->in_buffer_cur);
2111 OJPEGReadByteAdvance(OJPEGState*
sp)
2114 sp->in_buffer_cur++;
2115 sp->in_buffer_togo--;
2122 if (OJPEGReadByte(
sp,&
m)==0)
2125 if (OJPEGReadByte(
sp,&
m)==0)
2142 if (
sp->in_buffer_togo==0)
2144 if (OJPEGReadBufferFill(
sp)==0)
2149 if (
n>
sp->in_buffer_togo)
2150 n=
sp->in_buffer_togo;
2152 sp->in_buffer_cur+=
n;
2153 sp->in_buffer_togo-=
n;
2167 if (
n>
sp->in_buffer_togo)
2168 n=
sp->in_buffer_togo;
2169 sp->in_buffer_cur+=
n;
2170 sp->in_buffer_togo-=
n;
2178 sp->in_buffer_file_pos+=
n;
2179 sp->in_buffer_file_togo-=
n;
2180 sp->in_buffer_file_pos_log=0;
2198 switch(
sp->out_state)
2201 OJPEGWriteStreamSoi(tif,
mem,
len);
2204 OJPEGWriteStreamQTable(tif,0,
mem,
len);
2207 OJPEGWriteStreamQTable(tif,1,
mem,
len);
2210 OJPEGWriteStreamQTable(tif,2,
mem,
len);
2213 OJPEGWriteStreamQTable(tif,3,
mem,
len);
2216 OJPEGWriteStreamDcTable(tif,0,
mem,
len);
2219 OJPEGWriteStreamDcTable(tif,1,
mem,
len);
2222 OJPEGWriteStreamDcTable(tif,2,
mem,
len);
2225 OJPEGWriteStreamDcTable(tif,3,
mem,
len);
2228 OJPEGWriteStreamAcTable(tif,0,
mem,
len);
2231 OJPEGWriteStreamAcTable(tif,1,
mem,
len);
2234 OJPEGWriteStreamAcTable(tif,2,
mem,
len);
2237 OJPEGWriteStreamAcTable(tif,3,
mem,
len);
2240 OJPEGWriteStreamDri(tif,
mem,
len);
2243 OJPEGWriteStreamSof(tif,
mem,
len);
2246 OJPEGWriteStreamSos(tif,
mem,
len);
2248 case ososCompressed:
2249 if (OJPEGWriteStreamCompressed(tif,
mem,
len)==0)
2253 OJPEGWriteStreamRst(tif,
mem,
len);
2256 OJPEGWriteStreamEoi(tif,
mem,
len);
2268 sp->out_buffer[0]=255;
2269 sp->out_buffer[1]=JPEG_MARKER_SOI;
2271 *
mem=(
void*)
sp->out_buffer;
2279 if (
sp->qtable[table_index]!=0)
2281 *
mem=(
void*)(
sp->qtable[table_index]+
sizeof(
uint32));
2291 if (
sp->dctable[table_index]!=0)
2293 *
mem=(
void*)(
sp->dctable[table_index]+
sizeof(
uint32));
2303 if (
sp->actable[table_index]!=0)
2305 *
mem=(
void*)(
sp->actable[table_index]+
sizeof(
uint32));
2316 if (
sp->restart_interval!=0)
2318 sp->out_buffer[0]=255;
2319 sp->out_buffer[1]=JPEG_MARKER_DRI;
2320 sp->out_buffer[2]=0;
2321 sp->out_buffer[3]=4;
2322 sp->out_buffer[4]=(
sp->restart_interval>>8);
2323 sp->out_buffer[5]=(
sp->restart_interval&255);
2325 *
mem=(
void*)
sp->out_buffer;
2335 assert(OJPEG_BUFFER>=2+8+
sp->samples_per_pixel_per_plane*3);
2336 assert(255>=8+
sp->samples_per_pixel_per_plane*3);
2337 sp->out_buffer[0]=255;
2338 sp->out_buffer[1]=
sp->sof_marker_id;
2340 sp->out_buffer[2]=0;
2341 sp->out_buffer[3]=8+
sp->samples_per_pixel_per_plane*3;
2343 sp->out_buffer[4]=8;
2345 sp->out_buffer[5]=(
uint8)(
sp->sof_y>>8);
2346 sp->out_buffer[6]=(
sp->sof_y&255);
2348 sp->out_buffer[7]=(
uint8)(
sp->sof_x>>8);
2349 sp->out_buffer[8]=(
sp->sof_x&255);
2351 sp->out_buffer[9]=
sp->samples_per_pixel_per_plane;
2352 for (
m=0;
m<
sp->samples_per_pixel_per_plane;
m++)
2355 sp->out_buffer[10+
m*3]=
sp->sof_c[
sp->plane_sample_offset+
m];
2357 sp->out_buffer[10+
m*3+1]=
sp->sof_hv[
sp->plane_sample_offset+
m];
2359 sp->out_buffer[10+
m*3+2]=
sp->sof_tq[
sp->plane_sample_offset+
m];
2361 *
len=10+
sp->samples_per_pixel_per_plane*3;
2362 *
mem=(
void*)
sp->out_buffer;
2371 assert(OJPEG_BUFFER>=2+6+
sp->samples_per_pixel_per_plane*2);
2372 assert(255>=6+
sp->samples_per_pixel_per_plane*2);
2373 sp->out_buffer[0]=255;
2374 sp->out_buffer[1]=JPEG_MARKER_SOS;
2376 sp->out_buffer[2]=0;
2377 sp->out_buffer[3]=6+
sp->samples_per_pixel_per_plane*2;
2379 sp->out_buffer[4]=
sp->samples_per_pixel_per_plane;
2380 for (
m=0;
m<
sp->samples_per_pixel_per_plane;
m++)
2383 sp->out_buffer[5+
m*2]=
sp->sos_cs[
sp->plane_sample_offset+
m];
2385 sp->out_buffer[5+
m*2+1]=
sp->sos_tda[
sp->plane_sample_offset+
m];
2388 sp->out_buffer[5+
sp->samples_per_pixel_per_plane*2]=0;
2390 sp->out_buffer[5+
sp->samples_per_pixel_per_plane*2+1]=63;
2392 sp->out_buffer[5+
sp->samples_per_pixel_per_plane*2+2]=0;
2393 *
len=8+
sp->samples_per_pixel_per_plane*2;
2394 *
mem=(
void*)
sp->out_buffer;
2402 if (
sp->in_buffer_togo==0)
2404 if (OJPEGReadBufferFill(
sp)==0)
2408 *
len=
sp->in_buffer_togo;
2409 *
mem=(
void*)
sp->in_buffer_cur;
2410 sp->in_buffer_togo=0;
2411 if (
sp->in_buffer_file_togo==0)
2413 switch(
sp->in_buffer_source)
2416 if (
sp->in_buffer_next_strile<
sp->in_buffer_strile_count)
2417 sp->out_state=ososRst;
2419 sp->out_state=ososEoi;
2422 sp->out_state=ososEoi;
2436 sp->out_buffer[0]=255;
2437 sp->out_buffer[1]=JPEG_MARKER_RST0+
sp->restart_index;
2438 sp->restart_index++;
2439 if (
sp->restart_index==8)
2440 sp->restart_index=0;
2442 *
mem=(
void*)
sp->out_buffer;
2443 sp->out_state=ososCompressed;
2451 sp->out_buffer[0]=255;
2452 sp->out_buffer[1]=JPEG_MARKER_EOI;
2454 *
mem=(
void*)
sp->out_buffer;
2457 #ifndef LIBJPEG_ENCAP_EXTERNAL 2461 if( SETJMP(
sp->exit_jmpbuf) )
2470 #ifndef LIBJPEG_ENCAP_EXTERNAL 2474 if( SETJMP(
sp->exit_jmpbuf) )
2483 #ifndef LIBJPEG_ENCAP_EXTERNAL 2487 if( SETJMP(
sp->exit_jmpbuf) )
2490 jpeg_start_decompress(cinfo);
2496 #ifndef LIBJPEG_ENCAP_EXTERNAL 2500 if( SETJMP(
sp->exit_jmpbuf) )
2509 #ifndef LIBJPEG_ENCAP_EXTERNAL 2513 if( SETJMP(
sp->exit_jmpbuf) )
2522 #ifndef LIBJPEG_ENCAP_EXTERNAL 2524 jpeg_encap_unwind(
TIFF* tif)
2527 LONGJMP(
sp->exit_jmpbuf,1);
2535 (*cinfo->err->format_message)(cinfo,
buffer);
2543 (*cinfo->err->format_message)(cinfo,
buffer);
2545 jpeg_encap_unwind((
TIFF*)(cinfo->client_data));
2557 TIFF* tif=(
TIFF*)cinfo->client_data;
2561 if (OJPEGWriteStream(tif,&
mem,&
len)==0)
2564 jpeg_encap_unwind(tif);
2566 sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=
len;
2567 sp->libjpeg_jpeg_source_mgr.next_input_byte=
mem;
2574 TIFF* tif=(
TIFF*)cinfo->client_data;
2577 jpeg_encap_unwind(tif);
2581 #pragma warning( push ) 2582 #pragma warning( disable : 4702 ) 2587 TIFF* tif=(
TIFF*)cinfo->client_data;
2590 jpeg_encap_unwind(tif);
2594 #pragma warning( pop )
TIFFCodeMethod tif_decoderow
TIFFTagMethods tif_tagmethods
void _TIFFmemset(void *p, int v, tmsize_t c)
jpeg_read_header(j_decompress_ptr cinfo, boolean require_image)
GLint GLint GLsizei width
#define PHOTOMETRIC_YCBCR
TIFFPreMethod tif_predecode
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
#define TIFF_UINT64_FORMAT
#define TIFFTAG_JPEGIFOFFSET
void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt,...)
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]
TIFFCodeMethod tif_encodestrip
GLdouble GLdouble GLdouble r
#define TIFFSeekFile(tif, off, whence)
JSAMPARRAY JDIMENSION max_lines
int(* TIFFVSetMethod)(TIFF *, uint32, va_list)
TIFFCodeMethod tif_encoderow
#define PHOTOMETRIC_ITULAB
#define COMPRESSION_OJPEG
#define TIFFTAG_YCBCRSUBSAMPLING
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID out_buffer
static unsigned char * in_buffer
GLenum GLuint GLenum GLsizei const GLchar * buf
#define jpeg_create_decompress(cinfo)
#define TIFFSetFieldBit(tif, field)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32 n)
jpeg_read_raw_data(j_decompress_ptr cinfo, JSAMPIMAGE data, JDIMENSION max_lines)
#define TIFFTAG_JPEGACTABLES
TIFFCodeMethod tif_decodestrip
int(* TIFFVGetMethod)(TIFF *, uint32, va_list)
#define TIFFTAG_JPEGQTABLES
TIFFCodeMethod tif_encodetile
uint64 TIFFGetStrileOffsetWithErr(TIFF *tif, uint32 strile, int *pbErr)
void * _TIFFmalloc(tmsize_t s)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
TIFFPreMethod tif_preencode
TIFFBoolMethod tif_postencode
TIFFPostMethod tif_postdecode
GLdouble GLdouble GLdouble GLdouble q
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt,...)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define TIFFFieldSet(tif, field)
void * _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
TIFFCodeMethod tif_decodetile
TIFFVoidMethod tif_cleanup
#define TIFFTAG_JPEGDCTABLES
#define TIFFGetFileSize(tif)
#define TIFFArrayCount(a)
const TIFFField * TIFFFieldWithTag(TIFF *tif, uint32 tag)
void _TIFFSetDefaultCompressionState(TIFF *tif)
#define TIFFTAG_JPEGIFBYTECOUNT
jpeg_read_scanlines(j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines)
void(* TIFFPrintMethod)(TIFF *, FILE *, long)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
uint16 td_ycbcrsubsampling[2]
TIFFBoolMethod tif_fixuptags
uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr)
jpeg_std_error(struct jpeg_error_mgr *err)
void int int ULONGLONG int va_list * ap
uint16 td_samplesperpixel
jpeg_destroy(j_common_ptr cinfo)
#define TIFFReadFile(tif, buf, size)
#define TIFFTAG_JPEGRESTARTINTERVAL
TIFFBoolMethod tif_setupencode
int TIFFSetField(TIFF *tif, uint32 tag,...)
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
#define PLANARCONFIG_CONTIG
TIFFBoolMethod tif_setupdecode