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 <dan...@qtec.com>
---
 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

Reply via email to