From 312cd79456adc04147d60a4c6e5d06e3d6441736 Mon Sep 17 00:00:00 2001 From: DRC Date: Wed, 25 May 2011 04:12:22 +0000 Subject: [PATCH] "jpegut"="tjunittest" & "jpgtest"="tjbench" git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@645 632fc199-4ca6-4c93-a231-07263d6284db --- jpegut.c | 647 ---------------------------------------- jpgtest.c | 873 ------------------------------------------------------ 2 files changed, 1520 deletions(-) delete mode 100644 jpegut.c delete mode 100644 jpgtest.c diff --git a/jpegut.c b/jpegut.c deleted file mode 100644 index c7a6611..0000000 --- a/jpegut.c +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright (C)2009-2011 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: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of the libjpeg-turbo Project nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * This program tests the various code paths in the TurboJPEG JNI Wrapper - */ - -#include -#include -#include -#include -#include "./tjutil.h" -#include "./turbojpeg.h" - - -void usage(char *progName) -{ - printf("\nUSAGE: %s [options]\n", progName); - printf("Options:\n"); - printf("-yuv = test YUV encoding/decoding support\n"); - printf("-alloc = test automatic buffer allocation\n"); - exit(1); -} - - -#define _throwtj() {printf("TurboJPEG ERROR:\n%s\n", tjGetErrorStr()); \ - bailout();} -#define _tj(f) {if((f)==-1) _throwtj();} -#define _throw(m) {printf("ERROR: %s\n", m); bailout();} - -const char *subNameLong[TJ_NUMSAMP]= -{ - "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0" -}; -const char *subName[TJ_NUMSAMP]={"444", "422", "420", "GRAY", "440"}; - -const char *pixFormatStr[TJ_NUMPF]= -{ - "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale" -}; - -const int _3byteFormats[]={TJPF_RGB, TJPF_BGR}; -const int _4byteFormats[]={TJPF_RGBX, TJPF_BGRX, TJPF_XBGR, TJPF_XRGB}; -const int _onlyGray[]={TJPF_GRAY}; -const int _onlyRGB[]={TJPF_RGB}; - -enum {YUVENCODE=1, YUVDECODE}; -int yuv=0, alloc=0; - -int exitStatus=0; -#define bailout() {exitStatus=-1; goto bailout;} - -int pixels[9][3]= -{ - {0, 255, 0}, - {255, 0, 255}, - {0, 255, 255}, - {255, 0, 0}, - {255, 255, 0}, - {0, 0, 255}, - {255, 255, 255}, - {0, 0, 0}, - {0, 0, 255} -}; - - -void initBuf(unsigned char *buf, int w, int h, int pf, int flags) -{ - int roffset=tjRedOffset[pf]; - int goffset=tjGreenOffset[pf]; - int boffset=tjBlueOffset[pf]; - int ps=tjPixelSize[pf]; - int index, row, col, halfway=16; - - memset(buf, 0, w*h*ps); - if(pf==TJPF_GRAY) - { - for(row=0; row=halfway) buf[index*ps+goffset]=255; - } - } - } - } -} - - -#define checkval(v, cv) { \ - if(vcv+1) { \ - printf("\nComp. %s at %d,%d should be %d, not %d\n", \ - #v, row, col, cv, v); \ - retval=0; exitStatus=-1; goto bailout; \ - }} - -#define checkval0(v) { \ - if(v>1) { \ - printf("\nComp. %s at %d,%d should be 0, not %d\n", #v, row, col, v); \ - retval=0; exitStatus=-1; goto bailout; \ - }} - -#define checkval255(v) { \ - if(v<254) { \ - printf("\nComp. %s at %d,%d should be 255, not %d\n", #v, row, col, v); \ - retval=0; exitStatus=-1; goto bailout; \ - }} - - -int checkBuf(unsigned char *buf, int w, int h, int pf, int subsamp, - tjscalingfactor sf, int flags) -{ - int roffset=tjRedOffset[pf]; - int goffset=tjGreenOffset[pf]; - int boffset=tjBlueOffset[pf]; - int ps=tjPixelSize[pf]; - int index, row, col, retval=1; - int halfway=16*sf.num/sf.denom; - int blocksize=8*sf.num/sf.denom; - - for(row=0; row %s YUV ... ", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down ", subNameLong[subsamp]); - else - printf("%s %s -> %s Q%d ... ", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down ", subNameLong[subsamp], - jpegQual); - - if((srcBuf=(unsigned char *)malloc(w*h*tjPixelSize[pf]))==NULL) - _throw("Memory allocation failure"); - initBuf(srcBuf, w, h, pf, flags); - if(*dstBuf && *dstSize>0) memset(*dstBuf, 0, *dstSize); - - t=gettime(); - if(yuv==YUVENCODE) - { - _tj(tjEncodeYUV2(handle, srcBuf, w, 0, h, pf, *dstBuf, subsamp, flags)); - } - else - { - if(!alloc) - { - flags|=TJFLAG_NOREALLOC; - *dstSize=(yuv==YUVENCODE? TJBUFSIZEYUV(w, h, subsamp):TJBUFSIZE(w, h)); - } - _tj(tjCompress2(handle, srcBuf, w, 0, h, pf, dstBuf, dstSize, subsamp, - jpegQual, flags)); - } - t=gettime()-t; - - if(yuv==YUVENCODE) - snprintf(tempStr, 1024, "%s_enc_%s_%s_%s.yuv", basename, pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "BU":"TD", subName[subsamp]); - else - snprintf(tempStr, 1024, "%s_enc_%s_%s_%s_Q%d.jpg", basename, - pixFormatStr[pf], (flags&TJFLAG_BOTTOMUP)? "BU":"TD", subName[subsamp], - jpegQual); - writeJPEG(*dstBuf, *dstSize, tempStr); - if(yuv==YUVENCODE) - { - if(checkBufYUV(*dstBuf, w, h, subsamp)) printf("Passed."); - else printf("FAILED!"); - } - else printf("Done."); - printf(" %f ms\n Result in %s\n", t*1000., tempStr); - - bailout: - if(srcBuf) free(srcBuf); -} - - -void _decompTest(tjhandle handle, unsigned char *jpegBuf, - unsigned long jpegSize, int w, int h, int pf, char *basename, int subsamp, - int flags, tjscalingfactor sf) -{ - unsigned char *dstBuf=NULL; - int _hdrw=0, _hdrh=0, _hdrsubsamp=-1; double t; - int scaledWidth=TJSCALED(w, sf); - int scaledHeight=TJSCALED(h, sf); - unsigned long dstSize=0; - - if(yuv==YUVENCODE) return; - - if(yuv==YUVDECODE) - printf("JPEG -> YUV %s ... ", subName[subsamp]); - else - { - printf("JPEG -> %s %s ", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down "); - if(sf.num!=1 || sf.denom!=1) - printf("%d/%d ... ", sf.num, sf.denom); - else printf("... "); - } - - _tj(tjDecompressHeader2(handle, jpegBuf, jpegSize, &_hdrw, &_hdrh, - &_hdrsubsamp)); - if(_hdrw!=w || _hdrh!=h || _hdrsubsamp!=subsamp) - _throw("Incorrect JPEG header"); - - if(yuv==YUVDECODE) dstSize=TJBUFSIZEYUV(w, h, subsamp); - else dstSize=scaledWidth*scaledHeight*tjPixelSize[pf]; - if((dstBuf=(unsigned char *)malloc(dstSize))==NULL) - _throw("Memory allocation failure"); - memset(dstBuf, 0, dstSize); - - t=gettime(); - if(yuv==YUVDECODE) - { - _tj(tjDecompressToYUV(handle, jpegBuf, jpegSize, dstBuf, flags)); - } - else - { - _tj(tjDecompress2(handle, jpegBuf, jpegSize, dstBuf, scaledWidth, 0, - scaledHeight, pf, flags)); - } - t=gettime()-t; - - if(yuv==YUVDECODE) - { - if(checkBufYUV(dstBuf, w, h, subsamp)) printf("Passed."); - else printf("FAILED!"); - } - else - { - if(checkBuf(dstBuf, scaledWidth, scaledHeight, pf, subsamp, sf, flags)) - printf("Passed."); - else printf("FAILED!"); - } - printf(" %f ms\n", t*1000.); - - bailout: - if(dstBuf) free(dstBuf); -} - - -void decompTest(tjhandle handle, unsigned char *jpegBuf, - unsigned long jpegSize, int w, int h, int pf, char *basename, int subsamp, - int flags) -{ - int i, n=0; - tjscalingfactor *sf=tjGetScalingFactors(&n), sf1={1, 1}; - if(!sf || !n) _throwtj(); - - if((subsamp==TJSAMP_444 || subsamp==TJSAMP_GRAY) && !yuv) - { - for(i=0; i1) - { - for(i=1; i -#include -#include -#include -#include -#include -#include "./bmp.h" -#include "./tjutil.h" -#include "./turbojpeg.h" - - -#define _throw(op, err) { \ - printf("ERROR in line %d while %s:\n%s\n", __LINE__, op, err); \ - retval=-1; goto bailout;} -#define _throwunix(m) _throw(m, strerror(errno)) -#define _throwtj(m) _throw(m, tjGetErrorStr()) -#define _throwbmp(m) _throw(m, bmpgeterr()) - -enum {YUVENCODE=1, YUVDECODE}; -int flags=TJFLAG_NOREALLOC, decomponly=0, yuv=0, quiet=0, dotile=0, - pf=TJPF_BGR; -char *ext="ppm"; -const char *pixFormatStr[TJ_NUMPF]= -{ - "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY" -}; -const char *subNameLong[TJ_NUMSAMP]= -{ - "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0" -}; -const char *subName[NUMSUBOPT]={"444", "422", "420", "GRAY", "440"}; -tjscalingfactor *scalingfactors=NULL, sf={1, 1}; int nsf=0; -int xformop=TJXOP_NONE, xformopt=0; -double benchtime=5.0; - - -char *sigfig(double val, int figs, char *buf, int len) -{ - char format[80]; - int digitsafterdecimal=figs-(int)ceil(log10(fabs(val))); - if(digitsafterdecimal<1) snprintf(format, 80, "%%.0f"); - else snprintf(format, 80, "%%.%df", digitsafterdecimal); - snprintf(buf, len, format, val); - return buf; -} - - -/* Decompression test */ -int decomptest(unsigned char *srcbuf, unsigned char **jpegbuf, - unsigned long *jpegsize, unsigned char *dstbuf, int w, int h, - int subsamp, int jpegqual, char *filename, int tilew, int tileh) -{ - char tempstr[1024], sizestr[20]="\0", qualstr[6]="\0", *ptr; - FILE *file=NULL; tjhandle handle=NULL; - int row, col, i, dstbufalloc=0, retval=0; - double start, elapsed; - int ps=tjPixelSize[pf]; - int yuvsize=TJBUFSIZEYUV(w, h, subsamp), bufsize; - int scaledw=(yuv==YUVDECODE)? w : TJSCALED(w, sf); - int scaledh=(yuv==YUVDECODE)? h : TJSCALED(h, sf); - int pitch=scaledw*ps; - int ntilesw=(w+tilew-1)/tilew, ntilesh=(h+tileh-1)/tileh; - unsigned char *dstptr, *dstptr2; - - if(jpegqual>0) - { - snprintf(qualstr, 6, "_Q%d", jpegqual); - qualstr[5]=0; - } - - if((handle=tjInitDecompress())==NULL) - _throwtj("executing tjInitDecompress()"); - - bufsize=(yuv==YUVDECODE? yuvsize:pitch*h); - if(dstbuf==NULL) - { - if((dstbuf=(unsigned char *)malloc(bufsize)) == NULL) - _throwunix("allocating image buffer"); - dstbufalloc=1; - } - /* Set the destination buffer to gray so we know whether the decompressor - attempted to write to it */ - memset(dstbuf, 127, bufsize); - - /* Execute once to preload cache */ - if(yuv==YUVDECODE) - { - if(tjDecompressToYUV(handle, jpegbuf[0], jpegsize[0], dstbuf, flags)==-1) - _throwtj("executing tjDecompressToYUV()"); - } - else if(tjDecompress2(handle, jpegbuf[0], jpegsize[0], dstbuf, scaledw, - pitch, scaledh, pf, flags)==-1) - _throwtj("executing tjDecompress2()"); - - /* Benchmark */ - for(i=0, start=gettime(); (elapsed=gettime()-start) Frame rate: %f fps\n", (double)i/elapsed); - printf(" Dest. throughput: %f Megapixels/sec\n", - (double)(w*h)/1000000.*(double)i/elapsed); - } - if(yuv==YUVDECODE) - { - snprintf(tempstr, 1024, "%s_%s%s.yuv", filename, subName[subsamp], - qualstr); - if((file=fopen(tempstr, "wb"))==NULL) - _throwunix("opening YUV image for output"); - if(fwrite(dstbuf, yuvsize, 1, file)!=1) - _throwunix("writing YUV image"); - fclose(file); file=NULL; - } - else - { - if(sf.num!=1 || sf.denom!=1) - snprintf(sizestr, 20, "%d_%d", sf.num, sf.denom); - else if(tilew!=w || tileh!=h) - snprintf(sizestr, 20, "%dx%d", tilew, tileh); - else snprintf(sizestr, 20, "full"); - if(decomponly) - snprintf(tempstr, 1024, "%s_%s.%s", filename, sizestr, ext); - else - snprintf(tempstr, 1024, "%s_%s%s_%s.%s", filename, subName[subsamp], - qualstr, sizestr, ext); - if(savebmp(tempstr, dstbuf, scaledw, scaledh, pf, - (flags&TJFLAG_BOTTOMUP)!=0)==-1) - _throwbmp("saving bitmap"); - ptr=strrchr(tempstr, '.'); - snprintf(ptr, 1024-(ptr-tempstr), "-err.%s", ext); - if(srcbuf && sf.num==1 && sf.denom==1) - { - if(!quiet) printf("Compression error written to %s.\n", tempstr); - if(subsamp==TJ_GRAYSCALE) - { - int index, index2; - for(row=0, index=0; row255) y=255; if(y<0) y=0; - dstbuf[rindex]=abs(dstbuf[rindex]-y); - dstbuf[gindex]=abs(dstbuf[gindex]-y); - dstbuf[bindex]=abs(dstbuf[bindex]-y); - } - } - } - else - { - for(row=0; row>>>> %s (%s) <--> YUV %s <<<<<\n", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "Bottom-up":"Top-down", subNameLong[subsamp]); - - if(quiet==1) - printf("%s\t%s\t%s\tN/A\t", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "BU":"TD", subNameLong[subsamp]); - - if((handle=tjInitCompress())==NULL) - _throwtj("executing tjInitCompress()"); - - /* Execute once to preload cache */ - if(tjEncodeYUV2(handle, srcbuf, w, 0, h, pf, dstbuf, subsamp, flags)==-1) - _throwtj("executing tjEncodeYUV2()"); - - /* Benchmark */ - for(i=0, start=gettime(); (elapsed=gettime()-start) Frame rate: %f fps\n", (double)i/elapsed); - printf(" Output image size: %d bytes\n", yuvsize); - printf(" Compression ratio: %f:1\n", - (double)(w*h*ps)/(double)yuvsize); - printf(" Source throughput: %f Megapixels/sec\n", - (double)(w*h)/1000000.*(double)i/elapsed); - printf(" Output bit stream: %f Megabits/sec\n", - (double)yuvsize*8./1000000.*(double)i/elapsed); - } - snprintf(tempstr, 1024, "%s_%s.yuv", filename, subName[subsamp]); - if((file=fopen(tempstr, "wb"))==NULL) - _throwunix("opening reference image"); - if(fwrite(dstbuf, yuvsize, 1, file)!=1) - _throwunix("writing reference image"); - fclose(file); file=NULL; - if(!quiet) printf("Reference image written to %s\n", tempstr); - - bailout: - if(file) {fclose(file); file=NULL;} - if(dstbuf) {free(dstbuf); dstbuf=NULL;} - if(handle) {tjDestroy(handle); handle=NULL;} - return; -} - - -void dotest(unsigned char *srcbuf, int w, int h, int subsamp, int jpegqual, - char *filename) -{ - char tempstr[1024], tempstr2[80]; - FILE *file=NULL; tjhandle handle=NULL; - unsigned char **jpegbuf=NULL, *tmpbuf=NULL, *srcptr, *srcptr2; - double start, elapsed; - int totaljpegsize=0, row, col, i, tilew=w, tileh=h, retval=0; - unsigned long *jpegsize=NULL; - int ps=tjPixelSize[pf], ntilesw=1, ntilesh=1, pitch=w*ps; - - if(yuv==YUVENCODE) {dotestyuv(srcbuf, w, h, subsamp, filename); return;} - - if((tmpbuf=(unsigned char *)malloc(pitch*h)) == NULL) - _throwunix("allocating temporary image buffer"); - - if(!quiet) - printf(">>>>> %s (%s) <--> JPEG %s Q%d <<<<<\n", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "Bottom-up":"Top-down", subNameLong[subsamp], - jpegqual); - - for(tilew=dotile? 8:w, tileh=dotile? 8:h; ; tilew*=2, tileh*=2) - { - if(tilew>w) tilew=w; if(tileh>h) tileh=h; - ntilesw=(w+tilew-1)/tilew; ntilesh=(h+tileh-1)/tileh; - - if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *) - *ntilesw*ntilesh))==NULL) - _throwunix("allocating JPEG tile array"); - memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh); - if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long) - *ntilesw*ntilesh))==NULL) - _throwunix("allocating JPEG size array"); - memset(jpegsize, 0, sizeof(unsigned long)*ntilesw*ntilesh); - - if((flags&TJFLAG_NOREALLOC)!=0) - for(i=0; i Frame rate: %f fps\n", (double)i/elapsed); - printf(" Output image size: %d bytes\n", totaljpegsize); - printf(" Compression ratio: %f:1\n", - (double)(w*h*ps)/(double)totaljpegsize); - printf(" Source throughput: %f Megapixels/sec\n", - (double)(w*h)/1000000.*(double)i/elapsed); - printf(" Output bit stream: %f Megabits/sec\n", - (double)totaljpegsize*8./1000000.*(double)i/elapsed); - } - if(tilew==w && tileh==h) - { - snprintf(tempstr, 1024, "%s_%s_Q%d.jpg", filename, subName[subsamp], - jpegqual); - if((file=fopen(tempstr, "wb"))==NULL) - _throwunix("opening reference image"); - if(fwrite(jpegbuf[0], jpegsize[0], 1, file)!=1) - _throwunix("writing reference image"); - fclose(file); file=NULL; - if(!quiet) printf("Reference image written to %s\n", tempstr); - } - - /* Decompression test */ - if(decomptest(srcbuf, jpegbuf, jpegsize, tmpbuf, w, h, subsamp, jpegqual, - filename, tilew, tileh)==-1) - goto bailout; - - for(i=0; i>>>> JPEG %s --> %s (%s) <<<<<\n", subNameLong[subsamp], - pixFormatStr[pf], (flags&TJFLAG_BOTTOMUP)? "Bottom-up":"Top-down"); - } - - for(tilew=dotile? 16:w, tileh=dotile? 16:h; ; tilew*=2, tileh*=2) - { - if(tilew>w) tilew=w; if(tileh>h) tileh=h; - ntilesw=(w+tilew-1)/tilew; ntilesh=(h+tileh-1)/tileh; - - if((jpegbuf=(unsigned char **)malloc(sizeof(unsigned char *) - *ntilesw*ntilesh))==NULL) - _throwunix("allocating JPEG tile array"); - memset(jpegbuf, 0, sizeof(unsigned char *)*ntilesw*ntilesh); - if((jpegsize=(unsigned long *)malloc(sizeof(unsigned long) - *ntilesw*ntilesh))==NULL) - _throwunix("allocating JPEG size array"); - memset(jpegsize, 0, sizeof(unsigned long)*ntilesw*ntilesh); - - if((flags&TJFLAG_NOREALLOC)!=0) - for(i=0; i %d x %d", TJSCALED(_w, sf), TJSCALED(_h, sf)); - printf("\n"); - } - else if(quiet==1) - { - printf("%s\t%s\t%s\t", pixFormatStr[pf], - (flags&TJFLAG_BOTTOMUP)? "BU":"TD", subNameLong[subsamp]); - printf("%-4d %-4d\t", tilew, tileh); - } - - _subsamp=subsamp; - if(dotile || xformop!=TJXOP_NONE || xformopt!=0) - { - if((t=(tjtransform *)malloc(sizeof(tjtransform)*ntilesw*ntilesh)) - ==NULL) - _throwunix("allocating image transform array"); - - if(xformop==TJXOP_TRANSPOSE || xformop==TJXOP_TRANSVERSE - || xformop==TJXOP_ROT90 || xformop==TJXOP_ROT270) - { - _w=h; _h=w; _tilew=tileh; _tileh=tilew; - } - - if(xformopt&TJXOPT_GRAY) _subsamp=TJ_GRAYSCALE; - if(xformop==TJXOP_HFLIP || xformop==TJXOP_ROT180) - _w=_w-(_w%tjMCUWidth[_subsamp]); - if(xformop==TJXOP_VFLIP || xformop==TJXOP_ROT180) - _h=_h-(_h%tjMCUHeight[_subsamp]); - if(xformop==TJXOP_TRANSVERSE || xformop==TJXOP_ROT90) - _w=_w-(_w%tjMCUHeight[_subsamp]); - if(xformop==TJXOP_TRANSVERSE || xformop==TJXOP_ROT270) - _h=_h-(_h%tjMCUWidth[_subsamp]); - _ntilesw=(_w+_tilew-1)/_tilew; - _ntilesh=(_h+_tileh-1)/_tileh; - - for(row=0, tile=0; row<_ntilesh; row++) - { - for(col=0; col<_ntilesw; col++, tile++) - { - t[tile].r.w=min(_tilew, _w-col*_tilew); - t[tile].r.h=min(_tileh, _h-row*_tileh); - t[tile].r.x=col*_tilew; - t[tile].r.y=row*_tileh; - t[tile].op=xformop; - t[tile].options=xformopt|TJXOPT_TRIM; - } - } - - start=gettime(); - if(tjTransform(handle, srcbuf, srcsize, _ntilesw*_ntilesh, jpegbuf, - jpegsize, t, flags)==-1) - _throwtj("executing tjTransform()"); - elapsed=gettime()-start; - - free(t); t=NULL; - - for(tile=0, totaljpegsize=0; tile<_ntilesw*_ntilesh; tile++) - totaljpegsize+=jpegsize[tile]; - - if(quiet) - { - printf("%s%c%s%c", - sigfig((double)(w*h)/1000000./elapsed, 4, tempstr, 80), - quiet==2? '\n':'\t', - sigfig((double)(w*h*ps)/(double)totaljpegsize, 4, tempstr2, 80), - quiet==2? '\n':'\t'); - } - else if(!quiet) - { - printf("X--> Frame rate: %f fps\n", 1.0/elapsed); - printf(" Output image size: %lu bytes\n", totaljpegsize); - printf(" Compression ratio: %f:1\n", - (double)(w*h*ps)/(double)totaljpegsize); - printf(" Source throughput: %f Megapixels/sec\n", - (double)(w*h)/1000000./elapsed); - printf(" Output bit stream: %f Megabits/sec\n", - (double)totaljpegsize*8./1000000./elapsed); - } - } - else - { - if(quiet==1) printf("N/A\tN/A\t"); - jpegsize[0]=srcsize; - memcpy(jpegbuf[0], srcbuf, srcsize); - } - - if(w==tilew) _tilew=_w; - if(h==tileh) _tileh=_h; - if(decomptest(NULL, jpegbuf, jpegsize, NULL, _w, _h, _subsamp, 0, - filename, _tilew, _tileh)==-1) - goto bailout; - - for(i=0; i <%% Quality> [options]\n\n"); - printf(" %s\n", progname); - 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("-bottomup = Test bottom-up compression/decompression\n"); - printf("-tile = Test performance of the codec when the image is encoded as separate\n"); - printf(" tiles of varying sizes.\n"); - printf("-forcemmx, -forcesse, -forcesse2, -forcesse3 =\n"); - printf(" Force MMX, SSE, SSE2, or SSE3 code paths in the underlying codec\n"); - printf("-rgb, -bgr, -rgbx, -bgrx, -xbgr, -xrgb =\n"); - printf(" Test the specified color conversion path in the codec (default: BGR)\n"); - printf("-fastupsample = Use fast, inaccurate upsampling code to perform 4:2:2 and 4:2:0\n"); - printf(" YUV decoding in libjpeg decompressor\n"); - printf("-quiet = Output results in tabular rather than verbose format\n"); - printf("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG\n"); - printf("-yuvdecode = Decode JPEG image to planar YUV rather than RGB\n"); - printf("-scale M/N = scale down the width/height of the decompressed JPEG image by a\n"); - printf(" factor of M/N (M/N = "); - for(i=0; i2) - { - if(i!=nsf-1) printf(", "); - if(i==nsf-2) printf("or "); - } - } - printf(")\n"); - printf("-hflip, -vflip, -transpose, -transverse, -rot90, -rot180, -rot270 =\n"); - printf(" Perform the corresponding lossless transform prior to\n"); - printf(" decompression (these options are mutually exclusive)\n"); - printf("-grayscale = Perform lossless grayscale conversion prior to decompression\n"); - printf(" test (can be combined with the other transforms above)\n"); - printf("-benchtime = Run each benchmark for at least seconds (default = 5.0)\n\n"); - printf("NOTE: If the quality is specified as a range (e.g. 90-100), a separate\n"); - printf("test will be performed for all quality values in the range.\n\n"); - exit(1); -} - - -int main(int argc, char *argv[]) -{ - unsigned char *srcbuf=NULL; int w, h, i, j; - int minqual=-1, maxqual=-1; char *temp; - int minarg=2; int retval=0; - - if((scalingfactors=tjGetScalingFactors(&nsf))==NULL || nsf==0) - _throwtj("executing tjGetScalingFactors()"); - - if(argcminarg) - { - for(i=minarg; i100) - { - puts("ERROR: Quality must be between 1 and 100."); - exit(1); - } - if((temp=strchr(argv[2], '-'))!=NULL && strlen(temp)>1 - && sscanf(&temp[1], "%d", &maxqual)==1 && maxqual>minqual && maxqual>=1 - && maxqual<=100) {} - else maxqual=minqual; - } - - if(argc>minarg) - { - for(i=minarg; i0.0) benchtime=temp; - else usage(argv[0]); - } - if(!strcmp(argv[i], "-?")) usage(argv[0]); - if(!strcasecmp(argv[i], "-alloc")) flags&=(~TJFLAG_NOREALLOC); - } - } - - if((sf.num!=1 || sf.denom!=1) && dotile) - { - printf("Disabling tiled compression/decompression tests, because those tests do not\n"); - printf("work when scaled decompression is enabled.\n"); - dotile=0; - } - - if(yuv && dotile) - { - printf("Disabling tiled compression/decompression tests, because those tests do not\n"); - printf("work when YUV encoding or decoding is enabled.\n\n"); - dotile=0; - } - - if(!decomponly) - { - if(loadbmp(argv[1], &srcbuf, &w, &h, pf, (flags&TJFLAG_BOTTOMUP)!=0)==-1) - _throwbmp("loading bitmap"); - temp=strrchr(argv[1], '.'); - if(temp!=NULL) *temp='\0'; - } - - if(quiet==1 && !decomponly) - { - printf("All performance values in Mpixels/sec\n\n"); - printf("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tComp\tComp\tDecomp\n", - dotile? "Tile ":"Image", dotile? "Tile ":"Image"); - printf("Format\tOrder\tSubsamp\tQual\tWidth Height\tPerf \tRatio\tPerf\n\n"); - } - - if(decomponly) - { - dodecomptest(argv[1]); - printf("\n"); - goto bailout; - } - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_GRAYSCALE, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_420, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_422, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_444, i, argv[1]); - printf("\n"); - - bailout: - if(srcbuf) free(srcbuf); - return retval; -} -- 2.49.0