aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gomez <daniel@qtec.com>2019-02-27 14:47:09 (GMT)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>2019-03-11 15:28:09 (GMT)
commitb2045782b20c319d125b59f6e76c1ce4e2413ec0 (patch)
tree38d29cb7313f916a7b9b4e9f8deee3680455db80
parente95be220af9aa31b1fcc961bf058009024443073 (diff)
libv4lconvert: add support for BAYER10
Add support for 10 bit Bayer formats: -V4L2_PIX_FMT_SBGGR10 -V4L2_PIX_FMT_SGBRG10 -V4L2_PIX_FMT_SRGGB10 Previous BAYER10 format declared (V4L2_PIX_FMT_SGRBG10) now is grouped with the new list without the need of tmp buffer. Update v4lconvert_10to8 function: - Renaming function name to keep naming convention with the other bayer10p conversion function: v4lconvert_10to8 -> v4lconvert_bayer10_to_bayer8 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.c10
-rw-r--r--lib/libv4lconvert/libv4lconvert-priv.h2
-rw-r--r--lib/libv4lconvert/libv4lconvert.c65
3 files changed, 59 insertions, 18 deletions
diff --git a/lib/libv4lconvert/bayer.c b/lib/libv4lconvert/bayer.c
index 11af654..96d26cc 100644
--- a/lib/libv4lconvert/bayer.c
+++ b/lib/libv4lconvert/bayer.c
@@ -632,6 +632,16 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
!start_with_green, !blue_line);
}
+void v4lconvert_bayer10_to_bayer8(void *bayer10,
+ unsigned char *bayer8, int width, int height)
+{
+ int i;
+ uint16_t *src = bayer10;
+
+ for (i = 0; i < width * height; i++)
+ bayer8[i] = src[i] >> 2;
+}
+
void v4lconvert_bayer10p_to_bayer8(unsigned char *bayer10p,
unsigned char *bayer8, int width, int height)
{
diff --git a/lib/libv4lconvert/libv4lconvert-priv.h b/lib/libv4lconvert/libv4lconvert-priv.h
index 3020a39..44d2d32 100644
--- a/lib/libv4lconvert/libv4lconvert-priv.h
+++ b/lib/libv4lconvert/libv4lconvert-priv.h
@@ -264,6 +264,8 @@ void v4lconvert_bayer_to_bgr24(const unsigned char *bayer,
void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
int width, int height, const unsigned int stride, unsigned int src_pixfmt, int yvu);
+void v4lconvert_bayer10_to_bayer8(void *bayer10,
+ unsigned char *bayer8, int width, int height);
void v4lconvert_bayer10p_to_bayer8(unsigned char *bayer10p,
unsigned char *bayer8, int width, int height);
diff --git a/lib/libv4lconvert/libv4lconvert.c b/lib/libv4lconvert/libv4lconvert.c
index e928b97..560aa08 100644
--- a/lib/libv4lconvert/libv4lconvert.c
+++ b/lib/libv4lconvert/libv4lconvert.c
@@ -132,11 +132,14 @@ static const struct v4lconvert_pixfmt supported_src_pixfmts[] = {
{ V4L2_PIX_FMT_SGRBG8, 8, 8, 8, 0 },
{ V4L2_PIX_FMT_SRGGB8, 8, 8, 8, 0 },
{ V4L2_PIX_FMT_STV0680, 8, 8, 8, 1 },
- { V4L2_PIX_FMT_SGRBG10, 16, 8, 8, 1 },
{ V4L2_PIX_FMT_SBGGR10P, 10, 8, 8, 1 },
{ V4L2_PIX_FMT_SGBRG10P, 10, 8, 8, 1 },
{ V4L2_PIX_FMT_SGRBG10P, 10, 8, 8, 1 },
{ V4L2_PIX_FMT_SRGGB10P, 10, 8, 8, 1 },
+ { V4L2_PIX_FMT_SBGGR10, 16, 8, 8, 1 },
+ { V4L2_PIX_FMT_SGBRG10, 16, 8, 8, 1 },
+ { V4L2_PIX_FMT_SGRBG10, 16, 8, 8, 1 },
+ { V4L2_PIX_FMT_SRGGB10, 16, 8, 8, 1 },
/* compressed bayer */
{ V4L2_PIX_FMT_SPCA561, 0, 9, 9, 1 },
{ V4L2_PIX_FMT_SN9C10X, 0, 9, 9, 1 },
@@ -695,6 +698,10 @@ static int v4lconvert_processing_needs_double_conversion(
case V4L2_PIX_FMT_SGBRG10P:
case V4L2_PIX_FMT_SGRBG10P:
case V4L2_PIX_FMT_SRGGB10P:
+ case V4L2_PIX_FMT_SBGGR10:
+ case V4L2_PIX_FMT_SGBRG10:
+ case V4L2_PIX_FMT_SGRBG10:
+ case V4L2_PIX_FMT_SRGGB10:
case V4L2_PIX_FMT_STV0680:
return 0;
}
@@ -722,16 +729,6 @@ unsigned char *v4lconvert_alloc_buffer(int needed,
return *buf;
}
-static void v4lconvert_10to8(void *_src, unsigned char *dst, int width, int height)
-{
- int i;
- uint16_t *src = _src;
-
- for (i = 0; i < width * height; i++) {
- dst[i] = src[i] >> 2;
- }
-}
-
int v4lconvert_oom_error(struct v4lconvert_data *data)
{
V4LCONVERT_ERR("could not allocate memory\n");
@@ -907,8 +904,7 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
#endif
case V4L2_PIX_FMT_SN9C2028:
case V4L2_PIX_FMT_SQ905C:
- case V4L2_PIX_FMT_STV0680:
- case V4L2_PIX_FMT_SGRBG10: { /* Not compressed but needs some shuffling */
+ case V4L2_PIX_FMT_STV0680: { /* Not compressed but needs some shuffling */
unsigned char *tmpbuf;
struct v4l2_format tmpfmt = *fmt;
@@ -918,11 +914,6 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
return v4lconvert_oom_error(data);
switch (src_pix_fmt) {
- case V4L2_PIX_FMT_SGRBG10:
- v4lconvert_10to8(src, tmpbuf, width, height);
- tmpfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SGRBG8;
- bytesperline = width;
- break;
case V4L2_PIX_FMT_SPCA561:
v4lconvert_decode_spca561(src, tmpbuf, width, height);
tmpfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SGBRG8;
@@ -1023,6 +1014,44 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
bytesperline = width;
}
}
+
+ case V4L2_PIX_FMT_SBGGR10:
+ case V4L2_PIX_FMT_SGBRG10:
+ case V4L2_PIX_FMT_SGRBG10:
+ case V4L2_PIX_FMT_SRGGB10: {
+ int b10format = 1;
+
+ switch (src_pix_fmt) {
+ case V4L2_PIX_FMT_SBGGR10:
+ src_pix_fmt = V4L2_PIX_FMT_SBGGR8;
+ break;
+ case V4L2_PIX_FMT_SGBRG10:
+ src_pix_fmt = V4L2_PIX_FMT_SGBRG8;
+ break;
+ case V4L2_PIX_FMT_SGRBG10:
+ src_pix_fmt = V4L2_PIX_FMT_SGRBG8;
+ break;
+ case V4L2_PIX_FMT_SRGGB10:
+ src_pix_fmt = V4L2_PIX_FMT_SRGGB8;
+ break;
+ default:
+ b10format = 0;
+ break;
+ }
+
+ if (b10format) {
+ if (src_size < (width * height * 2)) {
+ V4LCONVERT_ERR
+ ("short raw bayer10 data frame\n");
+ errno = EPIPE;
+ result = -1;
+ break;
+ }
+ v4lconvert_bayer10_to_bayer8(src, src, width, height);
+ bytesperline = width;
+ }
+ }
+
/* Fall-through*/
case V4L2_PIX_FMT_SBGGR8:
case V4L2_PIX_FMT_SGBRG8:

Privacy Policy