[v3,11/11] pipeline: simple: Include the software ISP crop in request metadata
diff mbox series

Message ID 20261016202818.1405645-12-halfline@gmail.com
State New
Headers show
Series
  • software-isp: Align crops, statistics and metadata
Related show

Commit Message

Ray Strode Oct. 16, 2026, 8:28 p.m. UTC
From: Ray Strode <rstrode@redhat.com>

This commit includes the software ISP's configured image region in
completed requests as ScalerCrop metadata.

The simple pipeline exposes this fixed region through ScalerCropMaximum,
but completed requests still omit the sensor rectangle visible in their
processed output.

The crop is cached when the software ISP is configured and reported when
each request completes. Reconfiguration clears the cached region so
raw-only requests do not inherit an earlier processed-image crop.

Based on Kieran Bingham's ScalerCrop metadata reporting patch, extended to
use the software ISP's selected image region.

Link: https://patchwork.libcamera.org/patch/26817/
Signed-off-by: Ray Strode <rstrode@redhat.com>
---
 src/libcamera/pipeline/simple/simple.cpp | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 91b149d1..cce42af7 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -363,6 +363,7 @@  public:
 	std::unique_ptr<Converter> converter_;
 	std::unique_ptr<SoftwareIsp> swIsp_;
 	SimpleFrames frameInfo_;
+	std::optional<Rectangle> scalerCrop_;
 
 private:
 	void tryPipeline(unsigned int code, const Size &size);
@@ -1022,10 +1023,10 @@  void SimpleCameraData::updateScalerCrop(const Size &inputSize, Transform transfo
 		}
 	}
 
-	Rectangle crop = debayerCropToSensor(swIsp_->inputCrop(), inputSize,
-					     sensorInfo.analogCrop, sensorInfo.activeArea,
-					     transform);
-	properties_.set(properties::ScalerCropMaximum, crop);
+	scalerCrop_ = debayerCropToSensor(swIsp_->inputCrop(), inputSize,
+					  sensorInfo.analogCrop, sensorInfo.activeArea,
+					  transform);
+	properties_.set(properties::ScalerCropMaximum, *scalerCrop_);
 }
 
 void SimpleCameraData::tryCompleteRequest(Request *request)
@@ -1042,6 +1043,9 @@  void SimpleCameraData::tryCompleteRequest(Request *request)
 	if (info->metadataRequired && !info->metadataProcessed)
 		return;
 
+	if (scalerCrop_)
+		request->_d()->metadata().set(controls::ScalerCrop, *scalerCrop_);
+
 	frameInfo_.destroy(info->frame);
 	pipe()->completeRequest(request);
 }
@@ -1550,6 +1554,7 @@  int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
 	V4L2VideoDevice *video = data->video_;
 	int ret;
 
+	data->scalerCrop_.reset();
 	data->properties_ = data->sensor_->properties();
 
 	/*