diff -Naru fswebcam-20070108.orig/fswebcam.c fswebcam-20070108/fswebcam.c --- fswebcam-20070108.orig/fswebcam.c 2009-08-04 08:50:29.611449510 +0200 +++ fswebcam-20070108/fswebcam.c 2009-08-04 11:18:26.670698558 +0200 @@ -542,11 +542,17 @@ while(i-- > 0) { uint8_t r, g, b; - - r = (*img & 0xF800) >> 8; + g = (*img & 0x7E0) >> 3; - b = (*img & 0x1F) << 3; - + + if(src->palette == SRC_PAL_RGB555) { + r = (*img & 0xF800) >> 8; + b = (*img & 0x1F) << 3; + } else { /* RGB565X */ + b = (*img & 0xF800) >> 8; + r = (*img & 0x1F) << 3; + } + *(abitmap++) += r + (r >> 5); *(abitmap++) += g + (g >> 6); *(abitmap++) += b + (b >> 5); @@ -567,10 +573,17 @@ while(i-- > 0) { uint8_t r, g, b; - - r = (*img & 0x7C00) >> 7; - g = (*img & 0x3E0) >> 2; - b = (*img & 0x1F) << 3; + + + if(src->palette == SRC_PAL_RGB555) { + r = (*img & 0x7C00) >> 7; + g = (*img & 0x3E0) >> 2; + b = (*img & 0x1F) << 3; + } else { /* RGB555X */ + b = (*img & 0x3E) << 2; + g = (*img & 0x7C0) >> 3; + r = (*img & 0xF800) >> 8; + } *(abitmap++) += r + (r >> 5); *(abitmap++) += g + (g >> 5); @@ -1160,9 +1173,11 @@ fswc_add_image_nv12mb(&src, abitmap); break; case SRC_PAL_RGB565: + case SRC_PAL_RGB565X: fswc_add_image_rgb565(&src, abitmap); break; case SRC_PAL_RGB555: + case SRC_PAL_RGB555X: fswc_add_image_rgb555(&src, abitmap); break; case SRC_PAL_GREY: diff -Naru fswebcam-20070108.orig/src.c fswebcam-20070108/src.c --- fswebcam-20070108.orig/src.c 2009-08-04 08:50:29.615450858 +0200 +++ fswebcam-20070108/src.c 2009-08-04 11:12:31.635450221 +0200 @@ -62,6 +62,8 @@ { "RGB555" }, { "GREY" }, { "VYUY" }, + { "RGB555X" }, + { "RGB565X" }, { NULL } }; diff -Naru fswebcam-20070108.orig/src.h fswebcam-20070108/src.h --- fswebcam-20070108.orig/src.h 2009-08-04 08:50:29.615450858 +0200 +++ fswebcam-20070108/src.h 2009-08-04 11:12:31.635450221 +0200 @@ -36,6 +36,8 @@ #define SRC_PAL_RGB555 (13) #define SRC_PAL_GREY (14) #define SRC_PAL_VYUY (15) +#define SRC_PAL_RGB555X (16) +#define SRC_PAL_RGB565X (17) #define SRC_LIST_INPUTS (1 << 1) #define SRC_LIST_TUNERS (1 << 2) diff -Naru fswebcam-20070108.orig/src_v4l1.c fswebcam-20070108/src_v4l1.c --- fswebcam-20070108.orig/src_v4l1.c 2009-08-04 08:50:29.615450858 +0200 +++ fswebcam-20070108/src_v4l1.c 2009-08-04 11:12:31.635450221 +0200 @@ -64,6 +64,8 @@ { SRC_PAL_RGB555, VIDEO_PALETTE_RGB555, 16 }, { SRC_PAL_GREY, VIDEO_PALETTE_GREY, 8 }, { SRC_PAL_VYUY, VIDEO_PALETTE_VYUY, 16 }, + { SRC_PAL_RGB555X, VIDEO_PALETTE_RGB555X, 16 }, + { SRC_PAL_RGB565X, VIDEO_PALETTE_RGB565X, 16 }, { 0, 0, 0 } }; diff -Naru fswebcam-20070108.orig/src_v4l2.c fswebcam-20070108/src_v4l2.c --- fswebcam-20070108.orig/src_v4l2.c 2009-08-04 08:50:29.615450858 +0200 +++ fswebcam-20070108/src_v4l2.c 2009-08-04 11:12:31.635450221 +0200 @@ -66,6 +66,8 @@ { SRC_PAL_RGB555, V4L2_PIX_FMT_RGB555 }, { SRC_PAL_GREY, V4L2_PIX_FMT_GREY }, { SRC_PAL_VYUY, V4L2_PIX_FMT_VYUY }, + { SRC_PAL_RGB555X, V4L2_PIX_FMT_RGB555X }, + { SRC_PAL_RGB565X, V4L2_PIX_FMT_RGB565X }, { 0, 0 } }; diff -Naru fswebcam-20070108.orig/videodev.h fswebcam-20070108/videodev.h --- fswebcam-20070108.orig/videodev.h 2009-08-04 08:50:29.615450858 +0200 +++ fswebcam-20070108/videodev.h 2009-08-04 11:12:31.635450221 +0200 @@ -96,6 +96,8 @@ #define VIDEO_PALETTE_PLANAR 13 /* start of planar entries */ #define VIDEO_PALETTE_COMPONENT 7 /* start of component entries */ #define VIDEO_PALETTE_VYUY 15 /* The great thing about standards is ... */ +#define VIDEO_PALETTE_RGB555X 16 /* 555 15bit BGR */ +#define VIDEO_PALETTE_RGB565X 17 /* 565 15bit BGR */ }; struct video_audio