Added extended tjDecompressHeader() function which can determine the type of subsampling used in the JPEG image

This commit is contained in:
DRC
2010-12-14 01:21:29 +00:00
parent 55a9cbffe7
commit f0d2577482
2 changed files with 66 additions and 2 deletions

View File

@@ -169,9 +169,9 @@ DLLEXPORT tjhandle DLLCALL tjInitDecompress(void);
/*
int tjDecompressHeader(tjhandle j,
int tjDecompressHeader2(tjhandle j,
unsigned char *srcbuf, unsigned long size,
int *width, int *height)
int *width, int *height, int *jpegsub)
[INPUT] j = instance handle previously returned from a call to
tjInitDecompress()
@@ -180,9 +180,18 @@ DLLEXPORT tjhandle DLLCALL tjInitDecompress(void);
[INPUT] size = size of the JPEG image buffer (in bytes)
[OUTPUT] width = width (in pixels) of the JPEG image
[OUTPUT] height = height (in pixels) of the JPEG image
[OUTPUT] jpegsub = type of chrominance subsampling used when compressing the
JPEG image
RETURNS: 0 on success, -1 on error
*/
DLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle j,
unsigned char *srcbuf, unsigned long size,
int *width, int *height, int *jpegsub);
/*
Deprecated version of the above function
*/
DLLEXPORT int DLLCALL tjDecompressHeader(tjhandle j,
unsigned char *srcbuf, unsigned long size,
int *width, int *height);

View File

@@ -86,6 +86,7 @@ typedef struct _jpgstruct
static const int hsampfactor[NUMSUBOPT]={1, 2, 2, 1};
static const int vsampfactor[NUMSUBOPT]={1, 1, 2, 1};
static const int pixelsize[NUMSUBOPT]={3, 3, 3, 1};
#define _throw(c) {sprintf(lasterror, "%s", c); return -1;}
#define _catch(f) {if((f)==-1) return -1;}
@@ -400,6 +401,60 @@ DLLEXPORT int DLLCALL tjDecompressHeader(tjhandle h,
}
DLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle h,
unsigned char *srcbuf, unsigned long size,
int *width, int *height, int *jpegsub)
{
int i, k;
checkhandle(h);
if(srcbuf==NULL || size<=0 || width==NULL || height==NULL || jpegsub==NULL)
_throw("Invalid argument in tjDecompressHeader()");
if(!j->initd) _throw("Instance has not been initialized for decompression");
if(setjmp(j->jerr.jb))
{ // this will execute if LIBJPEG has an error
return -1;
}
j->jsms.bytes_in_buffer = size;
j->jsms.next_input_byte = srcbuf;
jpeg_read_header(&j->dinfo, TRUE);
*width=j->dinfo.image_width; *height=j->dinfo.image_height;
*jpegsub=-1;
for(i=0; i<NUMSUBOPT; i++)
{
if(j->dinfo.num_components==pixelsize[i])
{
if(j->dinfo.comp_info[0].h_samp_factor==hsampfactor[i]
&& j->dinfo.comp_info[0].v_samp_factor==vsampfactor[i])
{
int match=0;
for(k=1; k<j->dinfo.num_components; k++)
{
if(j->dinfo.comp_info[k].h_samp_factor==1
&& j->dinfo.comp_info[k].v_samp_factor==1)
match++;
}
if(match==j->dinfo.num_components-1)
{
*jpegsub=i; break;
}
}
}
}
jpeg_abort_decompress(&j->dinfo);
if(*jpegsub<0) _throw("Could not determine subsampling type for JPEG image");
if(*width<1 || *height<1) _throw("Invalid data returned in header");
return 0;
}
DLLEXPORT int DLLCALL tjDecompress(tjhandle h,
unsigned char *srcbuf, unsigned long size,
unsigned char *dstbuf, int width, int pitch, int height, int ps,