fix jpeg buffer too small

pull/1548/head
Andrew Bauer 2016-07-03 14:59:05 -05:00
parent 980d3f6e7f
commit 75a98601ef
2 changed files with 26 additions and 16 deletions

View File

@ -35,8 +35,10 @@ static short *g_u_table;
static short *b_u_table;
__attribute__((aligned(16))) static const uint8_t movemask[16] = {0,4,8,12,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
jpeg_compress_struct *Image::jpg_ccinfo[101] = { 0 };
jpeg_decompress_struct *Image::jpg_dcinfo = 0;
jpeg_compress_struct *Image::writejpg_ccinfo[101] = { 0 };
jpeg_compress_struct *Image::encodejpg_ccinfo[101] = { 0 };
jpeg_decompress_struct *Image::readjpg_dcinfo = 0;
jpeg_decompress_struct *Image::decodejpg_dcinfo = 0;
struct zm_error_mgr Image::jpg_err;
/* Pointer to blend function. */
@ -151,11 +153,17 @@ Image::~Image()
delete[] b_u_table;
initialised = false;
}
if ( jpg_dcinfo )
if ( readjpg_dcinfo )
{
jpeg_destroy_decompress( jpg_dcinfo );
delete jpg_dcinfo;
jpg_dcinfo = 0;
jpeg_destroy_decompress( readjpg_dcinfo );
delete readjpg_dcinfo;
readjpg_dcinfo = 0;
}
if ( decodejpg_dcinfo )
{
jpeg_destroy_decompress( decodejpg_dcinfo );
delete decodejpg_dcinfo;
decodejpg_dcinfo = 0;
}
}
@ -653,11 +661,11 @@ bool Image::WriteRaw( const char *filename ) const
bool Image::ReadJpeg( const char *filename, unsigned int p_colours, unsigned int p_subpixelorder)
{
unsigned int new_width, new_height, new_colours, new_subpixelorder;
struct jpeg_decompress_struct *cinfo = jpg_dcinfo;
struct jpeg_decompress_struct *cinfo = readjpg_dcinfo;
if ( !cinfo )
{
cinfo = jpg_dcinfo = new jpeg_decompress_struct;
cinfo = readjpg_dcinfo = new jpeg_decompress_struct;
cinfo->err = jpeg_std_error( &jpg_err.pub );
jpg_err.pub.error_exit = zm_jpeg_error_exit;
jpg_err.pub.emit_message = zm_jpeg_emit_message;
@ -814,11 +822,11 @@ bool Image::WriteJpeg( const char *filename, int quality_override, struct timeva
}
int quality = quality_override?quality_override:config.jpeg_file_quality;
struct jpeg_compress_struct *cinfo = jpg_ccinfo[quality];
struct jpeg_compress_struct *cinfo = writejpg_ccinfo[quality];
if ( !cinfo )
{
cinfo = jpg_ccinfo[quality] = new jpeg_compress_struct;
cinfo = writejpg_ccinfo[quality] = new jpeg_compress_struct;
cinfo->err = jpeg_std_error( &jpg_err.pub );
jpg_err.pub.error_exit = zm_jpeg_error_exit;
jpg_err.pub.emit_message = zm_jpeg_emit_message;
@ -945,11 +953,11 @@ bool Image::WriteJpeg( const char *filename, int quality_override, struct timeva
bool Image::DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, unsigned int p_colours, unsigned int p_subpixelorder)
{
unsigned int new_width, new_height, new_colours, new_subpixelorder;
struct jpeg_decompress_struct *cinfo = jpg_dcinfo;
struct jpeg_decompress_struct *cinfo = decodejpg_dcinfo;
if ( !cinfo )
{
cinfo = jpg_dcinfo = new jpeg_decompress_struct;
cinfo = decodejpg_dcinfo = new jpeg_decompress_struct;
cinfo->err = jpeg_std_error( &jpg_err.pub );
jpg_err.pub.error_exit = zm_jpeg_error_exit;
jpg_err.pub.emit_message = zm_jpeg_emit_message;
@ -1079,11 +1087,11 @@ bool Image::EncodeJpeg( JOCTET *outbuffer, int *outbuffer_size, int quality_over
int quality = quality_override?quality_override:config.jpeg_stream_quality;
struct jpeg_compress_struct *cinfo = jpg_ccinfo[quality];
struct jpeg_compress_struct *cinfo = encodejpg_ccinfo[quality];
if ( !cinfo )
{
cinfo = jpg_ccinfo[quality] = new jpeg_compress_struct;
cinfo = encodejpg_ccinfo[quality] = new jpeg_compress_struct;
cinfo->err = jpeg_std_error( &jpg_err.pub );
jpg_err.pub.error_exit = zm_jpeg_error_exit;
jpg_err.pub.emit_message = zm_jpeg_emit_message;

View File

@ -131,8 +131,10 @@ protected:
static unsigned char *y_r_table;
static unsigned char *y_g_table;
static unsigned char *y_b_table;
static jpeg_compress_struct *jpg_ccinfo[101];
static jpeg_decompress_struct *jpg_dcinfo;
static jpeg_compress_struct *writejpg_ccinfo[101];
static jpeg_compress_struct *encodejpg_ccinfo[101];
static jpeg_decompress_struct *readjpg_dcinfo;
static jpeg_decompress_struct *decodejpg_dcinfo;
static struct zm_error_mgr jpg_err;
protected: