1b8b359ae97442e77bc71d0830eaf58972206945dDRC/* 2bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III * Copyright (C)2009-2014, 2017 D. R. Commander. All Rights Reserved. 3b8b359ae97442e77bc71d0830eaf58972206945dDRC * 4b8b359ae97442e77bc71d0830eaf58972206945dDRC * Redistribution and use in source and binary forms, with or without 5b8b359ae97442e77bc71d0830eaf58972206945dDRC * modification, are permitted provided that the following conditions are met: 6b8b359ae97442e77bc71d0830eaf58972206945dDRC * 7b8b359ae97442e77bc71d0830eaf58972206945dDRC * - Redistributions of source code must retain the above copyright notice, 8b8b359ae97442e77bc71d0830eaf58972206945dDRC * this list of conditions and the following disclaimer. 9b8b359ae97442e77bc71d0830eaf58972206945dDRC * - Redistributions in binary form must reproduce the above copyright notice, 10b8b359ae97442e77bc71d0830eaf58972206945dDRC * this list of conditions and the following disclaimer in the documentation 11b8b359ae97442e77bc71d0830eaf58972206945dDRC * and/or other materials provided with the distribution. 12b8b359ae97442e77bc71d0830eaf58972206945dDRC * - Neither the name of the libjpeg-turbo Project nor the names of its 13b8b359ae97442e77bc71d0830eaf58972206945dDRC * contributors may be used to endorse or promote products derived from this 14b8b359ae97442e77bc71d0830eaf58972206945dDRC * software without specific prior written permission. 15b8b359ae97442e77bc71d0830eaf58972206945dDRC * 16b8b359ae97442e77bc71d0830eaf58972206945dDRC * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", 17b8b359ae97442e77bc71d0830eaf58972206945dDRC * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18b8b359ae97442e77bc71d0830eaf58972206945dDRC * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19b8b359ae97442e77bc71d0830eaf58972206945dDRC * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 20b8b359ae97442e77bc71d0830eaf58972206945dDRC * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21b8b359ae97442e77bc71d0830eaf58972206945dDRC * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22b8b359ae97442e77bc71d0830eaf58972206945dDRC * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23b8b359ae97442e77bc71d0830eaf58972206945dDRC * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24b8b359ae97442e77bc71d0830eaf58972206945dDRC * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25b8b359ae97442e77bc71d0830eaf58972206945dDRC * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26b8b359ae97442e77bc71d0830eaf58972206945dDRC * POSSIBILITY OF SUCH DAMAGE. 27b8b359ae97442e77bc71d0830eaf58972206945dDRC */ 28b8b359ae97442e77bc71d0830eaf58972206945dDRC 29b8b359ae97442e77bc71d0830eaf58972206945dDRC/* 30c52c55670a3235b9aa8358db354ca2461c2b1155DRC * This program tests the various code paths in the TurboJPEG C Wrapper 31b8b359ae97442e77bc71d0830eaf58972206945dDRC */ 32b8b359ae97442e77bc71d0830eaf58972206945dDRC 33b8b359ae97442e77bc71d0830eaf58972206945dDRC#include <stdio.h> 34b8b359ae97442e77bc71d0830eaf58972206945dDRC#include <stdlib.h> 35b8b359ae97442e77bc71d0830eaf58972206945dDRC#include <string.h> 36b8b359ae97442e77bc71d0830eaf58972206945dDRC#include <errno.h> 37b8b359ae97442e77bc71d0830eaf58972206945dDRC#include "./tjutil.h" 38b8b359ae97442e77bc71d0830eaf58972206945dDRC#include "./turbojpeg.h" 39e835ee3340936ac15b55507d0957ffbc83e6a670DRC#ifdef _WIN32 40e835ee3340936ac15b55507d0957ffbc83e6a670DRC #include <time.h> 41e835ee3340936ac15b55507d0957ffbc83e6a670DRC #define random() rand() 42e835ee3340936ac15b55507d0957ffbc83e6a670DRC#endif 43b8b359ae97442e77bc71d0830eaf58972206945dDRC 44b8b359ae97442e77bc71d0830eaf58972206945dDRC 45b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid usage(char *progName) 46b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 47bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III printf("\nUSAGE: %s [options]\n\n", progName); 48b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("Options:\n"); 49b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("-yuv = test YUV encoding/decoding support\n"); 50f610d61fcc38b36a8a29879e5c053015164242f8DRC printf("-noyuvpad = do not pad each line of each Y, U, and V plane to the nearest\n"); 51fef9852da3a80bfaf84862462609f97d77ad6db7DRC printf(" 4-byte boundary\n"); 52bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III printf("-alloc = test automatic buffer allocation\n\n"); 53b8b359ae97442e77bc71d0830eaf58972206945dDRC exit(1); 54b8b359ae97442e77bc71d0830eaf58972206945dDRC} 55b8b359ae97442e77bc71d0830eaf58972206945dDRC 56b8b359ae97442e77bc71d0830eaf58972206945dDRC 57b8b359ae97442e77bc71d0830eaf58972206945dDRC#define _throwtj() {printf("TurboJPEG ERROR:\n%s\n", tjGetErrorStr()); \ 58b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout();} 59b8b359ae97442e77bc71d0830eaf58972206945dDRC#define _tj(f) {if((f)==-1) _throwtj();} 60b8b359ae97442e77bc71d0830eaf58972206945dDRC#define _throw(m) {printf("ERROR: %s\n", m); bailout();} 61b8b359ae97442e77bc71d0830eaf58972206945dDRC 62b8b359ae97442e77bc71d0830eaf58972206945dDRCconst char *subNameLong[TJ_NUMSAMP]= 63b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 641f3635c4969f2319a01c9fe561958815b733227fDRC "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0", "4:1:1" 65b8b359ae97442e77bc71d0830eaf58972206945dDRC}; 661f3635c4969f2319a01c9fe561958815b733227fDRCconst char *subName[TJ_NUMSAMP]={"444", "422", "420", "GRAY", "440", "411"}; 67b8b359ae97442e77bc71d0830eaf58972206945dDRC 68b8b359ae97442e77bc71d0830eaf58972206945dDRCconst char *pixFormatStr[TJ_NUMPF]= 69b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 7067ce3b2352fe1f7511edbfed74ec6960e41e97dcDRC "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale", 71cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC "RGBA", "BGRA", "ABGR", "ARGB", "CMYK" 72b8b359ae97442e77bc71d0830eaf58972206945dDRC}; 73b8b359ae97442e77bc71d0830eaf58972206945dDRC 74cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRCconst int alphaOffset[TJ_NUMPF] = {-1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1}; 75c08e8c15bc73e7931ac5b87b992b17bbbda7f332DRC 76b8b359ae97442e77bc71d0830eaf58972206945dDRCconst int _3byteFormats[]={TJPF_RGB, TJPF_BGR}; 77cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRCconst int _4byteFormats[]={TJPF_RGBX, TJPF_BGRX, TJPF_XBGR, TJPF_XRGB, 78cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC TJPF_CMYK}; 79b8b359ae97442e77bc71d0830eaf58972206945dDRCconst int _onlyGray[]={TJPF_GRAY}; 80b8b359ae97442e77bc71d0830eaf58972206945dDRCconst int _onlyRGB[]={TJPF_RGB}; 81b8b359ae97442e77bc71d0830eaf58972206945dDRC 8234dca052271f4a75b3c0f7b11a2c5024159628d4DRCint doyuv=0, alloc=0, pad=4; 83b8b359ae97442e77bc71d0830eaf58972206945dDRC 84b8b359ae97442e77bc71d0830eaf58972206945dDRCint exitStatus=0; 85b8b359ae97442e77bc71d0830eaf58972206945dDRC#define bailout() {exitStatus=-1; goto bailout;} 86b8b359ae97442e77bc71d0830eaf58972206945dDRC 87b8b359ae97442e77bc71d0830eaf58972206945dDRC 88b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid initBuf(unsigned char *buf, int w, int h, int pf, int flags) 89b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 90b8b359ae97442e77bc71d0830eaf58972206945dDRC int roffset=tjRedOffset[pf]; 91b8b359ae97442e77bc71d0830eaf58972206945dDRC int goffset=tjGreenOffset[pf]; 92b8b359ae97442e77bc71d0830eaf58972206945dDRC int boffset=tjBlueOffset[pf]; 93b8b359ae97442e77bc71d0830eaf58972206945dDRC int ps=tjPixelSize[pf]; 94b8b359ae97442e77bc71d0830eaf58972206945dDRC int index, row, col, halfway=16; 95b8b359ae97442e77bc71d0830eaf58972206945dDRC 96b8b359ae97442e77bc71d0830eaf58972206945dDRC if(pf==TJPF_GRAY) 97b8b359ae97442e77bc71d0830eaf58972206945dDRC { 98cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC memset(buf, 0, w*h*ps); 99b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<h; row++) 100b8b359ae97442e77bc71d0830eaf58972206945dDRC { 101b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<w; col++) 102b8b359ae97442e77bc71d0830eaf58972206945dDRC { 103b8b359ae97442e77bc71d0830eaf58972206945dDRC if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col; 104b8b359ae97442e77bc71d0830eaf58972206945dDRC else index=row*w+col; 105b8b359ae97442e77bc71d0830eaf58972206945dDRC if(((row/8)+(col/8))%2==0) buf[index]=(row<halfway)? 255:0; 106b8b359ae97442e77bc71d0830eaf58972206945dDRC else buf[index]=(row<halfway)? 76:226; 107b8b359ae97442e77bc71d0830eaf58972206945dDRC } 108b8b359ae97442e77bc71d0830eaf58972206945dDRC } 109b8b359ae97442e77bc71d0830eaf58972206945dDRC } 110cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else if(pf==TJPF_CMYK) 111cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 112cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC memset(buf, 255, w*h*ps); 113cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC for(row=0; row<h; row++) 114cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 115cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC for(col=0; col<w; col++) 116cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 117cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col; 118cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else index=row*w+col; 119cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(((row/8)+(col/8))%2==0) 120cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 121cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(row>=halfway) buf[index*ps+3]=0; 122cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 123cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else 124cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 125cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC buf[index*ps+2]=0; 126cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(row<halfway) buf[index*ps+1]=0; 127cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 128cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 129cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 130cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 131b8b359ae97442e77bc71d0830eaf58972206945dDRC else 132b8b359ae97442e77bc71d0830eaf58972206945dDRC { 133cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC memset(buf, 0, w*h*ps); 134b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<h; row++) 135b8b359ae97442e77bc71d0830eaf58972206945dDRC { 136b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<w; col++) 137b8b359ae97442e77bc71d0830eaf58972206945dDRC { 138b8b359ae97442e77bc71d0830eaf58972206945dDRC if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col; 139b8b359ae97442e77bc71d0830eaf58972206945dDRC else index=row*w+col; 140b8b359ae97442e77bc71d0830eaf58972206945dDRC if(((row/8)+(col/8))%2==0) 141b8b359ae97442e77bc71d0830eaf58972206945dDRC { 142b8b359ae97442e77bc71d0830eaf58972206945dDRC if(row<halfway) 143b8b359ae97442e77bc71d0830eaf58972206945dDRC { 144b8b359ae97442e77bc71d0830eaf58972206945dDRC buf[index*ps+roffset]=255; 145b8b359ae97442e77bc71d0830eaf58972206945dDRC buf[index*ps+goffset]=255; 146b8b359ae97442e77bc71d0830eaf58972206945dDRC buf[index*ps+boffset]=255; 147b8b359ae97442e77bc71d0830eaf58972206945dDRC } 148b8b359ae97442e77bc71d0830eaf58972206945dDRC } 149b8b359ae97442e77bc71d0830eaf58972206945dDRC else 150b8b359ae97442e77bc71d0830eaf58972206945dDRC { 151b8b359ae97442e77bc71d0830eaf58972206945dDRC buf[index*ps+roffset]=255; 152b8b359ae97442e77bc71d0830eaf58972206945dDRC if(row>=halfway) buf[index*ps+goffset]=255; 153b8b359ae97442e77bc71d0830eaf58972206945dDRC } 154b8b359ae97442e77bc71d0830eaf58972206945dDRC } 155b8b359ae97442e77bc71d0830eaf58972206945dDRC } 156b8b359ae97442e77bc71d0830eaf58972206945dDRC } 157b8b359ae97442e77bc71d0830eaf58972206945dDRC} 158b8b359ae97442e77bc71d0830eaf58972206945dDRC 159b8b359ae97442e77bc71d0830eaf58972206945dDRC 160b8b359ae97442e77bc71d0830eaf58972206945dDRC#define checkval(v, cv) { \ 161b8b359ae97442e77bc71d0830eaf58972206945dDRC if(v<cv-1 || v>cv+1) { \ 162b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\nComp. %s at %d,%d should be %d, not %d\n", \ 163b8b359ae97442e77bc71d0830eaf58972206945dDRC #v, row, col, cv, v); \ 164b8b359ae97442e77bc71d0830eaf58972206945dDRC retval=0; exitStatus=-1; goto bailout; \ 165b8b359ae97442e77bc71d0830eaf58972206945dDRC }} 166b8b359ae97442e77bc71d0830eaf58972206945dDRC 167b8b359ae97442e77bc71d0830eaf58972206945dDRC#define checkval0(v) { \ 168b8b359ae97442e77bc71d0830eaf58972206945dDRC if(v>1) { \ 169b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\nComp. %s at %d,%d should be 0, not %d\n", #v, row, col, v); \ 170b8b359ae97442e77bc71d0830eaf58972206945dDRC retval=0; exitStatus=-1; goto bailout; \ 171b8b359ae97442e77bc71d0830eaf58972206945dDRC }} 172b8b359ae97442e77bc71d0830eaf58972206945dDRC 173b8b359ae97442e77bc71d0830eaf58972206945dDRC#define checkval255(v) { \ 174b8b359ae97442e77bc71d0830eaf58972206945dDRC if(v<254) { \ 175b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\nComp. %s at %d,%d should be 255, not %d\n", #v, row, col, v); \ 176b8b359ae97442e77bc71d0830eaf58972206945dDRC retval=0; exitStatus=-1; goto bailout; \ 177b8b359ae97442e77bc71d0830eaf58972206945dDRC }} 178b8b359ae97442e77bc71d0830eaf58972206945dDRC 179b8b359ae97442e77bc71d0830eaf58972206945dDRC 180b8b359ae97442e77bc71d0830eaf58972206945dDRCint checkBuf(unsigned char *buf, int w, int h, int pf, int subsamp, 181b8b359ae97442e77bc71d0830eaf58972206945dDRC tjscalingfactor sf, int flags) 182b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 183b8b359ae97442e77bc71d0830eaf58972206945dDRC int roffset=tjRedOffset[pf]; 184b8b359ae97442e77bc71d0830eaf58972206945dDRC int goffset=tjGreenOffset[pf]; 185b8b359ae97442e77bc71d0830eaf58972206945dDRC int boffset=tjBlueOffset[pf]; 186c08e8c15bc73e7931ac5b87b992b17bbbda7f332DRC int aoffset=alphaOffset[pf]; 187b8b359ae97442e77bc71d0830eaf58972206945dDRC int ps=tjPixelSize[pf]; 188b8b359ae97442e77bc71d0830eaf58972206945dDRC int index, row, col, retval=1; 189b8b359ae97442e77bc71d0830eaf58972206945dDRC int halfway=16*sf.num/sf.denom; 190b8b359ae97442e77bc71d0830eaf58972206945dDRC int blocksize=8*sf.num/sf.denom; 191b8b359ae97442e77bc71d0830eaf58972206945dDRC 192cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(pf==TJPF_CMYK) 193cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 194cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC for(row=0; row<h; row++) 195cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 196cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC for(col=0; col<w; col++) 197cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 198cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC unsigned char c, m, y, k; 199cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col; 200cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else index=row*w+col; 201cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC c=buf[index*ps]; 202cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC m=buf[index*ps+1]; 203cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC y=buf[index*ps+2]; 204cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC k=buf[index*ps+3]; 205cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(((row/blocksize)+(col/blocksize))%2==0) 206cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 207cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC checkval255(c); checkval255(m); checkval255(y); 208cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(row<halfway) checkval255(k) 209cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else checkval0(k) 210cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 211cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else 212cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC { 213cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC checkval255(c); checkval0(y); checkval255(k); 214cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(row<halfway) checkval0(m) 215cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else checkval255(m) 216cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 217cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 218cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 219cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC return 1; 220cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC } 221cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC 222b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<h; row++) 223b8b359ae97442e77bc71d0830eaf58972206945dDRC { 224b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<w; col++) 225b8b359ae97442e77bc71d0830eaf58972206945dDRC { 226c08e8c15bc73e7931ac5b87b992b17bbbda7f332DRC unsigned char r, g, b, a; 227b8b359ae97442e77bc71d0830eaf58972206945dDRC if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col; 228b8b359ae97442e77bc71d0830eaf58972206945dDRC else index=row*w+col; 229b8b359ae97442e77bc71d0830eaf58972206945dDRC r=buf[index*ps+roffset]; 230b8b359ae97442e77bc71d0830eaf58972206945dDRC g=buf[index*ps+goffset]; 231b8b359ae97442e77bc71d0830eaf58972206945dDRC b=buf[index*ps+boffset]; 232c08e8c15bc73e7931ac5b87b992b17bbbda7f332DRC a=aoffset>=0? buf[index*ps+aoffset]:0xFF; 233b8b359ae97442e77bc71d0830eaf58972206945dDRC if(((row/blocksize)+(col/blocksize))%2==0) 234b8b359ae97442e77bc71d0830eaf58972206945dDRC { 235b8b359ae97442e77bc71d0830eaf58972206945dDRC if(row<halfway) 236b8b359ae97442e77bc71d0830eaf58972206945dDRC { 237b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval255(r); checkval255(g); checkval255(b); 238b8b359ae97442e77bc71d0830eaf58972206945dDRC } 239b8b359ae97442e77bc71d0830eaf58972206945dDRC else 240b8b359ae97442e77bc71d0830eaf58972206945dDRC { 241b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval0(r); checkval0(g); checkval0(b); 242b8b359ae97442e77bc71d0830eaf58972206945dDRC } 243b8b359ae97442e77bc71d0830eaf58972206945dDRC } 244b8b359ae97442e77bc71d0830eaf58972206945dDRC else 245b8b359ae97442e77bc71d0830eaf58972206945dDRC { 246b8b359ae97442e77bc71d0830eaf58972206945dDRC if(subsamp==TJSAMP_GRAY) 247b8b359ae97442e77bc71d0830eaf58972206945dDRC { 248b8b359ae97442e77bc71d0830eaf58972206945dDRC if(row<halfway) 249b8b359ae97442e77bc71d0830eaf58972206945dDRC { 250b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval(r, 76); checkval(g, 76); checkval(b, 76); 251b8b359ae97442e77bc71d0830eaf58972206945dDRC } 252b8b359ae97442e77bc71d0830eaf58972206945dDRC else 253b8b359ae97442e77bc71d0830eaf58972206945dDRC { 254b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval(r, 226); checkval(g, 226); checkval(b, 226); 255b8b359ae97442e77bc71d0830eaf58972206945dDRC } 256b8b359ae97442e77bc71d0830eaf58972206945dDRC } 257b8b359ae97442e77bc71d0830eaf58972206945dDRC else 258b8b359ae97442e77bc71d0830eaf58972206945dDRC { 259b8b359ae97442e77bc71d0830eaf58972206945dDRC if(row<halfway) 260b8b359ae97442e77bc71d0830eaf58972206945dDRC { 261b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval255(r); checkval0(g); checkval0(b); 262b8b359ae97442e77bc71d0830eaf58972206945dDRC } 263b8b359ae97442e77bc71d0830eaf58972206945dDRC else 264b8b359ae97442e77bc71d0830eaf58972206945dDRC { 265b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval255(r); checkval255(g); checkval0(b); 266b8b359ae97442e77bc71d0830eaf58972206945dDRC } 267b8b359ae97442e77bc71d0830eaf58972206945dDRC } 268b8b359ae97442e77bc71d0830eaf58972206945dDRC } 269c08e8c15bc73e7931ac5b87b992b17bbbda7f332DRC checkval255(a); 270b8b359ae97442e77bc71d0830eaf58972206945dDRC } 271b8b359ae97442e77bc71d0830eaf58972206945dDRC } 272b8b359ae97442e77bc71d0830eaf58972206945dDRC 273b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 274b8b359ae97442e77bc71d0830eaf58972206945dDRC if(retval==0) 275b8b359ae97442e77bc71d0830eaf58972206945dDRC { 276b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<h; row++) 277b8b359ae97442e77bc71d0830eaf58972206945dDRC { 278b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<w; col++) 279b8b359ae97442e77bc71d0830eaf58972206945dDRC { 280cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC if(pf==TJPF_CMYK) 281cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC printf("%.3d/%.3d/%.3d/%.3d ", buf[(row*w+col)*ps], 282cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC buf[(row*w+col)*ps+1], buf[(row*w+col)*ps+2], 283cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC buf[(row*w+col)*ps+3]); 284cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC else 285cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC printf("%.3d/%.3d/%.3d ", buf[(row*w+col)*ps+roffset], 286cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC buf[(row*w+col)*ps+goffset], buf[(row*w+col)*ps+boffset]); 287b8b359ae97442e77bc71d0830eaf58972206945dDRC } 288b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 289b8b359ae97442e77bc71d0830eaf58972206945dDRC } 290b8b359ae97442e77bc71d0830eaf58972206945dDRC } 291b8b359ae97442e77bc71d0830eaf58972206945dDRC return retval; 292b8b359ae97442e77bc71d0830eaf58972206945dDRC} 293b8b359ae97442e77bc71d0830eaf58972206945dDRC 294b8b359ae97442e77bc71d0830eaf58972206945dDRC 295b8b359ae97442e77bc71d0830eaf58972206945dDRC#define PAD(v, p) ((v+(p)-1)&(~((p)-1))) 296b8b359ae97442e77bc71d0830eaf58972206945dDRC 297f610d61fcc38b36a8a29879e5c053015164242f8DRCint checkBufYUV(unsigned char *buf, int w, int h, int subsamp, 298f610d61fcc38b36a8a29879e5c053015164242f8DRC tjscalingfactor sf) 299b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 300b8b359ae97442e77bc71d0830eaf58972206945dDRC int row, col; 301b8b359ae97442e77bc71d0830eaf58972206945dDRC int hsf=tjMCUWidth[subsamp]/8, vsf=tjMCUHeight[subsamp]/8; 302b8b359ae97442e77bc71d0830eaf58972206945dDRC int pw=PAD(w, hsf), ph=PAD(h, vsf); 303b8b359ae97442e77bc71d0830eaf58972206945dDRC int cw=pw/hsf, ch=ph/vsf; 304f610d61fcc38b36a8a29879e5c053015164242f8DRC int ypitch=PAD(pw, pad), uvpitch=PAD(cw, pad); 305b8b359ae97442e77bc71d0830eaf58972206945dDRC int retval=1; 306f610d61fcc38b36a8a29879e5c053015164242f8DRC int halfway=16*sf.num/sf.denom; 307f610d61fcc38b36a8a29879e5c053015164242f8DRC int blocksize=8*sf.num/sf.denom; 308b8b359ae97442e77bc71d0830eaf58972206945dDRC 309215aa8b78bccea6ef301c5fb256722b4099e7b90DRC for(row=0; row<ph; row++) 310b8b359ae97442e77bc71d0830eaf58972206945dDRC { 311b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<pw; col++) 312b8b359ae97442e77bc71d0830eaf58972206945dDRC { 313b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned char y=buf[ypitch*row+col]; 314f610d61fcc38b36a8a29879e5c053015164242f8DRC if(((row/blocksize)+(col/blocksize))%2==0) 315215aa8b78bccea6ef301c5fb256722b4099e7b90DRC { 316215aa8b78bccea6ef301c5fb256722b4099e7b90DRC if(row<halfway) checkval255(y) else checkval0(y); 317215aa8b78bccea6ef301c5fb256722b4099e7b90DRC } 318215aa8b78bccea6ef301c5fb256722b4099e7b90DRC else 319215aa8b78bccea6ef301c5fb256722b4099e7b90DRC { 320215aa8b78bccea6ef301c5fb256722b4099e7b90DRC if(row<halfway) checkval(y, 76) else checkval(y, 226); 321215aa8b78bccea6ef301c5fb256722b4099e7b90DRC } 322b8b359ae97442e77bc71d0830eaf58972206945dDRC } 323b8b359ae97442e77bc71d0830eaf58972206945dDRC } 324b8b359ae97442e77bc71d0830eaf58972206945dDRC if(subsamp!=TJSAMP_GRAY) 325b8b359ae97442e77bc71d0830eaf58972206945dDRC { 326f610d61fcc38b36a8a29879e5c053015164242f8DRC int halfway=16/vsf*sf.num/sf.denom; 327215aa8b78bccea6ef301c5fb256722b4099e7b90DRC for(row=0; row<ch; row++) 328b8b359ae97442e77bc71d0830eaf58972206945dDRC { 329b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<cw; col++) 330b8b359ae97442e77bc71d0830eaf58972206945dDRC { 331b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned char u=buf[ypitch*ph + (uvpitch*row+col)], 332b8b359ae97442e77bc71d0830eaf58972206945dDRC v=buf[ypitch*ph + uvpitch*ch + (uvpitch*row+col)]; 333f610d61fcc38b36a8a29879e5c053015164242f8DRC if(((row*vsf/blocksize)+(col*hsf/blocksize))%2==0) 334b8b359ae97442e77bc71d0830eaf58972206945dDRC { 335b8b359ae97442e77bc71d0830eaf58972206945dDRC checkval(u, 128); checkval(v, 128); 336b8b359ae97442e77bc71d0830eaf58972206945dDRC } 337b8b359ae97442e77bc71d0830eaf58972206945dDRC else 338b8b359ae97442e77bc71d0830eaf58972206945dDRC { 339215aa8b78bccea6ef301c5fb256722b4099e7b90DRC if(row<halfway) 340215aa8b78bccea6ef301c5fb256722b4099e7b90DRC { 341215aa8b78bccea6ef301c5fb256722b4099e7b90DRC checkval(u, 85); checkval255(v); 342215aa8b78bccea6ef301c5fb256722b4099e7b90DRC } 343215aa8b78bccea6ef301c5fb256722b4099e7b90DRC else 344215aa8b78bccea6ef301c5fb256722b4099e7b90DRC { 345215aa8b78bccea6ef301c5fb256722b4099e7b90DRC checkval0(u); checkval(v, 149); 346215aa8b78bccea6ef301c5fb256722b4099e7b90DRC } 347b8b359ae97442e77bc71d0830eaf58972206945dDRC } 348b8b359ae97442e77bc71d0830eaf58972206945dDRC } 349b8b359ae97442e77bc71d0830eaf58972206945dDRC } 350b8b359ae97442e77bc71d0830eaf58972206945dDRC } 351b8b359ae97442e77bc71d0830eaf58972206945dDRC 352b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 353b8b359ae97442e77bc71d0830eaf58972206945dDRC if(retval==0) 354b8b359ae97442e77bc71d0830eaf58972206945dDRC { 355b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<ph; row++) 356b8b359ae97442e77bc71d0830eaf58972206945dDRC { 357b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<pw; col++) 358b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("%.3d ", buf[ypitch*row+col]); 359b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 360b8b359ae97442e77bc71d0830eaf58972206945dDRC } 361b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 362b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<ch; row++) 363b8b359ae97442e77bc71d0830eaf58972206945dDRC { 364b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<cw; col++) 365b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("%.3d ", buf[ypitch*ph + (uvpitch*row+col)]); 366b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 367b8b359ae97442e77bc71d0830eaf58972206945dDRC } 368b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 369b8b359ae97442e77bc71d0830eaf58972206945dDRC for(row=0; row<ch; row++) 370b8b359ae97442e77bc71d0830eaf58972206945dDRC { 371b8b359ae97442e77bc71d0830eaf58972206945dDRC for(col=0; col<cw; col++) 372b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("%.3d ", buf[ypitch*ph + uvpitch*ch + (uvpitch*row+col)]); 373b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("\n"); 374b8b359ae97442e77bc71d0830eaf58972206945dDRC } 375b8b359ae97442e77bc71d0830eaf58972206945dDRC } 376b8b359ae97442e77bc71d0830eaf58972206945dDRC 377b8b359ae97442e77bc71d0830eaf58972206945dDRC return retval; 378b8b359ae97442e77bc71d0830eaf58972206945dDRC} 379b8b359ae97442e77bc71d0830eaf58972206945dDRC 380b8b359ae97442e77bc71d0830eaf58972206945dDRC 381b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid writeJPEG(unsigned char *jpegBuf, unsigned long jpegSize, char *filename) 382b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 383b8b359ae97442e77bc71d0830eaf58972206945dDRC FILE *file=fopen(filename, "wb"); 384b8b359ae97442e77bc71d0830eaf58972206945dDRC if(!file || fwrite(jpegBuf, jpegSize, 1, file)!=1) 385b8b359ae97442e77bc71d0830eaf58972206945dDRC { 386b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("ERROR: Could not write to %s.\n%s\n", filename, strerror(errno)); 387b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout(); 388b8b359ae97442e77bc71d0830eaf58972206945dDRC } 389b8b359ae97442e77bc71d0830eaf58972206945dDRC 390b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 391b8b359ae97442e77bc71d0830eaf58972206945dDRC if(file) fclose(file); 392b8b359ae97442e77bc71d0830eaf58972206945dDRC} 393b8b359ae97442e77bc71d0830eaf58972206945dDRC 394b8b359ae97442e77bc71d0830eaf58972206945dDRC 395b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid compTest(tjhandle handle, unsigned char **dstBuf, 396b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned long *dstSize, int w, int h, int pf, char *basename, 397b8b359ae97442e77bc71d0830eaf58972206945dDRC int subsamp, int jpegQual, int flags) 398b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 39934dca052271f4a75b3c0f7b11a2c5024159628d4DRC char tempStr[1024]; unsigned char *srcBuf=NULL, *yuvBuf=NULL; 40034dca052271f4a75b3c0f7b11a2c5024159628d4DRC const char *pfStr=pixFormatStr[pf]; 401fe739656f93f2dce37182bfeac10a0acd95be5a4DRC const char *buStrLong=(flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down "; 402fe739656f93f2dce37182bfeac10a0acd95be5a4DRC const char *buStr=(flags&TJFLAG_BOTTOMUP)? "BU":"TD"; 403b8b359ae97442e77bc71d0830eaf58972206945dDRC 40434dca052271f4a75b3c0f7b11a2c5024159628d4DRC if((srcBuf=(unsigned char *)malloc(w*h*tjPixelSize[pf]))==NULL) 40534dca052271f4a75b3c0f7b11a2c5024159628d4DRC _throw("Memory allocation failure"); 40634dca052271f4a75b3c0f7b11a2c5024159628d4DRC initBuf(srcBuf, w, h, pf, flags); 407b8b359ae97442e77bc71d0830eaf58972206945dDRC 408b8b359ae97442e77bc71d0830eaf58972206945dDRC if(*dstBuf && *dstSize>0) memset(*dstBuf, 0, *dstSize); 409b8b359ae97442e77bc71d0830eaf58972206945dDRC 41034dca052271f4a75b3c0f7b11a2c5024159628d4DRC 41134dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(!alloc) flags|=TJFLAG_NOREALLOC; 41234dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) 413b8b359ae97442e77bc71d0830eaf58972206945dDRC { 41434dca052271f4a75b3c0f7b11a2c5024159628d4DRC unsigned long yuvSize=tjBufSizeYUV2(w, pad, h, subsamp); 41534dca052271f4a75b3c0f7b11a2c5024159628d4DRC tjscalingfactor sf={1, 1}; 416c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC tjhandle handle2=tjInitCompress(); 417c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC if(!handle2) _throwtj(); 41834dca052271f4a75b3c0f7b11a2c5024159628d4DRC 41934dca052271f4a75b3c0f7b11a2c5024159628d4DRC if((yuvBuf=(unsigned char *)malloc(yuvSize))==NULL) 42034dca052271f4a75b3c0f7b11a2c5024159628d4DRC _throw("Memory allocation failure"); 42120e158dcb7b8242f905f9feb2a91460ec25fc0e8DRC memset(yuvBuf, 0, yuvSize); 42234dca052271f4a75b3c0f7b11a2c5024159628d4DRC 42334dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("%s %s -> YUV %s ... ", pfStr, buStrLong, subNameLong[subsamp]); 424c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC _tj(tjEncodeYUV3(handle2, srcBuf, w, 0, h, pf, yuvBuf, pad, subsamp, 425f610d61fcc38b36a8a29879e5c053015164242f8DRC flags)); 426c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC tjDestroy(handle2); 42734dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(checkBufYUV(yuvBuf, w, h, subsamp, sf)) printf("Passed.\n"); 42834dca052271f4a75b3c0f7b11a2c5024159628d4DRC else printf("FAILED!\n"); 42934dca052271f4a75b3c0f7b11a2c5024159628d4DRC 43034dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("YUV %s %s -> JPEG Q%d ... ", subNameLong[subsamp], buStrLong, 43134dca052271f4a75b3c0f7b11a2c5024159628d4DRC jpegQual); 43234dca052271f4a75b3c0f7b11a2c5024159628d4DRC _tj(tjCompressFromYUV(handle, yuvBuf, w, pad, h, subsamp, dstBuf, 43334dca052271f4a75b3c0f7b11a2c5024159628d4DRC dstSize, jpegQual, flags)); 434b8b359ae97442e77bc71d0830eaf58972206945dDRC } 435b8b359ae97442e77bc71d0830eaf58972206945dDRC else 436b8b359ae97442e77bc71d0830eaf58972206945dDRC { 43734dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("%s %s -> %s Q%d ... ", pfStr, buStrLong, subNameLong[subsamp], 43834dca052271f4a75b3c0f7b11a2c5024159628d4DRC jpegQual); 43934dca052271f4a75b3c0f7b11a2c5024159628d4DRC _tj(tjCompress2(handle, srcBuf, w, 0, h, pf, dstBuf, dstSize, subsamp, 44034dca052271f4a75b3c0f7b11a2c5024159628d4DRC jpegQual, flags)); 441b8b359ae97442e77bc71d0830eaf58972206945dDRC } 442b8b359ae97442e77bc71d0830eaf58972206945dDRC 44334dca052271f4a75b3c0f7b11a2c5024159628d4DRC snprintf(tempStr, 1024, "%s_enc_%s_%s_%s_Q%d.jpg", basename, pfStr, buStr, 44434dca052271f4a75b3c0f7b11a2c5024159628d4DRC subName[subsamp], jpegQual); 445b8b359ae97442e77bc71d0830eaf58972206945dDRC writeJPEG(*dstBuf, *dstSize, tempStr); 44634dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("Done.\n Result in %s\n", tempStr); 447b8b359ae97442e77bc71d0830eaf58972206945dDRC 448b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 44934dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(yuvBuf) free(yuvBuf); 450b8b359ae97442e77bc71d0830eaf58972206945dDRC if(srcBuf) free(srcBuf); 451b8b359ae97442e77bc71d0830eaf58972206945dDRC} 452b8b359ae97442e77bc71d0830eaf58972206945dDRC 453b8b359ae97442e77bc71d0830eaf58972206945dDRC 454b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid _decompTest(tjhandle handle, unsigned char *jpegBuf, 455b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned long jpegSize, int w, int h, int pf, char *basename, int subsamp, 456b8b359ae97442e77bc71d0830eaf58972206945dDRC int flags, tjscalingfactor sf) 457b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 45834dca052271f4a75b3c0f7b11a2c5024159628d4DRC unsigned char *dstBuf=NULL, *yuvBuf=NULL; 4592bdadb44a77465d7eca03cfa9a6fcb16109bad51DRC int _hdrw=0, _hdrh=0, _hdrsubsamp=-1; 460b8b359ae97442e77bc71d0830eaf58972206945dDRC int scaledWidth=TJSCALED(w, sf); 461b8b359ae97442e77bc71d0830eaf58972206945dDRC int scaledHeight=TJSCALED(h, sf); 462b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned long dstSize=0; 463b8b359ae97442e77bc71d0830eaf58972206945dDRC 464b8b359ae97442e77bc71d0830eaf58972206945dDRC _tj(tjDecompressHeader2(handle, jpegBuf, jpegSize, &_hdrw, &_hdrh, 465b8b359ae97442e77bc71d0830eaf58972206945dDRC &_hdrsubsamp)); 466b8b359ae97442e77bc71d0830eaf58972206945dDRC if(_hdrw!=w || _hdrh!=h || _hdrsubsamp!=subsamp) 467b8b359ae97442e77bc71d0830eaf58972206945dDRC _throw("Incorrect JPEG header"); 468b8b359ae97442e77bc71d0830eaf58972206945dDRC 46934dca052271f4a75b3c0f7b11a2c5024159628d4DRC dstSize=scaledWidth*scaledHeight*tjPixelSize[pf]; 470b8b359ae97442e77bc71d0830eaf58972206945dDRC if((dstBuf=(unsigned char *)malloc(dstSize))==NULL) 471b8b359ae97442e77bc71d0830eaf58972206945dDRC _throw("Memory allocation failure"); 472b8b359ae97442e77bc71d0830eaf58972206945dDRC memset(dstBuf, 0, dstSize); 473b8b359ae97442e77bc71d0830eaf58972206945dDRC 47434dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) 475b8b359ae97442e77bc71d0830eaf58972206945dDRC { 47634dca052271f4a75b3c0f7b11a2c5024159628d4DRC unsigned long yuvSize=tjBufSizeYUV2(scaledWidth, pad, scaledHeight, 47734dca052271f4a75b3c0f7b11a2c5024159628d4DRC subsamp); 478c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC tjhandle handle2=tjInitDecompress(); 479c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC if(!handle2) _throwtj(); 48034dca052271f4a75b3c0f7b11a2c5024159628d4DRC 48134dca052271f4a75b3c0f7b11a2c5024159628d4DRC if((yuvBuf=(unsigned char *)malloc(yuvSize))==NULL) 48234dca052271f4a75b3c0f7b11a2c5024159628d4DRC _throw("Memory allocation failure"); 48320e158dcb7b8242f905f9feb2a91460ec25fc0e8DRC memset(yuvBuf, 0, yuvSize); 48434dca052271f4a75b3c0f7b11a2c5024159628d4DRC 48534dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("JPEG -> YUV %s ", subNameLong[subsamp]); 48634dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(sf.num!=1 || sf.denom!=1) 48734dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("%d/%d ... ", sf.num, sf.denom); 48834dca052271f4a75b3c0f7b11a2c5024159628d4DRC else printf("... "); 48934dca052271f4a75b3c0f7b11a2c5024159628d4DRC _tj(tjDecompressToYUV2(handle, jpegBuf, jpegSize, yuvBuf, scaledWidth, 490f610d61fcc38b36a8a29879e5c053015164242f8DRC pad, scaledHeight, flags)); 49134dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(checkBufYUV(yuvBuf, scaledWidth, scaledHeight, subsamp, sf)) 49234dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("Passed.\n"); 49334dca052271f4a75b3c0f7b11a2c5024159628d4DRC else printf("FAILED!\n"); 49434dca052271f4a75b3c0f7b11a2c5024159628d4DRC 49534dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("YUV %s -> %s %s ... ", subNameLong[subsamp], pixFormatStr[pf], 49634dca052271f4a75b3c0f7b11a2c5024159628d4DRC (flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down "); 497c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC _tj(tjDecodeYUV(handle2, yuvBuf, pad, subsamp, dstBuf, scaledWidth, 0, 49834dca052271f4a75b3c0f7b11a2c5024159628d4DRC scaledHeight, pf, flags)); 499c90144950ffc9e58f942f1be7fc18e7820a14eb7DRC tjDestroy(handle2); 500b8b359ae97442e77bc71d0830eaf58972206945dDRC } 501b8b359ae97442e77bc71d0830eaf58972206945dDRC else 502b8b359ae97442e77bc71d0830eaf58972206945dDRC { 50334dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("JPEG -> %s %s ", pixFormatStr[pf], 50434dca052271f4a75b3c0f7b11a2c5024159628d4DRC (flags&TJFLAG_BOTTOMUP)? "Bottom-Up":"Top-Down "); 50534dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(sf.num!=1 || sf.denom!=1) 50634dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("%d/%d ... ", sf.num, sf.denom); 50734dca052271f4a75b3c0f7b11a2c5024159628d4DRC else printf("... "); 508b8b359ae97442e77bc71d0830eaf58972206945dDRC _tj(tjDecompress2(handle, jpegBuf, jpegSize, dstBuf, scaledWidth, 0, 509b8b359ae97442e77bc71d0830eaf58972206945dDRC scaledHeight, pf, flags)); 510b8b359ae97442e77bc71d0830eaf58972206945dDRC } 511b8b359ae97442e77bc71d0830eaf58972206945dDRC 51234dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(checkBuf(dstBuf, scaledWidth, scaledHeight, pf, subsamp, sf, flags)) 51334dca052271f4a75b3c0f7b11a2c5024159628d4DRC printf("Passed."); 51434dca052271f4a75b3c0f7b11a2c5024159628d4DRC else printf("FAILED!"); 5152bdadb44a77465d7eca03cfa9a6fcb16109bad51DRC printf("\n"); 516b8b359ae97442e77bc71d0830eaf58972206945dDRC 517b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 51834dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(yuvBuf) free(yuvBuf); 519b8b359ae97442e77bc71d0830eaf58972206945dDRC if(dstBuf) free(dstBuf); 520b8b359ae97442e77bc71d0830eaf58972206945dDRC} 521b8b359ae97442e77bc71d0830eaf58972206945dDRC 522b8b359ae97442e77bc71d0830eaf58972206945dDRC 523b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid decompTest(tjhandle handle, unsigned char *jpegBuf, 524b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned long jpegSize, int w, int h, int pf, char *basename, int subsamp, 525b8b359ae97442e77bc71d0830eaf58972206945dDRC int flags) 526b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 527b8b359ae97442e77bc71d0830eaf58972206945dDRC int i, n=0; 528418fe286c2fe90dcd3338f1f1d2f221c0e0e2bf3DRC tjscalingfactor *sf=tjGetScalingFactors(&n); 529b8b359ae97442e77bc71d0830eaf58972206945dDRC if(!sf || !n) _throwtj(); 530b8b359ae97442e77bc71d0830eaf58972206945dDRC 531418fe286c2fe90dcd3338f1f1d2f221c0e0e2bf3DRC for(i=0; i<n; i++) 532b8b359ae97442e77bc71d0830eaf58972206945dDRC { 533418fe286c2fe90dcd3338f1f1d2f221c0e0e2bf3DRC if(subsamp==TJSAMP_444 || subsamp==TJSAMP_GRAY || 5341f3635c4969f2319a01c9fe561958815b733227fDRC (subsamp==TJSAMP_411 && sf[i].num==1 && 5351f3635c4969f2319a01c9fe561958815b733227fDRC (sf[i].denom==2 || sf[i].denom==1)) || 5361f3635c4969f2319a01c9fe561958815b733227fDRC (subsamp!=TJSAMP_411 && sf[i].num==1 && 5371f3635c4969f2319a01c9fe561958815b733227fDRC (sf[i].denom==4 || sf[i].denom==2 || sf[i].denom==1))) 538b8b359ae97442e77bc71d0830eaf58972206945dDRC _decompTest(handle, jpegBuf, jpegSize, w, h, pf, basename, subsamp, 539b8b359ae97442e77bc71d0830eaf58972206945dDRC flags, sf[i]); 540b8b359ae97442e77bc71d0830eaf58972206945dDRC } 541b8b359ae97442e77bc71d0830eaf58972206945dDRC 542b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 543b7c41932ed1ee9859a1aeea75e6e379e46a46158DRC return; 544b8b359ae97442e77bc71d0830eaf58972206945dDRC} 545b8b359ae97442e77bc71d0830eaf58972206945dDRC 546b8b359ae97442e77bc71d0830eaf58972206945dDRC 547b8b359ae97442e77bc71d0830eaf58972206945dDRCvoid doTest(int w, int h, const int *formats, int nformats, int subsamp, 548b8b359ae97442e77bc71d0830eaf58972206945dDRC char *basename) 549b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 550b8b359ae97442e77bc71d0830eaf58972206945dDRC tjhandle chandle=NULL, dhandle=NULL; 551b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned char *dstBuf=NULL; 552b8b359ae97442e77bc71d0830eaf58972206945dDRC unsigned long size=0; int pfi, pf, i; 553b8b359ae97442e77bc71d0830eaf58972206945dDRC 55434dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(!alloc) 555910a35725cb52913c248f39e3f273a4baadbd7ddDRC size=tjBufSize(w, h, subsamp); 556910a35725cb52913c248f39e3f273a4baadbd7ddDRC if(size!=0) 557b8b359ae97442e77bc71d0830eaf58972206945dDRC if((dstBuf=(unsigned char *)tjAlloc(size))==NULL) 558b8b359ae97442e77bc71d0830eaf58972206945dDRC _throw("Memory allocation failure."); 559b8b359ae97442e77bc71d0830eaf58972206945dDRC 560b8b359ae97442e77bc71d0830eaf58972206945dDRC if((chandle=tjInitCompress())==NULL || (dhandle=tjInitDecompress())==NULL) 561b8b359ae97442e77bc71d0830eaf58972206945dDRC _throwtj(); 562b8b359ae97442e77bc71d0830eaf58972206945dDRC 563b8b359ae97442e77bc71d0830eaf58972206945dDRC for(pfi=0; pfi<nformats; pfi++) 564b8b359ae97442e77bc71d0830eaf58972206945dDRC { 565b8b359ae97442e77bc71d0830eaf58972206945dDRC for(i=0; i<2; i++) 566b8b359ae97442e77bc71d0830eaf58972206945dDRC { 567b8b359ae97442e77bc71d0830eaf58972206945dDRC int flags=0; 5681f3635c4969f2319a01c9fe561958815b733227fDRC if(subsamp==TJSAMP_422 || subsamp==TJSAMP_420 || subsamp==TJSAMP_440 || 5691f3635c4969f2319a01c9fe561958815b733227fDRC subsamp==TJSAMP_411) 570cac105133e75a52fa5d57a2abccf242bb7b820d0DRC flags|=TJFLAG_FASTUPSAMPLE; 57134dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(i==1) flags|=TJFLAG_BOTTOMUP; 572b8b359ae97442e77bc71d0830eaf58972206945dDRC pf=formats[pfi]; 573b8b359ae97442e77bc71d0830eaf58972206945dDRC compTest(chandle, &dstBuf, &size, w, h, pf, basename, subsamp, 100, 574b8b359ae97442e77bc71d0830eaf58972206945dDRC flags); 575b8b359ae97442e77bc71d0830eaf58972206945dDRC decompTest(dhandle, dstBuf, size, w, h, pf, basename, subsamp, 576b8b359ae97442e77bc71d0830eaf58972206945dDRC flags); 57767ce3b2352fe1f7511edbfed74ec6960e41e97dcDRC if(pf>=TJPF_RGBX && pf<=TJPF_XRGB) 5784798b7e8067860f504dab5a252319055a3fa47dbDRC { 5794798b7e8067860f504dab5a252319055a3fa47dbDRC printf("\n"); 58067ce3b2352fe1f7511edbfed74ec6960e41e97dcDRC decompTest(dhandle, dstBuf, size, w, h, pf+(TJPF_RGBA-TJPF_RGBX), 58167ce3b2352fe1f7511edbfed74ec6960e41e97dcDRC basename, subsamp, flags); 5824798b7e8067860f504dab5a252319055a3fa47dbDRC } 583b7c41932ed1ee9859a1aeea75e6e379e46a46158DRC printf("\n"); 584b8b359ae97442e77bc71d0830eaf58972206945dDRC } 585b8b359ae97442e77bc71d0830eaf58972206945dDRC } 586b7c41932ed1ee9859a1aeea75e6e379e46a46158DRC printf("--------------------\n\n"); 587b8b359ae97442e77bc71d0830eaf58972206945dDRC 588b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 589b8b359ae97442e77bc71d0830eaf58972206945dDRC if(chandle) tjDestroy(chandle); 590b8b359ae97442e77bc71d0830eaf58972206945dDRC if(dhandle) tjDestroy(dhandle); 591b8b359ae97442e77bc71d0830eaf58972206945dDRC 592b8b359ae97442e77bc71d0830eaf58972206945dDRC if(dstBuf) tjFree(dstBuf); 593b8b359ae97442e77bc71d0830eaf58972206945dDRC} 594b8b359ae97442e77bc71d0830eaf58972206945dDRC 595b8b359ae97442e77bc71d0830eaf58972206945dDRC 596724c56b46af1ad81212d044689960f433046508bDRCvoid bufSizeTest(void) 597b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 598724c56b46af1ad81212d044689960f433046508bDRC int w, h, i, subsamp; 59938c9970b95f8f83769b5476a9d7e6062714c19f6DRC unsigned char *srcBuf=NULL, *dstBuf=NULL; 600b8b359ae97442e77bc71d0830eaf58972206945dDRC tjhandle handle=NULL; 60138c9970b95f8f83769b5476a9d7e6062714c19f6DRC unsigned long dstSize=0; 602b8b359ae97442e77bc71d0830eaf58972206945dDRC 603b8b359ae97442e77bc71d0830eaf58972206945dDRC if((handle=tjInitCompress())==NULL) _throwtj(); 604b8b359ae97442e77bc71d0830eaf58972206945dDRC 605b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("Buffer size regression test\n"); 606724c56b46af1ad81212d044689960f433046508bDRC for(subsamp=0; subsamp<TJ_NUMSAMP; subsamp++) 607b8b359ae97442e77bc71d0830eaf58972206945dDRC { 608724c56b46af1ad81212d044689960f433046508bDRC for(w=1; w<48; w++) 609b8b359ae97442e77bc71d0830eaf58972206945dDRC { 610724c56b46af1ad81212d044689960f433046508bDRC int maxh=(w==1)? 2048:48; 611724c56b46af1ad81212d044689960f433046508bDRC for(h=1; h<maxh; h++) 612b8b359ae97442e77bc71d0830eaf58972206945dDRC { 613724c56b46af1ad81212d044689960f433046508bDRC if(h%100==0) printf("%.4d x %.4d\b\b\b\b\b\b\b\b\b\b\b", w, h); 614724c56b46af1ad81212d044689960f433046508bDRC if((srcBuf=(unsigned char *)malloc(w*h*4))==NULL) 615b8b359ae97442e77bc71d0830eaf58972206945dDRC _throw("Memory allocation failure"); 61634dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(!alloc || doyuv) 617724c56b46af1ad81212d044689960f433046508bDRC { 61834dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) dstSize=tjBufSizeYUV2(w, pad, h, subsamp); 61938c9970b95f8f83769b5476a9d7e6062714c19f6DRC else dstSize=tjBufSize(w, h, subsamp); 62038c9970b95f8f83769b5476a9d7e6062714c19f6DRC if((dstBuf=(unsigned char *)tjAlloc(dstSize))==NULL) 621724c56b46af1ad81212d044689960f433046508bDRC _throw("Memory allocation failure"); 622724c56b46af1ad81212d044689960f433046508bDRC } 623b8b359ae97442e77bc71d0830eaf58972206945dDRC 624724c56b46af1ad81212d044689960f433046508bDRC for(i=0; i<w*h*4; i++) 625724c56b46af1ad81212d044689960f433046508bDRC { 626724c56b46af1ad81212d044689960f433046508bDRC if(random()<RAND_MAX/2) srcBuf[i]=0; 627724c56b46af1ad81212d044689960f433046508bDRC else srcBuf[i]=255; 628724c56b46af1ad81212d044689960f433046508bDRC } 629b8b359ae97442e77bc71d0830eaf58972206945dDRC 63034dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) 63138c9970b95f8f83769b5476a9d7e6062714c19f6DRC { 63238c9970b95f8f83769b5476a9d7e6062714c19f6DRC _tj(tjEncodeYUV3(handle, srcBuf, w, 0, h, TJPF_BGRX, dstBuf, pad, 63338c9970b95f8f83769b5476a9d7e6062714c19f6DRC subsamp, 0)); 63438c9970b95f8f83769b5476a9d7e6062714c19f6DRC } 63538c9970b95f8f83769b5476a9d7e6062714c19f6DRC else 63638c9970b95f8f83769b5476a9d7e6062714c19f6DRC { 63738c9970b95f8f83769b5476a9d7e6062714c19f6DRC _tj(tjCompress2(handle, srcBuf, w, 0, h, TJPF_BGRX, &dstBuf, 63838c9970b95f8f83769b5476a9d7e6062714c19f6DRC &dstSize, subsamp, 100, alloc? 0:TJFLAG_NOREALLOC)); 63938c9970b95f8f83769b5476a9d7e6062714c19f6DRC } 640724c56b46af1ad81212d044689960f433046508bDRC free(srcBuf); srcBuf=NULL; 6416eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if(!alloc || doyuv) 642fe80ec22752cce224c55d7b429d46503634ef034DRC { 643fe80ec22752cce224c55d7b429d46503634ef034DRC tjFree(dstBuf); dstBuf=NULL; 644fe80ec22752cce224c55d7b429d46503634ef034DRC } 645b8b359ae97442e77bc71d0830eaf58972206945dDRC 646724c56b46af1ad81212d044689960f433046508bDRC if((srcBuf=(unsigned char *)malloc(h*w*4))==NULL) 647b8b359ae97442e77bc71d0830eaf58972206945dDRC _throw("Memory allocation failure"); 64834dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(!alloc || doyuv) 649724c56b46af1ad81212d044689960f433046508bDRC { 65034dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) dstSize=tjBufSizeYUV2(h, pad, w, subsamp); 65138c9970b95f8f83769b5476a9d7e6062714c19f6DRC else dstSize=tjBufSize(h, w, subsamp); 65238c9970b95f8f83769b5476a9d7e6062714c19f6DRC if((dstBuf=(unsigned char *)tjAlloc(dstSize))==NULL) 653724c56b46af1ad81212d044689960f433046508bDRC _throw("Memory allocation failure"); 654724c56b46af1ad81212d044689960f433046508bDRC } 655b8b359ae97442e77bc71d0830eaf58972206945dDRC 656724c56b46af1ad81212d044689960f433046508bDRC for(i=0; i<h*w*4; i++) 657724c56b46af1ad81212d044689960f433046508bDRC { 658724c56b46af1ad81212d044689960f433046508bDRC if(random()<RAND_MAX/2) srcBuf[i]=0; 659724c56b46af1ad81212d044689960f433046508bDRC else srcBuf[i]=255; 660724c56b46af1ad81212d044689960f433046508bDRC } 661724c56b46af1ad81212d044689960f433046508bDRC 66234dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) 66338c9970b95f8f83769b5476a9d7e6062714c19f6DRC { 66438c9970b95f8f83769b5476a9d7e6062714c19f6DRC _tj(tjEncodeYUV3(handle, srcBuf, h, 0, w, TJPF_BGRX, dstBuf, pad, 66538c9970b95f8f83769b5476a9d7e6062714c19f6DRC subsamp, 0)); 66638c9970b95f8f83769b5476a9d7e6062714c19f6DRC } 66738c9970b95f8f83769b5476a9d7e6062714c19f6DRC else 66838c9970b95f8f83769b5476a9d7e6062714c19f6DRC { 66938c9970b95f8f83769b5476a9d7e6062714c19f6DRC _tj(tjCompress2(handle, srcBuf, h, 0, w, TJPF_BGRX, &dstBuf, 67038c9970b95f8f83769b5476a9d7e6062714c19f6DRC &dstSize, subsamp, 100, alloc? 0:TJFLAG_NOREALLOC)); 67138c9970b95f8f83769b5476a9d7e6062714c19f6DRC } 672724c56b46af1ad81212d044689960f433046508bDRC free(srcBuf); srcBuf=NULL; 6736eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if(!alloc || doyuv) 674fe80ec22752cce224c55d7b429d46503634ef034DRC { 675fe80ec22752cce224c55d7b429d46503634ef034DRC tjFree(dstBuf); dstBuf=NULL; 676fe80ec22752cce224c55d7b429d46503634ef034DRC } 677b8b359ae97442e77bc71d0830eaf58972206945dDRC } 678b8b359ae97442e77bc71d0830eaf58972206945dDRC } 679b8b359ae97442e77bc71d0830eaf58972206945dDRC } 680b8b359ae97442e77bc71d0830eaf58972206945dDRC printf("Done. \n"); 681b8b359ae97442e77bc71d0830eaf58972206945dDRC 682b8b359ae97442e77bc71d0830eaf58972206945dDRC bailout: 683b8b359ae97442e77bc71d0830eaf58972206945dDRC if(srcBuf) free(srcBuf); 684eb66974f3a60eaf47334e44d1a4eadffc9e4a5bdDRC if(dstBuf) tjFree(dstBuf); 685b8b359ae97442e77bc71d0830eaf58972206945dDRC if(handle) tjDestroy(handle); 686b8b359ae97442e77bc71d0830eaf58972206945dDRC} 687b8b359ae97442e77bc71d0830eaf58972206945dDRC 688b8b359ae97442e77bc71d0830eaf58972206945dDRC 689b8b359ae97442e77bc71d0830eaf58972206945dDRCint main(int argc, char *argv[]) 690b8b359ae97442e77bc71d0830eaf58972206945dDRC{ 69134dca052271f4a75b3c0f7b11a2c5024159628d4DRC int i, num4bf=5; 692e835ee3340936ac15b55507d0957ffbc83e6a670DRC #ifdef _WIN32 693e835ee3340936ac15b55507d0957ffbc83e6a670DRC srand((unsigned int)time(NULL)); 694e835ee3340936ac15b55507d0957ffbc83e6a670DRC #endif 695b8b359ae97442e77bc71d0830eaf58972206945dDRC if(argc>1) 696b8b359ae97442e77bc71d0830eaf58972206945dDRC { 697b8b359ae97442e77bc71d0830eaf58972206945dDRC for(i=1; i<argc; i++) 698b8b359ae97442e77bc71d0830eaf58972206945dDRC { 699b8b359ae97442e77bc71d0830eaf58972206945dDRC if(!strcasecmp(argv[i], "-yuv")) doyuv=1; 700bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III else if(!strcasecmp(argv[i], "-noyuvpad")) pad=1; 701bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III else if(!strcasecmp(argv[i], "-alloc")) alloc=1; 702bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III else usage(argv[0]); 703b8b359ae97442e77bc71d0830eaf58972206945dDRC } 704b8b359ae97442e77bc71d0830eaf58972206945dDRC } 705b8b359ae97442e77bc71d0830eaf58972206945dDRC if(alloc) printf("Testing automatic buffer allocation\n"); 70634dca052271f4a75b3c0f7b11a2c5024159628d4DRC if(doyuv) num4bf=4; 707b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(35, 39, _3byteFormats, 2, TJSAMP_444, "test"); 708cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC doTest(39, 41, _4byteFormats, num4bf, TJSAMP_444, "test"); 709cac105133e75a52fa5d57a2abccf242bb7b820d0DRC doTest(41, 35, _3byteFormats, 2, TJSAMP_422, "test"); 710cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC doTest(35, 39, _4byteFormats, num4bf, TJSAMP_422, "test"); 711cac105133e75a52fa5d57a2abccf242bb7b820d0DRC doTest(39, 41, _3byteFormats, 2, TJSAMP_420, "test"); 712cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC doTest(41, 35, _4byteFormats, num4bf, TJSAMP_420, "test"); 713cac105133e75a52fa5d57a2abccf242bb7b820d0DRC doTest(35, 39, _3byteFormats, 2, TJSAMP_440, "test"); 714cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC doTest(39, 41, _4byteFormats, num4bf, TJSAMP_440, "test"); 7151f3635c4969f2319a01c9fe561958815b733227fDRC doTest(41, 35, _3byteFormats, 2, TJSAMP_411, "test"); 716cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC doTest(35, 39, _4byteFormats, num4bf, TJSAMP_411, "test"); 7171f3635c4969f2319a01c9fe561958815b733227fDRC doTest(39, 41, _onlyGray, 1, TJSAMP_GRAY, "test"); 7181f3635c4969f2319a01c9fe561958815b733227fDRC doTest(41, 35, _3byteFormats, 2, TJSAMP_GRAY, "test"); 7191f3635c4969f2319a01c9fe561958815b733227fDRC doTest(35, 39, _4byteFormats, 4, TJSAMP_GRAY, "test"); 72038c9970b95f8f83769b5476a9d7e6062714c19f6DRC bufSizeTest(); 721b8b359ae97442e77bc71d0830eaf58972206945dDRC if(doyuv) 722b8b359ae97442e77bc71d0830eaf58972206945dDRC { 72338c9970b95f8f83769b5476a9d7e6062714c19f6DRC printf("\n--------------------\n\n"); 724b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_444, "test_yuv0"); 725b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_422, "test_yuv0"); 726b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_420, "test_yuv0"); 727b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_440, "test_yuv0"); 7281f3635c4969f2319a01c9fe561958815b733227fDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_411, "test_yuv0"); 729b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyRGB, 1, TJSAMP_GRAY, "test_yuv0"); 730b8b359ae97442e77bc71d0830eaf58972206945dDRC doTest(48, 48, _onlyGray, 1, TJSAMP_GRAY, "test_yuv0"); 731b8b359ae97442e77bc71d0830eaf58972206945dDRC } 732b8b359ae97442e77bc71d0830eaf58972206945dDRC 733b8b359ae97442e77bc71d0830eaf58972206945dDRC return exitStatus; 734b8b359ae97442e77bc71d0830eaf58972206945dDRC} 735