ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/Video-Capture-V4l/RTjpeg/codec/RTjpeg.c
Revision: 1.1
Committed: Mon Jun 5 23:36:36 2006 UTC (20 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 /* Autogenerated by compose.sh */
2     #include "RTjpeg.h"
3    
4     /*
5    
6     Main Routines
7    
8     This file contains most of the initialisation and control functions
9    
10     (C) Justin Schoeman 1998
11    
12     */
13    
14     #include <sys/types.h>
15     #include <stdio.h>
16     #include <stdlib.h>
17     #include <string.h>
18    
19     #ifdef MMX
20     #include <mmx.h>
21     #endif
22     static const unsigned char RTjpeg_ZZ[64]={
23     0,
24     8, 1,
25     2, 9, 16,
26     24, 17, 10, 3,
27     4, 11, 18, 25, 32,
28     40, 33, 26, 19, 12, 5,
29     6, 13, 20, 27, 34, 41, 48,
30     56, 49, 42, 35, 28, 21, 14, 7,
31     15, 22, 29, 36, 43, 50, 57,
32     58, 51, 44, 37, 30, 23,
33     31, 38, 45, 52, 59,
34     60, 53, 46, 39,
35     47, 54, 61,
36     62, 55,
37     63 };
38     static const u64 RTjpeg_aan_tab[64]={
39     4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, 3374581504ULL, 2324432128ULL, 1184891264ULL,
40     5957222912ULL, 8263040512ULL, 7783580160ULL, 7005009920ULL, 5957222912ULL, 4680582144ULL, 3224107520ULL, 1643641088ULL,
41     5611718144ULL, 7783580160ULL, 7331904512ULL, 6598688768ULL, 5611718144ULL, 4408998912ULL, 3036936960ULL, 1548224000ULL,
42     5050464768ULL, 7005009920ULL, 6598688768ULL, 5938608128ULL, 5050464768ULL, 3968072960ULL, 2733115392ULL, 1393296000ULL,
43     4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, 3374581504ULL, 2324432128ULL, 1184891264ULL,
44     3374581504ULL, 4680582144ULL, 4408998912ULL, 3968072960ULL, 3374581504ULL, 2651326208ULL, 1826357504ULL, 931136000ULL,
45     2324432128ULL, 3224107520ULL, 3036936960ULL, 2733115392ULL, 2324432128ULL, 1826357504ULL, 1258030336ULL, 641204288ULL,
46     1184891264ULL, 1643641088ULL, 1548224000ULL, 1393296000ULL, 1184891264ULL, 931136000ULL, 641204288ULL, 326894240ULL,
47     };
48    
49     static s32 RTjpeg_ws[64+31];
50     u8 RTjpeg_alldata[2*64+4*64+4*64+4*64+4*64+32];
51    
52     s16 *RTjpeg_block;
53     s32 *RTjpeg_lqt;
54     s32 *RTjpeg_cqt;
55     u32 *RTjpeg_liqt;
56     u32 *RTjpeg_ciqt;
57    
58     unsigned char RTjpeg_lb8;
59     unsigned char RTjpeg_cb8;
60     int RTjpeg_width, RTjpeg_height;
61    
62     s16 *RTjpeg_old=NULL;
63    
64     #ifdef MMX
65     mmx_t RTjpeg_lmask;
66     mmx_t RTjpeg_cmask;
67     #else
68     u16 RTjpeg_lmask;
69     u16 RTjpeg_cmask;
70     #endif
71     int RTjpeg_mtest=0;
72    
73     static const unsigned char RTjpeg_lum_quant_tbl[64] = {
74     16, 11, 10, 16, 24, 40, 51, 61,
75     12, 12, 14, 19, 26, 58, 60, 55,
76     14, 13, 16, 24, 40, 57, 69, 56,
77     14, 17, 22, 29, 51, 87, 80, 62,
78     18, 22, 37, 56, 68, 109, 103, 77,
79     24, 35, 55, 64, 81, 104, 113, 92,
80     49, 64, 78, 87, 103, 121, 120, 101,
81     72, 92, 95, 98, 112, 100, 103, 99
82     };
83    
84     static const unsigned char RTjpeg_chrom_quant_tbl[64] = {
85     17, 18, 24, 47, 99, 99, 99, 99,
86     18, 21, 26, 66, 99, 99, 99, 99,
87     24, 26, 56, 99, 99, 99, 99, 99,
88     47, 66, 99, 99, 99, 99, 99, 99,
89     99, 99, 99, 99, 99, 99, 99, 99,
90     99, 99, 99, 99, 99, 99, 99, 99,
91     99, 99, 99, 99, 99, 99, 99, 99,
92     99, 99, 99, 99, 99, 99, 99, 99
93     };
94    
95     int RTjpeg_b2s(s16 *data, s8 *strm, u8 bt8)
96     {
97     int ci=1, co=1, tmp;
98    
99     strm[0]=(s8)(u8)(data[RTjpeg_ZZ[0]]>254) ? 254:((data[RTjpeg_ZZ[0]]<0)?0:data[RTjpeg_ZZ[0]]);
100    
101     for(ci=1; ci<=bt8; ci++)
102     if(data[RTjpeg_ZZ[ci]]>0)
103     {
104     strm[co++]=(s8)(data[RTjpeg_ZZ[ci]]>127)?127:data[RTjpeg_ZZ[ci]];
105     } else
106     {
107     strm[co++]=(s8)(data[RTjpeg_ZZ[ci]]<-128)?-128:data[RTjpeg_ZZ[ci]];
108     }
109     for(; ci<64; ci++)
110     if(data[RTjpeg_ZZ[ci]]>0)
111     {
112     strm[co++]=(s8)(data[RTjpeg_ZZ[ci]]>63)?63:data[RTjpeg_ZZ[ci]];
113     } else if(data[RTjpeg_ZZ[ci]]<0)
114     {
115     strm[co++]=(s8)(data[RTjpeg_ZZ[ci]]<-64)?-64:data[RTjpeg_ZZ[ci]];
116     } else /* compress zeros */
117     {
118     tmp=ci;
119     do
120     {
121     ci++;
122     } while((ci<64)&&(data[RTjpeg_ZZ[ci]]==0));
123     strm[co++]=(s8)(63+(ci-tmp));
124     ci--;
125     }
126     return (int)co;
127     }
128     int RTjpeg_s2b(s16 *data, s8 *strm, u8 bt8, u32 *qtbl)
129     {
130     int ci=1, co=1, tmp;
131     register int i;
132    
133     i=RTjpeg_ZZ[0];
134     data[i]=((u8)strm[0])*qtbl[i];
135    
136     for(co=1; co<=bt8; co++)
137     {
138     i=RTjpeg_ZZ[co];
139     data[i]=strm[ci++]*qtbl[i];
140     }
141    
142     for(; co<64; co++)
143     {
144     if(strm[ci]>63)
145     {
146     tmp=co+strm[ci]-63;
147     for(; co<tmp; co++)data[RTjpeg_ZZ[co]]=0;
148     co--;
149     } else
150     {
151     i=RTjpeg_ZZ[co];
152     data[i]=strm[ci]*qtbl[i];
153     }
154     ci++;
155     }
156     return (int)ci;
157     }
158     void RTjpeg_quant_init(void)
159     {
160     }
161    
162     void RTjpeg_quant(s16 *block, s32 *qtbl)
163     {
164     int i;
165    
166     for(i=0; i<64; i++)
167     block[i]=(s16)((block[i]*qtbl[i]+32767)>>16);
168     }
169     void RTjpeg_color_init(void)
170     {
171     }
172    
173     #define KcrR 76284
174     #define KcrG 53281
175     #define KcbG 25625
176     #define KcbB 132252
177     #define Ky 76284
178    
179     void RTjpeg_yuvrgb(u8 *buf, u8 *rgb)
180     {
181     int tmp;
182     int i, j;
183     s32 y, crR, crG, cbG, cbB;
184     u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
185     int oskip, yskip;
186    
187     oskip=RTjpeg_width*3;
188     yskip=RTjpeg_width;
189    
190     bufcb=&buf[RTjpeg_width*RTjpeg_height];
191     bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
192     bufy=&buf[0];
193     bufoute=rgb;
194     bufouto=rgb+oskip;
195    
196     for(i=0; i<(RTjpeg_height>>1); i++)
197     {
198     for(j=0; j<RTjpeg_width; j+=2)
199     {
200     crR=(*bufcr-128)*KcrR;
201     crG=(*(bufcr++)-128)*KcrG;
202     cbG=(*bufcb-128)*KcbG;
203     cbB=(*(bufcb++)-128)*KcbB;
204    
205     y=(bufy[j]-16)*Ky;
206    
207     tmp=(y+crR)>>16;
208     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
209     tmp=(y-crG-cbG)>>16;
210     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
211     tmp=(y+cbB)>>16;
212     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
213    
214     y=(bufy[j+1]-16)*Ky;
215    
216     tmp=(y+crR)>>16;
217     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
218     tmp=(y-crG-cbG)>>16;
219     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
220     tmp=(y+cbB)>>16;
221     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
222    
223     y=(bufy[j+yskip]-16)*Ky;
224    
225     tmp=(y+crR)>>16;
226     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
227     tmp=(y-crG-cbG)>>16;
228     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
229     tmp=(y+cbB)>>16;
230     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
231    
232     y=(bufy[j+1+yskip]-16)*Ky;
233    
234     tmp=(y+crR)>>16;
235     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
236     tmp=(y-crG-cbG)>>16;
237     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
238     tmp=(y+cbB)>>16;
239     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
240    
241     }
242     bufoute+=oskip;
243     bufouto+=oskip;
244     bufy+=yskip<<1;
245     }
246     }
247    
248    
249     void RTjpeg_yuvrgb32(u8 *buf, u8 *rgb)
250     {
251     int tmp;
252     int i, j;
253     s32 y, crR, crG, cbG, cbB;
254     u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
255     int oskip, yskip;
256    
257     oskip=RTjpeg_width*4;
258     yskip=RTjpeg_width;
259    
260     bufcb=&buf[RTjpeg_width*RTjpeg_height];
261     bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
262     bufy=&buf[0];
263     bufoute=rgb;
264     bufouto=rgb+oskip;
265    
266     for(i=0; i<(RTjpeg_height>>1); i++)
267     {
268     for(j=0; j<RTjpeg_width; j+=2)
269     {
270     crR=(*bufcr-128)*KcrR;
271     crG=(*(bufcr++)-128)*KcrG;
272     cbG=(*bufcb-128)*KcbG;
273     cbB=(*(bufcb++)-128)*KcbB;
274    
275     y=(bufy[j]-16)*Ky;
276    
277     tmp=(y+cbB)>>16;
278     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
279     tmp=(y-crG-cbG)>>16;
280     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
281     tmp=(y+crR)>>16;
282     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
283     bufoute++;
284    
285     y=(bufy[j+1]-16)*Ky;
286    
287     tmp=(y+cbB)>>16;
288     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
289     tmp=(y-crG-cbG)>>16;
290     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
291     tmp=(y+crR)>>16;
292     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
293     bufoute++;
294    
295     y=(bufy[j+yskip]-16)*Ky;
296    
297     tmp=(y+cbB)>>16;
298     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
299     tmp=(y-crG-cbG)>>16;
300     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
301     tmp=(y+crR)>>16;
302     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
303     bufouto++;
304    
305     y=(bufy[j+1+yskip]-16)*Ky;
306    
307     tmp=(y+cbB)>>16;
308     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
309     tmp=(y-crG-cbG)>>16;
310     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
311     tmp=(y+crR)>>16;
312     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
313     bufouto++;
314    
315     }
316     bufoute+=oskip;
317     bufouto+=oskip;
318     bufy+=yskip<<1;
319     }
320     }
321    
322     void RTjpeg_yuvrgb24(u8 *buf, u8 *rgb)
323     {
324     int tmp;
325     int i, j;
326     s32 y, crR, crG, cbG, cbB;
327     u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
328     int oskip, yskip;
329    
330     oskip=RTjpeg_width*3;
331     yskip=RTjpeg_width;
332    
333     bufcb=&buf[RTjpeg_width*RTjpeg_height];
334     bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
335     bufy=&buf[0];
336     bufoute=rgb;
337     bufouto=rgb+oskip;
338    
339     for(i=0; i<(RTjpeg_height>>1); i++)
340     {
341     for(j=0; j<RTjpeg_width; j+=2)
342     {
343     crR=(*bufcr-128)*KcrR;
344     crG=(*(bufcr++)-128)*KcrG;
345     cbG=(*bufcb-128)*KcbG;
346     cbB=(*(bufcb++)-128)*KcbB;
347    
348     y=(bufy[j]-16)*Ky;
349    
350     tmp=(y+cbB)>>16;
351     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
352     tmp=(y-crG-cbG)>>16;
353     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
354     tmp=(y+crR)>>16;
355     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
356    
357     y=(bufy[j+1]-16)*Ky;
358    
359     tmp=(y+cbB)>>16;
360     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
361     tmp=(y-crG-cbG)>>16;
362     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
363     tmp=(y+crR)>>16;
364     *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
365    
366     y=(bufy[j+yskip]-16)*Ky;
367    
368     tmp=(y+cbB)>>16;
369     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
370     tmp=(y-crG-cbG)>>16;
371     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
372     tmp=(y+crR)>>16;
373     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
374    
375     y=(bufy[j+1+yskip]-16)*Ky;
376    
377     tmp=(y+cbB)>>16;
378     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
379     tmp=(y-crG-cbG)>>16;
380     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
381     tmp=(y+crR)>>16;
382     *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
383    
384     }
385     bufoute+=oskip;
386     bufouto+=oskip;
387     bufy+=yskip<<1;
388     }
389     }
390    
391     void RTjpeg_yuvrgb16(u8 *buf, u8 *rgb)
392     {
393     int tmp;
394     int i, j;
395     s32 y, crR, crG, cbG, cbB;
396     u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
397     int oskip, yskip;
398     unsigned char r, g, b;
399    
400     oskip=RTjpeg_width*2;
401     yskip=RTjpeg_width;
402    
403     bufcb=&buf[RTjpeg_width*RTjpeg_height];
404     bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
405     bufy=&buf[0];
406     bufoute=rgb;
407     bufouto=rgb+oskip;
408    
409     for(i=0; i<(RTjpeg_height>>1); i++)
410     {
411     for(j=0; j<RTjpeg_width; j+=2)
412     {
413     crR=(*bufcr-128)*KcrR;
414     crG=(*(bufcr++)-128)*KcrG;
415     cbG=(*bufcb-128)*KcbG;
416     cbB=(*(bufcb++)-128)*KcbB;
417    
418     y=(bufy[j]-16)*Ky;
419    
420     tmp=(y+cbB)>>16;
421     b=(tmp>255)?255:((tmp<0)?0:tmp);
422     tmp=(y-crG-cbG)>>16;
423     g=(tmp>255)?255:((tmp<0)?0:tmp);
424     tmp=(y+crR)>>16;
425     r=(tmp>255)?255:((tmp<0)?0:tmp);
426     tmp=(int)((int)b >> 3);
427     tmp|=(int)(((int)g >> 2) << 5);
428     tmp|=(int)(((int)r >> 3) << 11);
429     *(bufoute++)=tmp&0xff;
430     *(bufoute++)=tmp>>8;
431    
432    
433     y=(bufy[j+1]-16)*Ky;
434    
435     tmp=(y+cbB)>>16;
436     b=(tmp>255)?255:((tmp<0)?0:tmp);
437     tmp=(y-crG-cbG)>>16;
438     g=(tmp>255)?255:((tmp<0)?0:tmp);
439     tmp=(y+crR)>>16;
440     r=(tmp>255)?255:((tmp<0)?0:tmp);
441     tmp=(int)((int)b >> 3);
442     tmp|=(int)(((int)g >> 2) << 5);
443     tmp|=(int)(((int)r >> 3) << 11);
444     *(bufoute++)=tmp&0xff;
445     *(bufoute++)=tmp>>8;
446    
447     y=(bufy[j+yskip]-16)*Ky;
448    
449     tmp=(y+cbB)>>16;
450     b=(tmp>255)?255:((tmp<0)?0:tmp);
451     tmp=(y-crG-cbG)>>16;
452     g=(tmp>255)?255:((tmp<0)?0:tmp);
453     tmp=(y+crR)>>16;
454     r=(tmp>255)?255:((tmp<0)?0:tmp);
455     tmp=(int)((int)b >> 3);
456     tmp|=(int)(((int)g >> 2) << 5);
457     tmp|=(int)(((int)r >> 3) << 11);
458     *(bufouto++)=tmp&0xff;
459     *(bufouto++)=tmp>>8;
460    
461     y=(bufy[j+1+yskip]-16)*Ky;
462    
463     tmp=(y+cbB)>>16;
464     b=(tmp>255)?255:((tmp<0)?0:tmp);
465     tmp=(y-crG-cbG)>>16;
466     g=(tmp>255)?255:((tmp<0)?0:tmp);
467     tmp=(y+crR)>>16;
468     r=(tmp>255)?255:((tmp<0)?0:tmp);
469     tmp=(int)((int)b >> 3);
470     tmp|=(int)(((int)g >> 2) << 5);
471     tmp|=(int)(((int)r >> 3) << 11);
472     *(bufouto++)=tmp&0xff;
473     *(bufouto++)=tmp>>8;
474    
475     }
476     bufoute+=oskip;
477     bufouto+=oskip;
478     bufy+=yskip<<1;
479     }
480     }
481    
482     void RTjpeg_yuvrgb8(u8 *buf, u8 *rgb)
483     {
484     bcopy(buf, rgb, RTjpeg_width*RTjpeg_height);
485     }
486    
487     void RTjpeg_double32(u32 *buf)
488     {
489     int i, j;
490    
491     u32 *iptr, *optr1, *optr2;
492    
493     iptr=buf+(RTjpeg_width*RTjpeg_height)-1;
494     optr1=buf+(RTjpeg_width*RTjpeg_height*4)-1;
495     optr2=optr1-(2*RTjpeg_width);
496    
497     for(i=0; i<RTjpeg_height; i++)
498     {
499     for(j=0; j<RTjpeg_width; j++)
500     {
501     *(optr1--)=*iptr;
502     *(optr1--)=*iptr;
503     *(optr2--)=*iptr;
504     *(optr2--)=*(iptr--);
505     }
506     optr2=optr2-2*RTjpeg_width;
507     optr1=optr1-2*RTjpeg_width;
508     }
509     }
510    
511     void RTjpeg_double24(u8 *buf)
512     {
513     }
514    
515     void RTjpeg_double16(u16 *buf)
516     {
517     int i, j;
518    
519     u16 *iptr, *optr1, *optr2;
520    
521     iptr=buf+(RTjpeg_width*RTjpeg_height)-1;
522     optr1=buf+(RTjpeg_width*RTjpeg_height*4)-1;
523     optr2=optr1-(2*RTjpeg_width);
524    
525     for(i=0; i<RTjpeg_height; i++)
526     {
527     for(j=0; j<RTjpeg_width; j++)
528     {
529     *(optr1--)=*iptr;
530     *(optr1--)=*iptr;
531     *(optr2--)=*iptr;
532     *(optr2--)=*(iptr--);
533     }
534     optr2=optr2-2*RTjpeg_width;
535     optr1=optr1-2*RTjpeg_width;
536     }
537     }
538    
539     void RTjpeg_double8(u8 *buf)
540     {
541     int i, j;
542    
543     u8 *iptr, *optr1, *optr2;
544    
545     iptr=buf+(RTjpeg_width*RTjpeg_height)-1;
546     optr1=buf+(RTjpeg_width*RTjpeg_height*4)-1;
547     optr2=optr1-(2*RTjpeg_width);
548    
549     for(i=0; i<RTjpeg_height; i++)
550     {
551     for(j=0; j<RTjpeg_width; j++)
552     {
553     *(optr1--)=*iptr;
554     *(optr1--)=*iptr;
555     *(optr2--)=*iptr;
556     *(optr2--)=*(iptr--);
557     }
558     optr2=optr2-2*RTjpeg_width;
559     optr1=optr1-2*RTjpeg_width;
560     }
561     }
562    
563     #define FIX_0_382683433 ((s32) 98) /* FIX(0.382683433) */
564     #define FIX_0_541196100 ((s32) 139) /* FIX(0.541196100) */
565     #define FIX_0_707106781 ((s32) 181) /* FIX(0.707106781) */
566     #define FIX_1_306562965 ((s32) 334) /* FIX(1.306562965) */
567    
568     #define DESCALE10(x) (s16)( ((x)+128) >> 8)
569     #define DESCALE20(x) (s16)(((x)+32768) >> 16)
570     #define D_MULTIPLY(var,const) ((s32) ((var) * (const)))
571    
572     void RTjpeg_dct_init(void)
573     {
574     int i;
575    
576     for(i=0; i<64; i++)
577     {
578     RTjpeg_lqt[i]=(((u64)RTjpeg_lqt[i]<<32)/RTjpeg_aan_tab[i]);
579     RTjpeg_cqt[i]=(((u64)RTjpeg_cqt[i]<<32)/RTjpeg_aan_tab[i]);
580     }
581     }
582    
583     void RTjpeg_dct (u8 *idata, s16 *odata, int rskip)
584     {
585     s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
586     s32 tmp10, tmp11, tmp12, tmp13;
587     s32 z1, z2, z3, z4, z5, z11, z13;
588     u8 *idataptr;
589     s16 *odataptr;
590     s32 *wsptr;
591     int ctr;
592    
593     idataptr = idata;
594     wsptr = RTjpeg_ws;
595     for (ctr = 7; ctr >= 0; ctr--) {
596     tmp0 = idataptr[0] + idataptr[7];
597     tmp7 = idataptr[0] - idataptr[7];
598     tmp1 = idataptr[1] + idataptr[6];
599     tmp6 = idataptr[1] - idataptr[6];
600     tmp2 = idataptr[2] + idataptr[5];
601     tmp5 = idataptr[2] - idataptr[5];
602     tmp3 = idataptr[3] + idataptr[4];
603     tmp4 = idataptr[3] - idataptr[4];
604    
605     tmp10 = (tmp0 + tmp3); /* phase 2 */
606     tmp13 = tmp0 - tmp3;
607     tmp11 = (tmp1 + tmp2);
608     tmp12 = tmp1 - tmp2;
609    
610     wsptr[0] = (tmp10 + tmp11)<<8; /* phase 3 */
611     wsptr[4] = (tmp10 - tmp11)<<8;
612    
613     z1 = D_MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
614     wsptr[2] = (tmp13<<8) + z1; /* phase 5 */
615     wsptr[6] = (tmp13<<8) - z1;
616    
617     tmp10 = tmp4 + tmp5; /* phase 2 */
618     tmp11 = tmp5 + tmp6;
619     tmp12 = tmp6 + tmp7;
620    
621     z5 = D_MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
622     z2 = D_MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
623     z4 = D_MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
624     z3 = D_MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
625    
626     z11 = (tmp7<<8) + z3; /* phase 5 */
627     z13 = (tmp7<<8) - z3;
628    
629     wsptr[5] = z13 + z2; /* phase 6 */
630     wsptr[3] = z13 - z2;
631     wsptr[1] = z11 + z4;
632     wsptr[7] = z11 - z4;
633    
634     idataptr += rskip; /* advance pointer to next row */
635     wsptr += 8;
636     }
637    
638     wsptr = RTjpeg_ws;
639     odataptr=odata;
640     for (ctr = 7; ctr >= 0; ctr--) {
641     tmp0 = wsptr[0] + wsptr[56];
642     tmp7 = wsptr[0] - wsptr[56];
643     tmp1 = wsptr[8] + wsptr[48];
644     tmp6 = wsptr[8] - wsptr[48];
645     tmp2 = wsptr[16] + wsptr[40];
646     tmp5 = wsptr[16] - wsptr[40];
647     tmp3 = wsptr[24] + wsptr[32];
648     tmp4 = wsptr[24] - wsptr[32];
649    
650     tmp10 = tmp0 + tmp3; /* phase 2 */
651     tmp13 = tmp0 - tmp3;
652     tmp11 = tmp1 + tmp2;
653     tmp12 = tmp1 - tmp2;
654    
655     odataptr[0] = DESCALE10(tmp10 + tmp11); /* phase 3 */
656     odataptr[32] = DESCALE10(tmp10 - tmp11);
657    
658     z1 = D_MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
659     odataptr[16] = DESCALE20((tmp13<<8) + z1); /* phase 5 */
660     odataptr[48] = DESCALE20((tmp13<<8) - z1);
661    
662     tmp10 = tmp4 + tmp5; /* phase 2 */
663     tmp11 = tmp5 + tmp6;
664     tmp12 = tmp6 + tmp7;
665    
666     z5 = D_MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
667     z2 = D_MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
668     z4 = D_MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
669     z3 = D_MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
670    
671     z11 = (tmp7<<8) + z3; /* phase 5 */
672     z13 = (tmp7<<8) - z3;
673    
674     odataptr[40] = DESCALE20(z13 + z2); /* phase 6 */
675     odataptr[24] = DESCALE20(z13 - z2);
676     odataptr[8] = DESCALE20(z11 + z4);
677     odataptr[56] = DESCALE20(z11 - z4);
678    
679     odataptr++; /* advance pointer to next column */
680     wsptr++;
681     }
682     }
683     #define FIX_1_082392200 ((s32) 277) /* FIX(1.082392200) */
684     #define FIX_1_414213562 ((s32) 362) /* FIX(1.414213562) */
685     #define FIX_1_847759065 ((s32) 473) /* FIX(1.847759065) */
686     #define FIX_2_613125930 ((s32) 669) /* FIX(2.613125930) */
687    
688     #define DESCALE(x) (s16)( ((x)+4) >> 3)
689    
690     /* clip yuv to 16..235 (should be 16..240 for cr/cb but ... */
691    
692     #define RL(x) ((x)>235) ? 235 : (((x)<16) ? 16 : (x))
693     #define MULTIPLY(var,const) (((s32) ((var) * (const)) + 128)>>8)
694    
695     void RTjpeg_idct_init(void)
696     {
697     int i;
698    
699     for(i=0; i<64; i++)
700     {
701     RTjpeg_liqt[i]=((u64)RTjpeg_liqt[i]*RTjpeg_aan_tab[i])>>32;
702     RTjpeg_ciqt[i]=((u64)RTjpeg_ciqt[i]*RTjpeg_aan_tab[i])>>32;
703     }
704     }
705    
706     void RTjpeg_idct(u8 *odata, s16 *data, int rskip)
707     {
708     s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
709     s32 tmp10, tmp11, tmp12, tmp13;
710     s32 z5, z10, z11, z12, z13;
711     s16 *inptr;
712     s32 *wsptr;
713     u8 *outptr;
714     int ctr;
715     s32 dcval;
716     s32 workspace[64];
717    
718     inptr = data;
719     wsptr = workspace;
720     for (ctr = 8; ctr > 0; ctr--) {
721    
722     if ((inptr[8] | inptr[16] | inptr[24] |
723     inptr[32] | inptr[40] | inptr[48] | inptr[56]) == 0) {
724     dcval = inptr[0];
725     wsptr[0] = dcval;
726     wsptr[8] = dcval;
727     wsptr[16] = dcval;
728     wsptr[24] = dcval;
729     wsptr[32] = dcval;
730     wsptr[40] = dcval;
731     wsptr[48] = dcval;
732     wsptr[56] = dcval;
733    
734     inptr++;
735     wsptr++;
736     continue;
737     }
738    
739     tmp0 = inptr[0];
740     tmp1 = inptr[16];
741     tmp2 = inptr[32];
742     tmp3 = inptr[48];
743    
744     tmp10 = tmp0 + tmp2;
745     tmp11 = tmp0 - tmp2;
746    
747     tmp13 = tmp1 + tmp3;
748     tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13;
749    
750     tmp0 = tmp10 + tmp13;
751     tmp3 = tmp10 - tmp13;
752     tmp1 = tmp11 + tmp12;
753     tmp2 = tmp11 - tmp12;
754    
755     tmp4 = inptr[8];
756     tmp5 = inptr[24];
757     tmp6 = inptr[40];
758     tmp7 = inptr[56];
759    
760     z13 = tmp6 + tmp5;
761     z10 = tmp6 - tmp5;
762     z11 = tmp4 + tmp7;
763     z12 = tmp4 - tmp7;
764    
765     tmp7 = z11 + z13;
766     tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
767    
768     z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
769     tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
770     tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
771    
772     tmp6 = tmp12 - tmp7;
773     tmp5 = tmp11 - tmp6;
774     tmp4 = tmp10 + tmp5;
775    
776     wsptr[0] = (s32) (tmp0 + tmp7);
777     wsptr[56] = (s32) (tmp0 - tmp7);
778     wsptr[8] = (s32) (tmp1 + tmp6);
779     wsptr[48] = (s32) (tmp1 - tmp6);
780     wsptr[16] = (s32) (tmp2 + tmp5);
781     wsptr[40] = (s32) (tmp2 - tmp5);
782     wsptr[32] = (s32) (tmp3 + tmp4);
783     wsptr[24] = (s32) (tmp3 - tmp4);
784    
785     inptr++;
786     wsptr++;
787     }
788    
789     wsptr = workspace;
790     for (ctr = 0; ctr < 8; ctr++) {
791     outptr = &(odata[ctr*rskip]);
792    
793     tmp10 = wsptr[0] + wsptr[4];
794     tmp11 = wsptr[0] - wsptr[4];
795    
796     tmp13 = wsptr[2] + wsptr[6];
797     tmp12 = MULTIPLY(wsptr[2] - wsptr[6], FIX_1_414213562) - tmp13;
798    
799     tmp0 = tmp10 + tmp13;
800     tmp3 = tmp10 - tmp13;
801     tmp1 = tmp11 + tmp12;
802     tmp2 = tmp11 - tmp12;
803    
804     z13 = wsptr[5] + wsptr[3];
805     z10 = wsptr[5] - wsptr[3];
806     z11 = wsptr[1] + wsptr[7];
807     z12 = wsptr[1] - wsptr[7];
808    
809     tmp7 = z11 + z13;
810     tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
811    
812     z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
813     tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
814     tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
815    
816     tmp6 = tmp12 - tmp7;
817     tmp5 = tmp11 - tmp6;
818     tmp4 = tmp10 + tmp5;
819    
820     outptr[0] = RL(DESCALE(tmp0 + tmp7));
821     outptr[7] = RL(DESCALE(tmp0 - tmp7));
822     outptr[1] = RL(DESCALE(tmp1 + tmp6));
823     outptr[6] = RL(DESCALE(tmp1 - tmp6));
824     outptr[2] = RL(DESCALE(tmp2 + tmp5));
825     outptr[5] = RL(DESCALE(tmp2 - tmp5));
826     outptr[4] = RL(DESCALE(tmp3 + tmp4));
827     outptr[3] = RL(DESCALE(tmp3 - tmp4));
828    
829     wsptr += 8;
830     }
831     }
832     /*
833    
834     Main Routines
835    
836     This file contains most of the initialisation and control functions
837    
838     (C) Justin Schoeman 1998
839    
840     */
841    
842     /*
843    
844     Private function
845    
846     Initialise all the cache-aliged data blocks
847    
848     */
849    
850     void
851     RTjpeg_init_data (void)
852     {
853     unsigned long dptr;
854    
855     dptr = (unsigned long) &(RTjpeg_alldata[0]);
856     dptr += 32;
857     dptr = dptr >> 5;
858     dptr = dptr << 5; /* cache align data */
859    
860     RTjpeg_block = (s16 *) dptr;
861     dptr += sizeof (s16) * 64;
862     RTjpeg_lqt = (s32 *) dptr;
863     dptr += sizeof (s32) * 64;
864     RTjpeg_cqt = (s32 *) dptr;
865     dptr += sizeof (s32) * 64;
866     RTjpeg_liqt = (u32 *) dptr;
867     dptr += sizeof (u32) * 64;
868     RTjpeg_ciqt = (u32 *) dptr;
869     }
870    
871     /*
872    
873     External Function
874    
875     Re-set quality factor
876    
877     Input: buf -> pointer to 128 ints for quant values store to pass back to
878     init_decompress.
879     Q -> quality factor (192=best, 32=worst)
880     */
881    
882     void
883     RTjpeg_init_Q (u8 Q)
884     {
885     int i;
886     u64 qual;
887    
888     qual = (u64) Q << (32 - 7); /* 32 bit FP, 255=2, 0=0 */
889    
890     for (i = 0; i < 64; i++)
891     {
892     RTjpeg_lqt[i] = (s32) ((qual / ((u64) RTjpeg_lum_quant_tbl[i] << 16)) >> 3);
893     if (RTjpeg_lqt[i] == 0)
894     RTjpeg_lqt[i] = 1;
895     RTjpeg_cqt[i] = (s32) ((qual / ((u64) RTjpeg_chrom_quant_tbl[i] << 16)) >> 3);
896     if (RTjpeg_cqt[i] == 0)
897     RTjpeg_cqt[i] = 1;
898     RTjpeg_liqt[i] = (1 << 16) / (RTjpeg_lqt[i] << 3);
899     RTjpeg_ciqt[i] = (1 << 16) / (RTjpeg_cqt[i] << 3);
900     RTjpeg_lqt[i] = ((1 << 16) / RTjpeg_liqt[i]) >> 3;
901     RTjpeg_cqt[i] = ((1 << 16) / RTjpeg_ciqt[i]) >> 3;
902     }
903    
904     RTjpeg_lb8 = 0;
905     while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8);
906     RTjpeg_lb8--;
907     RTjpeg_cb8 = 0;
908     while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8);
909     RTjpeg_cb8--;
910    
911     RTjpeg_dct_init ();
912     RTjpeg_idct_init ();
913     RTjpeg_quant_init ();
914     }
915    
916     /*
917    
918     External Function
919    
920     Initialise compression.
921    
922     Input: buf -> pointer to 128 ints for quant values store to pass back to
923     init_decompress.
924     width -> width of image
925     height -> height of image
926     Q -> quality factor (192=best, 32=worst)
927    
928     */
929    
930     void
931     RTjpeg_init_compress (u32 * buf, int width, int height, u8 Q)
932     {
933     int i;
934     u64 qual;
935    
936     RTjpeg_init_data ();
937    
938     RTjpeg_width = width;
939     RTjpeg_height = height;
940    
941     qual = (u64) Q << (32 - 7); /* 32 bit FP, 255=2, 0=0 */
942    
943     for (i = 0; i < 64; i++)
944     {
945     RTjpeg_lqt[i] = (s32) ((qual / ((u64) RTjpeg_lum_quant_tbl[i] << 16)) >> 3);
946     if (RTjpeg_lqt[i] == 0)
947     RTjpeg_lqt[i] = 1;
948     RTjpeg_cqt[i] = (s32) ((qual / ((u64) RTjpeg_chrom_quant_tbl[i] << 16)) >> 3);
949     if (RTjpeg_cqt[i] == 0)
950     RTjpeg_cqt[i] = 1;
951     RTjpeg_liqt[i] = (1 << 16) / (RTjpeg_lqt[i] << 3);
952     RTjpeg_ciqt[i] = (1 << 16) / (RTjpeg_cqt[i] << 3);
953     RTjpeg_lqt[i] = ((1 << 16) / RTjpeg_liqt[i]) >> 3;
954     RTjpeg_cqt[i] = ((1 << 16) / RTjpeg_ciqt[i]) >> 3;
955     }
956    
957     RTjpeg_lb8 = 0;
958     while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8);
959     RTjpeg_lb8--;
960     RTjpeg_cb8 = 0;
961     while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8);
962     RTjpeg_cb8--;
963    
964     RTjpeg_dct_init ();
965     RTjpeg_quant_init ();
966    
967     for (i = 0; i < 64; i++)
968     buf[i] = RTjpeg_liqt[i];
969     for (i = 0; i < 64; i++)
970     buf[64 + i] = RTjpeg_ciqt[i];
971     }
972    
973     void
974     RTjpeg_init_decompress (u32 * buf, int width, int height)
975     {
976     int i;
977    
978     RTjpeg_init_data ();
979    
980     RTjpeg_width = width;
981     RTjpeg_height = height;
982    
983     for (i = 0; i < 64; i++)
984     {
985     RTjpeg_liqt[i] = buf[i];
986     RTjpeg_ciqt[i] = buf[i + 64];
987     }
988    
989     RTjpeg_lb8 = 0;
990     while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8);
991     RTjpeg_lb8--;
992     RTjpeg_cb8 = 0;
993     while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8);
994     RTjpeg_cb8--;
995    
996     RTjpeg_idct_init ();
997    
998     RTjpeg_color_init ();
999     }
1000    
1001     int
1002     RTjpeg_compress (s8 * sp, unsigned char *bp)
1003     {
1004     s8 *sb;
1005     int i, j;
1006    
1007     #ifdef MMX
1008     emms ();
1009     #endif
1010    
1011     sb = sp;
1012     /* Y */
1013     for (i = 0; i < RTjpeg_height; i += 8)
1014     {
1015     for (j = 0; j < RTjpeg_width; j += 8)
1016     {
1017     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width);
1018     RTjpeg_quant (RTjpeg_block, RTjpeg_lqt);
1019     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8);
1020     }
1021     bp += RTjpeg_width << 3;
1022     }
1023     /* Cr */
1024     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1025     {
1026     for (j = 0; j < (RTjpeg_width >> 1); j += 8)
1027     {
1028     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1029     RTjpeg_quant (RTjpeg_block, RTjpeg_cqt);
1030     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8);
1031     }
1032     bp += RTjpeg_width << 2;
1033     }
1034     /* Cb */
1035     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1036     {
1037     for (j = 0; j < (RTjpeg_width >> 1); j += 8)
1038     {
1039     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1040     RTjpeg_quant (RTjpeg_block, RTjpeg_cqt);
1041     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8);
1042     }
1043     bp += RTjpeg_width << 2;
1044     }
1045     #ifdef MMX
1046     emms ();
1047     #endif
1048     return (sp - sb);
1049     }
1050    
1051     void
1052     RTjpeg_decompress (s8 * sp, u8 * bp)
1053     {
1054     int i, j;
1055    
1056     #ifdef MMX
1057     emms ();
1058     #endif
1059    
1060     /* Y */
1061     for (i = 0; i < RTjpeg_height; i += 8)
1062     {
1063     for (j = 0; j < RTjpeg_width; j += 8)
1064     if (*sp == -1)
1065     sp++;
1066     else
1067     {
1068     sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
1069     RTjpeg_idct (bp + j, RTjpeg_block, RTjpeg_width);
1070     }
1071     bp += RTjpeg_width << 3;
1072     }
1073     /* Cr */
1074     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1075     {
1076     for (j = 0; j < (RTjpeg_width >> 1); j += 8)
1077     if (*sp == -1)
1078     sp++;
1079     else
1080     {
1081     sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
1082     RTjpeg_idct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1083     }
1084     bp += RTjpeg_width << 2;
1085     }
1086     /* Cb */
1087     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1088     {
1089     for (j = 0; j < (RTjpeg_width >> 1); j += 8)
1090     if (*sp == -1)
1091     sp++;
1092     else
1093     {
1094     sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
1095     RTjpeg_idct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1096     }
1097     bp += RTjpeg_width << 2;
1098     }
1099     #ifdef MMX
1100     emms ();
1101     #endif
1102     }
1103    
1104     /*
1105     External Function
1106    
1107     Initialise additional data structures for motion compensation
1108    
1109     */
1110    
1111     void
1112     RTjpeg_init_mcompress (void)
1113     {
1114     unsigned long tmp;
1115    
1116     if (!RTjpeg_old)
1117     {
1118     RTjpeg_old = malloc (((RTjpeg_width * RTjpeg_height) << 1) + (RTjpeg_width * RTjpeg_height) + 32);
1119     tmp = (unsigned long) RTjpeg_old;
1120     tmp += 32;
1121     tmp = tmp >> 5;
1122     RTjpeg_old = (s16 *) (tmp << 5);
1123     }
1124     if (!RTjpeg_old)
1125     {
1126     fprintf (stderr, "RTjpeg: Could not allocate memory\n");
1127     exit (-1);
1128     }
1129     bzero (RTjpeg_old, ((RTjpeg_width * RTjpeg_height) + ((RTjpeg_width * RTjpeg_height) >> 1)) << 1);
1130     }
1131    
1132     #ifdef MMX
1133    
1134     int
1135     RTjpeg_bcomp (s16 * old, mmx_t * mask)
1136     {
1137     int i;
1138     mmx_t *mold = (mmx_t *) old;
1139     mmx_t *mblock = (mmx_t *) RTjpeg_block;
1140     mmx_t result;
1141     static mmx_t neg = (mmx_t) (unsigned long long) 0xffffffffffffffffULL;
1142    
1143     movq_m2r (*mask, mm7);
1144     movq_m2r (neg, mm6);
1145     pxor_r2r (mm5, mm5);
1146    
1147     for (i = 0; i < 8; i++)
1148     {
1149     movq_m2r (*(mblock++), mm0);
1150     movq_m2r (*(mblock++), mm2);
1151     movq_m2r (*(mold++), mm1);
1152     movq_m2r (*(mold++), mm3);
1153     psubsw_r2r (mm1, mm0);
1154     psubsw_r2r (mm3, mm2);
1155     movq_r2r (mm0, mm1);
1156     movq_r2r (mm2, mm3);
1157     pcmpgtw_r2r (mm7, mm0);
1158     pcmpgtw_r2r (mm7, mm2);
1159     pxor_r2r (mm6, mm1);
1160     pxor_r2r (mm6, mm3);
1161     pcmpgtw_r2r (mm7, mm1);
1162     pcmpgtw_r2r (mm7, mm3);
1163     por_r2r (mm0, mm5);
1164     por_r2r (mm2, mm5);
1165     por_r2r (mm1, mm5);
1166     por_r2r (mm3, mm5);
1167     }
1168     movq_r2m (mm5, result);
1169    
1170     if (result.q)
1171     {
1172     if (!RTjpeg_mtest)
1173     for (i = 0; i < 16; i++)
1174     ((u64 *) old)[i] = ((u64 *) RTjpeg_block)[i];
1175     return 0;
1176     }
1177     // printf(".");
1178     return 1;
1179     }
1180    
1181     #else
1182     int
1183     RTjpeg_bcomp (s16 * old, u16 * mask)
1184     {
1185     int i;
1186    
1187     for (i = 0; i < 64; i++)
1188     if (abs (old[i] - RTjpeg_block[i]) > *mask)
1189     {
1190     if (!RTjpeg_mtest)
1191     for (i = 0; i < 16; i++)
1192     ((u64 *) old)[i] = ((u64 *) RTjpeg_block)[i];
1193     return 0;
1194     }
1195     return 1;
1196     }
1197     #endif
1198    
1199     void
1200     RTjpeg_set_test (int i)
1201     {
1202     RTjpeg_mtest = i;
1203     }
1204    
1205     int
1206     RTjpeg_mcompress (s8 * sp, unsigned char *bp, u16 lmask, u16 cmask,
1207     int x, int y, int w, int h)
1208     {
1209     s8 *sb;
1210     s16 *block;
1211     int i, j;
1212    
1213     #ifdef MMX
1214     emms ();
1215     RTjpeg_lmask = (mmx_t) (((u64) lmask << 48) | ((u64) lmask << 32) | ((u64) lmask << 16) | lmask);
1216     RTjpeg_cmask = (mmx_t) (((u64) cmask << 48) | ((u64) cmask << 32) | ((u64) cmask << 16) | cmask);
1217     #else
1218     RTjpeg_lmask = lmask;
1219     RTjpeg_cmask = cmask;
1220     #endif
1221    
1222     w += x;
1223     h += y;
1224    
1225     sb = sp;
1226     block = RTjpeg_old;
1227     /* Y */
1228     for (i = 0; i < RTjpeg_height; i += 8)
1229     {
1230     if (i >= y && i < h)
1231     {
1232     for (j = x; j < w; j += 8)
1233     {
1234     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width);
1235     RTjpeg_quant (RTjpeg_block, RTjpeg_lqt);
1236     if (RTjpeg_bcomp (block, &RTjpeg_lmask))
1237     *((u8 *) sp++) = 255;
1238     else
1239     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8);
1240     block += 64;
1241     }
1242     }
1243     bp += RTjpeg_width << 3;
1244     }
1245    
1246     y >>= 1; h >>= 1;
1247    
1248     /* Cr */
1249     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1250     {
1251     if (i >= y && i < h)
1252     {
1253     for (j = x >> 1; j < (w >> 1); j += 8)
1254     {
1255     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1256     RTjpeg_quant (RTjpeg_block, RTjpeg_cqt);
1257     if (RTjpeg_bcomp (block, &RTjpeg_cmask))
1258     *((u8 *) sp++) = 255;
1259     else
1260     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8);
1261     block += 64;
1262     }
1263     }
1264     bp += RTjpeg_width << 2;
1265     }
1266     /* Cb */
1267     for (i = 0; i < (RTjpeg_height >> 1); i += 8)
1268     {
1269     if (i >= y && i < h)
1270     {
1271     for (j = x >> 1; j < (w >> 1); j += 8)
1272     {
1273     RTjpeg_dct (bp + j, RTjpeg_block, RTjpeg_width >> 1);
1274     RTjpeg_quant (RTjpeg_block, RTjpeg_cqt);
1275     if (RTjpeg_bcomp (block, &RTjpeg_cmask))
1276     *((u8 *) sp++) = 255;
1277     else
1278     sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8);
1279     block += 64;
1280     }
1281     }
1282     bp += RTjpeg_width << 2;
1283     }
1284     #ifdef MMX
1285     emms ();
1286     #endif
1287     return (sp - sb);
1288     }
1289