[libcamera-devel,3/6] libcamera: ipu3: returning partial results
diff mbox series

Message ID 20220726182500.425182-4-hanlinchen@chromium.org
State Superseded
Headers show
Series
  • Implement Android Partial Result Featrue
Related show

Commit Message

Hanlin Chen July 26, 2022, 6:24 p.m. UTC
Return metadata at earlier stage.

Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 46 +++++++++++++++-------------
 1 file changed, 25 insertions(+), 21 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 4fe52f74..75231156 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1300,7 +1300,7 @@  void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)
 		return;
 
 	Request *request = info->request;
-	request->metadata().merge(metadata);
+	pipe()->completeMetadata(request, metadata);
 
 	info->metadataProcessed = true;
 	if (frameInfos_.tryComplete(info))
@@ -1324,16 +1324,8 @@  void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
 		return;
 
 	Request *request = info->request;
-
 	pipe()->completeBuffer(request, buffer);
 
-	request->metadata().set(controls::draft::PipelineDepth, 3);
-	/* \todo Actually apply the scaler crop region to the ImgU. */
-	const auto &scalerCrop = request->controls().get(controls::ScalerCrop);
-	if (scalerCrop)
-		cropRegion_ = *scalerCrop;
-	request->metadata().set(controls::ScalerCrop, cropRegion_);
-
 	if (frameInfos_.tryComplete(info))
 		pipe()->completeRequest(request);
 }
@@ -1372,13 +1364,24 @@  void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
 	 * \todo The sensor timestamp should be better estimated by connecting
 	 * to the V4L2Device::frameStart signal.
 	 */
-	request->metadata().set(controls::SensorTimestamp,
-				buffer->metadata().timestamp);
 
 	info->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);
 
-	if (request->findBuffer(&rawStream_))
+	ControlList metadata;
+	metadata.set(controls::draft::PipelineDepth, 3);
+	metadata.set(controls::SensorTimestamp, buffer->metadata().timestamp);
+
+	/* \todo Actually apply the scaler crop region to the ImgU. */
+	const auto &scalerCrop = request->controls().get(controls::ScalerCrop);
+	if (scalerCrop)
+		cropRegion_ = *scalerCrop;
+	metadata.set(controls::ScalerCrop, cropRegion_);
+
+	pipe()->completeMetadata(request, metadata);
+
+	if (request->findBuffer(&rawStream_)) {
 		pipe()->completeBuffer(request, buffer);
+	}
 
 	ipa_->fillParamsBuffer(info->id, info->paramBuffer->cookie());
 }
@@ -1455,20 +1458,21 @@  void IPU3CameraData::frameStart(uint32_t sequence)
 	Request *request = processingRequests_.front();
 	processingRequests_.pop();
 
-	const auto &testPatternMode = request->controls().get(controls::draft::TestPatternMode);
-	if (!testPatternMode)
-		return;
+	int32_t testPatternMode = controls::draft::TestPatternModeOff;
+	const auto &testPatternControl = request->controls().get(controls::draft::TestPatternMode);
+	if (testPatternControl)
+		testPatternMode = *testPatternControl;
 
 	int ret = cio2_.sensor()->setTestPatternMode(
-		static_cast<controls::draft::TestPatternModeEnum>(*testPatternMode));
+		static_cast<controls::draft::TestPatternModeEnum>(testPatternMode));
 	if (ret) {
-		LOG(IPU3, Error) << "Failed to set test pattern mode: "
-				 << ret;
-		return;
+		LOG(IPU3, Error) << "Failed to set test pattern mode: " << ret;
+		testPatternMode = controls::draft::TestPatternModeOff;
 	}
 
-	request->metadata().set(controls::draft::TestPatternMode,
-				*testPatternMode);
+	ControlList metadata;
+	metadata.set(controls::draft::TestPatternMode, testPatternMode);
+	pipe()->completeMetadata(request, metadata);
 }
 
 REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3)