32 #define UYVY // it conforms to the yuv422 structure in the cmvision class.
36 #define YUV2RGB(y, u, v, r, g, b)\
37 r = y + ((v*1436) >>10);\
38 g = y - ((u*352 + v*731) >> 10);\
39 b = y + ((u*1814) >> 10);\
43 r = r > 255 ? 255 : r;\
44 g = g > 255 ? 255 : g;\
48 #define RGB2YUV(r, g, b, y, u, v)\
49 y = (306*r + 601*g + 117*b) >> 10;\
50 u = ((-172*r - 340*g + 512*b) >> 10) + 128;\
51 v = ((512*r - 429*g - 83*b) >> 10) + 128;\
55 y = y > 255 ? 255 : y;\
56 u = u > 255 ? 255 : u;\
59 #define CLIP(in, out)\
61 in = in < 0 ? 0 : in;\
62 in = in > 255 ? 255 : in;\
73 yuyv2uyvy(
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
76 swab(src, dest, NumPixels << 1);
78 memcpy(dest,src, NumPixels<<1);
83 uyvy2yuyv(
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
86 swab(src, dest, NumPixels << 1);
88 memcpy(dest,src, NumPixels<<1);
92 uyyvyy2uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
94 register int i=NumPixels + (NumPixels >> 1)-1;
95 register int j=(NumPixels << 1)-1;
96 register int y0, y1, y2, y3, u, v;
130 uyv2uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
132 register int i = NumPixels + (NumPixels << 1)-1;
133 register int j = (NumPixels << 1)-1;
134 register int y0, y1, u0, u1, v0, v1;
145 dest[j--] = (v0+v1) >> 1;
147 dest[j--] = (u0+u1) >> 1;
151 dest[j--] = (v0+v1) >> 1;
153 dest[j--] = (u0+u1) >> 1;
160 y2uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
162 register int i= NumPixels-1;
163 register int j = (NumPixels << 1)-1;
184 y162uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels,
int bits)
186 register int i = (NumPixels << 1)-1;
187 register int j = (NumPixels << 1)-1;
193 y1 = (y1 + (((int)src[i--])<<8))>>(bits-8);
195 y0 = (y0 + (((int)src[i--])<<8))>>(bits-8);
211 y162y (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels,
int bits)
213 register int i = (NumPixels<<1)-1;
214 register int j = NumPixels-1;
219 dest[j--] = (y + (src[i--]<<8))>>(bits-8);
224 rgb2uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
226 register int i = NumPixels + ( NumPixels << 1 )-1;
227 register int j = (NumPixels << 1)-1;
228 register int y0, y1, u0, u1, v0, v1 ;
229 register int r, g, b;
232 b = (
unsigned char) src[i--];
233 g = (
unsigned char) src[i--];
234 r = (
unsigned char) src[i--];
235 RGB2YUV (r, g, b, y0, u0 , v0);
236 b = (
unsigned char) src[i--];
237 g = (
unsigned char) src[i--];
238 r = (
unsigned char) src[i--];
239 RGB2YUV (r, g, b, y1, u1 , v1);
241 dest[j--] = (v0+v1) >> 1;
243 dest[j--] = (u0+u1) >> 1;
247 dest[j--] = (v0+v1) >> 1;
249 dest[j--] = (u0+u1) >> 1;
255 rgb482uyvy (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
257 register int i = ( (NumPixels + ( NumPixels << 1 )) << 1 ) -1;
258 register int j = (NumPixels << 1)-1;
259 register int y0, y1, u0, u1, v0, v1 ;
260 register int r, g, b;
264 b = (
unsigned char) src[i--];
266 g = (
unsigned char) src[i--];
268 r = (
unsigned char) src[i--];
270 RGB2YUV (r, g, b, y0, u0 , v0);
271 b = (
unsigned char) src[i--];
273 g = (
unsigned char) src[i--];
275 r = (
unsigned char) src[i--];
276 RGB2YUV (r, g, b, y1, u1 , v1);
279 dest[j--] = (v0+v1) >> 1;
281 dest[j--] = (u0+u1) >> 1;
285 dest[j--] = (v0+v1) >> 1;
287 dest[j--] = (u0+u1) >> 1;
299 rgb482rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
301 register int i = ((NumPixels + ( NumPixels << 1 )) << 1)-1;
302 register int j = NumPixels + ( NumPixels << 1 ) -1;
316 uyv2rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
318 register int i = NumPixels + ( NumPixels << 1 ) -1;
319 register int j = NumPixels + ( NumPixels << 1 ) -1;
320 register int y, u, v;
321 register int r, g, b;
324 v = (
unsigned char) src[i--] - 128;
325 y = (
unsigned char) src[i--];
326 u = (
unsigned char) src[i--] - 128;
335 uyvy2rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
337 register int i = (NumPixels << 1)-1;
338 register int j = NumPixels + ( NumPixels << 1 ) -1;
339 register int y0, y1, u, v;
340 register int r, g, b;
343 y1 = (
unsigned char) src[i--];
344 v = (
unsigned char) src[i--] - 128;
345 y0 = (
unsigned char) src[i--];
346 u = (
unsigned char) src[i--] - 128;
360 uyyvyy2rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
362 register int i = NumPixels + ( NumPixels >> 1 )-1;
363 register int j = NumPixels + ( NumPixels << 1 )-1;
364 register int y0, y1, y2, y3, u, v;
365 register int r, g, b;
368 y3 = (
unsigned char) src[i--];
369 y2 = (
unsigned char) src[i--];
370 v = (
unsigned char) src[i--] - 128;
371 y1 = (
unsigned char) src[i--];
372 y0 = (
unsigned char) src[i--];
373 u = (
unsigned char) src[i--] - 128;
394 y2rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
396 register int i = NumPixels-1;
397 register int j = NumPixels + ( NumPixels << 1 )-1;
401 y = (
unsigned char) src[i--];
409 y162rgb (
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels,
int bits)
411 register int i = (NumPixels << 1)-1;
412 register int j = NumPixels + ( NumPixels << 1 )-1;
417 y = (y + (src[i--]<<8))>>(bits-8);
436 unsigned char *outR, *outG, *outB;
462 for (i=0;i<sy;i+=2) {
463 for (j=0;j<sx;j+=2) {
464 outG[(i*sx+j)*3]=src[i*sx+j];
465 outG[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];
466 outR[(i*sx+j+1)*3]=src[i*sx+j+1];
467 outB[((i+1)*sx+j)*3]=src[(i+1)*sx+j];
471 for (i=0;i<sy;i+=2) {
472 for (j=0;j<sx-1;j+=2) {
473 outR[(i*sx+j)*3]=outR[(i*sx+j+1)*3];
474 outR[((i+1)*sx+j+1)*3]=outR[(i*sx+j+1)*3];
475 outR[((i+1)*sx+j)*3]=outR[(i*sx+j+1)*3];
479 for (i=0;i<sy-1;i+=2) {
480 for (j=0;j<sx-1;j+=2) {
481 outB[(i*sx+j)*3]=outB[((i+1)*sx+j)*3];
482 outB[(i*sx+j+1)*3]=outB[((i+1)*sx+j)*3];
483 outB[((i+1)*sx+j+1)*3]=outB[((i+1)*sx+j)*3];
489 for (i=0;i<sy-1;i+=2)
491 outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];
493 for (i=1;i<sy-2;i+=2)
494 for (j=0;j<sx-1;j+=2)
495 outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];
498 for (j=0;j<sx-1;j+=2)
499 outG[((sy-1)*sx+j)*3]=outG[((sy-2)*sx+j)*3];
505 for (i=0;i<sy;i+=2) {
506 for (j=0;j<sx;j+=2) {
507 outB[(i*sx+j)*3]=src[i*sx+j];
508 outR[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];
509 outG[(i*sx+j+1)*3]=src[i*sx+j+1];
510 outG[((i+1)*sx+j)*3]=src[(i+1)*sx+j];
515 for (j=0;j<sx-1;j+=2) {
516 outR[(i*sx+j)*3]=outR[((i+1)*sx+j+1)*3];
517 outR[(i*sx+j+1)*3]=outR[((i+1)*sx+j+1)*3];
518 outR[((i+1)*sx+j)*3]=outR[((i+1)*sx+j+1)*3];
522 for (i=0;i<sy-1;i+=2) {
523 for (j=0;j<sx-1;j+=2) {
524 outB[((i+1)*sx+j)*3]=outB[(i*sx+j)*3];
525 outB[(i*sx+j+1)*3]=outB[(i*sx+j)*3];
526 outB[((i+1)*sx+j+1)*3]=outB[(i*sx+j)*3];
532 for (i=0;i<sy-1;i+=2)
533 for (j=0;j<sx-1;j+=2)
534 outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];
536 for (i=1;i<sy-2;i+=2)
537 for (j=0;j<sx-1;j+=2)
538 outG[(i*sx+j+1)*3]=outG[((i+1)*sx+j+1)*3];
541 for (j=0;j<sx-1;j+=2)
542 outG[((sy-1)*sx+j+1)*3]=outG[((sy-2)*sx+j+1)*3];
555 unsigned char *outR, *outG, *outB;
583 for (i=0;i<sy;i+=2) {
584 for (j=0;j<sx;j+=2) {
585 outG[(i*sx+j)*3]=src[i*sx+j];
586 outG[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];
587 outR[(i*sx+j+1)*3]=src[i*sx+j+1];
588 outB[((i+1)*sx+j)*3]=src[(i+1)*sx+j];
592 for (i=3;i<sy-2;i+=2) {
593 for (j=2;j<sx-3;j+=2) {
594 dh=abs((outB[(i*sx+j-2)*3]+outB[(i*sx+j+2)*3])/2-outB[(i*sx+j)*3]);
595 dv=abs((outB[((i-2)*sx+j)*3]+outB[((i+2)*sx+j)*3])/2-outB[(i*sx+j)*3]);
597 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;
600 tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;
602 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;
604 CLIP(tmp,outG[(i*sx+j)*3]);
608 for (i=2;i<sy-3;i+=2) {
609 for (j=3;j<sx-2;j+=2) {
610 dh=abs((outR[(i*sx+j-2)*3]+outR[(i*sx+j+2)*3])/2-outR[(i*sx+j)*3]);
611 dv=abs((outR[((i-2)*sx+j)*3]+outR[((i+2)*sx+j)*3])/2-outR[(i*sx+j)*3]);
613 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;
616 tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;
618 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;
620 CLIP(tmp,outG[(i*sx+j)*3]);
624 for (i=0;i<sy-1;i+=2) {
625 for (j=2;j<sx-1;j+=2) {
626 tmp=outG[(i*sx+j)*3]+(outR[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+
627 outR[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;
628 CLIP(tmp,outR[(i*sx+j)*3]);
631 for (i=1;i<sy-2;i+=2) {
632 for (j=1;j<sx;j+=2) {
633 tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+
634 outR[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;
635 CLIP(tmp,outR[(i*sx+j)*3]);
637 for (j=2;j<sx-1;j+=2) {
638 tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+
639 outR[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+
640 outR[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+
641 outR[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;
642 CLIP(tmp,outR[(i*sx+j)*3]);
647 for (i=1;i<sy;i+=2) {
648 for (j=1;j<sx-2;j+=2) {
649 tmp=outG[(i*sx+j)*3]+(outB[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+
650 outB[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;
651 CLIP(tmp,outB[(i*sx+j)*3]);
654 for (i=2;i<sy-1;i+=2) {
655 for (j=0;j<sx-1;j+=2) {
656 tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+
657 outB[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;
658 CLIP(tmp,outB[(i*sx+j)*3]);
660 for (j=1;j<sx-2;j+=2) {
661 tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+
662 outB[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+
663 outB[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+
664 outB[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;
665 CLIP(tmp,outB[(i*sx+j)*3]);
673 for (i=0;i<sy;i+=2) {
674 for (j=0;j<sx;j+=2) {
675 outB[(i*sx+j)*3]=src[i*sx+j];
676 outR[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];
677 outG[(i*sx+j+1)*3]=src[i*sx+j+1];
678 outG[((i+1)*sx+j)*3]=src[(i+1)*sx+j];
682 for (i=2;i<sy-2;i+=2) {
683 for (j=2;j<sx-3;j+=2) {
684 dh=abs((outB[(i*sx+j-2)*3]+outB[(i*sx+j+2)*3])/2-outB[(i*sx+j)*3]);
685 dv=abs((outB[((i-2)*sx+j)*3]+outB[((i+2)*sx+j)*3])/2-outB[(i*sx+j)*3]);
687 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;
690 tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;
692 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;
694 CLIP(tmp,outG[(i*sx+j)*3]);
697 for (i=3;i<sy-3;i+=2) {
698 for (j=3;j<sx-2;j+=2) {
699 dh=abs((outR[(i*sx+j-2)*3]+outR[(i*sx+j+2)*3])/2-outR[(i*sx+j)*3]);
700 dv=abs((outR[((i-2)*sx+j)*3]+outR[((i+2)*sx+j)*3])/2-outR[(i*sx+j)*3]);
702 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;
705 tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;
707 tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;
709 CLIP(tmp,outG[(i*sx+j)*3]);
713 for (i=1;i<sy-1;i+=2) {
714 for (j=2;j<sx-1;j+=2) {
715 tmp=outG[(i*sx+j)*3]+(outR[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+
716 outR[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;
717 CLIP(tmp,outR[(i*sx+j)*3]);
720 for (i=2;i<sy-2;i+=2) {
721 for (j=1;j<sx;j+=2) {
722 tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+
723 outR[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;
724 CLIP(tmp,outR[(i*sx+j)*3]);
726 for (j=2;j<sx-1;j+=2) {
727 tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+
728 outR[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+
729 outR[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+
730 outR[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;
731 CLIP(tmp,outR[(i*sx+j)*3]);
736 for (i=0;i<sy;i+=2) {
737 for (j=1;j<sx-2;j+=2) {
738 tmp=outG[(i*sx+j)*3]+(outB[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+
739 outB[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;
740 CLIP(tmp,outB[(i*sx+j)*3]);
743 for (i=1;i<sy-1;i+=2) {
744 for (j=0;j<sx-1;j+=2) {
745 tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+
746 outB[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;
747 CLIP(tmp,outB[(i*sx+j)*3]);
749 for (j=1;j<sx-2;j+=2) {
750 tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+
751 outB[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+
752 outB[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+
753 outB[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;
754 CLIP(tmp,outB[(i*sx+j)*3]);
759 fprintf(stderr,
"Bad bayer pattern ID\n");
767 unsigned char *outR, *outG, *outB;
795 for (i=0;i<sy;i+=2) {
796 for (j=0;j<sx;j+=2) {
797 tmp=((src[i*sx+j]+src[(i+1)*sx+(j+1)])>>1);
798 CLIP(tmp,outG[(((i*sx)>>2)+(j>>1))*3]);
800 CLIP(tmp,outR[(((i*sx)>>2)+(j>>1))*3]);
802 CLIP(tmp,outB[(((i*sx)>>2)+(j>>1))*3]);
808 for (i=0;i<sy;i+=2) {
809 for (j=0;j<sx;j+=2) {
810 tmp=((src[(i+1)*sx+j]+src[i*sx+(j+1)])>>1);
811 CLIP(tmp,outG[(((i*sx)>>2)+(j>>1))*3]);
812 tmp=src[(i+1)*sx+j+1];
813 CLIP(tmp,outR[(((i*sx)>>2)+(j>>1))*3]);
815 CLIP(tmp,outB[(((i*sx)>>2)+(j>>1))*3]);
820 fprintf(stderr,
"Bad bayer pattern ID\n");
829 StereoDecode(
unsigned char *src,
unsigned char *dest,
unsigned long long int NumPixels)
831 register int i = NumPixels-1;
832 register int j = (NumPixels>>1)-1;
833 register int k = NumPixels-1;
836 dest[k--] = src[i--];
837 dest[j--] = src[i--];