Blame


1 28994509 2004-04-21 devnull #include <u.h>
2 28994509 2004-04-21 devnull #include <libc.h>
3 28994509 2004-04-21 devnull #include <bio.h>
4 28994509 2004-04-21 devnull #include <draw.h>
5 28994509 2004-04-21 devnull #include "imagefile.h"
6 28994509 2004-04-21 devnull
7 28994509 2004-04-21 devnull enum {
8 28994509 2004-04-21 devnull /* Constants, all preceded by byte 0xFF */
9 28994509 2004-04-21 devnull SOF =0xC0, /* Start of Frame */
10 28994509 2004-04-21 devnull SOF2=0xC2, /* Start of Frame; progressive Huffman */
11 28994509 2004-04-21 devnull JPG =0xC8, /* Reserved for JPEG extensions */
12 28994509 2004-04-21 devnull DHT =0xC4, /* Define Huffman Tables */
13 28994509 2004-04-21 devnull DAC =0xCC, /* Arithmetic coding conditioning */
14 28994509 2004-04-21 devnull RST =0xD0, /* Restart interval termination */
15 28994509 2004-04-21 devnull RST7 =0xD7, /* Restart interval termination (highest value) */
16 28994509 2004-04-21 devnull SOI =0xD8, /* Start of Image */
17 28994509 2004-04-21 devnull EOI =0xD9, /* End of Image */
18 28994509 2004-04-21 devnull SOS =0xDA, /* Start of Scan */
19 28994509 2004-04-21 devnull DQT =0xDB, /* Define quantization tables */
20 28994509 2004-04-21 devnull DNL =0xDC, /* Define number of lines */
21 28994509 2004-04-21 devnull DRI =0xDD, /* Define restart interval */
22 28994509 2004-04-21 devnull DHP =0xDE, /* Define hierarchical progression */
23 28994509 2004-04-21 devnull EXP =0xDF, /* Expand reference components */
24 28994509 2004-04-21 devnull APPn =0xE0, /* Reserved for application segments */
25 28994509 2004-04-21 devnull JPGn =0xF0, /* Reserved for JPEG extensions */
26 28994509 2004-04-21 devnull COM =0xFE, /* Comment */
27 28994509 2004-04-21 devnull
28 28994509 2004-04-21 devnull CLAMPOFF = 300,
29 28994509 2004-04-21 devnull NCLAMP = CLAMPOFF+700
30 28994509 2004-04-21 devnull };
31 28994509 2004-04-21 devnull
32 28994509 2004-04-21 devnull typedef struct Framecomp Framecomp;
33 28994509 2004-04-21 devnull typedef struct Header Header;
34 28994509 2004-04-21 devnull typedef struct Huffman Huffman;
35 28994509 2004-04-21 devnull
36 28994509 2004-04-21 devnull struct Framecomp /* Frame component specifier from SOF marker */
37 28994509 2004-04-21 devnull {
38 28994509 2004-04-21 devnull int C;
39 28994509 2004-04-21 devnull int H;
40 28994509 2004-04-21 devnull int V;
41 28994509 2004-04-21 devnull int Tq;
42 28994509 2004-04-21 devnull };
43 28994509 2004-04-21 devnull
44 28994509 2004-04-21 devnull struct Huffman
45 28994509 2004-04-21 devnull {
46 28994509 2004-04-21 devnull int *size; /* malloc'ed */
47 28994509 2004-04-21 devnull int *code; /* malloc'ed */
48 28994509 2004-04-21 devnull int *val; /* malloc'ed */
49 28994509 2004-04-21 devnull int mincode[17];
50 28994509 2004-04-21 devnull int maxcode[17];
51 28994509 2004-04-21 devnull int valptr[17];
52 28994509 2004-04-21 devnull /* fast lookup */
53 28994509 2004-04-21 devnull int value[256];
54 28994509 2004-04-21 devnull int shift[256];
55 28994509 2004-04-21 devnull };
56 28994509 2004-04-21 devnull
57 28994509 2004-04-21 devnull
58 28994509 2004-04-21 devnull struct Header
59 28994509 2004-04-21 devnull {
60 28994509 2004-04-21 devnull Biobuf *fd;
61 28994509 2004-04-21 devnull char err[256];
62 28994509 2004-04-21 devnull jmp_buf errlab;
63 28994509 2004-04-21 devnull /* variables in i/o routines */
64 28994509 2004-04-21 devnull int sr; /* shift register, right aligned */
65 28994509 2004-04-21 devnull int cnt; /* # bits in right part of sr */
66 28994509 2004-04-21 devnull uchar *buf;
67 28994509 2004-04-21 devnull int nbuf;
68 28994509 2004-04-21 devnull int peek;
69 28994509 2004-04-21 devnull
70 28994509 2004-04-21 devnull int Nf;
71 28994509 2004-04-21 devnull
72 28994509 2004-04-21 devnull Framecomp comp[3];
73 28994509 2004-04-21 devnull uchar mode;
74 28994509 2004-04-21 devnull int X;
75 28994509 2004-04-21 devnull int Y;
76 28994509 2004-04-21 devnull int qt[4][64]; /* quantization tables */
77 28994509 2004-04-21 devnull Huffman dcht[4];
78 28994509 2004-04-21 devnull Huffman acht[4];
79 28994509 2004-04-21 devnull int **data[3];
80 28994509 2004-04-21 devnull int ndata[3];
81 fa325e9b 2020-01-10 cross
82 28994509 2004-04-21 devnull uchar *sf; /* start of frame; do better later */
83 28994509 2004-04-21 devnull uchar *ss; /* start of scan; do better later */
84 28994509 2004-04-21 devnull int ri; /* restart interval */
85 28994509 2004-04-21 devnull
86 28994509 2004-04-21 devnull /* progressive scan */
87 28994509 2004-04-21 devnull Rawimage *image;
88 28994509 2004-04-21 devnull Rawimage **array;
89 28994509 2004-04-21 devnull int *dccoeff[3];
90 28994509 2004-04-21 devnull int **accoeff[3]; /* only need 8 bits plus quantization */
91 28994509 2004-04-21 devnull int naccoeff[3];
92 28994509 2004-04-21 devnull int nblock[3];
93 28994509 2004-04-21 devnull int nacross;
94 28994509 2004-04-21 devnull int ndown;
95 28994509 2004-04-21 devnull int Hmax;
96 28994509 2004-04-21 devnull int Vmax;
97 28994509 2004-04-21 devnull };
98 28994509 2004-04-21 devnull
99 28994509 2004-04-21 devnull static uchar clamp[NCLAMP];
100 28994509 2004-04-21 devnull
101 28994509 2004-04-21 devnull static Rawimage *readslave(Header*, int);
102 28994509 2004-04-21 devnull static int readsegment(Header*, int*);
103 28994509 2004-04-21 devnull static void quanttables(Header*, uchar*, int);
104 28994509 2004-04-21 devnull static void huffmantables(Header*, uchar*, int);
105 28994509 2004-04-21 devnull static void soiheader(Header*);
106 28994509 2004-04-21 devnull static int nextbyte(Header*, int);
107 28994509 2004-04-21 devnull static int int2(uchar*, int);
108 28994509 2004-04-21 devnull static void nibbles(int, int*, int*);
109 28994509 2004-04-21 devnull static int receive(Header*, int);
110 28994509 2004-04-21 devnull static int receiveEOB(Header*, int);
111 28994509 2004-04-21 devnull static int receivebit(Header*);
112 28994509 2004-04-21 devnull static void restart(Header*, int);
113 28994509 2004-04-21 devnull static int decode(Header*, Huffman*);
114 28994509 2004-04-21 devnull static Rawimage* baselinescan(Header*, int);
115 28994509 2004-04-21 devnull static void progressivescan(Header*, int);
116 28994509 2004-04-21 devnull static Rawimage* progressiveIDCT(Header*, int);
117 28994509 2004-04-21 devnull static void idct(int*);
118 28994509 2004-04-21 devnull static void colormap1(Header*, int, Rawimage*, int*, int, int);
119 28994509 2004-04-21 devnull static void colormapall1(Header*, int, Rawimage*, int*, int*, int*, int, int);
120 28994509 2004-04-21 devnull static void colormap(Header*, int, Rawimage*, int**, int**, int**, int, int, int, int, int*, int*);
121 28994509 2004-04-21 devnull static void jpgerror(Header*, char*, ...);
122 28994509 2004-04-21 devnull
123 28994509 2004-04-21 devnull static char readerr[] = "ReadJPG: read error: %r";
124 28994509 2004-04-21 devnull static char memerr[] = "ReadJPG: malloc failed: %r";
125 28994509 2004-04-21 devnull
126 28994509 2004-04-21 devnull static int zig[64] = {
127 28994509 2004-04-21 devnull 0, 1, 8, 16, 9, 2, 3, 10, 17, /* 0-7 */
128 28994509 2004-04-21 devnull 24, 32, 25, 18, 11, 4, 5, /* 8-15 */
129 28994509 2004-04-21 devnull 12, 19, 26, 33, 40, 48, 41, 34, /* 16-23 */
130 28994509 2004-04-21 devnull 27, 20, 13, 6, 7, 14, 21, 28, /* 24-31 */
131 28994509 2004-04-21 devnull 35, 42, 49, 56, 57, 50, 43, 36, /* 32-39 */
132 28994509 2004-04-21 devnull 29, 22, 15, 23, 30, 37, 44, 51, /* 40-47 */
133 28994509 2004-04-21 devnull 58, 59, 52, 45, 38, 31, 39, 46, /* 48-55 */
134 28994509 2004-04-21 devnull 53, 60, 61, 54, 47, 55, 62, 63 /* 56-63 */
135 28994509 2004-04-21 devnull };
136 28994509 2004-04-21 devnull
137 28994509 2004-04-21 devnull static
138 28994509 2004-04-21 devnull void
139 28994509 2004-04-21 devnull jpginit(void)
140 28994509 2004-04-21 devnull {
141 28994509 2004-04-21 devnull int k;
142 28994509 2004-04-21 devnull static int inited;
143 28994509 2004-04-21 devnull
144 28994509 2004-04-21 devnull if(inited)
145 28994509 2004-04-21 devnull return;
146 28994509 2004-04-21 devnull inited = 1;
147 28994509 2004-04-21 devnull for(k=0; k<CLAMPOFF; k++)
148 28994509 2004-04-21 devnull clamp[k] = 0;
149 28994509 2004-04-21 devnull for(; k<CLAMPOFF+256; k++)
150 28994509 2004-04-21 devnull clamp[k] = k-CLAMPOFF;
151 28994509 2004-04-21 devnull for(; k<NCLAMP; k++)
152 28994509 2004-04-21 devnull clamp[k] = 255;
153 28994509 2004-04-21 devnull }
154 28994509 2004-04-21 devnull
155 28994509 2004-04-21 devnull static
156 28994509 2004-04-21 devnull void*
157 28994509 2004-04-21 devnull jpgmalloc(Header *h, int n, int clear)
158 28994509 2004-04-21 devnull {
159 28994509 2004-04-21 devnull void *p;
160 28994509 2004-04-21 devnull
161 28994509 2004-04-21 devnull p = malloc(n);
162 28994509 2004-04-21 devnull if(p == nil)
163 28994509 2004-04-21 devnull jpgerror(h, memerr);
164 28994509 2004-04-21 devnull if(clear)
165 28994509 2004-04-21 devnull memset(p, 0, n);
166 28994509 2004-04-21 devnull return p;
167 28994509 2004-04-21 devnull }
168 28994509 2004-04-21 devnull
169 28994509 2004-04-21 devnull static
170 28994509 2004-04-21 devnull void
171 28994509 2004-04-21 devnull clear(void *pp)
172 28994509 2004-04-21 devnull {
173 28994509 2004-04-21 devnull void **p = (void**)pp;
174 28994509 2004-04-21 devnull
175 28994509 2004-04-21 devnull if(*p){
176 28994509 2004-04-21 devnull free(*p);
177 28994509 2004-04-21 devnull *p = nil;
178 28994509 2004-04-21 devnull }
179 28994509 2004-04-21 devnull }
180 28994509 2004-04-21 devnull
181 28994509 2004-04-21 devnull static
182 28994509 2004-04-21 devnull void
183 28994509 2004-04-21 devnull jpgfreeall(Header *h, int freeimage)
184 28994509 2004-04-21 devnull {
185 28994509 2004-04-21 devnull int i, j;
186 28994509 2004-04-21 devnull
187 28994509 2004-04-21 devnull clear(&h->buf);
188 28994509 2004-04-21 devnull if(h->dccoeff[0])
189 28994509 2004-04-21 devnull for(i=0; i<3; i++)
190 28994509 2004-04-21 devnull clear(&h->dccoeff[i]);
191 28994509 2004-04-21 devnull if(h->accoeff[0])
192 28994509 2004-04-21 devnull for(i=0; i<3; i++){
193 28994509 2004-04-21 devnull if(h->accoeff[i])
194 28994509 2004-04-21 devnull for(j=0; j<h->naccoeff[i]; j++)
195 28994509 2004-04-21 devnull clear(&h->accoeff[i][j]);
196 28994509 2004-04-21 devnull clear(&h->accoeff[i]);
197 28994509 2004-04-21 devnull }
198 28994509 2004-04-21 devnull for(i=0; i<4; i++){
199 28994509 2004-04-21 devnull clear(&h->dcht[i].size);
200 28994509 2004-04-21 devnull clear(&h->acht[i].size);
201 28994509 2004-04-21 devnull clear(&h->dcht[i].code);
202 28994509 2004-04-21 devnull clear(&h->acht[i].code);
203 28994509 2004-04-21 devnull clear(&h->dcht[i].val);
204 28994509 2004-04-21 devnull clear(&h->acht[i].val);
205 28994509 2004-04-21 devnull }
206 28994509 2004-04-21 devnull if(h->data[0])
207 28994509 2004-04-21 devnull for(i=0; i<3; i++){
208 28994509 2004-04-21 devnull if(h->data[i])
209 28994509 2004-04-21 devnull for(j=0; j<h->ndata[i]; j++)
210 28994509 2004-04-21 devnull clear(&h->data[i][j]);
211 28994509 2004-04-21 devnull clear(&h->data[i]);
212 28994509 2004-04-21 devnull }
213 28994509 2004-04-21 devnull if(freeimage && h->image!=nil){
214 28994509 2004-04-21 devnull clear(&h->array);
215 28994509 2004-04-21 devnull clear(&h->image->cmap);
216 28994509 2004-04-21 devnull for(i=0; i<3; i++)
217 28994509 2004-04-21 devnull clear(&h->image->chans[i]);
218 28994509 2004-04-21 devnull clear(&h->image);
219 28994509 2004-04-21 devnull }
220 28994509 2004-04-21 devnull }
221 28994509 2004-04-21 devnull
222 28994509 2004-04-21 devnull static
223 28994509 2004-04-21 devnull void
224 28994509 2004-04-21 devnull jpgerror(Header *h, char *fmt, ...)
225 28994509 2004-04-21 devnull {
226 28994509 2004-04-21 devnull va_list arg;
227 28994509 2004-04-21 devnull
228 28994509 2004-04-21 devnull va_start(arg, fmt);
229 28994509 2004-04-21 devnull vseprint(h->err, h->err+sizeof h->err, fmt, arg);
230 28994509 2004-04-21 devnull va_end(arg);
231 28994509 2004-04-21 devnull
232 28994509 2004-04-21 devnull werrstr(h->err);
233 28994509 2004-04-21 devnull jpgfreeall(h, 1);
234 28994509 2004-04-21 devnull longjmp(h->errlab, 1);
235 28994509 2004-04-21 devnull }
236 28994509 2004-04-21 devnull
237 28994509 2004-04-21 devnull Rawimage**
238 28994509 2004-04-21 devnull Breadjpg(Biobuf *b, int colorspace)
239 28994509 2004-04-21 devnull {
240 28994509 2004-04-21 devnull Rawimage *r, **array;
241 28994509 2004-04-21 devnull Header *h;
242 28994509 2004-04-21 devnull char buf[ERRMAX];
243 28994509 2004-04-21 devnull
244 28994509 2004-04-21 devnull buf[0] = '\0';
245 28994509 2004-04-21 devnull if(colorspace!=CYCbCr && colorspace!=CRGB){
246 28994509 2004-04-21 devnull errstr(buf, sizeof buf); /* throw it away */
247 28994509 2004-04-21 devnull werrstr("ReadJPG: unknown color space");
248 28994509 2004-04-21 devnull return nil;
249 28994509 2004-04-21 devnull }
250 28994509 2004-04-21 devnull jpginit();
251 28994509 2004-04-21 devnull h = malloc(sizeof(Header));
252 28994509 2004-04-21 devnull array = malloc(sizeof(Header));
253 28994509 2004-04-21 devnull if(h==nil || array==nil){
254 28994509 2004-04-21 devnull free(h);
255 28994509 2004-04-21 devnull free(array);
256 28994509 2004-04-21 devnull return nil;
257 28994509 2004-04-21 devnull }
258 28994509 2004-04-21 devnull h->array = array;
259 28994509 2004-04-21 devnull memset(h, 0, sizeof(Header));
260 28994509 2004-04-21 devnull h->fd = b;
261 28994509 2004-04-21 devnull errstr(buf, sizeof buf); /* throw it away */
262 28994509 2004-04-21 devnull if(setjmp(h->errlab))
263 28994509 2004-04-21 devnull r = nil;
264 28994509 2004-04-21 devnull else
265 28994509 2004-04-21 devnull r = readslave(h, colorspace);
266 28994509 2004-04-21 devnull jpgfreeall(h, 0);
267 28994509 2004-04-21 devnull free(h);
268 28994509 2004-04-21 devnull array[0] = r;
269 28994509 2004-04-21 devnull array[1] = nil;
270 28994509 2004-04-21 devnull return array;
271 28994509 2004-04-21 devnull }
272 28994509 2004-04-21 devnull
273 28994509 2004-04-21 devnull Rawimage**
274 28994509 2004-04-21 devnull readjpg(int fd, int colorspace)
275 28994509 2004-04-21 devnull {
276 28994509 2004-04-21 devnull Rawimage** a;
277 28994509 2004-04-21 devnull Biobuf b;
278 28994509 2004-04-21 devnull
279 28994509 2004-04-21 devnull if(Binit(&b, fd, OREAD) < 0)
280 28994509 2004-04-21 devnull return nil;
281 28994509 2004-04-21 devnull a = Breadjpg(&b, colorspace);
282 28994509 2004-04-21 devnull Bterm(&b);
283 28994509 2004-04-21 devnull return a;
284 28994509 2004-04-21 devnull }
285 28994509 2004-04-21 devnull
286 28994509 2004-04-21 devnull static
287 28994509 2004-04-21 devnull Rawimage*
288 28994509 2004-04-21 devnull readslave(Header *header, int colorspace)
289 28994509 2004-04-21 devnull {
290 28994509 2004-04-21 devnull Rawimage *image;
291 28994509 2004-04-21 devnull int nseg, i, H, V, m, n;
292 28994509 2004-04-21 devnull uchar *b;
293 28994509 2004-04-21 devnull
294 28994509 2004-04-21 devnull soiheader(header);
295 28994509 2004-04-21 devnull nseg = 0;
296 28994509 2004-04-21 devnull image = nil;
297 28994509 2004-04-21 devnull
298 28994509 2004-04-21 devnull header->buf = jpgmalloc(header, 4096, 0);
299 28994509 2004-04-21 devnull header->nbuf = 4096;
300 28994509 2004-04-21 devnull while(header->err[0] == '\0'){
301 28994509 2004-04-21 devnull nseg++;
302 28994509 2004-04-21 devnull n = readsegment(header, &m);
303 28994509 2004-04-21 devnull b = header->buf;
304 28994509 2004-04-21 devnull switch(m){
305 28994509 2004-04-21 devnull case -1:
306 28994509 2004-04-21 devnull return image;
307 28994509 2004-04-21 devnull
308 28994509 2004-04-21 devnull case APPn+0:
309 28994509 2004-04-21 devnull if(nseg==1 && strncmp((char*)b, "JFIF", 4)==0) /* JFIF header; check version */
310 28994509 2004-04-21 devnull if(b[5]>1 || b[6]>2)
311 28994509 2004-04-21 devnull sprint(header->err, "ReadJPG: can't handle JFIF version %d.%2d", b[5], b[6]);
312 28994509 2004-04-21 devnull break;
313 28994509 2004-04-21 devnull
314 28994509 2004-04-21 devnull case APPn+1: case APPn+2: case APPn+3: case APPn+4: case APPn+5:
315 28994509 2004-04-21 devnull case APPn+6: case APPn+7: case APPn+8: case APPn+9: case APPn+10:
316 28994509 2004-04-21 devnull case APPn+11: case APPn+12: case APPn+13: case APPn+14: case APPn+15:
317 28994509 2004-04-21 devnull break;
318 28994509 2004-04-21 devnull
319 28994509 2004-04-21 devnull case DQT:
320 28994509 2004-04-21 devnull quanttables(header, b, n);
321 28994509 2004-04-21 devnull break;
322 28994509 2004-04-21 devnull
323 28994509 2004-04-21 devnull case SOF:
324 28994509 2004-04-21 devnull case SOF2:
325 28994509 2004-04-21 devnull header->Y = int2(b, 1);
326 28994509 2004-04-21 devnull header->X = int2(b, 3);
327 28994509 2004-04-21 devnull header->Nf =b[5];
328 28994509 2004-04-21 devnull for(i=0; i<header->Nf; i++){
329 28994509 2004-04-21 devnull header->comp[i].C = b[6+3*i+0];
330 28994509 2004-04-21 devnull nibbles(b[6+3*i+1], &H, &V);
331 28994509 2004-04-21 devnull if(H<=0 || V<=0)
332 28994509 2004-04-21 devnull jpgerror(header, "non-positive sampling factor (Hsamp or Vsamp)");
333 28994509 2004-04-21 devnull header->comp[i].H = H;
334 28994509 2004-04-21 devnull header->comp[i].V = V;
335 28994509 2004-04-21 devnull header->comp[i].Tq = b[6+3*i+2];
336 28994509 2004-04-21 devnull }
337 28994509 2004-04-21 devnull header->mode = m;
338 28994509 2004-04-21 devnull header->sf = b;
339 28994509 2004-04-21 devnull break;
340 28994509 2004-04-21 devnull
341 28994509 2004-04-21 devnull case SOS:
342 28994509 2004-04-21 devnull header->ss = b;
343 28994509 2004-04-21 devnull switch(header->mode){
344 28994509 2004-04-21 devnull case SOF:
345 28994509 2004-04-21 devnull image = baselinescan(header, colorspace);
346 28994509 2004-04-21 devnull break;
347 28994509 2004-04-21 devnull case SOF2:
348 28994509 2004-04-21 devnull progressivescan(header, colorspace);
349 28994509 2004-04-21 devnull break;
350 28994509 2004-04-21 devnull default:
351 28994509 2004-04-21 devnull sprint(header->err, "unrecognized or unspecified encoding %d", header->mode);
352 28994509 2004-04-21 devnull break;
353 28994509 2004-04-21 devnull }
354 28994509 2004-04-21 devnull break;
355 28994509 2004-04-21 devnull
356 28994509 2004-04-21 devnull case DHT:
357 28994509 2004-04-21 devnull huffmantables(header, b, n);
358 28994509 2004-04-21 devnull break;
359 28994509 2004-04-21 devnull
360 28994509 2004-04-21 devnull case DRI:
361 28994509 2004-04-21 devnull header->ri = int2(b, 0);
362 28994509 2004-04-21 devnull break;
363 28994509 2004-04-21 devnull
364 28994509 2004-04-21 devnull case COM:
365 28994509 2004-04-21 devnull break;
366 28994509 2004-04-21 devnull
367 28994509 2004-04-21 devnull case EOI:
368 28994509 2004-04-21 devnull if(header->mode == SOF2)
369 28994509 2004-04-21 devnull image = progressiveIDCT(header, colorspace);
370 28994509 2004-04-21 devnull return image;
371 28994509 2004-04-21 devnull
372 28994509 2004-04-21 devnull default:
373 28994509 2004-04-21 devnull sprint(header->err, "ReadJPG: unknown marker %.2x", m);
374 28994509 2004-04-21 devnull break;
375 28994509 2004-04-21 devnull }
376 28994509 2004-04-21 devnull }
377 28994509 2004-04-21 devnull return image;
378 28994509 2004-04-21 devnull }
379 28994509 2004-04-21 devnull
380 28994509 2004-04-21 devnull /* readsegment is called after reading scan, which can have */
381 28994509 2004-04-21 devnull /* read ahead a byte. so we must check peek here */
382 28994509 2004-04-21 devnull static
383 28994509 2004-04-21 devnull int
384 28994509 2004-04-21 devnull readbyte(Header *h)
385 28994509 2004-04-21 devnull {
386 28994509 2004-04-21 devnull uchar x;
387 28994509 2004-04-21 devnull
388 28994509 2004-04-21 devnull if(h->peek >= 0){
389 28994509 2004-04-21 devnull x = h->peek;
390 28994509 2004-04-21 devnull h->peek = -1;
391 28994509 2004-04-21 devnull }else if(Bread(h->fd, &x, 1) != 1)
392 28994509 2004-04-21 devnull jpgerror(h, readerr);
393 28994509 2004-04-21 devnull return x;
394 28994509 2004-04-21 devnull }
395 28994509 2004-04-21 devnull
396 28994509 2004-04-21 devnull static
397 28994509 2004-04-21 devnull int
398 28994509 2004-04-21 devnull marker(Header *h)
399 28994509 2004-04-21 devnull {
400 28994509 2004-04-21 devnull int c;
401 28994509 2004-04-21 devnull
402 28994509 2004-04-21 devnull while((c=readbyte(h)) == 0)
403 28994509 2004-04-21 devnull fprint(2, "ReadJPG: skipping zero byte at offset %lld\n", Boffset(h->fd));
404 28994509 2004-04-21 devnull if(c != 0xFF)
405 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: expecting marker; found 0x%x at offset %lld\n", c, Boffset(h->fd));
406 28994509 2004-04-21 devnull while(c == 0xFF)
407 28994509 2004-04-21 devnull c = readbyte(h);
408 28994509 2004-04-21 devnull return c;
409 28994509 2004-04-21 devnull }
410 28994509 2004-04-21 devnull
411 28994509 2004-04-21 devnull static
412 28994509 2004-04-21 devnull int
413 28994509 2004-04-21 devnull int2(uchar *buf, int n)
414 28994509 2004-04-21 devnull {
415 28994509 2004-04-21 devnull return (buf[n]<<8) + buf[n+1];
416 28994509 2004-04-21 devnull }
417 28994509 2004-04-21 devnull
418 28994509 2004-04-21 devnull static
419 28994509 2004-04-21 devnull void
420 28994509 2004-04-21 devnull nibbles(int b, int *p0, int *p1)
421 28994509 2004-04-21 devnull {
422 28994509 2004-04-21 devnull *p0 = (b>>4) & 0xF;
423 28994509 2004-04-21 devnull *p1 = b & 0xF;
424 28994509 2004-04-21 devnull }
425 28994509 2004-04-21 devnull
426 28994509 2004-04-21 devnull static
427 28994509 2004-04-21 devnull void
428 28994509 2004-04-21 devnull soiheader(Header *h)
429 28994509 2004-04-21 devnull {
430 28994509 2004-04-21 devnull h->peek = -1;
431 28994509 2004-04-21 devnull if(marker(h) != SOI)
432 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: unrecognized marker in header");
433 28994509 2004-04-21 devnull h->err[0] = '\0';
434 28994509 2004-04-21 devnull h->mode = 0;
435 28994509 2004-04-21 devnull h->ri = 0;
436 28994509 2004-04-21 devnull }
437 28994509 2004-04-21 devnull
438 28994509 2004-04-21 devnull static
439 28994509 2004-04-21 devnull int
440 28994509 2004-04-21 devnull readsegment(Header *h, int *markerp)
441 28994509 2004-04-21 devnull {
442 28994509 2004-04-21 devnull int m, n;
443 28994509 2004-04-21 devnull uchar tmp[2];
444 28994509 2004-04-21 devnull
445 28994509 2004-04-21 devnull m = marker(h);
446 28994509 2004-04-21 devnull switch(m){
447 28994509 2004-04-21 devnull case EOI:
448 28994509 2004-04-21 devnull *markerp = m;
449 28994509 2004-04-21 devnull return 0;
450 28994509 2004-04-21 devnull case 0:
451 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: expecting marker; saw %.2x at offset %lld", m, Boffset(h->fd));
452 28994509 2004-04-21 devnull }
453 28994509 2004-04-21 devnull if(Bread(h->fd, tmp, 2) != 2)
454 28994509 2004-04-21 devnull Readerr:
455 28994509 2004-04-21 devnull jpgerror(h, readerr);
456 28994509 2004-04-21 devnull n = int2(tmp, 0);
457 28994509 2004-04-21 devnull if(n < 2)
458 28994509 2004-04-21 devnull goto Readerr;
459 28994509 2004-04-21 devnull n -= 2;
460 28994509 2004-04-21 devnull if(n > h->nbuf){
461 28994509 2004-04-21 devnull free(h->buf);
462 28994509 2004-04-21 devnull h->buf = jpgmalloc(h, n+1, 0); /* +1 for sentinel */
463 28994509 2004-04-21 devnull h->nbuf = n;
464 28994509 2004-04-21 devnull }
465 28994509 2004-04-21 devnull if(Bread(h->fd, h->buf, n) != n)
466 28994509 2004-04-21 devnull goto Readerr;
467 28994509 2004-04-21 devnull *markerp = m;
468 28994509 2004-04-21 devnull return n;
469 28994509 2004-04-21 devnull }
470 28994509 2004-04-21 devnull
471 28994509 2004-04-21 devnull static
472 28994509 2004-04-21 devnull int
473 28994509 2004-04-21 devnull huffmantable(Header *h, uchar *b)
474 28994509 2004-04-21 devnull {
475 28994509 2004-04-21 devnull Huffman *t;
476 28994509 2004-04-21 devnull int Tc, th, n, nsize, i, j, k, v, cnt, code, si, sr, m;
477 28994509 2004-04-21 devnull int *maxcode;
478 28994509 2004-04-21 devnull
479 28994509 2004-04-21 devnull nibbles(b[0], &Tc, &th);
480 28994509 2004-04-21 devnull if(Tc > 1)
481 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: unknown Huffman table class %d", Tc);
482 28994509 2004-04-21 devnull if(th>3 || (h->mode==SOF && th>1))
483 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: unknown Huffman table index %d", th);
484 28994509 2004-04-21 devnull if(Tc == 0)
485 28994509 2004-04-21 devnull t = &h->dcht[th];
486 28994509 2004-04-21 devnull else
487 28994509 2004-04-21 devnull t = &h->acht[th];
488 28994509 2004-04-21 devnull
489 28994509 2004-04-21 devnull /* flow chart C-2 */
490 28994509 2004-04-21 devnull nsize = 0;
491 28994509 2004-04-21 devnull for(i=0; i<16; i++)
492 28994509 2004-04-21 devnull nsize += b[1+i];
493 28994509 2004-04-21 devnull t->size = jpgmalloc(h, (nsize+1)*sizeof(int), 1);
494 28994509 2004-04-21 devnull k = 0;
495 28994509 2004-04-21 devnull for(i=1; i<=16; i++){
496 28994509 2004-04-21 devnull n = b[i];
497 28994509 2004-04-21 devnull for(j=0; j<n; j++)
498 28994509 2004-04-21 devnull t->size[k++] = i;
499 28994509 2004-04-21 devnull }
500 28994509 2004-04-21 devnull t->size[k] = 0;
501 28994509 2004-04-21 devnull
502 28994509 2004-04-21 devnull /* initialize HUFFVAL */
503 28994509 2004-04-21 devnull t->val = jpgmalloc(h, nsize*sizeof(int), 1);
504 28994509 2004-04-21 devnull for(i=0; i<nsize; i++)
505 28994509 2004-04-21 devnull t->val[i] = b[17+i];
506 28994509 2004-04-21 devnull
507 28994509 2004-04-21 devnull /* flow chart C-3 */
508 28994509 2004-04-21 devnull t->code = jpgmalloc(h, (nsize+1)*sizeof(int), 1);
509 28994509 2004-04-21 devnull k = 0;
510 28994509 2004-04-21 devnull code = 0;
511 28994509 2004-04-21 devnull si = t->size[0];
512 28994509 2004-04-21 devnull for(;;){
513 28994509 2004-04-21 devnull do
514 28994509 2004-04-21 devnull t->code[k++] = code++;
515 28994509 2004-04-21 devnull while(t->size[k] == si);
516 28994509 2004-04-21 devnull if(t->size[k] == 0)
517 28994509 2004-04-21 devnull break;
518 28994509 2004-04-21 devnull do{
519 28994509 2004-04-21 devnull code <<= 1;
520 28994509 2004-04-21 devnull si++;
521 28994509 2004-04-21 devnull }while(t->size[k] != si);
522 28994509 2004-04-21 devnull }
523 28994509 2004-04-21 devnull
524 28994509 2004-04-21 devnull /* flow chart F-25 */
525 28994509 2004-04-21 devnull i = 0;
526 28994509 2004-04-21 devnull j = 0;
527 28994509 2004-04-21 devnull for(;;){
528 28994509 2004-04-21 devnull for(;;){
529 28994509 2004-04-21 devnull i++;
530 28994509 2004-04-21 devnull if(i > 16)
531 28994509 2004-04-21 devnull goto outF25;
532 28994509 2004-04-21 devnull if(b[i] != 0)
533 28994509 2004-04-21 devnull break;
534 28994509 2004-04-21 devnull t->maxcode[i] = -1;
535 28994509 2004-04-21 devnull }
536 28994509 2004-04-21 devnull t->valptr[i] = j;
537 28994509 2004-04-21 devnull t->mincode[i] = t->code[j];
538 28994509 2004-04-21 devnull j += b[i]-1;
539 28994509 2004-04-21 devnull t->maxcode[i] = t->code[j];
540 28994509 2004-04-21 devnull j++;
541 28994509 2004-04-21 devnull }
542 28994509 2004-04-21 devnull outF25:
543 28994509 2004-04-21 devnull
544 28994509 2004-04-21 devnull /* create byte-indexed fast path tables */
545 28994509 2004-04-21 devnull maxcode = t->maxcode;
546 28994509 2004-04-21 devnull /* stupid startup algorithm: just run machine for each byte value */
547 28994509 2004-04-21 devnull for(v=0; v<256; ){
548 28994509 2004-04-21 devnull cnt = 7;
549 28994509 2004-04-21 devnull m = 1<<7;
550 28994509 2004-04-21 devnull code = 0;
551 28994509 2004-04-21 devnull sr = v;
552 28994509 2004-04-21 devnull i = 1;
553 28994509 2004-04-21 devnull for(;;i++){
554 28994509 2004-04-21 devnull if(sr & m)
555 28994509 2004-04-21 devnull code |= 1;
556 28994509 2004-04-21 devnull if(code <= maxcode[i])
557 28994509 2004-04-21 devnull break;
558 28994509 2004-04-21 devnull code <<= 1;
559 28994509 2004-04-21 devnull m >>= 1;
560 28994509 2004-04-21 devnull if(m == 0){
561 28994509 2004-04-21 devnull t->shift[v] = 0;
562 28994509 2004-04-21 devnull t->value[v] = -1;
563 28994509 2004-04-21 devnull goto continueBytes;
564 28994509 2004-04-21 devnull }
565 28994509 2004-04-21 devnull cnt--;
566 28994509 2004-04-21 devnull }
567 28994509 2004-04-21 devnull t->shift[v] = 8-cnt;
568 28994509 2004-04-21 devnull t->value[v] = t->val[t->valptr[i]+(code-t->mincode[i])];
569 28994509 2004-04-21 devnull
570 28994509 2004-04-21 devnull continueBytes:
571 28994509 2004-04-21 devnull v++;
572 28994509 2004-04-21 devnull }
573 28994509 2004-04-21 devnull
574 28994509 2004-04-21 devnull return nsize;
575 28994509 2004-04-21 devnull }
576 28994509 2004-04-21 devnull
577 28994509 2004-04-21 devnull static
578 28994509 2004-04-21 devnull void
579 28994509 2004-04-21 devnull huffmantables(Header *h, uchar *b, int n)
580 28994509 2004-04-21 devnull {
581 28994509 2004-04-21 devnull int l, mt;
582 28994509 2004-04-21 devnull
583 28994509 2004-04-21 devnull for(l=0; l<n; l+=17+mt)
584 28994509 2004-04-21 devnull mt = huffmantable(h, &b[l]);
585 28994509 2004-04-21 devnull }
586 28994509 2004-04-21 devnull
587 28994509 2004-04-21 devnull static
588 28994509 2004-04-21 devnull int
589 28994509 2004-04-21 devnull quanttable(Header *h, uchar *b)
590 28994509 2004-04-21 devnull {
591 28994509 2004-04-21 devnull int i, pq, tq, *q;
592 28994509 2004-04-21 devnull
593 28994509 2004-04-21 devnull nibbles(b[0], &pq, &tq);
594 28994509 2004-04-21 devnull if(pq > 1)
595 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: unknown quantization table class %d", pq);
596 28994509 2004-04-21 devnull if(tq > 3)
597 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: unknown quantization table index %d", tq);
598 28994509 2004-04-21 devnull q = h->qt[tq];
599 28994509 2004-04-21 devnull for(i=0; i<64; i++){
600 28994509 2004-04-21 devnull if(pq == 0)
601 28994509 2004-04-21 devnull q[i] = b[1+i];
602 28994509 2004-04-21 devnull else
603 28994509 2004-04-21 devnull q[i] = int2(b, 1+2*i);
604 28994509 2004-04-21 devnull }
605 28994509 2004-04-21 devnull return 64*(1+pq);
606 28994509 2004-04-21 devnull }
607 28994509 2004-04-21 devnull
608 28994509 2004-04-21 devnull static
609 28994509 2004-04-21 devnull void
610 28994509 2004-04-21 devnull quanttables(Header *h, uchar *b, int n)
611 28994509 2004-04-21 devnull {
612 28994509 2004-04-21 devnull int l, m;
613 28994509 2004-04-21 devnull
614 28994509 2004-04-21 devnull for(l=0; l<n; l+=1+m)
615 28994509 2004-04-21 devnull m = quanttable(h, &b[l]);
616 28994509 2004-04-21 devnull }
617 28994509 2004-04-21 devnull
618 28994509 2004-04-21 devnull static
619 28994509 2004-04-21 devnull Rawimage*
620 28994509 2004-04-21 devnull baselinescan(Header *h, int colorspace)
621 28994509 2004-04-21 devnull {
622 28994509 2004-04-21 devnull int Ns, z, k, m, Hmax, Vmax, comp;
623 28994509 2004-04-21 devnull int allHV1, nblock, ri, mcu, nacross, nmcu;
624 28994509 2004-04-21 devnull Huffman *dcht, *acht;
625 28994509 2004-04-21 devnull int block, t, diff, *qt;
626 28994509 2004-04-21 devnull uchar *ss;
627 28994509 2004-04-21 devnull Rawimage *image;
628 28994509 2004-04-21 devnull int Td[3], Ta[3], H[3], V[3], DC[3];
629 28994509 2004-04-21 devnull int ***data, *zz;
630 28994509 2004-04-21 devnull
631 28994509 2004-04-21 devnull ss = h->ss;
632 28994509 2004-04-21 devnull Ns = ss[0];
633 28994509 2004-04-21 devnull if((Ns!=3 && Ns!=1) || Ns!=h->Nf)
634 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: can't handle scan not 3 components");
635 28994509 2004-04-21 devnull
636 28994509 2004-04-21 devnull image = jpgmalloc(h, sizeof(Rawimage), 1);
637 28994509 2004-04-21 devnull h->image = image;
638 28994509 2004-04-21 devnull image->r = Rect(0, 0, h->X, h->Y);
639 28994509 2004-04-21 devnull image->cmap = nil;
640 28994509 2004-04-21 devnull image->cmaplen = 0;
641 28994509 2004-04-21 devnull image->chanlen = h->X*h->Y;
642 28994509 2004-04-21 devnull image->fields = 0;
643 28994509 2004-04-21 devnull image->gifflags = 0;
644 28994509 2004-04-21 devnull image->gifdelay = 0;
645 28994509 2004-04-21 devnull image->giftrindex = 0;
646 28994509 2004-04-21 devnull if(Ns == 3)
647 28994509 2004-04-21 devnull image->chandesc = colorspace;
648 28994509 2004-04-21 devnull else
649 28994509 2004-04-21 devnull image->chandesc = CY;
650 28994509 2004-04-21 devnull image->nchans = h->Nf;
651 28994509 2004-04-21 devnull for(k=0; k<h->Nf; k++)
652 28994509 2004-04-21 devnull image->chans[k] = jpgmalloc(h, h->X*h->Y, 0);
653 28994509 2004-04-21 devnull
654 28994509 2004-04-21 devnull /* compute maximum H and V */
655 28994509 2004-04-21 devnull Hmax = 0;
656 28994509 2004-04-21 devnull Vmax = 0;
657 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++){
658 28994509 2004-04-21 devnull if(h->comp[comp].H > Hmax)
659 28994509 2004-04-21 devnull Hmax = h->comp[comp].H;
660 28994509 2004-04-21 devnull if(h->comp[comp].V > Vmax)
661 28994509 2004-04-21 devnull Vmax = h->comp[comp].V;
662 28994509 2004-04-21 devnull }
663 28994509 2004-04-21 devnull
664 28994509 2004-04-21 devnull /* initialize data structures */
665 28994509 2004-04-21 devnull allHV1 = 1;
666 28994509 2004-04-21 devnull data = h->data;
667 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++){
668 28994509 2004-04-21 devnull /* JPEG requires scan components to be in same order as in frame, */
669 28994509 2004-04-21 devnull /* so if both have 3 we know scan is Y Cb Cr and there's no need to */
670 28994509 2004-04-21 devnull /* reorder */
671 28994509 2004-04-21 devnull nibbles(ss[2+2*comp], &Td[comp], &Ta[comp]);
672 28994509 2004-04-21 devnull H[comp] = h->comp[comp].H;
673 28994509 2004-04-21 devnull V[comp] = h->comp[comp].V;
674 28994509 2004-04-21 devnull nblock = H[comp]*V[comp];
675 28994509 2004-04-21 devnull if(nblock != 1)
676 28994509 2004-04-21 devnull allHV1 = 0;
677 28994509 2004-04-21 devnull data[comp] = jpgmalloc(h, nblock*sizeof(int*), 0);
678 28994509 2004-04-21 devnull h->ndata[comp] = nblock;
679 28994509 2004-04-21 devnull DC[comp] = 0;
680 28994509 2004-04-21 devnull for(m=0; m<nblock; m++)
681 28994509 2004-04-21 devnull data[comp][m] = jpgmalloc(h, 8*8*sizeof(int), 0);
682 28994509 2004-04-21 devnull }
683 28994509 2004-04-21 devnull
684 28994509 2004-04-21 devnull ri = h->ri;
685 28994509 2004-04-21 devnull
686 28994509 2004-04-21 devnull h->cnt = 0;
687 28994509 2004-04-21 devnull h->sr = 0;
688 28994509 2004-04-21 devnull h->peek = -1;
689 28994509 2004-04-21 devnull nacross = ((h->X+(8*Hmax-1))/(8*Hmax));
690 28994509 2004-04-21 devnull nmcu = ((h->Y+(8*Vmax-1))/(8*Vmax))*nacross;
691 28994509 2004-04-21 devnull for(mcu=0; mcu<nmcu; ){
692 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++){
693 28994509 2004-04-21 devnull dcht = &h->dcht[Td[comp]];
694 28994509 2004-04-21 devnull acht = &h->acht[Ta[comp]];
695 28994509 2004-04-21 devnull qt = h->qt[h->comp[comp].Tq];
696 28994509 2004-04-21 devnull
697 28994509 2004-04-21 devnull for(block=0; block<H[comp]*V[comp]; block++){
698 28994509 2004-04-21 devnull /* F-22 */
699 28994509 2004-04-21 devnull t = decode(h, dcht);
700 28994509 2004-04-21 devnull diff = receive(h, t);
701 28994509 2004-04-21 devnull DC[comp] += diff;
702 28994509 2004-04-21 devnull
703 28994509 2004-04-21 devnull /* F-23 */
704 28994509 2004-04-21 devnull zz = data[comp][block];
705 28994509 2004-04-21 devnull memset(zz, 0, 8*8*sizeof(int));
706 28994509 2004-04-21 devnull zz[0] = qt[0]*DC[comp];
707 28994509 2004-04-21 devnull k = 1;
708 28994509 2004-04-21 devnull
709 28994509 2004-04-21 devnull for(;;){
710 28994509 2004-04-21 devnull t = decode(h, acht);
711 28994509 2004-04-21 devnull if((t&0x0F) == 0){
712 28994509 2004-04-21 devnull if((t&0xF0) != 0xF0)
713 28994509 2004-04-21 devnull break;
714 28994509 2004-04-21 devnull k += 16;
715 28994509 2004-04-21 devnull }else{
716 28994509 2004-04-21 devnull k += t>>4;
717 28994509 2004-04-21 devnull z = receive(h, t&0xF);
718 28994509 2004-04-21 devnull zz[zig[k]] = z*qt[k];
719 28994509 2004-04-21 devnull if(k == 63)
720 28994509 2004-04-21 devnull break;
721 28994509 2004-04-21 devnull k++;
722 28994509 2004-04-21 devnull }
723 28994509 2004-04-21 devnull }
724 28994509 2004-04-21 devnull
725 28994509 2004-04-21 devnull idct(zz);
726 28994509 2004-04-21 devnull }
727 28994509 2004-04-21 devnull }
728 28994509 2004-04-21 devnull
729 28994509 2004-04-21 devnull /* rotate colors to RGB and assign to bytes */
730 28994509 2004-04-21 devnull if(Ns == 1) /* very easy */
731 28994509 2004-04-21 devnull colormap1(h, colorspace, image, data[0][0], mcu, nacross);
732 28994509 2004-04-21 devnull else if(allHV1) /* fairly easy */
733 28994509 2004-04-21 devnull colormapall1(h, colorspace, image, data[0][0], data[1][0], data[2][0], mcu, nacross);
734 28994509 2004-04-21 devnull else /* miserable general case */
735 28994509 2004-04-21 devnull colormap(h, colorspace, image, data[0], data[1], data[2], mcu, nacross, Hmax, Vmax, H, V);
736 28994509 2004-04-21 devnull /* process restart marker, if present */
737 28994509 2004-04-21 devnull mcu++;
738 28994509 2004-04-21 devnull if(ri>0 && mcu<nmcu && mcu%ri==0){
739 28994509 2004-04-21 devnull restart(h, mcu);
740 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++)
741 28994509 2004-04-21 devnull DC[comp] = 0;
742 28994509 2004-04-21 devnull }
743 28994509 2004-04-21 devnull }
744 28994509 2004-04-21 devnull return image;
745 28994509 2004-04-21 devnull }
746 28994509 2004-04-21 devnull
747 28994509 2004-04-21 devnull static
748 28994509 2004-04-21 devnull void
749 28994509 2004-04-21 devnull restart(Header *h, int mcu)
750 28994509 2004-04-21 devnull {
751 28994509 2004-04-21 devnull int rest, rst, nskip;
752 28994509 2004-04-21 devnull
753 28994509 2004-04-21 devnull rest = mcu/h->ri-1;
754 28994509 2004-04-21 devnull nskip = 0;
755 28994509 2004-04-21 devnull do{
756 28994509 2004-04-21 devnull do{
757 28994509 2004-04-21 devnull rst = nextbyte(h, 1);
758 28994509 2004-04-21 devnull nskip++;
759 28994509 2004-04-21 devnull }while(rst>=0 && rst!=0xFF);
760 28994509 2004-04-21 devnull if(rst == 0xFF){
761 28994509 2004-04-21 devnull rst = nextbyte(h, 1);
762 28994509 2004-04-21 devnull nskip++;
763 28994509 2004-04-21 devnull }
764 28994509 2004-04-21 devnull }while(rst>=0 && (rst&~7)!=RST);
765 28994509 2004-04-21 devnull if(nskip != 2)
766 28994509 2004-04-21 devnull sprint(h->err, "ReadJPG: skipped %d bytes at restart %d\n", nskip-2, rest);
767 28994509 2004-04-21 devnull if(rst < 0)
768 28994509 2004-04-21 devnull jpgerror(h, readerr);
769 28994509 2004-04-21 devnull if((rst&7) != (rest&7))
770 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: expected RST%d got %d", rest&7, rst&7);
771 28994509 2004-04-21 devnull h->cnt = 0;
772 28994509 2004-04-21 devnull h->sr = 0;
773 28994509 2004-04-21 devnull }
774 28994509 2004-04-21 devnull
775 28994509 2004-04-21 devnull static
776 28994509 2004-04-21 devnull Rawimage*
777 28994509 2004-04-21 devnull progressiveIDCT(Header *h, int colorspace)
778 28994509 2004-04-21 devnull {
779 28994509 2004-04-21 devnull int k, m, comp, block, Nf, bn;
780 28994509 2004-04-21 devnull int allHV1, nblock, mcu, nmcu;
781 28994509 2004-04-21 devnull int H[3], V[3], blockno[3];
782 28994509 2004-04-21 devnull int *dccoeff, **accoeff;
783 28994509 2004-04-21 devnull int ***data, *zz;
784 28994509 2004-04-21 devnull
785 28994509 2004-04-21 devnull Nf = h->Nf;
786 28994509 2004-04-21 devnull allHV1 = 1;
787 28994509 2004-04-21 devnull data = h->data;
788 28994509 2004-04-21 devnull
789 28994509 2004-04-21 devnull for(comp=0; comp<Nf; comp++){
790 28994509 2004-04-21 devnull H[comp] = h->comp[comp].H;
791 28994509 2004-04-21 devnull V[comp] = h->comp[comp].V;
792 28994509 2004-04-21 devnull nblock = h->nblock[comp];
793 28994509 2004-04-21 devnull if(nblock != 1)
794 28994509 2004-04-21 devnull allHV1 = 0;
795 28994509 2004-04-21 devnull h->ndata[comp] = nblock;
796 28994509 2004-04-21 devnull data[comp] = jpgmalloc(h, nblock*sizeof(int*), 0);
797 28994509 2004-04-21 devnull for(m=0; m<nblock; m++)
798 28994509 2004-04-21 devnull data[comp][m] = jpgmalloc(h, 8*8*sizeof(int), 0);
799 28994509 2004-04-21 devnull }
800 28994509 2004-04-21 devnull
801 28994509 2004-04-21 devnull memset(blockno, 0, sizeof blockno);
802 28994509 2004-04-21 devnull nmcu = h->nacross*h->ndown;
803 28994509 2004-04-21 devnull for(mcu=0; mcu<nmcu; mcu++){
804 28994509 2004-04-21 devnull for(comp=0; comp<Nf; comp++){
805 28994509 2004-04-21 devnull dccoeff = h->dccoeff[comp];
806 28994509 2004-04-21 devnull accoeff = h->accoeff[comp];
807 28994509 2004-04-21 devnull bn = blockno[comp];
808 28994509 2004-04-21 devnull for(block=0; block<h->nblock[comp]; block++){
809 28994509 2004-04-21 devnull zz = data[comp][block];
810 28994509 2004-04-21 devnull memset(zz, 0, 8*8*sizeof(int));
811 28994509 2004-04-21 devnull zz[0] = dccoeff[bn];
812 28994509 2004-04-21 devnull
813 28994509 2004-04-21 devnull for(k=1; k<64; k++)
814 28994509 2004-04-21 devnull zz[zig[k]] = accoeff[bn][k];
815 28994509 2004-04-21 devnull
816 28994509 2004-04-21 devnull idct(zz);
817 28994509 2004-04-21 devnull bn++;
818 28994509 2004-04-21 devnull }
819 28994509 2004-04-21 devnull blockno[comp] = bn;
820 28994509 2004-04-21 devnull }
821 28994509 2004-04-21 devnull
822 28994509 2004-04-21 devnull /* rotate colors to RGB and assign to bytes */
823 28994509 2004-04-21 devnull if(Nf == 1) /* very easy */
824 28994509 2004-04-21 devnull colormap1(h, colorspace, h->image, data[0][0], mcu, h->nacross);
825 28994509 2004-04-21 devnull else if(allHV1) /* fairly easy */
826 28994509 2004-04-21 devnull colormapall1(h, colorspace, h->image, data[0][0], data[1][0], data[2][0], mcu, h->nacross);
827 28994509 2004-04-21 devnull else /* miserable general case */
828 28994509 2004-04-21 devnull colormap(h, colorspace, h->image, data[0], data[1], data[2], mcu, h->nacross, h->Hmax, h->Vmax, H, V);
829 28994509 2004-04-21 devnull }
830 28994509 2004-04-21 devnull
831 28994509 2004-04-21 devnull return h->image;
832 28994509 2004-04-21 devnull }
833 28994509 2004-04-21 devnull
834 28994509 2004-04-21 devnull static
835 28994509 2004-04-21 devnull void
836 28994509 2004-04-21 devnull progressiveinit(Header *h, int colorspace)
837 28994509 2004-04-21 devnull {
838 28994509 2004-04-21 devnull int Nf, Ns, j, k, nmcu, comp;
839 28994509 2004-04-21 devnull uchar *ss;
840 28994509 2004-04-21 devnull Rawimage *image;
841 28994509 2004-04-21 devnull
842 28994509 2004-04-21 devnull ss = h->ss;
843 28994509 2004-04-21 devnull Ns = ss[0];
844 28994509 2004-04-21 devnull Nf = h->Nf;
845 28994509 2004-04-21 devnull if((Ns!=3 && Ns!=1) || Ns!=Nf)
846 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: image must have 1 or 3 components");
847 28994509 2004-04-21 devnull
848 28994509 2004-04-21 devnull image = jpgmalloc(h, sizeof(Rawimage), 1);
849 28994509 2004-04-21 devnull h->image = image;
850 28994509 2004-04-21 devnull image->r = Rect(0, 0, h->X, h->Y);
851 28994509 2004-04-21 devnull image->cmap = nil;
852 28994509 2004-04-21 devnull image->cmaplen = 0;
853 28994509 2004-04-21 devnull image->chanlen = h->X*h->Y;
854 28994509 2004-04-21 devnull image->fields = 0;
855 28994509 2004-04-21 devnull image->gifflags = 0;
856 28994509 2004-04-21 devnull image->gifdelay = 0;
857 28994509 2004-04-21 devnull image->giftrindex = 0;
858 28994509 2004-04-21 devnull if(Nf == 3)
859 28994509 2004-04-21 devnull image->chandesc = colorspace;
860 28994509 2004-04-21 devnull else
861 28994509 2004-04-21 devnull image->chandesc = CY;
862 28994509 2004-04-21 devnull image->nchans = h->Nf;
863 28994509 2004-04-21 devnull for(k=0; k<Nf; k++){
864 28994509 2004-04-21 devnull image->chans[k] = jpgmalloc(h, h->X*h->Y, 0);
865 28994509 2004-04-21 devnull h->nblock[k] = h->comp[k].H*h->comp[k].V;
866 28994509 2004-04-21 devnull }
867 28994509 2004-04-21 devnull
868 28994509 2004-04-21 devnull /* compute maximum H and V */
869 28994509 2004-04-21 devnull h->Hmax = 0;
870 28994509 2004-04-21 devnull h->Vmax = 0;
871 28994509 2004-04-21 devnull for(comp=0; comp<Nf; comp++){
872 28994509 2004-04-21 devnull if(h->comp[comp].H > h->Hmax)
873 28994509 2004-04-21 devnull h->Hmax = h->comp[comp].H;
874 28994509 2004-04-21 devnull if(h->comp[comp].V > h->Vmax)
875 28994509 2004-04-21 devnull h->Vmax = h->comp[comp].V;
876 28994509 2004-04-21 devnull }
877 28994509 2004-04-21 devnull h->nacross = ((h->X+(8*h->Hmax-1))/(8*h->Hmax));
878 28994509 2004-04-21 devnull h->ndown = ((h->Y+(8*h->Vmax-1))/(8*h->Vmax));
879 28994509 2004-04-21 devnull nmcu = h->nacross*h->ndown;
880 28994509 2004-04-21 devnull
881 28994509 2004-04-21 devnull for(k=0; k<Nf; k++){
882 28994509 2004-04-21 devnull h->dccoeff[k] = jpgmalloc(h, h->nblock[k]*nmcu * sizeof(int), 1);
883 28994509 2004-04-21 devnull h->accoeff[k] = jpgmalloc(h, h->nblock[k]*nmcu * sizeof(int*), 1);
884 28994509 2004-04-21 devnull h->naccoeff[k] = h->nblock[k]*nmcu;
885 28994509 2004-04-21 devnull for(j=0; j<h->nblock[k]*nmcu; j++)
886 28994509 2004-04-21 devnull h->accoeff[k][j] = jpgmalloc(h, 64*sizeof(int), 1);
887 28994509 2004-04-21 devnull }
888 28994509 2004-04-21 devnull
889 28994509 2004-04-21 devnull }
890 28994509 2004-04-21 devnull
891 28994509 2004-04-21 devnull static
892 28994509 2004-04-21 devnull void
893 28994509 2004-04-21 devnull progressivedc(Header *h, int comp, int Ah, int Al)
894 28994509 2004-04-21 devnull {
895 28994509 2004-04-21 devnull int Ns, z, ri, mcu, nmcu;
896 28994509 2004-04-21 devnull int block, t, diff, qt, *dc, bn;
897 28994509 2004-04-21 devnull Huffman *dcht;
898 28994509 2004-04-21 devnull uchar *ss;
899 28994509 2004-04-21 devnull int Td[3], DC[3], blockno[3];
900 28994509 2004-04-21 devnull
901 28994509 2004-04-21 devnull ss= h->ss;
902 28994509 2004-04-21 devnull Ns = ss[0];
903 28994509 2004-04-21 devnull if(Ns!=h->Nf)
904 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: can't handle progressive with Nf!=Ns in DC scan");
905 28994509 2004-04-21 devnull
906 28994509 2004-04-21 devnull /* initialize data structures */
907 28994509 2004-04-21 devnull h->cnt = 0;
908 28994509 2004-04-21 devnull h->sr = 0;
909 28994509 2004-04-21 devnull h->peek = -1;
910 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++){
911 28994509 2004-04-21 devnull /*
912 28994509 2004-04-21 devnull * JPEG requires scan components to be in same order as in frame,
913 28994509 2004-04-21 devnull * so if both have 3 we know scan is Y Cb Cr and there's no need to
914 28994509 2004-04-21 devnull * reorder
915 28994509 2004-04-21 devnull */
916 28994509 2004-04-21 devnull nibbles(ss[2+2*comp], &Td[comp], &z); /* z is ignored */
917 28994509 2004-04-21 devnull DC[comp] = 0;
918 28994509 2004-04-21 devnull }
919 28994509 2004-04-21 devnull
920 28994509 2004-04-21 devnull ri = h->ri;
921 28994509 2004-04-21 devnull
922 28994509 2004-04-21 devnull nmcu = h->nacross*h->ndown;
923 28994509 2004-04-21 devnull memset(blockno, 0, sizeof blockno);
924 28994509 2004-04-21 devnull for(mcu=0; mcu<nmcu; ){
925 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++){
926 28994509 2004-04-21 devnull dcht = &h->dcht[Td[comp]];
927 28994509 2004-04-21 devnull qt = h->qt[h->comp[comp].Tq][0];
928 28994509 2004-04-21 devnull dc = h->dccoeff[comp];
929 28994509 2004-04-21 devnull bn = blockno[comp];
930 28994509 2004-04-21 devnull
931 28994509 2004-04-21 devnull for(block=0; block<h->nblock[comp]; block++){
932 28994509 2004-04-21 devnull if(Ah == 0){
933 28994509 2004-04-21 devnull t = decode(h, dcht);
934 28994509 2004-04-21 devnull diff = receive(h, t);
935 28994509 2004-04-21 devnull DC[comp] += diff;
936 28994509 2004-04-21 devnull dc[bn] = qt*DC[comp]<<Al;
937 28994509 2004-04-21 devnull }else
938 28994509 2004-04-21 devnull dc[bn] |= qt*receivebit(h)<<Al;
939 28994509 2004-04-21 devnull bn++;
940 28994509 2004-04-21 devnull }
941 28994509 2004-04-21 devnull blockno[comp] = bn;
942 28994509 2004-04-21 devnull }
943 28994509 2004-04-21 devnull
944 28994509 2004-04-21 devnull /* process restart marker, if present */
945 28994509 2004-04-21 devnull mcu++;
946 28994509 2004-04-21 devnull if(ri>0 && mcu<nmcu && mcu%ri==0){
947 28994509 2004-04-21 devnull restart(h, mcu);
948 28994509 2004-04-21 devnull for(comp=0; comp<Ns; comp++)
949 28994509 2004-04-21 devnull DC[comp] = 0;
950 28994509 2004-04-21 devnull }
951 28994509 2004-04-21 devnull }
952 28994509 2004-04-21 devnull }
953 28994509 2004-04-21 devnull
954 28994509 2004-04-21 devnull static
955 28994509 2004-04-21 devnull void
956 28994509 2004-04-21 devnull progressiveac(Header *h, int comp, int Al)
957 28994509 2004-04-21 devnull {
958 28994509 2004-04-21 devnull int Ns, Ss, Se, z, k, eobrun, x, y, nver, tmcu, blockno, *acc, rs;
959 28994509 2004-04-21 devnull int ri, mcu, nacross, ndown, nmcu, nhor;
960 28994509 2004-04-21 devnull Huffman *acht;
961 28994509 2004-04-21 devnull int *qt, rrrr, ssss, q;
962 28994509 2004-04-21 devnull uchar *ss;
963 28994509 2004-04-21 devnull int Ta, H, V;
964 28994509 2004-04-21 devnull
965 28994509 2004-04-21 devnull ss = h->ss;
966 28994509 2004-04-21 devnull Ns = ss[0];
967 28994509 2004-04-21 devnull if(Ns != 1)
968 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: illegal Ns>1 in progressive AC scan");
969 28994509 2004-04-21 devnull Ss = ss[1+2];
970 28994509 2004-04-21 devnull Se = ss[2+2];
971 28994509 2004-04-21 devnull H = h->comp[comp].H;
972 28994509 2004-04-21 devnull V = h->comp[comp].V;
973 28994509 2004-04-21 devnull
974 28994509 2004-04-21 devnull nacross = h->nacross*H;
975 28994509 2004-04-21 devnull ndown = h->ndown*V;
976 28994509 2004-04-21 devnull q = 8*h->Hmax/H;
977 28994509 2004-04-21 devnull nhor = (h->X+q-1)/q;
978 28994509 2004-04-21 devnull q = 8*h->Vmax/V;
979 28994509 2004-04-21 devnull nver = (h->Y+q-1)/q;
980 28994509 2004-04-21 devnull
981 28994509 2004-04-21 devnull /* initialize data structures */
982 28994509 2004-04-21 devnull h->cnt = 0;
983 28994509 2004-04-21 devnull h->sr = 0;
984 28994509 2004-04-21 devnull h->peek = -1;
985 28994509 2004-04-21 devnull nibbles(ss[1+1], &z, &Ta); /* z is thrown away */
986 28994509 2004-04-21 devnull
987 28994509 2004-04-21 devnull ri = h->ri;
988 28994509 2004-04-21 devnull
989 28994509 2004-04-21 devnull eobrun = 0;
990 28994509 2004-04-21 devnull acht = &h->acht[Ta];
991 28994509 2004-04-21 devnull qt = h->qt[h->comp[comp].Tq];
992 28994509 2004-04-21 devnull nmcu = nacross*ndown;
993 28994509 2004-04-21 devnull mcu = 0;
994 28994509 2004-04-21 devnull for(y=0; y<nver; y++){
995 28994509 2004-04-21 devnull for(x=0; x<nhor; x++){
996 28994509 2004-04-21 devnull /* Figure G-3 */
997 28994509 2004-04-21 devnull if(eobrun > 0){
998 28994509 2004-04-21 devnull --eobrun;
999 28994509 2004-04-21 devnull continue;
1000 28994509 2004-04-21 devnull }
1001 28994509 2004-04-21 devnull
1002 28994509 2004-04-21 devnull /* arrange blockno to be in same sequence as original scan calculation. */
1003 28994509 2004-04-21 devnull tmcu = x/H + (nacross/H)*(y/V);
1004 28994509 2004-04-21 devnull blockno = tmcu*H*V + H*(y%V) + x%H;
1005 28994509 2004-04-21 devnull acc = h->accoeff[comp][blockno];
1006 28994509 2004-04-21 devnull k = Ss;
1007 28994509 2004-04-21 devnull for(;;){
1008 28994509 2004-04-21 devnull rs = decode(h, acht);
1009 28994509 2004-04-21 devnull /* XXX remove rrrr ssss as in baselinescan */
1010 28994509 2004-04-21 devnull nibbles(rs, &rrrr, &ssss);
1011 28994509 2004-04-21 devnull if(ssss == 0){
1012 28994509 2004-04-21 devnull if(rrrr < 15){
1013 28994509 2004-04-21 devnull eobrun = 0;
1014 28994509 2004-04-21 devnull if(rrrr > 0)
1015 28994509 2004-04-21 devnull eobrun = receiveEOB(h, rrrr)-1;
1016 28994509 2004-04-21 devnull break;
1017 28994509 2004-04-21 devnull }
1018 28994509 2004-04-21 devnull k += 16;
1019 28994509 2004-04-21 devnull }else{
1020 28994509 2004-04-21 devnull k += rrrr;
1021 28994509 2004-04-21 devnull z = receive(h, ssss);
1022 28994509 2004-04-21 devnull acc[k] = z*qt[k]<<Al;
1023 28994509 2004-04-21 devnull if(k == Se)
1024 28994509 2004-04-21 devnull break;
1025 28994509 2004-04-21 devnull k++;
1026 28994509 2004-04-21 devnull }
1027 28994509 2004-04-21 devnull }
1028 28994509 2004-04-21 devnull }
1029 28994509 2004-04-21 devnull
1030 28994509 2004-04-21 devnull /* process restart marker, if present */
1031 28994509 2004-04-21 devnull mcu++;
1032 28994509 2004-04-21 devnull if(ri>0 && mcu<nmcu && mcu%ri==0){
1033 28994509 2004-04-21 devnull restart(h, mcu);
1034 28994509 2004-04-21 devnull eobrun = 0;
1035 28994509 2004-04-21 devnull }
1036 28994509 2004-04-21 devnull }
1037 28994509 2004-04-21 devnull }
1038 28994509 2004-04-21 devnull
1039 28994509 2004-04-21 devnull static
1040 28994509 2004-04-21 devnull void
1041 28994509 2004-04-21 devnull increment(Header *h, int acc[], int k, int Pt)
1042 28994509 2004-04-21 devnull {
1043 28994509 2004-04-21 devnull if(acc[k] == 0)
1044 28994509 2004-04-21 devnull return;
1045 28994509 2004-04-21 devnull if(receivebit(h) != 0)
1046 28994509 2004-04-21 devnull if(acc[k] < 0)
1047 28994509 2004-04-21 devnull acc[k] -= Pt;
1048 28994509 2004-04-21 devnull else
1049 28994509 2004-04-21 devnull acc[k] += Pt;
1050 28994509 2004-04-21 devnull }
1051 28994509 2004-04-21 devnull
1052 28994509 2004-04-21 devnull static
1053 28994509 2004-04-21 devnull void
1054 28994509 2004-04-21 devnull progressiveacinc(Header *h, int comp, int Al)
1055 28994509 2004-04-21 devnull {
1056 28994509 2004-04-21 devnull int Ns, i, z, k, Ss, Se, Ta, **ac, H, V;
1057 28994509 2004-04-21 devnull int ri, mcu, nacross, ndown, nhor, nver, eobrun, nzeros, pending, x, y, tmcu, blockno, q, nmcu;
1058 28994509 2004-04-21 devnull Huffman *acht;
1059 28994509 2004-04-21 devnull int *qt, rrrr, ssss, *acc, rs;
1060 28994509 2004-04-21 devnull uchar *ss;
1061 28994509 2004-04-21 devnull
1062 28994509 2004-04-21 devnull ss = h->ss;
1063 28994509 2004-04-21 devnull Ns = ss[0];
1064 28994509 2004-04-21 devnull if(Ns != 1)
1065 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: illegal Ns>1 in progressive AC scan");
1066 28994509 2004-04-21 devnull Ss = ss[1+2];
1067 28994509 2004-04-21 devnull Se = ss[2+2];
1068 28994509 2004-04-21 devnull H = h->comp[comp].H;
1069 28994509 2004-04-21 devnull V = h->comp[comp].V;
1070 28994509 2004-04-21 devnull
1071 28994509 2004-04-21 devnull nacross = h->nacross*H;
1072 28994509 2004-04-21 devnull ndown = h->ndown*V;
1073 28994509 2004-04-21 devnull q = 8*h->Hmax/H;
1074 28994509 2004-04-21 devnull nhor = (h->X+q-1)/q;
1075 28994509 2004-04-21 devnull q = 8*h->Vmax/V;
1076 28994509 2004-04-21 devnull nver = (h->Y+q-1)/q;
1077 28994509 2004-04-21 devnull
1078 28994509 2004-04-21 devnull /* initialize data structures */
1079 28994509 2004-04-21 devnull h->cnt = 0;
1080 28994509 2004-04-21 devnull h->sr = 0;
1081 28994509 2004-04-21 devnull h->peek = -1;
1082 28994509 2004-04-21 devnull nibbles(ss[1+1], &z, &Ta); /* z is thrown away */
1083 28994509 2004-04-21 devnull ri = h->ri;
1084 28994509 2004-04-21 devnull
1085 28994509 2004-04-21 devnull eobrun = 0;
1086 28994509 2004-04-21 devnull ac = h->accoeff[comp];
1087 28994509 2004-04-21 devnull acht = &h->acht[Ta];
1088 28994509 2004-04-21 devnull qt = h->qt[h->comp[comp].Tq];
1089 28994509 2004-04-21 devnull nmcu = nacross*ndown;
1090 28994509 2004-04-21 devnull mcu = 0;
1091 28994509 2004-04-21 devnull pending = 0;
1092 28994509 2004-04-21 devnull nzeros = -1;
1093 28994509 2004-04-21 devnull for(y=0; y<nver; y++){
1094 28994509 2004-04-21 devnull for(x=0; x<nhor; x++){
1095 28994509 2004-04-21 devnull /* Figure G-7 */
1096 28994509 2004-04-21 devnull
1097 28994509 2004-04-21 devnull /* arrange blockno to be in same sequence as original scan calculation. */
1098 28994509 2004-04-21 devnull tmcu = x/H + (nacross/H)*(y/V);
1099 28994509 2004-04-21 devnull blockno = tmcu*H*V + H*(y%V) + x%H;
1100 28994509 2004-04-21 devnull acc = ac[blockno];
1101 28994509 2004-04-21 devnull if(eobrun > 0){
1102 28994509 2004-04-21 devnull if(nzeros > 0)
1103 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: zeros pending at block start");
1104 28994509 2004-04-21 devnull for(k=Ss; k<=Se; k++)
1105 28994509 2004-04-21 devnull increment(h, acc, k, qt[k]<<Al);
1106 28994509 2004-04-21 devnull --eobrun;
1107 28994509 2004-04-21 devnull continue;
1108 28994509 2004-04-21 devnull }
1109 28994509 2004-04-21 devnull
1110 28994509 2004-04-21 devnull for(k=Ss; k<=Se; ){
1111 28994509 2004-04-21 devnull if(nzeros >= 0){
1112 28994509 2004-04-21 devnull if(acc[k] != 0)
1113 28994509 2004-04-21 devnull increment(h, acc, k, qt[k]<<Al);
1114 28994509 2004-04-21 devnull else if(nzeros-- == 0)
1115 28994509 2004-04-21 devnull acc[k] = pending;
1116 28994509 2004-04-21 devnull k++;
1117 28994509 2004-04-21 devnull continue;
1118 28994509 2004-04-21 devnull }
1119 28994509 2004-04-21 devnull rs = decode(h, acht);
1120 28994509 2004-04-21 devnull nibbles(rs, &rrrr, &ssss);
1121 28994509 2004-04-21 devnull if(ssss == 0){
1122 28994509 2004-04-21 devnull if(rrrr < 15){
1123 28994509 2004-04-21 devnull eobrun = 0;
1124 28994509 2004-04-21 devnull if(rrrr > 0)
1125 28994509 2004-04-21 devnull eobrun = receiveEOB(h, rrrr)-1;
1126 28994509 2004-04-21 devnull while(k <= Se){
1127 28994509 2004-04-21 devnull increment(h, acc, k, qt[k]<<Al);
1128 28994509 2004-04-21 devnull k++;
1129 28994509 2004-04-21 devnull }
1130 28994509 2004-04-21 devnull break;
1131 28994509 2004-04-21 devnull }
1132 28994509 2004-04-21 devnull for(i=0; i<16; k++){
1133 28994509 2004-04-21 devnull increment(h, acc, k, qt[k]<<Al);
1134 28994509 2004-04-21 devnull if(acc[k] == 0)
1135 28994509 2004-04-21 devnull i++;
1136 28994509 2004-04-21 devnull }
1137 28994509 2004-04-21 devnull continue;
1138 28994509 2004-04-21 devnull }else if(ssss != 1)
1139 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: ssss!=1 in progressive increment");
1140 28994509 2004-04-21 devnull nzeros = rrrr;
1141 28994509 2004-04-21 devnull pending = receivebit(h);
1142 28994509 2004-04-21 devnull if(pending == 0)
1143 28994509 2004-04-21 devnull pending = -1;
1144 28994509 2004-04-21 devnull pending *= qt[k]<<Al;
1145 28994509 2004-04-21 devnull }
1146 28994509 2004-04-21 devnull }
1147 28994509 2004-04-21 devnull
1148 28994509 2004-04-21 devnull /* process restart marker, if present */
1149 28994509 2004-04-21 devnull mcu++;
1150 28994509 2004-04-21 devnull if(ri>0 && mcu<nmcu && mcu%ri==0){
1151 28994509 2004-04-21 devnull restart(h, mcu);
1152 28994509 2004-04-21 devnull eobrun = 0;
1153 28994509 2004-04-21 devnull nzeros = -1;
1154 28994509 2004-04-21 devnull }
1155 28994509 2004-04-21 devnull }
1156 28994509 2004-04-21 devnull }
1157 28994509 2004-04-21 devnull
1158 28994509 2004-04-21 devnull static
1159 28994509 2004-04-21 devnull void
1160 28994509 2004-04-21 devnull progressivescan(Header *h, int colorspace)
1161 28994509 2004-04-21 devnull {
1162 28994509 2004-04-21 devnull uchar *ss;
1163 28994509 2004-04-21 devnull int Ns, Ss, Ah, Al, c, comp, i;
1164 28994509 2004-04-21 devnull
1165 28994509 2004-04-21 devnull if(h->dccoeff[0] == nil)
1166 28994509 2004-04-21 devnull progressiveinit(h, colorspace);
1167 28994509 2004-04-21 devnull
1168 28994509 2004-04-21 devnull ss = h->ss;
1169 28994509 2004-04-21 devnull Ns = ss[0];
1170 28994509 2004-04-21 devnull Ss = ss[1+2*Ns];
1171 28994509 2004-04-21 devnull nibbles(ss[3+2*Ns], &Ah, &Al);
1172 28994509 2004-04-21 devnull c = ss[1];
1173 28994509 2004-04-21 devnull comp = -1;
1174 28994509 2004-04-21 devnull for(i=0; i<h->Nf; i++)
1175 28994509 2004-04-21 devnull if(h->comp[i].C == c)
1176 28994509 2004-04-21 devnull comp = i;
1177 28994509 2004-04-21 devnull if(comp == -1)
1178 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: bad component index in scan header");
1179 28994509 2004-04-21 devnull
1180 28994509 2004-04-21 devnull if(Ss == 0){
1181 28994509 2004-04-21 devnull progressivedc(h, comp, Ah, Al);
1182 28994509 2004-04-21 devnull return;
1183 28994509 2004-04-21 devnull }
1184 28994509 2004-04-21 devnull if(Ah == 0){
1185 28994509 2004-04-21 devnull progressiveac(h, comp, Al);
1186 28994509 2004-04-21 devnull return;
1187 28994509 2004-04-21 devnull }
1188 28994509 2004-04-21 devnull progressiveacinc(h, comp, Al);
1189 28994509 2004-04-21 devnull }
1190 28994509 2004-04-21 devnull
1191 28994509 2004-04-21 devnull enum {
1192 28994509 2004-04-21 devnull c1 = 2871, /* 1.402 * 2048 */
1193 28994509 2004-04-21 devnull c2 = 705, /* 0.34414 * 2048 */
1194 28994509 2004-04-21 devnull c3 = 1463, /* 0.71414 * 2048 */
1195 cbeb0b26 2006-04-01 devnull c4 = 3629 /* 1.772 * 2048 */
1196 28994509 2004-04-21 devnull };
1197 28994509 2004-04-21 devnull
1198 28994509 2004-04-21 devnull static
1199 28994509 2004-04-21 devnull void
1200 28994509 2004-04-21 devnull colormap1(Header *h, int colorspace, Rawimage *image, int data[8*8], int mcu, int nacross)
1201 28994509 2004-04-21 devnull {
1202 28994509 2004-04-21 devnull uchar *pic;
1203 28994509 2004-04-21 devnull int x, y, dx, dy, minx, miny;
1204 28994509 2004-04-21 devnull int r, k, pici;
1205 28994509 2004-04-21 devnull
1206 28994509 2004-04-21 devnull USED(colorspace);
1207 28994509 2004-04-21 devnull pic = image->chans[0];
1208 28994509 2004-04-21 devnull minx = 8*(mcu%nacross);
1209 28994509 2004-04-21 devnull dx = 8;
1210 28994509 2004-04-21 devnull if(minx+dx > h->X)
1211 28994509 2004-04-21 devnull dx = h->X-minx;
1212 28994509 2004-04-21 devnull miny = 8*(mcu/nacross);
1213 28994509 2004-04-21 devnull dy = 8;
1214 28994509 2004-04-21 devnull if(miny+dy > h->Y)
1215 28994509 2004-04-21 devnull dy = h->Y-miny;
1216 28994509 2004-04-21 devnull pici = miny*h->X+minx;
1217 28994509 2004-04-21 devnull k = 0;
1218 28994509 2004-04-21 devnull for(y=0; y<dy; y++){
1219 28994509 2004-04-21 devnull for(x=0; x<dx; x++){
1220 28994509 2004-04-21 devnull r = clamp[(data[k+x]+128)+CLAMPOFF];
1221 28994509 2004-04-21 devnull pic[pici+x] = r;
1222 28994509 2004-04-21 devnull }
1223 28994509 2004-04-21 devnull pici += h->X;
1224 28994509 2004-04-21 devnull k += 8;
1225 28994509 2004-04-21 devnull }
1226 28994509 2004-04-21 devnull }
1227 28994509 2004-04-21 devnull
1228 28994509 2004-04-21 devnull static
1229 28994509 2004-04-21 devnull void
1230 28994509 2004-04-21 devnull colormapall1(Header *h, int colorspace, Rawimage *image, int data0[8*8], int data1[8*8], int data2[8*8], int mcu, int nacross)
1231 28994509 2004-04-21 devnull {
1232 28994509 2004-04-21 devnull uchar *rpic, *gpic, *bpic, *rp, *gp, *bp;
1233 28994509 2004-04-21 devnull int *p0, *p1, *p2;
1234 28994509 2004-04-21 devnull int x, y, dx, dy, minx, miny;
1235 28994509 2004-04-21 devnull int r, g, b, k, pici;
1236 28994509 2004-04-21 devnull int Y, Cr, Cb;
1237 28994509 2004-04-21 devnull
1238 28994509 2004-04-21 devnull rpic = image->chans[0];
1239 28994509 2004-04-21 devnull gpic = image->chans[1];
1240 28994509 2004-04-21 devnull bpic = image->chans[2];
1241 28994509 2004-04-21 devnull minx = 8*(mcu%nacross);
1242 28994509 2004-04-21 devnull dx = 8;
1243 28994509 2004-04-21 devnull if(minx+dx > h->X)
1244 28994509 2004-04-21 devnull dx = h->X-minx;
1245 28994509 2004-04-21 devnull miny = 8*(mcu/nacross);
1246 28994509 2004-04-21 devnull dy = 8;
1247 28994509 2004-04-21 devnull if(miny+dy > h->Y)
1248 28994509 2004-04-21 devnull dy = h->Y-miny;
1249 28994509 2004-04-21 devnull pici = miny*h->X+minx;
1250 28994509 2004-04-21 devnull k = 0;
1251 28994509 2004-04-21 devnull for(y=0; y<dy; y++){
1252 28994509 2004-04-21 devnull p0 = data0+k;
1253 28994509 2004-04-21 devnull p1 = data1+k;
1254 28994509 2004-04-21 devnull p2 = data2+k;
1255 28994509 2004-04-21 devnull rp = rpic+pici;
1256 28994509 2004-04-21 devnull gp = gpic+pici;
1257 28994509 2004-04-21 devnull bp = bpic+pici;
1258 28994509 2004-04-21 devnull if(colorspace == CYCbCr)
1259 28994509 2004-04-21 devnull for(x=0; x<dx; x++){
1260 28994509 2004-04-21 devnull *rp++ = clamp[*p0++ + 128 + CLAMPOFF];
1261 28994509 2004-04-21 devnull *gp++ = clamp[*p1++ + 128 + CLAMPOFF];
1262 28994509 2004-04-21 devnull *bp++ = clamp[*p2++ + 128 + CLAMPOFF];
1263 28994509 2004-04-21 devnull }
1264 28994509 2004-04-21 devnull else
1265 28994509 2004-04-21 devnull for(x=0; x<dx; x++){
1266 28994509 2004-04-21 devnull Y = (*p0++ + 128) << 11;
1267 28994509 2004-04-21 devnull Cb = *p1++;
1268 28994509 2004-04-21 devnull Cr = *p2++;
1269 28994509 2004-04-21 devnull r = Y+c1*Cr;
1270 28994509 2004-04-21 devnull g = Y-c2*Cb-c3*Cr;
1271 28994509 2004-04-21 devnull b = Y+c4*Cb;
1272 28994509 2004-04-21 devnull *rp++ = clamp[(r>>11)+CLAMPOFF];
1273 28994509 2004-04-21 devnull *gp++ = clamp[(g>>11)+CLAMPOFF];
1274 28994509 2004-04-21 devnull *bp++ = clamp[(b>>11)+CLAMPOFF];
1275 28994509 2004-04-21 devnull }
1276 28994509 2004-04-21 devnull pici += h->X;
1277 28994509 2004-04-21 devnull k += 8;
1278 28994509 2004-04-21 devnull }
1279 28994509 2004-04-21 devnull }
1280 28994509 2004-04-21 devnull
1281 28994509 2004-04-21 devnull static
1282 28994509 2004-04-21 devnull void
1283 28994509 2004-04-21 devnull colormap(Header *h, int colorspace, Rawimage *image, int *data0[8*8], int *data1[8*8], int *data2[8*8], int mcu, int nacross, int Hmax, int Vmax, int *H, int *V)
1284 28994509 2004-04-21 devnull {
1285 28994509 2004-04-21 devnull uchar *rpic, *gpic, *bpic;
1286 28994509 2004-04-21 devnull int x, y, dx, dy, minx, miny;
1287 28994509 2004-04-21 devnull int r, g, b, pici, H0, H1, H2;
1288 28994509 2004-04-21 devnull int t, b0, b1, b2, y0, y1, y2, x0, x1, x2;
1289 28994509 2004-04-21 devnull int Y, Cr, Cb;
1290 28994509 2004-04-21 devnull
1291 28994509 2004-04-21 devnull rpic = image->chans[0];
1292 28994509 2004-04-21 devnull gpic = image->chans[1];
1293 28994509 2004-04-21 devnull bpic = image->chans[2];
1294 28994509 2004-04-21 devnull minx = 8*Hmax*(mcu%nacross);
1295 28994509 2004-04-21 devnull dx = 8*Hmax;
1296 28994509 2004-04-21 devnull if(minx+dx > h->X)
1297 28994509 2004-04-21 devnull dx = h->X-minx;
1298 28994509 2004-04-21 devnull miny = 8*Vmax*(mcu/nacross);
1299 28994509 2004-04-21 devnull dy = 8*Vmax;
1300 28994509 2004-04-21 devnull if(miny+dy > h->Y)
1301 28994509 2004-04-21 devnull dy = h->Y-miny;
1302 28994509 2004-04-21 devnull pici = miny*h->X+minx;
1303 28994509 2004-04-21 devnull H0 = H[0];
1304 28994509 2004-04-21 devnull H1 = H[1];
1305 28994509 2004-04-21 devnull H2 = H[2];
1306 28994509 2004-04-21 devnull for(y=0; y<dy; y++){
1307 28994509 2004-04-21 devnull t = y*V[0];
1308 28994509 2004-04-21 devnull b0 = H0*(t/(8*Vmax));
1309 28994509 2004-04-21 devnull y0 = 8*((t/Vmax)&7);
1310 28994509 2004-04-21 devnull t = y*V[1];
1311 28994509 2004-04-21 devnull b1 = H1*(t/(8*Vmax));
1312 28994509 2004-04-21 devnull y1 = 8*((t/Vmax)&7);
1313 28994509 2004-04-21 devnull t = y*V[2];
1314 28994509 2004-04-21 devnull b2 = H2*(t/(8*Vmax));
1315 28994509 2004-04-21 devnull y2 = 8*((t/Vmax)&7);
1316 28994509 2004-04-21 devnull x0 = 0;
1317 28994509 2004-04-21 devnull x1 = 0;
1318 28994509 2004-04-21 devnull x2 = 0;
1319 28994509 2004-04-21 devnull for(x=0; x<dx; x++){
1320 28994509 2004-04-21 devnull if(colorspace == CYCbCr){
1321 28994509 2004-04-21 devnull rpic[pici+x] = clamp[data0[b0][y0+x0++*H0/Hmax] + 128 + CLAMPOFF];
1322 28994509 2004-04-21 devnull gpic[pici+x] = clamp[data1[b1][y1+x1++*H1/Hmax] + 128 + CLAMPOFF];
1323 28994509 2004-04-21 devnull bpic[pici+x] = clamp[data2[b2][y2+x2++*H2/Hmax] + 128 + CLAMPOFF];
1324 28994509 2004-04-21 devnull }else{
1325 28994509 2004-04-21 devnull Y = (data0[b0][y0+x0++*H0/Hmax]+128)<<11;
1326 28994509 2004-04-21 devnull Cb = data1[b1][y1+x1++*H1/Hmax];
1327 28994509 2004-04-21 devnull Cr = data2[b2][y2+x2++*H2/Hmax];
1328 28994509 2004-04-21 devnull r = Y+c1*Cr;
1329 28994509 2004-04-21 devnull g = Y-c2*Cb-c3*Cr;
1330 28994509 2004-04-21 devnull b = Y+c4*Cb;
1331 28994509 2004-04-21 devnull rpic[pici+x] = clamp[(r>>11)+CLAMPOFF];
1332 28994509 2004-04-21 devnull gpic[pici+x] = clamp[(g>>11)+CLAMPOFF];
1333 28994509 2004-04-21 devnull bpic[pici+x] = clamp[(b>>11)+CLAMPOFF];
1334 28994509 2004-04-21 devnull }
1335 28994509 2004-04-21 devnull if(x0*H0/Hmax >= 8){
1336 28994509 2004-04-21 devnull x0 = 0;
1337 28994509 2004-04-21 devnull b0++;
1338 28994509 2004-04-21 devnull }
1339 28994509 2004-04-21 devnull if(x1*H1/Hmax >= 8){
1340 28994509 2004-04-21 devnull x1 = 0;
1341 28994509 2004-04-21 devnull b1++;
1342 28994509 2004-04-21 devnull }
1343 28994509 2004-04-21 devnull if(x2*H2/Hmax >= 8){
1344 28994509 2004-04-21 devnull x2 = 0;
1345 28994509 2004-04-21 devnull b2++;
1346 28994509 2004-04-21 devnull }
1347 28994509 2004-04-21 devnull }
1348 28994509 2004-04-21 devnull pici += h->X;
1349 28994509 2004-04-21 devnull }
1350 28994509 2004-04-21 devnull }
1351 28994509 2004-04-21 devnull
1352 28994509 2004-04-21 devnull /*
1353 28994509 2004-04-21 devnull * decode next 8-bit value from entropy-coded input. chart F-26
1354 28994509 2004-04-21 devnull */
1355 28994509 2004-04-21 devnull static
1356 28994509 2004-04-21 devnull int
1357 28994509 2004-04-21 devnull decode(Header *h, Huffman *t)
1358 28994509 2004-04-21 devnull {
1359 28994509 2004-04-21 devnull int code, v, cnt, m, sr, i;
1360 28994509 2004-04-21 devnull int *maxcode;
1361 28994509 2004-04-21 devnull static int badcode;
1362 28994509 2004-04-21 devnull
1363 28994509 2004-04-21 devnull maxcode = t->maxcode;
1364 28994509 2004-04-21 devnull if(h->cnt < 8)
1365 28994509 2004-04-21 devnull nextbyte(h, 0);
1366 28994509 2004-04-21 devnull /* fast lookup */
1367 28994509 2004-04-21 devnull code = (h->sr>>(h->cnt-8))&0xFF;
1368 28994509 2004-04-21 devnull v = t->value[code];
1369 28994509 2004-04-21 devnull if(v >= 0){
1370 28994509 2004-04-21 devnull h->cnt -= t->shift[code];
1371 28994509 2004-04-21 devnull return v;
1372 28994509 2004-04-21 devnull }
1373 28994509 2004-04-21 devnull
1374 28994509 2004-04-21 devnull h->cnt -= 8;
1375 28994509 2004-04-21 devnull if(h->cnt == 0)
1376 28994509 2004-04-21 devnull nextbyte(h, 0);
1377 28994509 2004-04-21 devnull h->cnt--;
1378 28994509 2004-04-21 devnull cnt = h->cnt;
1379 28994509 2004-04-21 devnull m = 1<<cnt;
1380 28994509 2004-04-21 devnull sr = h->sr;
1381 28994509 2004-04-21 devnull code <<= 1;
1382 28994509 2004-04-21 devnull i = 9;
1383 28994509 2004-04-21 devnull for(;;i++){
1384 28994509 2004-04-21 devnull if(sr & m)
1385 28994509 2004-04-21 devnull code |= 1;
1386 28994509 2004-04-21 devnull if(code <= maxcode[i])
1387 28994509 2004-04-21 devnull break;
1388 28994509 2004-04-21 devnull code <<= 1;
1389 28994509 2004-04-21 devnull m >>= 1;
1390 28994509 2004-04-21 devnull if(m == 0){
1391 28994509 2004-04-21 devnull sr = nextbyte(h, 0);
1392 28994509 2004-04-21 devnull m = 0x80;
1393 28994509 2004-04-21 devnull cnt = 8;
1394 28994509 2004-04-21 devnull }
1395 28994509 2004-04-21 devnull cnt--;
1396 28994509 2004-04-21 devnull }
1397 28994509 2004-04-21 devnull if(i >= 17){
1398 28994509 2004-04-21 devnull if(badcode == 0)
1399 28994509 2004-04-21 devnull fprint(2, "badly encoded %dx%d JPEG file; ignoring bad value\n", h->X, h->Y);
1400 28994509 2004-04-21 devnull badcode = 1;
1401 28994509 2004-04-21 devnull i = 0;
1402 28994509 2004-04-21 devnull }
1403 28994509 2004-04-21 devnull h->cnt = cnt;
1404 28994509 2004-04-21 devnull return t->val[t->valptr[i]+(code-t->mincode[i])];
1405 28994509 2004-04-21 devnull }
1406 28994509 2004-04-21 devnull
1407 28994509 2004-04-21 devnull /*
1408 28994509 2004-04-21 devnull * load next byte of input
1409 28994509 2004-04-21 devnull */
1410 28994509 2004-04-21 devnull static
1411 28994509 2004-04-21 devnull int
1412 28994509 2004-04-21 devnull nextbyte(Header *h, int marker)
1413 28994509 2004-04-21 devnull {
1414 28994509 2004-04-21 devnull int b, b2;
1415 28994509 2004-04-21 devnull
1416 28994509 2004-04-21 devnull if(h->peek >= 0){
1417 28994509 2004-04-21 devnull b = h->peek;
1418 28994509 2004-04-21 devnull h->peek = -1;
1419 28994509 2004-04-21 devnull }else{
1420 28994509 2004-04-21 devnull b = Bgetc(h->fd);
1421 28994509 2004-04-21 devnull if(b == Beof)
1422 28994509 2004-04-21 devnull jpgerror(h, "truncated file");
1423 28994509 2004-04-21 devnull b &= 0xFF;
1424 28994509 2004-04-21 devnull }
1425 28994509 2004-04-21 devnull
1426 28994509 2004-04-21 devnull if(b == 0xFF){
1427 28994509 2004-04-21 devnull if(marker)
1428 28994509 2004-04-21 devnull return b;
1429 28994509 2004-04-21 devnull b2 = Bgetc(h->fd);
1430 28994509 2004-04-21 devnull if(b2 != 0){
1431 28994509 2004-04-21 devnull if(b2 == Beof)
1432 28994509 2004-04-21 devnull jpgerror(h, "truncated file");
1433 28994509 2004-04-21 devnull b2 &= 0xFF;
1434 28994509 2004-04-21 devnull if(b2 == DNL)
1435 28994509 2004-04-21 devnull jpgerror(h, "ReadJPG: DNL marker unimplemented");
1436 28994509 2004-04-21 devnull /* decoder is reading into marker; satisfy it and restore state */
1437 28994509 2004-04-21 devnull Bungetc(h->fd);
1438 28994509 2004-04-21 devnull h->peek = b;
1439 28994509 2004-04-21 devnull }
1440 28994509 2004-04-21 devnull }
1441 28994509 2004-04-21 devnull h->cnt += 8;
1442 28994509 2004-04-21 devnull h->sr = (h->sr<<8) | b;
1443 28994509 2004-04-21 devnull return b;
1444 28994509 2004-04-21 devnull }
1445 28994509 2004-04-21 devnull
1446 28994509 2004-04-21 devnull /*
1447 28994509 2004-04-21 devnull * return next s bits of input, MSB first, and level shift it
1448 28994509 2004-04-21 devnull */
1449 28994509 2004-04-21 devnull static
1450 28994509 2004-04-21 devnull int
1451 28994509 2004-04-21 devnull receive(Header *h, int s)
1452 28994509 2004-04-21 devnull {
1453 28994509 2004-04-21 devnull int v, m;
1454 28994509 2004-04-21 devnull
1455 28994509 2004-04-21 devnull while(h->cnt < s)
1456 28994509 2004-04-21 devnull nextbyte(h, 0);
1457 28994509 2004-04-21 devnull h->cnt -= s;
1458 28994509 2004-04-21 devnull v = h->sr >> h->cnt;
1459 28994509 2004-04-21 devnull m = (1<<s);
1460 28994509 2004-04-21 devnull v &= m-1;
1461 28994509 2004-04-21 devnull /* level shift */
1462 28994509 2004-04-21 devnull if(v < (m>>1))
1463 28994509 2004-04-21 devnull v += ~(m-1)+1;
1464 28994509 2004-04-21 devnull return v;
1465 28994509 2004-04-21 devnull }
1466 28994509 2004-04-21 devnull
1467 28994509 2004-04-21 devnull /*
1468 28994509 2004-04-21 devnull * return next s bits of input, decode as EOB
1469 28994509 2004-04-21 devnull */
1470 28994509 2004-04-21 devnull static
1471 28994509 2004-04-21 devnull int
1472 28994509 2004-04-21 devnull receiveEOB(Header *h, int s)
1473 28994509 2004-04-21 devnull {
1474 28994509 2004-04-21 devnull int v, m;
1475 28994509 2004-04-21 devnull
1476 28994509 2004-04-21 devnull while(h->cnt < s)
1477 28994509 2004-04-21 devnull nextbyte(h, 0);
1478 28994509 2004-04-21 devnull h->cnt -= s;
1479 28994509 2004-04-21 devnull v = h->sr >> h->cnt;
1480 28994509 2004-04-21 devnull m = (1<<s);
1481 28994509 2004-04-21 devnull v &= m-1;
1482 28994509 2004-04-21 devnull /* level shift */
1483 28994509 2004-04-21 devnull v += m;
1484 28994509 2004-04-21 devnull return v;
1485 28994509 2004-04-21 devnull }
1486 28994509 2004-04-21 devnull
1487 fa325e9b 2020-01-10 cross /*
1488 28994509 2004-04-21 devnull * return next bit of input
1489 28994509 2004-04-21 devnull */
1490 28994509 2004-04-21 devnull static
1491 28994509 2004-04-21 devnull int
1492 28994509 2004-04-21 devnull receivebit(Header *h)
1493 28994509 2004-04-21 devnull {
1494 28994509 2004-04-21 devnull if(h->cnt < 1)
1495 28994509 2004-04-21 devnull nextbyte(h, 0);
1496 28994509 2004-04-21 devnull h->cnt--;
1497 28994509 2004-04-21 devnull return (h->sr >> h->cnt) & 1;
1498 28994509 2004-04-21 devnull }
1499 28994509 2004-04-21 devnull
1500 28994509 2004-04-21 devnull /*
1501 28994509 2004-04-21 devnull * Scaled integer implementation.
1502 28994509 2004-04-21 devnull * inverse two dimensional DCT, Chen-Wang algorithm
1503 28994509 2004-04-21 devnull * (IEEE ASSP-32, pp. 803-816, Aug. 1984)
1504 28994509 2004-04-21 devnull * 32-bit integer arithmetic (8 bit coefficients)
1505 28994509 2004-04-21 devnull * 11 mults, 29 adds per DCT
1506 28994509 2004-04-21 devnull *
1507 28994509 2004-04-21 devnull * coefficients extended to 12 bit for IEEE1180-1990 compliance
1508 28994509 2004-04-21 devnull */
1509 28994509 2004-04-21 devnull
1510 28994509 2004-04-21 devnull enum {
1511 28994509 2004-04-21 devnull W1 = 2841, /* 2048*sqrt(2)*cos(1*pi/16)*/
1512 28994509 2004-04-21 devnull W2 = 2676, /* 2048*sqrt(2)*cos(2*pi/16)*/
1513 28994509 2004-04-21 devnull W3 = 2408, /* 2048*sqrt(2)*cos(3*pi/16)*/
1514 28994509 2004-04-21 devnull W5 = 1609, /* 2048*sqrt(2)*cos(5*pi/16)*/
1515 28994509 2004-04-21 devnull W6 = 1108, /* 2048*sqrt(2)*cos(6*pi/16)*/
1516 28994509 2004-04-21 devnull W7 = 565, /* 2048*sqrt(2)*cos(7*pi/16)*/
1517 28994509 2004-04-21 devnull
1518 28994509 2004-04-21 devnull W1pW7 = 3406, /* W1+W7*/
1519 28994509 2004-04-21 devnull W1mW7 = 2276, /* W1-W7*/
1520 28994509 2004-04-21 devnull W3pW5 = 4017, /* W3+W5*/
1521 28994509 2004-04-21 devnull W3mW5 = 799, /* W3-W5*/
1522 28994509 2004-04-21 devnull W2pW6 = 3784, /* W2+W6*/
1523 28994509 2004-04-21 devnull W2mW6 = 1567, /* W2-W6*/
1524 28994509 2004-04-21 devnull
1525 28994509 2004-04-21 devnull R2 = 181 /* 256/sqrt(2)*/
1526 28994509 2004-04-21 devnull };
1527 28994509 2004-04-21 devnull
1528 28994509 2004-04-21 devnull static
1529 28994509 2004-04-21 devnull void
1530 28994509 2004-04-21 devnull idct(int b[8*8])
1531 28994509 2004-04-21 devnull {
1532 28994509 2004-04-21 devnull int x, y, eighty, v;
1533 28994509 2004-04-21 devnull int x0, x1, x2, x3, x4, x5, x6, x7, x8;
1534 28994509 2004-04-21 devnull int *p;
1535 28994509 2004-04-21 devnull
1536 28994509 2004-04-21 devnull /* transform horizontally*/
1537 28994509 2004-04-21 devnull for(y=0; y<8; y++){
1538 28994509 2004-04-21 devnull eighty = y<<3;
1539 28994509 2004-04-21 devnull /* if all non-DC components are zero, just propagate the DC term*/
1540 28994509 2004-04-21 devnull p = b+eighty;
1541 28994509 2004-04-21 devnull if(p[1]==0)
1542 28994509 2004-04-21 devnull if(p[2]==0 && p[3]==0)
1543 28994509 2004-04-21 devnull if(p[4]==0 && p[5]==0)
1544 28994509 2004-04-21 devnull if(p[6]==0 && p[7]==0){
1545 28994509 2004-04-21 devnull v = p[0]<<3;
1546 28994509 2004-04-21 devnull p[0] = v;
1547 28994509 2004-04-21 devnull p[1] = v;
1548 28994509 2004-04-21 devnull p[2] = v;
1549 28994509 2004-04-21 devnull p[3] = v;
1550 28994509 2004-04-21 devnull p[4] = v;
1551 28994509 2004-04-21 devnull p[5] = v;
1552 28994509 2004-04-21 devnull p[6] = v;
1553 28994509 2004-04-21 devnull p[7] = v;
1554 28994509 2004-04-21 devnull continue;
1555 28994509 2004-04-21 devnull }
1556 28994509 2004-04-21 devnull /* prescale*/
1557 28994509 2004-04-21 devnull x0 = (p[0]<<11)+128;
1558 28994509 2004-04-21 devnull x1 = p[4]<<11;
1559 28994509 2004-04-21 devnull x2 = p[6];
1560 28994509 2004-04-21 devnull x3 = p[2];
1561 28994509 2004-04-21 devnull x4 = p[1];
1562 28994509 2004-04-21 devnull x5 = p[7];
1563 28994509 2004-04-21 devnull x6 = p[5];
1564 28994509 2004-04-21 devnull x7 = p[3];
1565 28994509 2004-04-21 devnull /* first stage*/
1566 28994509 2004-04-21 devnull x8 = W7*(x4+x5);
1567 28994509 2004-04-21 devnull x4 = x8 + W1mW7*x4;
1568 28994509 2004-04-21 devnull x5 = x8 - W1pW7*x5;
1569 28994509 2004-04-21 devnull x8 = W3*(x6+x7);
1570 28994509 2004-04-21 devnull x6 = x8 - W3mW5*x6;
1571 28994509 2004-04-21 devnull x7 = x8 - W3pW5*x7;
1572 28994509 2004-04-21 devnull /* second stage*/
1573 28994509 2004-04-21 devnull x8 = x0 + x1;
1574 28994509 2004-04-21 devnull x0 -= x1;
1575 28994509 2004-04-21 devnull x1 = W6*(x3+x2);
1576 28994509 2004-04-21 devnull x2 = x1 - W2pW6*x2;
1577 28994509 2004-04-21 devnull x3 = x1 + W2mW6*x3;
1578 28994509 2004-04-21 devnull x1 = x4 + x6;
1579 28994509 2004-04-21 devnull x4 -= x6;
1580 28994509 2004-04-21 devnull x6 = x5 + x7;
1581 28994509 2004-04-21 devnull x5 -= x7;
1582 28994509 2004-04-21 devnull /* third stage*/
1583 28994509 2004-04-21 devnull x7 = x8 + x3;
1584 28994509 2004-04-21 devnull x8 -= x3;
1585 28994509 2004-04-21 devnull x3 = x0 + x2;
1586 28994509 2004-04-21 devnull x0 -= x2;
1587 28994509 2004-04-21 devnull x2 = (R2*(x4+x5)+128)>>8;
1588 28994509 2004-04-21 devnull x4 = (R2*(x4-x5)+128)>>8;
1589 28994509 2004-04-21 devnull /* fourth stage*/
1590 28994509 2004-04-21 devnull p[0] = (x7+x1)>>8;
1591 28994509 2004-04-21 devnull p[1] = (x3+x2)>>8;
1592 28994509 2004-04-21 devnull p[2] = (x0+x4)>>8;
1593 28994509 2004-04-21 devnull p[3] = (x8+x6)>>8;
1594 28994509 2004-04-21 devnull p[4] = (x8-x6)>>8;
1595 28994509 2004-04-21 devnull p[5] = (x0-x4)>>8;
1596 28994509 2004-04-21 devnull p[6] = (x3-x2)>>8;
1597 28994509 2004-04-21 devnull p[7] = (x7-x1)>>8;
1598 28994509 2004-04-21 devnull }
1599 28994509 2004-04-21 devnull /* transform vertically*/
1600 28994509 2004-04-21 devnull for(x=0; x<8; x++){
1601 28994509 2004-04-21 devnull /* if all non-DC components are zero, just propagate the DC term*/
1602 28994509 2004-04-21 devnull p = b+x;
1603 28994509 2004-04-21 devnull if(p[8*1]==0)
1604 28994509 2004-04-21 devnull if(p[8*2]==0 && p[8*3]==0)
1605 28994509 2004-04-21 devnull if(p[8*4]==0 && p[8*5]==0)
1606 28994509 2004-04-21 devnull if(p[8*6]==0 && p[8*7]==0){
1607 28994509 2004-04-21 devnull v = (p[8*0]+32)>>6;
1608 28994509 2004-04-21 devnull p[8*0] = v;
1609 28994509 2004-04-21 devnull p[8*1] = v;
1610 28994509 2004-04-21 devnull p[8*2] = v;
1611 28994509 2004-04-21 devnull p[8*3] = v;
1612 28994509 2004-04-21 devnull p[8*4] = v;
1613 28994509 2004-04-21 devnull p[8*5] = v;
1614 28994509 2004-04-21 devnull p[8*6] = v;
1615 28994509 2004-04-21 devnull p[8*7] = v;
1616 28994509 2004-04-21 devnull continue;
1617 28994509 2004-04-21 devnull }
1618 28994509 2004-04-21 devnull /* prescale*/
1619 28994509 2004-04-21 devnull x0 = (p[8*0]<<8)+8192;
1620 28994509 2004-04-21 devnull x1 = p[8*4]<<8;
1621 28994509 2004-04-21 devnull x2 = p[8*6];
1622 28994509 2004-04-21 devnull x3 = p[8*2];
1623 28994509 2004-04-21 devnull x4 = p[8*1];
1624 28994509 2004-04-21 devnull x5 = p[8*7];
1625 28994509 2004-04-21 devnull x6 = p[8*5];
1626 28994509 2004-04-21 devnull x7 = p[8*3];
1627 28994509 2004-04-21 devnull /* first stage*/
1628 28994509 2004-04-21 devnull x8 = W7*(x4+x5) + 4;
1629 28994509 2004-04-21 devnull x4 = (x8+W1mW7*x4)>>3;
1630 28994509 2004-04-21 devnull x5 = (x8-W1pW7*x5)>>3;
1631 28994509 2004-04-21 devnull x8 = W3*(x6+x7) + 4;
1632 28994509 2004-04-21 devnull x6 = (x8-W3mW5*x6)>>3;
1633 28994509 2004-04-21 devnull x7 = (x8-W3pW5*x7)>>3;
1634 28994509 2004-04-21 devnull /* second stage*/
1635 28994509 2004-04-21 devnull x8 = x0 + x1;
1636 28994509 2004-04-21 devnull x0 -= x1;
1637 28994509 2004-04-21 devnull x1 = W6*(x3+x2) + 4;
1638 28994509 2004-04-21 devnull x2 = (x1-W2pW6*x2)>>3;
1639 28994509 2004-04-21 devnull x3 = (x1+W2mW6*x3)>>3;
1640 28994509 2004-04-21 devnull x1 = x4 + x6;
1641 28994509 2004-04-21 devnull x4 -= x6;
1642 28994509 2004-04-21 devnull x6 = x5 + x7;
1643 28994509 2004-04-21 devnull x5 -= x7;
1644 28994509 2004-04-21 devnull /* third stage*/
1645 28994509 2004-04-21 devnull x7 = x8 + x3;
1646 28994509 2004-04-21 devnull x8 -= x3;
1647 28994509 2004-04-21 devnull x3 = x0 + x2;
1648 28994509 2004-04-21 devnull x0 -= x2;
1649 28994509 2004-04-21 devnull x2 = (R2*(x4+x5)+128)>>8;
1650 28994509 2004-04-21 devnull x4 = (R2*(x4-x5)+128)>>8;
1651 28994509 2004-04-21 devnull /* fourth stage*/
1652 28994509 2004-04-21 devnull p[8*0] = (x7+x1)>>14;
1653 28994509 2004-04-21 devnull p[8*1] = (x3+x2)>>14;
1654 28994509 2004-04-21 devnull p[8*2] = (x0+x4)>>14;
1655 28994509 2004-04-21 devnull p[8*3] = (x8+x6)>>14;
1656 28994509 2004-04-21 devnull p[8*4] = (x8-x6)>>14;
1657 28994509 2004-04-21 devnull p[8*5] = (x0-x4)>>14;
1658 28994509 2004-04-21 devnull p[8*6] = (x3-x2)>>14;
1659 28994509 2004-04-21 devnull p[8*7] = (x7-x1)>>14;
1660 28994509 2004-04-21 devnull }
1661 28994509 2004-04-21 devnull }