aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gomez <daniel@qtec.com>2019-02-27 14:47:10 (GMT)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>2019-03-11 15:28:09 (GMT)
commit979a8fe38a801647bf809ffcfe496bcc9b015a5d (patch)
tree7ca3354554c6fe8599a4f80e125b3f08757ac85e
parentb2045782b20c319d125b59f6e76c1ce4e2413ec0 (diff)
libv4lconvert: add support for BAYER16
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@qtec.com> Signed-off-by: Ricardo Ribalda <ricardo@ribalda.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
-rw-r--r--lib/libv4lconvert/bayer.c9
-rw-r--r--lib/libv4lconvert/libv4lconvert-priv.h3
-rw-r--r--lib/libv4lconvert/libv4lconvert.c45
3 files changed, 57 insertions, 0 deletions
diff --git a/lib/libv4lconvert/bayer.c b/lib/libv4lconvert/bayer.c
index 96d26cc..7748e68 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 44d2d32..a8046ce 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 560aa08..78fb343 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:

Privacy Policy