diff options
-rw-r--r-- | src/libcamera/pipeline/ipu3/ipu3.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 2b4d3150..3dd1bdd0 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1164,6 +1164,7 @@ void IPU3CameraData::queueFrameAction(unsigned int id, * in action.controls to register additional metadata. */ Request *request = info->request; + info->metadataProcessed = true; if (frameInfos_.tryComplete(info)) pipe_->completeRequest(request); @@ -1253,8 +1254,17 @@ void IPU3CameraData::paramBufferReady(FrameBuffer *buffer) return; info->paramDequeued = true; + + /* + * tryComplete() will delete info if it completes the IPU3Frame. + * In that event, we must have obtained the Request before hand. + * + * \todo Improve the FrameInfo API to avoid this type of issue + */ + Request *request = info->request; + if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(info->request); + pipe_->completeRequest(request); } void IPU3CameraData::statBufferReady(FrameBuffer *buffer) @@ -1265,8 +1275,16 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer) if (buffer->metadata().status == FrameMetadata::FrameCancelled) { info->metadataProcessed = true; + + /* + * tryComplete() will delete info if it completes the IPU3Frame. + * In that event, we must have obtained the Request before hand. + */ + Request *request = info->request; + if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(info->request); + pipe_->completeRequest(request); + return; } |