From 2be53dc60565822008ebb7d877bc10e6c234ef8f Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Tue, 2 Apr 2019 19:00:16 +0200 Subject: libcamera: ipu3: Cache the sensor size and format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cache the sensor maximum size and the media bus code used to produce it. Reviewed-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/ipu3/ipu3.cpp | 51 +++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 99395477..02521f5f 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -8,6 +8,8 @@ #include #include +#include + #include #include #include @@ -41,9 +43,15 @@ public: int init(const MediaDevice *media, unsigned int index); + static int mediaBusToFormat(unsigned int code); + 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 @@ -407,7 +415,7 @@ void PipelineHandlerIPU3::IPU3CameraData::bufferReady(Buffer *buffer) * Create and open the video device and subdevices in the CIO2 instance at \a * index, if a supported image sensor is connected to the CSI-2 receiver of * this CIO2 instance. Enable the media links connecting the CIO2 components - * to prepare for capture operations. + * to prepare for capture operations and cached the sensor maximum size. * * \return 0 on success or a negative error code otherwise * \retval -ENODEV No supported image sensor is connected to this CIO2 instance @@ -442,6 +450,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 +462,27 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) if (ret) return ret; + for (auto it : sensor_->formats(0)) { + int mbusCode = mediaBusToFormat(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) @@ -464,6 +497,22 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) return 0; } +int CIO2Device::mediaBusToFormat(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; + } +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3); } /* namespace libcamera */ -- cgit v1.2.1