Re: [PATCH 2/2] libv4lconvert: add support for BAYER16

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Daniel,

On Wed, Feb 27, 2019 at 3:47 PM Daniel Gomez <daniel@xxxxxxxx> wrote:
>
> 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>

Signed-off-by: Ricardo Ribalda <ricardo@xxxxxxxxxxx>

> ---
>  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
>


-- 
Ricardo Ribalda



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux