[libcamera-devel] [PATCH 1/3] libcamera: Add support for monochrome sensors

Naushir Patuck naush at raspberrypi.com
Fri Jun 25 16:54:15 CEST 2021


Hi David,

Sorry, I realised this was not tagged by me so...

On Tue, 15 Jun 2021 at 11:51, David Plowman <david.plowman at raspberrypi.com>
wrote:

> This commit adds support for monochrome (greyscale) raw sensors. These
> are sensors that have no colour filter array, so all pixels are the
> same and there are no distinct colour channels.
>
> These sensors still require many of an ISP's processing stages, such
> as denoise, tone mapping, but not those that involve colours (such as
> demosaic, or colour matrices).
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>

The mono case is a bit awkward, but really we must deal with it.

Reviewed-by: Naushir Patuck <naush at raspberrypi.com>


> ---
>  include/libcamera/internal/bayer_format.h |  3 ++-
>  src/libcamera/bayer_format.cpp            | 14 ++++++++++++--
>  src/libcamera/camera_sensor.cpp           |  3 +++
>  src/libcamera/property_ids.yaml           |  4 ++++
>  4 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/include/libcamera/internal/bayer_format.h
> b/include/libcamera/internal/bayer_format.h
> index 5b8c1dc9..723382d4 100644
> --- a/include/libcamera/internal/bayer_format.h
> +++ b/include/libcamera/internal/bayer_format.h
> @@ -23,7 +23,8 @@ public:
>                 BGGR = 0,
>                 GBRG = 1,
>                 GRBG = 2,
> -               RGGB = 3
> +               RGGB = 3,
> +               MONO = 4
>         };
>
>         enum Packing : uint16_t {
> diff --git a/src/libcamera/bayer_format.cpp
> b/src/libcamera/bayer_format.cpp
> index ed61202c..11355f14 100644
> --- a/src/libcamera/bayer_format.cpp
> +++ b/src/libcamera/bayer_format.cpp
> @@ -45,6 +45,8 @@ namespace libcamera {
>   * \brief G then R on the first row, B then G on the second row.
>   * \var BayerFormat::RGGB
>   * \brief R then G on the first row, G then B on the second row.
> + * \var BayerFormat::MONO
> + * \brief Monochrome image data, there is no colour filter array.
>   */
>
>  /**
> @@ -111,6 +113,8 @@ const std::map<BayerFormat, V4L2PixelFormat,
> BayerFormatComparator> bayerToV4l2{
>         { { BayerFormat::GBRG, 16, BayerFormat::None },
> V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16) },
>         { { BayerFormat::GRBG, 16, BayerFormat::None },
> V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) },
>         { { BayerFormat::RGGB, 16, BayerFormat::None },
> V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) },
> +       { { BayerFormat::MONO, 8, BayerFormat::None },
> V4L2PixelFormat(V4L2_PIX_FMT_GREY) },
> +       { { BayerFormat::MONO, 10, BayerFormat::CSI2Packed },
> V4L2PixelFormat(V4L2_PIX_FMT_Y10P) },
>  };
>
>  const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{
> @@ -146,6 +150,8 @@ const std::unordered_map<unsigned int, BayerFormat>
> mbusCodeToBayer{
>         { MEDIA_BUS_FMT_SGBRG16_1X16, { BayerFormat::GBRG, 16,
> BayerFormat::None } },
>         { MEDIA_BUS_FMT_SGRBG16_1X16, { BayerFormat::GRBG, 16,
> BayerFormat::None } },
>         { MEDIA_BUS_FMT_SRGGB16_1X16, { BayerFormat::RGGB, 16,
> BayerFormat::None } },
> +       { MEDIA_BUS_FMT_Y8_1X8, { BayerFormat::MONO, 8, BayerFormat::None
> } },
> +       { MEDIA_BUS_FMT_Y10_1X10, { BayerFormat::MONO, 10,
> BayerFormat::None } },
>  };
>
>  } /* namespace */
> @@ -198,9 +204,10 @@ std::string BayerFormat::toString() const
>                 "BGGR",
>                 "GBRG",
>                 "GRBG",
> -               "RGGB"
> +               "RGGB",
> +               "MONO"
>         };
> -       if (isValid() && order <= RGGB)
> +       if (isValid() && order <= MONO)
>                 result = orderStrings[order];
>         else
>                 return "INVALID";
> @@ -280,6 +287,9 @@ BayerFormat BayerFormat::transform(Transform t) const
>  {
>         BayerFormat result = *this;
>
> +       if (order == MONO)
> +               return result;
> +
>         /*
>          * Observe that flipping bit 0 of the Order enum performs a
> horizontal
>          * mirror on the Bayer pattern (e.g. RGGB goes to GRBG). Similarly,
> diff --git a/src/libcamera/camera_sensor.cpp
> b/src/libcamera/camera_sensor.cpp
> index 3e135353..fb67c15a 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -427,6 +427,9 @@ int CameraSensor::initProperties()
>                 case BayerFormat::RGGB:
>                         cfa = properties::draft::RGGB;
>                         break;
> +               case BayerFormat::MONO:
> +                       cfa = properties::draft::MONO;
> +                       break;
>                 }
>
>                 properties_.set(properties::draft::ColorFilterArrangement,
> cfa);
> diff --git a/src/libcamera/property_ids.yaml
> b/src/libcamera/property_ids.yaml
> index 104e9aaf..87be68f7 100644
> --- a/src/libcamera/property_ids.yaml
> +++ b/src/libcamera/property_ids.yaml
> @@ -706,5 +706,9 @@ controls:
>            description: |
>              Sensor is not Bayer; output has 3 16-bit values for each
> pixel,
>              instead of just 1 16-bit value per pixel.
> +        - name: MONO
> +          value: 5
> +          description: |
> +            Sensor is not Bayer; output consits of a single colour
> channel.
>
>  ...
> --
> 2.20.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210625/05e43afb/attachment.htm>


More information about the libcamera-devel mailing list