[libcamera-devel] [PATCH v7 04/13] libcamera: ipu3: Cache the sensor sizes
Jacopo Mondi
jacopo at jmondi.org
Tue Apr 2 19:13:00 CEST 2019
Cache the sensor maximum size and the media bus code used to produce
it.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/pipeline/ipu3/ipu3.cpp | 47 ++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index a870b325f4b3..1e315048738b 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -8,6 +8,8 @@
#include <memory>
#include <vector>
+#include <linux/media-bus-format.h>
+
#include <libcamera/camera.h>
#include <libcamera/request.h>
#include <libcamera/stream.h>
@@ -24,6 +26,22 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(IPU3)
+static int mediaBusToCIO2Format(unsigned int code)
+{
+ switch (code) {
+ case MEDIA_BUS_FMT_SBGGR10_1X10:
+ return V4L2_PIX_FMT_IPU3_SBGGR10;
+ case MEDIA_BUS_FMT_SGBRG10_1X10:
+ return V4L2_PIX_FMT_IPU3_SGBRG10;
+ case MEDIA_BUS_FMT_SGRBG10_1X10:
+ return V4L2_PIX_FMT_IPU3_SGRBG10;
+ case MEDIA_BUS_FMT_SRGGB10_1X10:
+ return V4L2_PIX_FMT_IPU3_SRGGB10;
+ default:
+ return -EINVAL;
+ }
+}
+
class CIO2Device
{
public:
@@ -44,6 +62,10 @@ public:
V4L2Device *output_;
V4L2Subdevice *csi2_;
V4L2Subdevice *sensor_;
+
+ /* Maximum sizes and the mbus code used to produce them. */
+ unsigned int mbusCode_;
+ Size maxSize_;
};
class PipelineHandlerIPU3 : public PipelineHandler
@@ -442,6 +464,10 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
return ret;
/*
+ * Now that we're sure a sensor subdevice is connected, make sure it
+ * produces at least one image format compatible with CIO2 requirements
+ * and cache the camera maximum size.
+ *
* \todo Define when to open and close video device nodes, as they
* might impact on power consumption.
*/
@@ -450,6 +476,27 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
if (ret)
return ret;
+ for (auto it : sensor_->formats(0)) {
+ int mbusCode = mediaBusToCIO2Format(it.first);
+ if (mbusCode < 0)
+ continue;
+
+ for (const SizeRange &size : it.second) {
+ if (maxSize_.width < size.maxWidth &&
+ maxSize_.height < size.maxHeight) {
+ maxSize_.width = size.maxWidth;
+ maxSize_.height = size.maxHeight;
+ mbusCode_ = mbusCode;
+ }
+ }
+ }
+ if (maxSize_.width == 0) {
+ LOG(IPU3, Info) << "Sensor '" << sensor_->entityName()
+ << "' detected, but no supported image format "
+ << " found: skip camera creation";
+ return -ENODEV;
+ }
+
csi2_ = new V4L2Subdevice(csi2Entity);
ret = csi2_->open();
if (ret)
--
2.21.0
More information about the libcamera-devel
mailing list