Add support for 16 bit Bayer formats: -V4L2_PIX_FMT_SBGGR16 -V4L2_PIX_FMT_SGBRG16 -V4L2_PIX_FMT_SGRBG16 -V4L2_PIX_FMT_SRGGB16 Tested using vivid included in linux v5.0-rc8. Signed-off-by: Daniel Gomez <daniel@xxxxxxxx> --- lib/libv4lconvert/bayer.c | 9 ++++++ lib/libv4lconvert/libv4lconvert-priv.h | 3 ++ lib/libv4lconvert/libv4lconvert.c | 45 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/lib/libv4lconvert/bayer.c b/lib/libv4lconvert/bayer.c index 96d26cce..7748e68d 100644 --- a/lib/libv4lconvert/bayer.c +++ b/lib/libv4lconvert/bayer.c @@ -662,3 +662,12 @@ void v4lconvert_bayer10p_to_bayer8(unsigned char *bayer10p, bayer8 += 4; } } + +void v4lconvert_bayer16_to_bayer8(unsigned char *bayer16, + unsigned char *bayer8, int width, int height) +{ + int i; + + for (i = 0; i < width * height; i++) + bayer8[i] = bayer16[2*i+1]; +} diff --git a/lib/libv4lconvert/libv4lconvert-priv.h b/lib/libv4lconvert/libv4lconvert-priv.h index 44d2d32e..a8046ce2 100644 --- a/lib/libv4lconvert/libv4lconvert-priv.h +++ b/lib/libv4lconvert/libv4lconvert-priv.h @@ -270,6 +270,9 @@ void v4lconvert_bayer10_to_bayer8(void *bayer10, void v4lconvert_bayer10p_to_bayer8(unsigned char *bayer10p, unsigned char *bayer8, int width, int height); +void v4lconvert_bayer16_to_bayer8(unsigned char *bayer16, + unsigned char *bayer8, int width, int height); + void v4lconvert_hm12_to_rgb24(const unsigned char *src, unsigned char *dst, int width, int height); diff --git a/lib/libv4lconvert/libv4lconvert.c b/lib/libv4lconvert/libv4lconvert.c index a8cf856a..7dc409f2 100644 --- a/lib/libv4lconvert/libv4lconvert.c +++ b/lib/libv4lconvert/libv4lconvert.c @@ -140,6 +140,10 @@ static const struct v4lconvert_pixfmt supported_src_pixfmts[] = { { V4L2_PIX_FMT_SGBRG10, 16, 8, 8, 1 }, { V4L2_PIX_FMT_SGRBG10, 16, 8, 8, 1 }, { V4L2_PIX_FMT_SRGGB10, 16, 8, 8, 1 }, + { V4L2_PIX_FMT_SBGGR16, 16, 8, 8, 1 }, + { V4L2_PIX_FMT_SGBRG16, 16, 8, 8, 1 }, + { V4L2_PIX_FMT_SGRBG16, 16, 8, 8, 1 }, + { V4L2_PIX_FMT_SRGGB16, 16, 8, 8, 1 }, /* compressed bayer */ { V4L2_PIX_FMT_SPCA561, 0, 9, 9, 1 }, { V4L2_PIX_FMT_SN9C10X, 0, 9, 9, 1 }, @@ -702,6 +706,10 @@ static int v4lconvert_processing_needs_double_conversion( case V4L2_PIX_FMT_SGBRG10: case V4L2_PIX_FMT_SGRBG10: case V4L2_PIX_FMT_SRGGB10: + case V4L2_PIX_FMT_SBGGR16: + case V4L2_PIX_FMT_SGBRG16: + case V4L2_PIX_FMT_SGRBG16: + case V4L2_PIX_FMT_SRGGB16: case V4L2_PIX_FMT_STV0680: return 0; } @@ -1052,6 +1060,43 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data, } } + case V4L2_PIX_FMT_SBGGR16: + case V4L2_PIX_FMT_SGBRG16: + case V4L2_PIX_FMT_SGRBG16: + case V4L2_PIX_FMT_SRGGB16: { + int b16format = 1; + + switch (src_pix_fmt) { + case V4L2_PIX_FMT_SBGGR16: + src_pix_fmt = V4L2_PIX_FMT_SBGGR8; + break; + case V4L2_PIX_FMT_SGBRG16: + src_pix_fmt = V4L2_PIX_FMT_SGBRG8; + break; + case V4L2_PIX_FMT_SGRBG16: + src_pix_fmt = V4L2_PIX_FMT_SGRBG8; + break; + case V4L2_PIX_FMT_SRGGB16: + src_pix_fmt = V4L2_PIX_FMT_SRGGB8; + break; + default: + b16format = 0; + break; + } + + if (b16format) { + if (src_size < ((width * height * 2))) { + V4LCONVERT_ERR + ("short raw bayer16 data frame\n"); + errno = EPIPE; + result = -1; + break; + } + v4lconvert_bayer16_to_bayer8(src, src, width, height); + bytesperline = width; + } + } + /* Fall-through*/ case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SGBRG8: -- 2.20.1