[libcamera-devel] [PATCH v2 2/4] pipeline: vimc: Allocate fake IPA buffers

Umang Jain umang.jain at ideasonboard.com
Fri Aug 13 16:44:35 CEST 2021


VIMC is a virtual test driver that doesn't generate statistics or
consume parameters buffers. Thus, create simple (single plane)
dmabuf-backed FrameBuffers, which can act as fake IPA buffers and
can be memory mapped(mmap) to VIMC IPA.

To create these buffers, temporarily hijack the output video node
and configure it with a V4L2DeviceFormat. Buffers then can be exported
from the output video node using V4L2VideoDevice::exportBuffers().
These buffers will be mimicked as IPA buffers in subsequent commits.

Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
---
 src/libcamera/pipeline/vimc/vimc.cpp | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index 4c92729d..edf8c58e 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -50,6 +50,7 @@ public:
 	}
 
 	int init();
+	int allocateMockIPABuffers();
 	void bufferReady(FrameBuffer *buffer);
 
 	MediaDevice *media_;
@@ -61,6 +62,7 @@ public:
 	Stream stream_;
 
 	std::unique_ptr<ipa::vimc::IPAProxyVimc> ipa_;
+	std::vector<std::unique_ptr<FrameBuffer>> mockIPABufs_;
 };
 
 class VimcCameraConfiguration : public CameraConfiguration
@@ -500,6 +502,12 @@ int VimcCameraData::init()
 	if (raw_->open())
 		return -ENODEV;
 
+	ret = allocateMockIPABuffers();
+	if (!ret) {
+		LOG(VIMC, Warning) << "Cannot allocate fake IPA buffers";
+		/* \todo fail hard or continue? */
+	}
+
 	/* Initialise the supported controls. */
 	const ControlInfoMap &controls = sensor_->controls();
 	ControlInfoMap::Map ctrls;
@@ -548,6 +556,25 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer)
 	pipe_->completeRequest(request);
 }
 
+int VimcCameraData::allocateMockIPABuffers()
+{
+	unsigned int bufCount = 2;
+
+	V4L2DeviceFormat format;
+	format.fourcc = video_->toV4L2PixelFormat(formats::BGR888);
+	format.size = Size(160, 120);
+
+	int ret = video_->tryFormat(&format);
+	if (ret < 0)
+		return ret;
+
+	ret = video_->setFormat(&format);
+	if (ret < 0)
+		return ret;
+
+	return video_->exportBuffers(bufCount, &mockIPABufs_);
+}
+
 REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc)
 
 } /* namespace libcamera */
-- 
2.31.0



More information about the libcamera-devel mailing list