[PATCH/RFC,30/32] pipeline: raspberrypi: vc4: Fix configuration of the embedded data node
diff mbox series

Message ID 20240301212121.9072-31-laurent.pinchart@ideasonboard.com
State RFC
Headers show
Series
  • libcamera: Support the upstream Unicam driver
Related show

Commit Message

Laurent Pinchart March 1, 2024, 9:21 p.m. UTC
The Unicam embedded data video device suffers from two issues with the
upstream driver:

- The driver uses the generic metadata V4L2_META_FMT_GENERIC_* formats,
  instead of the downstream V4L2_META_FMT_SENSOR_DATA.

- The driver requires the width and height of the embedded data stream
  to be configured.

Fix them both.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/libcamera/pipeline/rpi/vc4/vc4.cpp | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
index 81e0bc1b8f7a..2ff9b708d021 100644
--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
@@ -624,10 +624,25 @@  int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi
 	 * supports it.
 	 */
 	if (sensorMetadata_) {
+		static const std::map<uint32_t, V4L2PixelFormat> metaFormats{
+			{ MEDIA_BUS_FMT_META_8, V4L2PixelFormat(V4L2_META_FMT_GENERIC_8) },
+			{ MEDIA_BUS_FMT_META_10, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_10) },
+			{ MEDIA_BUS_FMT_META_12, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_12) },
+			{ MEDIA_BUS_FMT_META_14, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_14) },
+		};
+
 		V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat();
+		const auto metaFormat = metaFormats.find(embeddedFormat.code);
+		if (metaFormat == metaFormats.end()) {
+			LOG(RPI, Error)
+				<< "Unsupported metadata format "
+				<< utils::hex(embeddedFormat.code, 4);
+			return -EINVAL;
+		}
+
 		V4L2DeviceFormat format{};
-		format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA);
-		format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height;
+		format.fourcc = metaFormat->second;
+		format.size = embeddedFormat.size;
 
 		LOG(RPI, Debug) << "Setting embedded data format " << format;
 		ret = unicam_[Unicam::Embedded].dev()->setFormat(&format);