Add dynamic allocation test; Fix compression ratio output in quiet mode; Fix memory leak
This commit is contained in:
25
jpgtest.c
25
jpgtest.c
@@ -45,7 +45,8 @@
|
|||||||
#define _throwbmp(m) _throw(m, bmpgeterr())
|
#define _throwbmp(m) _throw(m, bmpgeterr())
|
||||||
|
|
||||||
enum {YUVENCODE=1, YUVDECODE};
|
enum {YUVENCODE=1, YUVDECODE};
|
||||||
int flags=0, decomponly=0, yuv=0, quiet=0, dotile=0, pf=TJPF_BGR;
|
int flags=TJFLAG_NOREALLOC, decomponly=0, yuv=0, quiet=0, dotile=0,
|
||||||
|
pf=TJPF_BGR;
|
||||||
char *ext="ppm";
|
char *ext="ppm";
|
||||||
const char *pixFormatStr[TJ_NUMPF]=
|
const char *pixFormatStr[TJ_NUMPF]=
|
||||||
{
|
{
|
||||||
@@ -305,7 +306,7 @@ void dotestyuv(unsigned char *srcbuf, int w, int h, int subsamp,
|
|||||||
void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
||||||
char *filename)
|
char *filename)
|
||||||
{
|
{
|
||||||
char tempstr[1024];
|
char tempstr[1024], tempstr2[80];
|
||||||
FILE *file=NULL; tjhandle handle=NULL;
|
FILE *file=NULL; tjhandle handle=NULL;
|
||||||
unsigned char **jpegbuf=NULL, *tmpbuf=NULL, *srcptr, *srcptr2;
|
unsigned char **jpegbuf=NULL, *tmpbuf=NULL, *srcptr, *srcptr2;
|
||||||
double start, elapsed;
|
double start, elapsed;
|
||||||
@@ -331,11 +332,13 @@ void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
|||||||
if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *)
|
if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *)
|
||||||
*ntilesw*ntilesh))==NULL)
|
*ntilesw*ntilesh))==NULL)
|
||||||
_throwunix("allocating JPEG tile array");
|
_throwunix("allocating JPEG tile array");
|
||||||
|
memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh);
|
||||||
if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long)
|
if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long)
|
||||||
*ntilesw*ntilesh))==NULL)
|
*ntilesw*ntilesh))==NULL)
|
||||||
_throwunix("allocating JPEG size array");
|
_throwunix("allocating JPEG size array");
|
||||||
memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh);
|
memset(jpegsize, 0, sizeof(unsigned long)*ntilesw*ntilesh);
|
||||||
|
|
||||||
|
if((flags&TJFLAG_NOREALLOC)!=0)
|
||||||
for(i=0; i<ntilesw*ntilesh; i++)
|
for(i=0; i<ntilesw*ntilesh; i++)
|
||||||
{
|
{
|
||||||
if((jpegbuf[i]=(unsigned char *)malloc(TJBUFSIZE(tilew, tileh)))==NULL)
|
if((jpegbuf[i]=(unsigned char *)malloc(TJBUFSIZE(tilew, tileh)))==NULL)
|
||||||
@@ -353,7 +356,7 @@ void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
|||||||
|
|
||||||
/* Execute once to preload cache */
|
/* Execute once to preload cache */
|
||||||
if(tjCompress2(handle, srcbuf, tilew, pitch, tileh, pf, &jpegbuf[0],
|
if(tjCompress2(handle, srcbuf, tilew, pitch, tileh, pf, &jpegbuf[0],
|
||||||
&jpegsize[0], subsamp, jpegqual, flags|TJFLAG_NOREALLOC)==-1)
|
&jpegsize[0], subsamp, jpegqual, flags)==-1)
|
||||||
_throwtj("executing tjCompress2()");
|
_throwtj("executing tjCompress2()");
|
||||||
|
|
||||||
/* Benchmark */
|
/* Benchmark */
|
||||||
@@ -369,8 +372,7 @@ void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
|||||||
int width=min(tilew, w-col*tilew);
|
int width=min(tilew, w-col*tilew);
|
||||||
int height=min(tileh, h-row*tileh);
|
int height=min(tileh, h-row*tileh);
|
||||||
if(tjCompress2(handle, srcptr2, width, pitch, height, pf,
|
if(tjCompress2(handle, srcptr2, width, pitch, height, pf,
|
||||||
&jpegbuf[tile], &jpegsize[tile], subsamp, jpegqual,
|
&jpegbuf[tile], &jpegsize[tile], subsamp, jpegqual, flags)==-1)
|
||||||
flags|TJFLAG_NOREALLOC)==-1)
|
|
||||||
_throwtj("executing tjCompress()2");
|
_throwtj("executing tjCompress()2");
|
||||||
totaljpegsize+=jpegsize[tile];
|
totaljpegsize+=jpegsize[tile];
|
||||||
}
|
}
|
||||||
@@ -386,7 +388,7 @@ void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual,
|
|||||||
printf("%s%c%s%c",
|
printf("%s%c%s%c",
|
||||||
sigfig((double)(w*h)/1000000.*(double)i/elapsed, 4, tempstr, 1024),
|
sigfig((double)(w*h)/1000000.*(double)i/elapsed, 4, tempstr, 1024),
|
||||||
quiet==2? '\n':'\t',
|
quiet==2? '\n':'\t',
|
||||||
sigfig((double)(w*h*ps)/(double)totaljpegsize, 4, tempstr, 1024),
|
sigfig((double)(w*h*ps)/(double)totaljpegsize, 4, tempstr2, 80),
|
||||||
quiet==2? '\n':'\t');
|
quiet==2? '\n':'\t');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -500,11 +502,13 @@ void dodecomptest(char *filename)
|
|||||||
if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *)
|
if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *)
|
||||||
*ntilesw*ntilesh))==NULL)
|
*ntilesw*ntilesh))==NULL)
|
||||||
_throwunix("allocating JPEG tile array");
|
_throwunix("allocating JPEG tile array");
|
||||||
|
memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh);
|
||||||
if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long)
|
if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long)
|
||||||
*ntilesw*ntilesh))==NULL)
|
*ntilesw*ntilesh))==NULL)
|
||||||
_throwunix("allocating JPEG size array");
|
_throwunix("allocating JPEG size array");
|
||||||
memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh);
|
memset(jpegsize, 0, sizeof(unsigned long)*ntilesw*ntilesh);
|
||||||
|
|
||||||
|
if((flags&TJFLAG_NOREALLOC)!=0)
|
||||||
for(i=0; i<ntilesw*ntilesh; i++)
|
for(i=0; i<ntilesw*ntilesh; i++)
|
||||||
{
|
{
|
||||||
if((jpegbuf[i]=(unsigned char *)malloc(TJBUFSIZE(tilew, tileh)))==NULL)
|
if((jpegbuf[i]=(unsigned char *)malloc(TJBUFSIZE(tilew, tileh)))==NULL)
|
||||||
@@ -571,6 +575,8 @@ void dodecomptest(char *filename)
|
|||||||
_throwtj("executing tjTransform()");
|
_throwtj("executing tjTransform()");
|
||||||
elapsed=gettime()-start;
|
elapsed=gettime()-start;
|
||||||
|
|
||||||
|
free(t); t=NULL;
|
||||||
|
|
||||||
for(tile=0, totaljpegsize=0; tile<_ntilesw*_ntilesh; tile++)
|
for(tile=0, totaljpegsize=0; tile<_ntilesw*_ntilesh; tile++)
|
||||||
totaljpegsize+=jpegsize[tile];
|
totaljpegsize+=jpegsize[tile];
|
||||||
|
|
||||||
@@ -629,6 +635,7 @@ void dodecomptest(char *filename)
|
|||||||
}
|
}
|
||||||
if(jpegsize) {free(jpegsize); jpegsize=NULL;}
|
if(jpegsize) {free(jpegsize); jpegsize=NULL;}
|
||||||
if(srcbuf) {free(srcbuf); srcbuf=NULL;}
|
if(srcbuf) {free(srcbuf); srcbuf=NULL;}
|
||||||
|
if(t) {free(t); t=NULL;}
|
||||||
if(handle) {tjDestroy(handle); handle=NULL;}
|
if(handle) {tjDestroy(handle); handle=NULL;}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -642,6 +649,7 @@ void usage(char *progname)
|
|||||||
printf(" %s\n", progname);
|
printf(" %s\n", progname);
|
||||||
printf(" <Inputfile (JPG)> [options]\n\n");
|
printf(" <Inputfile (JPG)> [options]\n\n");
|
||||||
printf("Options:\n\n");
|
printf("Options:\n\n");
|
||||||
|
printf("-alloc = Dynamically allocate JPEG image buffers\n");
|
||||||
printf("-bmp = Generate output images in Windows Bitmap format (default=PPM)\n");
|
printf("-bmp = Generate output images in Windows Bitmap format (default=PPM)\n");
|
||||||
printf("-bottomup = Test bottom-up compression/decompression\n");
|
printf("-bottomup = Test bottom-up compression/decompression\n");
|
||||||
printf("-tile = Test performance of the codec when the image is encoded as separate\n");
|
printf("-tile = Test performance of the codec when the image is encoded as separate\n");
|
||||||
@@ -806,6 +814,7 @@ int main(int argc, char *argv[])
|
|||||||
else usage(argv[0]);
|
else usage(argv[0]);
|
||||||
}
|
}
|
||||||
if(!strcmp(argv[i], "-?")) usage(argv[0]);
|
if(!strcmp(argv[i], "-?")) usage(argv[0]);
|
||||||
|
if(!strcasecmp(argv[i], "-alloc")) flags&=(~TJFLAG_NOREALLOC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user