@@ -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)
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(-)