| Index: turbojpeg.c
|
| ===================================================================
|
| --- turbojpeg.c (revision 106486)
|
| +++ turbojpeg.c (working copy)
|
| @@ -132,9 +132,11 @@
|
| return -1;
|
| }
|
|
|
| -static void setCompDefaults(struct jpeg_compress_struct *cinfo,
|
| +static int setCompDefaults(struct jpeg_compress_struct *cinfo,
|
| int pixelFormat, int subsamp, int jpegQual)
|
| {
|
| + int retval=0;
|
| +
|
| switch(pixelFormat)
|
| {
|
| case TJPF_GRAY:
|
| @@ -182,11 +184,18 @@
|
| cinfo->comp_info[0].v_samp_factor=tjMCUHeight[subsamp]/8;
|
| cinfo->comp_info[1].v_samp_factor=1;
|
| cinfo->comp_info[2].v_samp_factor=1;
|
| +
|
| + #if JCS_EXTENSIONS!=1
|
| + bailout:
|
| + #endif
|
| + return retval;
|
| }
|
|
|
| -static void setDecompDefaults(struct jpeg_decompress_struct *dinfo,
|
| +static int setDecompDefaults(struct jpeg_decompress_struct *dinfo,
|
| int pixelFormat)
|
| {
|
| + int retval=0;
|
| +
|
| switch(pixelFormat)
|
| {
|
| case TJPF_GRAY:
|
| @@ -214,6 +223,11 @@
|
| _throw("Unsupported pixel format");
|
| #endif
|
| }
|
| +
|
| + #if JCS_EXTENSIONS!=1
|
| + bailout:
|
| + #endif
|
| + return retval;
|
| }
|
|
|
|
|
| @@ -416,7 +430,8 @@
|
| alloc=0; *jpegSize=tjBufSize(width, height, jpegSubsamp);
|
| }
|
| jpeg_mem_dest_tj(cinfo, jpegBuf, jpegSize, alloc);
|
| - setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual);
|
| + if(setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual)==-1)
|
| + return -1;
|
|
|
| jpeg_start_compress(cinfo, TRUE);
|
| if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL)
|
| @@ -507,7 +522,7 @@
|
|
|
| yuvsize=tjBufSizeYUV(width, height, subsamp);
|
| jpeg_mem_dest_tj(cinfo, &dstBuf, &yuvsize, 0);
|
| - setCompDefaults(cinfo, pixelFormat, subsamp, -1);
|
| + if(setCompDefaults(cinfo, pixelFormat, subsamp, -1)==-1) return -1;
|
|
|
| jpeg_start_compress(cinfo, TRUE);
|
| pw=PAD(width, cinfo->max_h_samp_factor);
|
| @@ -729,7 +744,7 @@
|
|
|
| jpeg_mem_src_tj(dinfo, jpegBuf, jpegSize);
|
| jpeg_read_header(dinfo, TRUE);
|
| - setDecompDefaults(dinfo, pixelFormat);
|
| + if(setDecompDefaults(dinfo, pixelFormat)==-1) return -1;
|
|
|
| if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE;
|
|
|
| @@ -1023,15 +1038,45 @@
|
| {
|
| alloc=0; dstSizes[i]=tjBufSize(w, h, jpegSubsamp);
|
| }
|
| - jpeg_mem_dest_tj(cinfo, &dstBufs[i], &dstSizes[i], alloc);
|
| + if(!(t[i].options&TJXOPT_NOOUTPUT))
|
| + jpeg_mem_dest_tj(cinfo, &dstBufs[i], &dstSizes[i], alloc);
|
| jpeg_copy_critical_parameters(dinfo, cinfo);
|
| dstcoefs=jtransform_adjust_parameters(dinfo, cinfo, srccoefs,
|
| &xinfo[i]);
|
| - jpeg_write_coefficients(cinfo, dstcoefs);
|
| - jcopy_markers_execute(dinfo, cinfo, JCOPYOPT_ALL);
|
| + if(!(t[i].options&TJXOPT_NOOUTPUT))
|
| + {
|
| + jpeg_write_coefficients(cinfo, dstcoefs);
|
| + jcopy_markers_execute(dinfo, cinfo, JCOPYOPT_ALL);
|
| + }
|
| + else jinit_c_master_control(cinfo, TRUE);
|
| jtransform_execute_transformation(dinfo, cinfo, srccoefs,
|
| &xinfo[i]);
|
| - jpeg_finish_compress(cinfo);
|
| + if(t[i].customFilter)
|
| + {
|
| + int ci, by, y;
|
| + for(ci=0; ci<cinfo->num_components; ci++)
|
| + {
|
| + jpeg_component_info *compptr=&cinfo->comp_info[ci];
|
| + tjregion arrayRegion={0, 0, compptr->width_in_blocks*DCTSIZE,
|
| + DCTSIZE};
|
| + tjregion planeRegion={0, 0, compptr->width_in_blocks*DCTSIZE,
|
| + compptr->height_in_blocks*DCTSIZE};
|
| + for(by=0; by<compptr->height_in_blocks; by+=compptr->v_samp_factor)
|
| + {
|
| + JBLOCKARRAY barray=(dinfo->mem->access_virt_barray)
|
| + ((j_common_ptr)dinfo, dstcoefs[ci], by, compptr->v_samp_factor,
|
| + TRUE);
|
| + for(y=0; y<compptr->v_samp_factor; y++)
|
| + {
|
| + if(t[i].customFilter(barray[y][0], arrayRegion, planeRegion,
|
| + ci, i, &t[i])==-1)
|
| + _throw("tjTransform(): Error in custom filter");
|
| + arrayRegion.y+=DCTSIZE;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + if(!(t[i].options&TJXOPT_NOOUTPUT)) jpeg_finish_compress(cinfo);
|
| }
|
|
|
| jpeg_finish_decompress(dinfo);
|
|
|