1b8b359ae97442e77bc71d0830eaf58972206945dDRC/*
238c9970b95f8f83769b5476a9d7e6062714c19f6DRC * Copyright (C)2009-2014 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{
47b8b359ae97442e77bc71d0830eaf58972206945dDRC	printf("\nUSAGE: %s [options]\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");
52b8b359ae97442e77bc71d0830eaf58972206945dDRC	printf("-alloc = test automatic buffer allocation\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;
641fe80ec22752cce224c55d7b429d46503634ef034DRC				if(!alloc)
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;
673fe80ec22752cce224c55d7b429d46503634ef034DRC				if(!alloc)
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;
700f610d61fcc38b36a8a29879e5c053015164242f8DRC			if(!strcasecmp(argv[i], "-noyuvpad")) pad=1;
701b8b359ae97442e77bc71d0830eaf58972206945dDRC			if(!strcasecmp(argv[i], "-alloc")) alloc=1;
702b8b359ae97442e77bc71d0830eaf58972206945dDRC			if(!strncasecmp(argv[i], "-h", 2) || !strcasecmp(argv[i], "-?"))
703b8b359ae97442e77bc71d0830eaf58972206945dDRC				usage(argv[0]);
704b8b359ae97442e77bc71d0830eaf58972206945dDRC		}
705b8b359ae97442e77bc71d0830eaf58972206945dDRC	}
706b8b359ae97442e77bc71d0830eaf58972206945dDRC	if(alloc) printf("Testing automatic buffer allocation\n");
70734dca052271f4a75b3c0f7b11a2c5024159628d4DRC	if(doyuv) num4bf=4;
708b8b359ae97442e77bc71d0830eaf58972206945dDRC	doTest(35, 39, _3byteFormats, 2, TJSAMP_444, "test");
709cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC	doTest(39, 41, _4byteFormats, num4bf, TJSAMP_444, "test");
710cac105133e75a52fa5d57a2abccf242bb7b820d0DRC	doTest(41, 35, _3byteFormats, 2, TJSAMP_422, "test");
711cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC	doTest(35, 39, _4byteFormats, num4bf, TJSAMP_422, "test");
712cac105133e75a52fa5d57a2abccf242bb7b820d0DRC	doTest(39, 41, _3byteFormats, 2, TJSAMP_420, "test");
713cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC	doTest(41, 35, _4byteFormats, num4bf, TJSAMP_420, "test");
714cac105133e75a52fa5d57a2abccf242bb7b820d0DRC	doTest(35, 39, _3byteFormats, 2, TJSAMP_440, "test");
715cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC	doTest(39, 41, _4byteFormats, num4bf, TJSAMP_440, "test");
7161f3635c4969f2319a01c9fe561958815b733227fDRC	doTest(41, 35, _3byteFormats, 2, TJSAMP_411, "test");
717cd7c3e6672cce3779450c6dd10d0d70b0c2278b2DRC	doTest(35, 39, _4byteFormats, num4bf, TJSAMP_411, "test");
7181f3635c4969f2319a01c9fe561958815b733227fDRC	doTest(39, 41, _onlyGray, 1, TJSAMP_GRAY, "test");
7191f3635c4969f2319a01c9fe561958815b733227fDRC	doTest(41, 35, _3byteFormats, 2, TJSAMP_GRAY, "test");
7201f3635c4969f2319a01c9fe561958815b733227fDRC	doTest(35, 39, _4byteFormats, 4, TJSAMP_GRAY, "test");
72138c9970b95f8f83769b5476a9d7e6062714c19f6DRC	bufSizeTest();
722b8b359ae97442e77bc71d0830eaf58972206945dDRC	if(doyuv)
723b8b359ae97442e77bc71d0830eaf58972206945dDRC	{
72438c9970b95f8f83769b5476a9d7e6062714c19f6DRC		printf("\n--------------------\n\n");
725b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_444, "test_yuv0");
726b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_422, "test_yuv0");
727b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_420, "test_yuv0");
728b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_440, "test_yuv0");
7291f3635c4969f2319a01c9fe561958815b733227fDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_411, "test_yuv0");
730b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyRGB, 1, TJSAMP_GRAY, "test_yuv0");
731b8b359ae97442e77bc71d0830eaf58972206945dDRC		doTest(48, 48, _onlyGray, 1, TJSAMP_GRAY, "test_yuv0");
732b8b359ae97442e77bc71d0830eaf58972206945dDRC	}
733b8b359ae97442e77bc71d0830eaf58972206945dDRC
734b8b359ae97442e77bc71d0830eaf58972206945dDRC	return exitStatus;
735b8b359ae97442e77bc71d0830eaf58972206945dDRC}
736