summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Plowman <david.plowman@raspberrypi.com>2021-06-28 13:23:22 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-06-28 19:33:42 +0300
commitbdf04cca086eb72a9e0528ba90a5c53d96e52a01 (patch)
treedbe4f65e6e61fe36cfdf445907983718c070aa05
parent8738d539f4a350d51bc1f6b780cc1fdfd62cf4ec (diff)
libcamera: Add support for monochrome sensors
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@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--include/libcamera/internal/bayer_format.h3
-rw-r--r--src/libcamera/bayer_format.cpp14
-rw-r--r--src/libcamera/camera_sensor.cpp3
-rw-r--r--src/libcamera/property_ids.yaml4
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 94dcf4f9..cde431cc 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -428,6 +428,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..12ecbce5 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 consists of a single colour channel.
...