[libcamera-devel] [PATCH] libcamera: vimc: Adjust crop rectangle

Jacopo Mondi jacopo at jmondi.org
Fri May 1 17:16:51 CEST 2020


Since the Linux kernel commit:
69e39d40587b ("media: vimc: Implement get/set selection in sink")
the crop rectangle on the VIMC scaler sink pad needs to be
reset to match the requested format to avoid hitting a pipeline format
mis-configurations when the applied format is larger than the one
set in a previous capture session.

As the V4L2 specification is not clear on what the correct behaviour
is, if the crop rectangle should be reset automatically or not on a
set_fmt operation, momentary fix the pipeline handler to please the
driver and manually reset the crop rectangle.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---

Tested on v5.6, please test on older kernel releases.

---
 src/libcamera/pipeline/vimc/vimc.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index ccfd7f86d158..339d1cf653fb 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -224,6 +224,16 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
 	if (ret)
 		return ret;

+	Rectangle crop = {
+		.x = 0,
+		.y = 0,
+		.width = subformat.size.width,
+		.height = subformat.size.height,
+	};
+	ret = data->scaler_->setSelection(0, V4L2_SEL_TGT_CROP, &crop);
+	if (ret && ret != -ENOTTY)
+		return ret;
+
 	subformat.size = cfg.size;
 	ret = data->scaler_->setFormat(1, &subformat);
 	if (ret)
--
2.26.1



More information about the libcamera-devel mailing list