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__)
225 osibsJpegInterchangeFormat,
228} OJPEGStateInBufferSource;
232 ososQTable0,ososQTable1,ososQTable2,ososQTable3,
233 ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
234 ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
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;
343static int OJPEGFixupTags(
TIFF* tif);
344static int OJPEGSetupDecode(
TIFF* tif);
346static int OJPEGPreDecodeSkipRaw(
TIFF* tif);
347static int OJPEGPreDecodeSkipScanlines(
TIFF* tif);
352static int OJPEGSetupEncode(
TIFF* tif);
355static int OJPEGPostEncode(
TIFF* tif);
356static void OJPEGCleanup(
TIFF* tif);
358static void OJPEGSubsamplingCorrect(
TIFF* tif);
359static int OJPEGReadHeaderInfo(
TIFF* tif);
360static int OJPEGReadSecondarySos(
TIFF* tif,
uint16 s);
361static int OJPEGWriteHeaderInfo(
TIFF* tif);
362static void OJPEGLibjpegSessionAbort(
TIFF* tif);
364static int OJPEGReadHeaderInfoSec(
TIFF* tif);
365static int OJPEGReadHeaderInfoSecStreamDri(
TIFF* tif);
366static int OJPEGReadHeaderInfoSecStreamDqt(
TIFF* tif);
367static int OJPEGReadHeaderInfoSecStreamDht(
TIFF* tif);
368static int OJPEGReadHeaderInfoSecStreamSof(
TIFF* tif,
uint8 marker_id);
369static int OJPEGReadHeaderInfoSecStreamSos(
TIFF* tif);
370static int OJPEGReadHeaderInfoSecTablesQTable(
TIFF* tif);
371static int OJPEGReadHeaderInfoSecTablesDcTable(
TIFF* tif);
372static int OJPEGReadHeaderInfoSecTablesAcTable(
TIFF* tif);
374static int OJPEGReadBufferFill(OJPEGState*
sp);
375static int OJPEGReadByte(OJPEGState*
sp,
uint8*
byte);
376static int OJPEGReadBytePeek(OJPEGState*
sp,
uint8*
byte);
377static void OJPEGReadByteAdvance(OJPEGState*
sp);
380static void OJPEGReadSkip(OJPEGState*
sp,
uint16 len);
394#ifdef LIBJPEG_ENCAP_EXTERNAL
400extern void jpeg_encap_unwind(
TIFF* tif);
407static 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);
651OJPEGFixupTags(
TIFF* tif)
658OJPEGSetupDecode(
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++;
730OJPEGPreDecodeSkipRaw(
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;
764OJPEGPreDecodeSkipScanlines(
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;
943OJPEGSetupEncode(
TIFF* tif)
945 static const char module[]=
"OJPEGSetupEncode";
953 static const char module[]=
"OJPEGPreEncode";
962 static const char module[]=
"OJPEGEncode";
971OJPEGPostEncode(
TIFF* tif)
973 static const char module[]=
"OJPEGPostEncode";
979OJPEGCleanup(
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)
1026OJPEGSubsamplingCorrect(
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;
1080OJPEGReadHeaderInfo(
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;
1198OJPEGWriteHeaderInfo(
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;
1299OJPEGLibjpegSessionAbort(
TIFF* tif)
1302 assert(
sp->libjpeg_session_active!=0);
1304 sp->libjpeg_session_active=0;
1308OJPEGReadHeaderInfoSec(
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++)
1441OJPEGReadHeaderInfoSecStreamDri(
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;
1462OJPEGReadHeaderInfoSecStreamDqt(
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)
1524OJPEGReadHeaderInfoSecStreamDht(
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)
1601OJPEGReadHeaderInfoSecStreamSof(
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)
1753OJPEGReadHeaderInfoSecStreamSos(
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);
1801OJPEGReadHeaderInfoSecTablesQTable(
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];
1860OJPEGReadHeaderInfoSecTablesDcTable(
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];
1929OJPEGReadHeaderInfoSecTablesAcTable(
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));
1998OJPEGReadBufferFill(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++;
2083OJPEGReadByte(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--;
2098OJPEGReadBytePeek(OJPEGState*
sp,
uint8*
byte)
2100 if (
sp->in_buffer_togo==0)
2102 if (OJPEGReadBufferFill(
sp)==0)
2106 *
byte=*(
sp->in_buffer_cur);
2111OJPEGReadByteAdvance(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
2524jpeg_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 )
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLint GLint GLsizei width
GLdouble GLdouble GLdouble GLdouble q
GLenum GLuint GLenum GLsizei const GLchar * buf
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
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
static unsigned char * in_buffer
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
jpeg_destroy(j_common_ptr cinfo)
jpeg_read_header(j_decompress_ptr cinfo, boolean require_image)
jpeg_read_scanlines(j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines)
jpeg_read_raw_data(j_decompress_ptr cinfo, JSAMPIMAGE data, JDIMENSION max_lines)
jpeg_std_error(struct jpeg_error_mgr *err)
#define jpeg_create_decompress(cinfo)
JSAMPARRAY JDIMENSION max_lines
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID out_buffer
static unsigned int file_size
uint16 td_samplesperpixel
uint16 td_ycbcrsubsampling[2]
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]
TIFFCodeMethod tif_encodestrip
TIFFCodeMethod tif_encodetile
TIFFTagMethods tif_tagmethods
TIFFPreMethod tif_preencode
TIFFBoolMethod tif_fixuptags
TIFFPreMethod tif_predecode
TIFFCodeMethod tif_decodestrip
TIFFPostMethod tif_postdecode
TIFFCodeMethod tif_decoderow
TIFFBoolMethod tif_setupencode
TIFFBoolMethod tif_postencode
TIFFCodeMethod tif_encoderow
TIFFVoidMethod tif_cleanup
TIFFBoolMethod tif_setupdecode
TIFFCodeMethod tif_decodetile
void _TIFFSetDefaultCompressionState(TIFF *tif)
#define TIFF_UINT64_FORMAT
int TIFFSetField(TIFF *tif, uint32 tag,...)
#define TIFFFieldSet(tif, field)
#define TIFFSetFieldBit(tif, field)
const TIFFField * TIFFFieldWithTag(TIFF *tif, uint32 tag)
int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32 n)
uint64 TIFFGetStrileOffsetWithErr(TIFF *tif, uint32 strile, int *pbErr)
uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr)
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt,...)
void * _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
void _TIFFmemset(void *p, int v, tmsize_t c)
void * _TIFFmalloc(tmsize_t s)
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt,...)
#define TIFFTAG_JPEGDCTABLES
#define COMPRESSION_OJPEG
#define TIFFTAG_JPEGQTABLES
#define PHOTOMETRIC_ITULAB
#define TIFFTAG_JPEGIFBYTECOUNT
#define TIFFTAG_JPEGACTABLES
#define TIFFTAG_JPEGRESTARTINTERVAL
#define PHOTOMETRIC_YCBCR
#define TIFFTAG_JPEGIFOFFSET
#define TIFFTAG_YCBCRSUBSAMPLING
#define PLANARCONFIG_CONTIG
void(* TIFFPrintMethod)(TIFF *, FILE *, long)
int(* TIFFVGetMethod)(TIFF *, uint32, va_list)
int(* TIFFVSetMethod)(TIFF *, uint32, va_list)
#define TIFFReadFile(tif, buf, size)
#define TIFFGetFileSize(tif)
#define TIFFSeekFile(tif, off, whence)
#define TIFFArrayCount(a)
void int int ULONGLONG int va_list * ap