summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2022-07-15 14:11:49 +0200
committerJacopo Mondi <jacopo@jmondi.org>2022-07-23 11:41:20 +0200
commit6aa6d57e8166ab8698ec43e62a271a5da9ce72d9 (patch)
tree0982ec3d9e068ca098ed1cb72cb366e12332252b
parent15a5ab99aea0f87c86a5e45401fc2641e813ff3e (diff)
libcamera: v4l2_videodevice: Add multiplanar argument to toV4L2PixelFormat
The toV4L2PixelFormat() function selects which V4L2 format variant to use (contiguous planes vs non-contiguous version) by using video device multiplanar API from the capabilities. The isMultiplanar() function however verifies if the video device uses the singleplanar or the multiplanar V4L2 API, something which is unrelated to the format variant to use. Add a 'multiplanar' flag, which defaults to false, to the toV4L2PixelFormat() function to allow explicit selection of the format variant. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--include/libcamera/internal/v4l2_videodevice.h3
-rw-r--r--src/libcamera/v4l2_videodevice.cpp13
2 files changed, 9 insertions, 7 deletions
diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
index 6d8850c9..64296c58 100644
--- a/include/libcamera/internal/v4l2_videodevice.h
+++ b/include/libcamera/internal/v4l2_videodevice.h
@@ -228,7 +228,8 @@ public:
static std::unique_ptr<V4L2VideoDevice>
fromEntityName(const MediaDevice *media, const std::string &entity);
- V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat) const;
+ V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat,
+ bool multiplanar = false) const;
protected:
std::string logPrefix() const override;
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index a3242ba7..767ab236 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1992,23 +1992,24 @@ V4L2VideoDevice::fromEntityName(const MediaDevice *media,
/**
* \brief Convert \a PixelFormat to one of the device supported V4L2 FourCC
* \param[in] pixelFormat The PixelFormat to convert
+ * \param[in] multiplanar Use the multiplanar format version, default to false
*
* Convert a\ pixelformat to a V4L2 FourCC that is known to be supported by
* the video device.
*
- * For multiplanar formats, the V4L2 format variant (contiguous or
- * non-contiguous planes) is selected automatically based on the capabilities
- * of the video device. If the video device supports the V4L2 multiplanar API,
- * non-contiguous formats are preferred.
+ * V4L2 defines different format variants for the same format when using
+ * contiguous or non-contiguous planes. The \a multiplanar parameter allows
+ * to select which variant to use.
*
* \return The V4L2PixelFormat corresponding to \a pixelFormat or an invalid
* PixelFormat if \a pixelFormat is not supported by the video device
*/
-V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelFormat) const
+V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelFormat,
+ bool multiplanar) const
{
std::vector<V4L2PixelFormat> deviceFormats = enumPixelformats(0);
std::vector<V4L2PixelFormat> v4l2PixelFormats =
- V4L2PixelFormat::fromPixelFormat(pixelFormat, caps_.isMultiplanar());
+ V4L2PixelFormat::fromPixelFormat(pixelFormat, multiplanar);
for (const V4L2PixelFormat &v4l2Format : v4l2PixelFormats) {
auto it = std::find_if(deviceFormats.begin(), deviceFormats.end(),