[libcamera-devel] [PATCH 03/15] libcamera: ipu3: cio2: Report format and sizes
Jacopo Mondi
jacopo at jmondi.org
Wed Jul 1 14:30:24 CEST 2020
Add two methods to the CIO2Device class to retrieve all the supported
PixelFormats and sizes.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/pipeline/ipu3/cio2.cpp | 43 +++++++++++++++++++++++++++-
src/libcamera/pipeline/ipu3/cio2.h | 7 +++++
2 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index 2ec8fcb42d92..b34194c5097f 100644
--- a/src/libcamera/pipeline/ipu3/cio2.cpp
+++ b/src/libcamera/pipeline/ipu3/cio2.cpp
@@ -33,7 +33,7 @@ static const std::map<uint32_t, PixelFormat> mbusCodesToPixelFormat = {
} /* namespace */
CIO2Device::CIO2Device()
- : sensor_(nullptr), csi2_(nullptr), output_(nullptr)
+ : sensor_(nullptr), csi2_(nullptr), output_(nullptr), initialized_(false)
{
}
@@ -44,6 +44,45 @@ CIO2Device::~CIO2Device()
delete sensor_;
}
+/**
+ * \brief Retrieve the list of supported PixelFormats
+ *
+ * Retrieve the list of supported pixel formats by matching the sensor produced
+ * media bus codes with the formats supported by the CIO2 unit.
+ *
+ * \return The list of supported PixelFormat
+ */
+std::vector<PixelFormat> CIO2Device::formats() const
+{
+ if (!initialized_)
+ return {};
+
+ std::vector<PixelFormat> formats;
+ for (unsigned int code : sensor_->mbusCodes()) {
+ auto it = mbusCodesToPixelFormat.find(code);
+ if (it != mbusCodesToPixelFormat.end())
+ formats.push_back(it->second);
+ }
+
+ return formats;
+}
+
+/**
+ * \brief Retrieve the list of supported size ranges
+ * \return The list of supported SizeRange
+ */
+std::vector<SizeRange> CIO2Device::sizes() const
+{
+ if (!initialized_)
+ return {};
+
+ std::vector<SizeRange> sizes;
+ for (const Size &size : sensor_->sizes())
+ sizes.emplace_back(size, size);
+
+ return sizes;
+}
+
/**
* \brief Initialize components of the CIO2 device with \a index
* \param[in] media The CIO2 media device
@@ -127,6 +166,8 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
output_->bufferReady.connect(this, &CIO2Device::cio2BufferReady);
+ initialized_ = true;
+
return 0;
}
diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h
index dc764b101f11..7e793e8450f5 100644
--- a/src/libcamera/pipeline/ipu3/cio2.h
+++ b/src/libcamera/pipeline/ipu3/cio2.h
@@ -18,7 +18,9 @@ namespace libcamera {
class CameraSensor;
class FrameBuffer;
class MediaDevice;
+class PixelFormat;
class Request;
+class SizeRange;
class V4L2DeviceFormat;
class V4L2Subdevice;
class V4L2VideoDevice;
@@ -33,6 +35,9 @@ public:
CIO2Device();
~CIO2Device();
+ std::vector<PixelFormat> formats() const;
+ std::vector<SizeRange> sizes() const;
+
int init(const MediaDevice *media, unsigned int index);
int configure(const Size &size, V4L2DeviceFormat *outputFormat);
@@ -61,6 +66,8 @@ private:
std::vector<std::unique_ptr<FrameBuffer>> buffers_;
std::queue<FrameBuffer *> availableBuffers_;
+
+ bool initialized_;
};
} /* namespace libcamera */
--
2.27.0
More information about the libcamera-devel
mailing list