OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. | 2 * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are met: | 5 * modification, are permitted provided that the following conditions are met: |
6 * | 6 * |
7 * - Redistributions of source code must retain the above copyright notice, | 7 * - Redistributions of source code must retain the above copyright notice, |
8 * this list of conditions and the following disclaimer. | 8 * this list of conditions and the following disclaimer. |
9 * - Redistributions in binary form must reproduce the above copyright notice, | 9 * - Redistributions in binary form must reproduce the above copyright notice, |
10 * this list of conditions and the following disclaimer in the documentation | 10 * this list of conditions and the following disclaimer in the documentation |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 else | 138 else |
139 { | 139 { |
140 if(flags&TJ_BGR) return TJPF_BGRX; | 140 if(flags&TJ_BGR) return TJPF_BGRX; |
141 else return TJPF_RGBX; | 141 else return TJPF_RGBX; |
142 } | 142 } |
143 } | 143 } |
144 return -1; | 144 return -1; |
145 } | 145 } |
146 | 146 |
147 static int setCompDefaults(struct jpeg_compress_struct *cinfo, | 147 static int setCompDefaults(struct jpeg_compress_struct *cinfo, |
148 » int pixelFormat, int subsamp, int jpegQual) | 148 » int pixelFormat, int subsamp, int jpegQual, int flags) |
149 { | 149 { |
150 int retval=0; | 150 int retval=0; |
151 | 151 |
152 switch(pixelFormat) | 152 switch(pixelFormat) |
153 { | 153 { |
154 case TJPF_GRAY: | 154 case TJPF_GRAY: |
155 cinfo->in_color_space=JCS_GRAYSCALE; break; | 155 cinfo->in_color_space=JCS_GRAYSCALE; break; |
156 #if JCS_EXTENSIONS==1 | 156 #if JCS_EXTENSIONS==1 |
157 case TJPF_RGB: | 157 case TJPF_RGB: |
158 cinfo->in_color_space=JCS_EXT_RGB; break; | 158 cinfo->in_color_space=JCS_EXT_RGB; break; |
(...skipping 25 matching lines...) Expand all Loading... |
184 cinfo->in_color_space=JCS_RGB; pixelFormat=TJPF_RGB; | 184 cinfo->in_color_space=JCS_RGB; pixelFormat=TJPF_RGB; |
185 break; | 185 break; |
186 #endif | 186 #endif |
187 } | 187 } |
188 | 188 |
189 cinfo->input_components=tjPixelSize[pixelFormat]; | 189 cinfo->input_components=tjPixelSize[pixelFormat]; |
190 jpeg_set_defaults(cinfo); | 190 jpeg_set_defaults(cinfo); |
191 if(jpegQual>=0) | 191 if(jpegQual>=0) |
192 { | 192 { |
193 jpeg_set_quality(cinfo, jpegQual, TRUE); | 193 jpeg_set_quality(cinfo, jpegQual, TRUE); |
194 » » if(jpegQual>=96) cinfo->dct_method=JDCT_ISLOW; | 194 » » if(jpegQual>=96 || flags&TJFLAG_ACCURATEDCT) cinfo->dct_method=J
DCT_ISLOW; |
195 else cinfo->dct_method=JDCT_FASTEST; | 195 else cinfo->dct_method=JDCT_FASTEST; |
196 } | 196 } |
197 if(subsamp==TJSAMP_GRAY) | 197 if(subsamp==TJSAMP_GRAY) |
198 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); | 198 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); |
199 else | 199 else |
200 jpeg_set_colorspace(cinfo, JCS_YCbCr); | 200 jpeg_set_colorspace(cinfo, JCS_YCbCr); |
201 | 201 |
202 cinfo->comp_info[0].h_samp_factor=tjMCUWidth[subsamp]/8; | 202 cinfo->comp_info[0].h_samp_factor=tjMCUWidth[subsamp]/8; |
203 cinfo->comp_info[1].h_samp_factor=1; | 203 cinfo->comp_info[1].h_samp_factor=1; |
204 cinfo->comp_info[2].h_samp_factor=1; | 204 cinfo->comp_info[2].h_samp_factor=1; |
205 cinfo->comp_info[0].v_samp_factor=tjMCUHeight[subsamp]/8; | 205 cinfo->comp_info[0].v_samp_factor=tjMCUHeight[subsamp]/8; |
206 cinfo->comp_info[1].v_samp_factor=1; | 206 cinfo->comp_info[1].v_samp_factor=1; |
207 cinfo->comp_info[2].v_samp_factor=1; | 207 cinfo->comp_info[2].v_samp_factor=1; |
208 | 208 |
209 return retval; | 209 return retval; |
210 } | 210 } |
211 | 211 |
212 static int setDecompDefaults(struct jpeg_decompress_struct *dinfo, | 212 static int setDecompDefaults(struct jpeg_decompress_struct *dinfo, |
213 » int pixelFormat) | 213 » int pixelFormat, int flags) |
214 { | 214 { |
215 int retval=0; | 215 int retval=0; |
216 | 216 |
217 switch(pixelFormat) | 217 switch(pixelFormat) |
218 { | 218 { |
219 case TJPF_GRAY: | 219 case TJPF_GRAY: |
220 dinfo->out_color_space=JCS_GRAYSCALE; break; | 220 dinfo->out_color_space=JCS_GRAYSCALE; break; |
221 #if JCS_EXTENSIONS==1 | 221 #if JCS_EXTENSIONS==1 |
222 case TJPF_RGB: | 222 case TJPF_RGB: |
223 dinfo->out_color_space=JCS_EXT_RGB; break; | 223 dinfo->out_color_space=JCS_EXT_RGB; break; |
(...skipping 27 matching lines...) Expand all Loading... |
251 case TJPF_RGBA: | 251 case TJPF_RGBA: |
252 case TJPF_BGRA: | 252 case TJPF_BGRA: |
253 case TJPF_ARGB: | 253 case TJPF_ARGB: |
254 case TJPF_ABGR: | 254 case TJPF_ABGR: |
255 dinfo->out_color_space=JCS_RGB; break; | 255 dinfo->out_color_space=JCS_RGB; break; |
256 #endif | 256 #endif |
257 default: | 257 default: |
258 _throw("Unsupported pixel format"); | 258 _throw("Unsupported pixel format"); |
259 } | 259 } |
260 | 260 |
| 261 if(flags&TJFLAG_FASTDCT) dinfo->dct_method=JDCT_FASTEST; |
| 262 |
261 bailout: | 263 bailout: |
262 return retval; | 264 return retval; |
263 } | 265 } |
264 | 266 |
265 | 267 |
266 static int getSubsamp(j_decompress_ptr dinfo) | 268 static int getSubsamp(j_decompress_ptr dinfo) |
267 { | 269 { |
268 int retval=-1, i, k; | 270 int retval=-1, i, k; |
269 for(i=0; i<NUMSUBOPT; i++) | 271 for(i=0; i<NUMSUBOPT; i++) |
270 { | 272 { |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 | 613 |
612 if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); | 614 if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); |
613 else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); | 615 else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); |
614 else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); | 616 else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); |
615 | 617 |
616 if(flags&TJFLAG_NOREALLOC) | 618 if(flags&TJFLAG_NOREALLOC) |
617 { | 619 { |
618 alloc=0; *jpegSize=tjBufSize(width, height, jpegSubsamp); | 620 alloc=0; *jpegSize=tjBufSize(width, height, jpegSubsamp); |
619 } | 621 } |
620 jpeg_mem_dest_tj(cinfo, jpegBuf, jpegSize, alloc); | 622 jpeg_mem_dest_tj(cinfo, jpegBuf, jpegSize, alloc); |
621 » if(setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual)==-1) | 623 » if(setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual, flags)==-1
) |
622 return -1; | 624 return -1; |
623 | 625 |
624 jpeg_start_compress(cinfo, TRUE); | 626 jpeg_start_compress(cinfo, TRUE); |
625 if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL) | 627 if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL) |
626 _throw("tjCompress2(): Memory allocation failure"); | 628 _throw("tjCompress2(): Memory allocation failure"); |
627 for(i=0; i<height; i++) | 629 for(i=0; i<height; i++) |
628 { | 630 { |
629 if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pi
tch]; | 631 if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pi
tch]; |
630 else row_pointer[i]=&srcBuf[i*pitch]; | 632 else row_pointer[i]=&srcBuf[i*pitch]; |
631 } | 633 } |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 | 721 |
720 cinfo->image_width=width; | 722 cinfo->image_width=width; |
721 cinfo->image_height=height; | 723 cinfo->image_height=height; |
722 | 724 |
723 if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); | 725 if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); |
724 else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); | 726 else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); |
725 else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); | 727 else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); |
726 | 728 |
727 yuvsize=tjBufSizeYUV(width, height, subsamp); | 729 yuvsize=tjBufSizeYUV(width, height, subsamp); |
728 jpeg_mem_dest_tj(cinfo, &dstBuf, &yuvsize, 0); | 730 jpeg_mem_dest_tj(cinfo, &dstBuf, &yuvsize, 0); |
729 » if(setCompDefaults(cinfo, pixelFormat, subsamp, -1)==-1) return -1; | 731 » if(setCompDefaults(cinfo, pixelFormat, subsamp, -1, flags)==-1) return -
1; |
730 | 732 |
731 jpeg_start_compress(cinfo, TRUE); | 733 jpeg_start_compress(cinfo, TRUE); |
732 pw=PAD(width, cinfo->max_h_samp_factor); | 734 pw=PAD(width, cinfo->max_h_samp_factor); |
733 ph=PAD(height, cinfo->max_v_samp_factor); | 735 ph=PAD(height, cinfo->max_v_samp_factor); |
734 | 736 |
735 if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*ph))==NULL) | 737 if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*ph))==NULL) |
736 _throw("tjEncodeYUV2(): Memory allocation failure"); | 738 _throw("tjEncodeYUV2(): Memory allocation failure"); |
737 for(i=0; i<height; i++) | 739 for(i=0; i<height; i++) |
738 { | 740 { |
739 if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pi
tch]; | 741 if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pi
tch]; |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 | 950 |
949 if(setjmp(this->jerr.setjmp_buffer)) | 951 if(setjmp(this->jerr.setjmp_buffer)) |
950 { | 952 { |
951 /* If we get here, the JPEG code has signaled an error. */ | 953 /* If we get here, the JPEG code has signaled an error. */ |
952 retval=-1; | 954 retval=-1; |
953 goto bailout; | 955 goto bailout; |
954 } | 956 } |
955 | 957 |
956 jpeg_mem_src_tj(dinfo, jpegBuf, jpegSize); | 958 jpeg_mem_src_tj(dinfo, jpegBuf, jpegSize); |
957 jpeg_read_header(dinfo, TRUE); | 959 jpeg_read_header(dinfo, TRUE); |
958 » if(setDecompDefaults(dinfo, pixelFormat)==-1) | 960 » if(setDecompDefaults(dinfo, pixelFormat, flags)==-1) |
959 { | 961 { |
960 retval=-1; goto bailout; | 962 retval=-1; goto bailout; |
961 } | 963 } |
962 | 964 |
963 if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; | 965 if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; |
964 | 966 |
965 jpegwidth=dinfo->image_width; jpegheight=dinfo->image_height; | 967 jpegwidth=dinfo->image_width; jpegheight=dinfo->image_height; |
966 if(width==0) width=jpegwidth; | 968 if(width==0) width=jpegwidth; |
967 if(height==0) height=jpegheight; | 969 if(height==0) height=jpegheight; |
968 for(i=0; i<NUMSF; i++) | 970 for(i=0; i<NUMSF; i++) |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 _throw("tjDecompressToYUV(): Memory allocation f
ailure"); | 1105 _throw("tjDecompressToYUV(): Memory allocation f
ailure"); |
1104 for(row=0; row<th[i]; row++) | 1106 for(row=0; row<th[i]; row++) |
1105 { | 1107 { |
1106 tmpbuf[i][row]=ptr; | 1108 tmpbuf[i][row]=ptr; |
1107 ptr+=iw[i]; | 1109 ptr+=iw[i]; |
1108 } | 1110 } |
1109 } | 1111 } |
1110 } | 1112 } |
1111 | 1113 |
1112 if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; | 1114 if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; |
| 1115 if(flags&TJFLAG_FASTDCT) dinfo->dct_method=JDCT_FASTEST; |
1113 dinfo->raw_data_out=TRUE; | 1116 dinfo->raw_data_out=TRUE; |
1114 | 1117 |
1115 jpeg_start_decompress(dinfo); | 1118 jpeg_start_decompress(dinfo); |
1116 for(row=0; row<(int)dinfo->output_height; | 1119 for(row=0; row<(int)dinfo->output_height; |
1117 row+=dinfo->max_v_samp_factor*DCTSIZE) | 1120 row+=dinfo->max_v_samp_factor*DCTSIZE) |
1118 { | 1121 { |
1119 JSAMPARRAY yuvptr[MAX_COMPONENTS]; | 1122 JSAMPARRAY yuvptr[MAX_COMPONENTS]; |
1120 int crow[MAX_COMPONENTS]; | 1123 int crow[MAX_COMPONENTS]; |
1121 for(i=0; i<dinfo->num_components; i++) | 1124 for(i=0; i<dinfo->num_components; i++) |
1122 { | 1125 { |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1316 } | 1319 } |
1317 | 1320 |
1318 jpeg_finish_decompress(dinfo); | 1321 jpeg_finish_decompress(dinfo); |
1319 | 1322 |
1320 bailout: | 1323 bailout: |
1321 if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo); | 1324 if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo); |
1322 if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo); | 1325 if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo); |
1323 if(xinfo) free(xinfo); | 1326 if(xinfo) free(xinfo); |
1324 return retval; | 1327 return retval; |
1325 } | 1328 } |
OLD | NEW |