If a warning (such as "Premature end of JPEG file") is triggered in the underlying libjpeg API, make sure that the TurboJPEG API function returns -1. Unlike errors, however, libjpeg warnings do not make the TurboJPEG functions abort.
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/branches/1.4.x@1561 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
@@ -47,6 +47,12 @@ used.
|
||||
shared libraries. This is accomplished by adding either -DENABLE_STATIC=0 or
|
||||
-DENABLE_SHARED=0 to the CMake command line.
|
||||
|
||||
[9] TurboJPEG API functions will now return an error code if a warning is
|
||||
triggered in the underlying libjpeg API. For instance, if a JPEG file is
|
||||
corrupt, the TurboJPEG decompression functions will attempt to decompress
|
||||
as much of the image as possible, but those functions will now return -1 to
|
||||
indicate that the decompression was not entirely successful.
|
||||
|
||||
|
||||
1.4.0
|
||||
=====
|
||||
|
||||
32
turbojpeg.c
32
turbojpeg.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C)2009-2014 D. R. Commander. All Rights Reserved.
|
||||
* Copyright (C)2009-2015 D. R. Commander. All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -58,6 +58,8 @@ struct my_error_mgr
|
||||
{
|
||||
struct jpeg_error_mgr pub;
|
||||
jmp_buf setjmp_buffer;
|
||||
void (*emit_message)(j_common_ptr, int);
|
||||
boolean warning;
|
||||
};
|
||||
typedef struct my_error_mgr *my_error_ptr;
|
||||
|
||||
@@ -75,6 +77,13 @@ static void my_output_message(j_common_ptr cinfo)
|
||||
(*cinfo->err->format_message)(cinfo, errStr);
|
||||
}
|
||||
|
||||
static void my_emit_message(j_common_ptr cinfo, int msg_level)
|
||||
{
|
||||
my_error_ptr myerr=(my_error_ptr)cinfo->err;
|
||||
myerr->emit_message(cinfo, msg_level);
|
||||
if(msg_level<0) myerr->warning=TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Global structures, macros, etc. */
|
||||
|
||||
@@ -122,17 +131,20 @@ static const tjscalingfactor sf[NUMSF]={
|
||||
j_compress_ptr cinfo=NULL; j_decompress_ptr dinfo=NULL; \
|
||||
if(!this) {snprintf(errStr, JMSG_LENGTH_MAX, "Invalid handle"); \
|
||||
return -1;} \
|
||||
cinfo=&this->cinfo; dinfo=&this->dinfo;
|
||||
cinfo=&this->cinfo; dinfo=&this->dinfo; \
|
||||
this->jerr.warning=FALSE;
|
||||
#define getcinstance(handle) tjinstance *this=(tjinstance *)handle; \
|
||||
j_compress_ptr cinfo=NULL; \
|
||||
if(!this) {snprintf(errStr, JMSG_LENGTH_MAX, "Invalid handle"); \
|
||||
return -1;} \
|
||||
cinfo=&this->cinfo;
|
||||
cinfo=&this->cinfo; \
|
||||
this->jerr.warning=FALSE;
|
||||
#define getdinstance(handle) tjinstance *this=(tjinstance *)handle; \
|
||||
j_decompress_ptr dinfo=NULL; \
|
||||
if(!this) {snprintf(errStr, JMSG_LENGTH_MAX, "Invalid handle"); \
|
||||
return -1;} \
|
||||
dinfo=&this->dinfo;
|
||||
dinfo=&this->dinfo; \
|
||||
this->jerr.warning=FALSE;
|
||||
|
||||
static int getPixelFormat(int pixelSize, int flags)
|
||||
{
|
||||
@@ -550,6 +562,8 @@ static tjhandle _tjInitCompress(tjinstance *this)
|
||||
this->cinfo.err=jpeg_std_error(&this->jerr.pub);
|
||||
this->jerr.pub.error_exit=my_error_exit;
|
||||
this->jerr.pub.output_message=my_output_message;
|
||||
this->jerr.emit_message=this->jerr.pub.emit_message;
|
||||
this->jerr.pub.emit_message=my_emit_message;
|
||||
|
||||
if(setjmp(this->jerr.setjmp_buffer))
|
||||
{
|
||||
@@ -787,6 +801,7 @@ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf,
|
||||
if(rgbBuf) free(rgbBuf);
|
||||
#endif
|
||||
if(row_pointer) free(row_pointer);
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -969,6 +984,7 @@ DLLEXPORT int DLLCALL tjEncodeYUVPlanes(tjhandle handle, unsigned char *srcBuf,
|
||||
if(_tmpbuf2[i]!=NULL) free(_tmpbuf2[i]);
|
||||
if(outbuf[i]!=NULL) free(outbuf[i]);
|
||||
}
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1152,6 +1168,7 @@ DLLEXPORT int DLLCALL tjCompressFromYUVPlanes(tjhandle handle,
|
||||
if(inbuf[i]) free(inbuf[i]);
|
||||
}
|
||||
if(_tmpbuf) free(_tmpbuf);
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1202,6 +1219,8 @@ static tjhandle _tjInitDecompress(tjinstance *this)
|
||||
this->dinfo.err=jpeg_std_error(&this->jerr.pub);
|
||||
this->jerr.pub.error_exit=my_error_exit;
|
||||
this->jerr.pub.output_message=my_output_message;
|
||||
this->jerr.emit_message=this->jerr.pub.emit_message;
|
||||
this->jerr.pub.emit_message=my_emit_message;
|
||||
|
||||
if(setjmp(this->jerr.setjmp_buffer))
|
||||
{
|
||||
@@ -1277,6 +1296,7 @@ DLLEXPORT int DLLCALL tjDecompressHeader3(tjhandle handle,
|
||||
_throw("tjDecompressHeader3(): Invalid data returned in header");
|
||||
|
||||
bailout:
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1410,6 +1430,7 @@ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf,
|
||||
if(rgbBuf) free(rgbBuf);
|
||||
#endif
|
||||
if(row_pointer) free(row_pointer);
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1635,6 +1656,7 @@ DLLEXPORT int DLLCALL tjDecodeYUVPlanes(tjhandle handle,
|
||||
if(_tmpbuf[i]!=NULL) free(_tmpbuf[i]);
|
||||
if(inbuf[i]!=NULL) free(inbuf[i]);
|
||||
}
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1844,6 +1866,7 @@ DLLEXPORT int DLLCALL tjDecompressToYUVPlanes(tjhandle handle,
|
||||
if(outbuf[i]) free(outbuf[i]);
|
||||
}
|
||||
if(_tmpbuf) free(_tmpbuf);
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -2085,5 +2108,6 @@ DLLEXPORT int DLLCALL tjTransform(tjhandle handle, unsigned char *jpegBuf,
|
||||
if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo);
|
||||
if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo);
|
||||
if(xinfo) free(xinfo);
|
||||
if(this->jerr.warning) retval=-1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user