263void bayer2rgb24(
unsigned char *dst,
unsigned char *src,
long int WIDTH,
long int HEIGHT)
266 unsigned char *rawpt, *scanpt;
271 size = WIDTH * HEIGHT;
273 for (i = 0; i < size; i++)
275 if ((i / WIDTH) % 2 == 0)
280 if ((i > WIDTH) && ((i % WIDTH) > 0))
283 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
285 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt + WIDTH) + *(rawpt - WIDTH)) / 4;
291 *scanpt++ = *(rawpt + WIDTH + 1);
292 *scanpt++ = (*(rawpt + 1) + *(rawpt + WIDTH)) / 2;
299 if ((i > WIDTH) && ((i % WIDTH) < (WIDTH - 1)))
301 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
303 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
308 *scanpt++ = *(rawpt + WIDTH);
310 *scanpt++ = *(rawpt - 1);
319 if ((i < (WIDTH * (HEIGHT - 1))) && ((i % WIDTH) > 0))
321 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
323 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
328 *scanpt++ = *(rawpt + 1);
330 *scanpt++ = *(rawpt - WIDTH);
336 if (i < (WIDTH * (HEIGHT - 1)) && ((i % WIDTH) < (WIDTH - 1)))
339 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt - WIDTH) + *(rawpt + WIDTH)) / 4;
341 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
348 *scanpt++ = (*(rawpt - 1) + *(rawpt - WIDTH)) / 2;
349 *scanpt++ = *(rawpt - WIDTH - 1);
357void bayer16_2_rgb24(
unsigned short *dst,
unsigned short *src,
long int WIDTH,
long int HEIGHT)
360 unsigned short *rawpt, *scanpt;
365 size = WIDTH * HEIGHT;
367 for (i = 0; i < size; i++)
369 if ((i / WIDTH) % 2 == 0)
374 if ((i > WIDTH) && ((i % WIDTH) > 0))
377 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
379 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt + WIDTH) + *(rawpt - WIDTH)) / 4;
385 *scanpt++ = *(rawpt + WIDTH + 1);
386 *scanpt++ = (*(rawpt + 1) + *(rawpt + WIDTH)) / 2;
393 if ((i > WIDTH) && ((i % WIDTH) < (WIDTH - 1)))
395 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
397 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
402 *scanpt++ = *(rawpt + WIDTH);
404 *scanpt++ = *(rawpt - 1);
413 if ((i < (WIDTH * (HEIGHT - 1))) && ((i % WIDTH) > 0))
415 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
417 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
422 *scanpt++ = *(rawpt + 1);
424 *scanpt++ = *(rawpt - WIDTH);
430 if (i < (WIDTH * (HEIGHT - 1)) && ((i % WIDTH) < (WIDTH - 1)))
433 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt - WIDTH) + *(rawpt + WIDTH)) / 4;
435 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
442 *scanpt++ = (*(rawpt - 1) + *(rawpt - WIDTH)) / 2;
443 *scanpt++ = *(rawpt - WIDTH - 1);
454 unsigned char *rawpt, *scanpt;
459 size = WIDTH * HEIGHT;
461 for (i = 0; i < size; i++)
463 if ((i / WIDTH) % 2 == 0)
468 if ((i > WIDTH) && ((i % WIDTH) > 0))
471 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt + WIDTH) + *(rawpt - WIDTH)) / 4;
473 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
480 *scanpt++ = (*(rawpt + 1) + *(rawpt + WIDTH)) / 2;
481 *scanpt++ = *(rawpt + WIDTH + 1);
487 if ((i > WIDTH) && ((i % WIDTH) < (WIDTH - 1)))
489 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
491 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
496 *scanpt++ = *(rawpt - 1);
498 *scanpt++ = *(rawpt + WIDTH);
507 if ((i < (WIDTH * (HEIGHT - 1))) && ((i % WIDTH) > 0))
509 *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
511 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
516 *scanpt++ = *(rawpt - WIDTH);
518 *scanpt++ = *(rawpt + 1);
524 if (i < (WIDTH * (HEIGHT - 1)) && ((i % WIDTH) < (WIDTH - 1)))
527 (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) + *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
529 *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt - WIDTH) + *(rawpt + WIDTH)) / 4;
535 *scanpt++ = *(rawpt - WIDTH - 1);
536 *scanpt++ = (*(rawpt - 1) + *(rawpt - WIDTH)) / 2;
559 long int width=WIDTH;
563 for (row = 0; row < HEIGHT; row++) {
564 for (col = 0; col < WIDTH; col++) {
569 if (col != 0 && col != WIDTH -1) {
570 dst[(row*width+col)*3+RED]=(src[row*width+col+1]+src[row*width+col-1])/2;
572 if (col == 0) { dst[(row*width+col)*3+RED]=src[row*width+col+1];}
573 if (col == WIDTH -1 ) { dst[(row*width+col)*3+RED]=src[row*width+col-1]; }
575 dst[(row*width+col)*3+GREEN]=src[row*width+col];
576 if (row !=0 && row !=HEIGHT-1) {
577 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col]+src[(row-1)*width+col])/2;
579 if (row == 0) {dst[(row*width+col)*3+BLUE]=src[(row+1)*width+col];}
580 if (row == HEIGHT -1) {dst[(row*width+col)*3+BLUE]=src[(row-1)*width+col];}
583 dst[(row*width+col)*3+RED]=src[row*width+col];
584 if (col != WIDTH -1 && row !=0 ) {
585 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/4;
586 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col+1]+src[(row-1)*width+col+1]+src[(row+1)*width+col-1]+src[(row-1)*width+col-1])/4;
588 if (col != WIDTH -1 && row == 0) {
594 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row)*width+col+1]+src[(row)*width+col+1])/3;
595 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col+1]+src[(row+1)*width+col-1])/2;
598 if (col == WIDTH -1 && row !=0 ) {
605 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row)*width+col-1])/3;
606 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col-1]+src[(row-1)*width+col-1])/2;
609 if (col == WIDTH -1 && row ==0) {
617 dst[(row*width+col)*3+GREEN]=(src[(row+0)*width+col-1]+src[(row+1)*width+col])/2;
618 dst[(row*width+col)*3+BLUE]=src[(row+1)*width+col-1];
620 if (col == 1 && row !=0) {
628 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/4;
629 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col+1]+src[(row-1)*width+col+1]+src[(row+1)*width+col-1]+src[(row-1)*width+col-1])/4;
631 if (row == HEIGHT -1) {
639 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/4;
640 dst[(row*width+col)*3+BLUE]=(src[(row+1)*width+col+1]+src[(row-1)*width+col+1]+src[(row+1)*width+col-1]+src[(row-1)*width+col-1])/4;
648 dst[(row*width+col)*3+BLUE]=src[row*width+col];
649 if ( col != 0 && row != HEIGHT -1) {
654 dst[(row*width+col)*3+RED]=(src[(row+1)*width+col+1]+src[(row-1)*width+col+1]+src[(row+1)*width+col-1]+src[(row-1)*width+col-1])/4;
655 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/4;
657 if (col == 0 && row != HEIGHT -1) {
663 dst[(row*width+col)*3+RED]=(src[(row+1)*width+col+1]+src[(row-1)*width+col+1])/2;
664 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/3;
666 if (row == HEIGHT -1 && col !=0) {
670 dst[(row*width+col)*3+RED]=(src[(row-1)*width+col+1]+src[(row-1)*width+col-1])/2;
671 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/3;
673 if (row == HEIGHT -1 && col ==0) {
677 dst[(row*width+col)*3+RED]=(src[(row-1)*width+col+1]+src[(row-1)*width+col-1])/2;
678 dst[(row*width+col)*3+GREEN]=(src[(row+1)*width+col]+src[(row-1)*width+col]+src[(row+0)*width+col+1]+src[(row+0)*width+col-1])/3;
683 dst[(row*width+col)*3+GREEN]=src[row*width+col];
684 if (col != WIDTH -1 && row != HEIGHT -1) {
690 dst[(row*width+col)*3+RED]=(src[(row+1)*width+col]+src[(row-1)*width+col])/2;
691 dst[(row*width+col)*3+BLUE]=(src[row*width+col+1]+src[row*width+col-1])/2;
693 if (col == WIDTH -1 && row != HEIGHT -1) {
699 dst[(row*width+col)*3+RED]=(src[(row+1)*width+col]+src[(row-1)*width+col])/2;
700 dst[(row*width+col)*3+BLUE]=src[row*width+col-1];
702 if (row == HEIGHT -1 && col != WIDTH -1) {
706 dst[(row*width+col)*3+RED]=src[(row-1)*width+col];
707 dst[(row*width+col)*3+BLUE]=(src[row*width+col+1]+src[row*width+col-1])/2;
709 if (row == HEIGHT -1 && col == WIDTH -1) {
713 dst[(row*width+col)*3+RED]=src[(row-1)*width+col];
714 dst[(row*width+col)*3+BLUE]=src[row*width+col-1];
723int mjpegtoyuv420p(
unsigned char *map,
unsigned char *cap_map,
int width,
int height,
unsigned int size)
725 unsigned char *yuv[3];
726 unsigned char *y, *u, *v;
729 yuv[0] = malloc(width * height *
sizeof(yuv[0][0]));
730 yuv[1] = malloc(width * height / 4 *
sizeof(yuv[1][0]));
731 yuv[2] = malloc(width * height / 4 *
sizeof(yuv[2][0]));
733 ret =
decode_jpeg_raw(cap_map, size, 0, 420, width, height, yuv[0], yuv[1], yuv[2]);
736 u = y + width * height;
737 v = u + (width * height) / 4;
738 memset(y, 0, width * height);
739 memset(u, 0, width * height / 4);
740 memset(v, 0, width * height / 4);
742 for (loop = 0; loop < width * height; loop++)
743 *map++ = yuv[0][loop];
745 for (loop = 0; loop < width * height / 4; loop++)
746 *map++ = yuv[1][loop];
748 for (loop = 0; loop < width * height / 4; loop++)
749 *map++ = yuv[2][loop];
787int RGB2YUV(
int x_dim,
int y_dim,
void *bmp,
void *y_out,
void *u_out,
void *v_out,
int flip)
789 static int init_done = 0;
792 unsigned char *r, *g, *b;
793 unsigned char *y, *u, *v;
794 unsigned char *pu1, *pu2, *pv1, *pv2, *psu, *psv;
795 unsigned char *y_buffer, *u_buffer, *v_buffer;
796 unsigned char *sub_u_buf, *sub_v_buf;
805 if ((x_dim % 2) || (y_dim % 2))
807 size = x_dim * y_dim;
810 y_buffer = (
unsigned char *)y_out;
811 sub_u_buf = (
unsigned char *)u_out;
812 sub_v_buf = (
unsigned char *)v_out;
813 u_buffer = (
unsigned char *)malloc(size *
sizeof(
unsigned char));
814 v_buffer = (
unsigned char *)malloc(size *
sizeof(
unsigned char));
815 if (!(u_buffer && v_buffer))
824 b = (
unsigned char *)bmp;
832 for (j = 0; j < y_dim; j++)
834 y = y_buffer + (y_dim - j - 1) * x_dim;
835 u = u_buffer + (y_dim - j - 1) * x_dim;
836 v = v_buffer + (y_dim - j - 1) * x_dim;
838 for (i = 0; i < x_dim; i++)
842 *y = (
unsigned char)(RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
843 *u = (
unsigned char)(-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
844 *v = (
unsigned char)((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
854 for (i = 0; i < size; i++)
858 *y = (
unsigned char)(RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
859 *u = (
unsigned char)(-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
860 *v = (
unsigned char)((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
869 for (j = 0; j < y_dim / 2; j++)
871 psu = sub_u_buf + j * x_dim / 2;
872 psv = sub_v_buf + j * x_dim / 2;
873 pu1 = u_buffer + 2 * j * x_dim;
874 pu2 = u_buffer + (2 * j + 1) * x_dim;
875 pv1 = v_buffer + 2 * j * x_dim;
876 pv2 = v_buffer + (2 * j + 1) * x_dim;
877 for (i = 0; i < x_dim / 2; i++)
879 *psu = (*pu1 + *(pu1 + 1) + *pu2 + *(pu2 + 1)) / 4;
880 *psv = (*pv1 + *(pv1 + 1) + *pv2 + *(pv2 + 1)) / 4;
896int BGR2YUV(
int x_dim,
int y_dim,
void *bmp,
void *y_out,
void *u_out,
void *v_out,
int flip)
898 static int init_done = 0;
901 unsigned char *r, *g, *b;
902 unsigned char *y, *u, *v;
903 unsigned char *pu1, *pu2, *pv1, *pv2, *psu, *psv;
904 unsigned char *y_buffer, *u_buffer, *v_buffer;
905 unsigned char *sub_u_buf, *sub_v_buf;
914 if ((x_dim % 2) || (y_dim % 2))
916 size = x_dim * y_dim;
919 y_buffer = (
unsigned char *)y_out;
920 sub_u_buf = (
unsigned char *)u_out;
921 sub_v_buf = (
unsigned char *)v_out;
922 u_buffer = (
unsigned char *)malloc(size *
sizeof(
unsigned char));
923 v_buffer = (
unsigned char *)malloc(size *
sizeof(
unsigned char));
924 if (!(u_buffer && v_buffer))
933 r = (
unsigned char *)bmp;
941 for (j = 0; j < y_dim; j++)
943 y = y_buffer + (y_dim - j - 1) * x_dim;
944 u = u_buffer + (y_dim - j - 1) * x_dim;
945 v = v_buffer + (y_dim - j - 1) * x_dim;
947 for (i = 0; i < x_dim; i++)
951 *y = (
unsigned char)(RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
952 *u = (
unsigned char)(-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
953 *v = (
unsigned char)((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
963 for (i = 0; i < size; i++)
967 *y = (
unsigned char)(RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
968 *u = (
unsigned char)(-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
969 *v = (
unsigned char)((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
978 for (j = 0; j < y_dim / 2; j++)
980 psu = sub_u_buf + j * x_dim / 2;
981 psv = sub_v_buf + j * x_dim / 2;
982 pu1 = u_buffer + 2 * j * x_dim;
983 pu2 = u_buffer + (2 * j + 1) * x_dim;
984 pv1 = v_buffer + 2 * j * x_dim;
985 pv2 = v_buffer + (2 * j + 1) * x_dim;
986 for (i = 0; i < x_dim / 2; i++)
988 *psu = (*pu1 + *(pu1 + 1) + *pu2 + *(pu2 + 1)) / 4;
989 *psv = (*pv1 + *(pv1 + 1) + *pv2 + *(pv2 + 1)) / 4;