summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMilan Zamazal <mzamazal@redhat.com>2025-02-25 16:06:09 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2025-03-01 23:09:56 +0000
commitcd32e069ecf23f26312d3b0067c676f8cc33c7b8 (patch)
treeee5248b2c855297b861437c96386b953965d2961 /src
parentba4715ffedea0c6b1ba98049ab5a2bd35a56bb0a (diff)
libcamera: software_isp: Handle queued input buffers on stop
When SoftwareIsp stops, input and output buffers queued to it may not yet be fully processed. They will be eventually returned but stop means stop, there should be no processing related actions invoked afterwards. Let's stop forwarding processed input buffers from SoftwareIsp slots when SoftwareIsp is stopped. Let's track the queued input buffers and return them back for capture in SoftwareIsp::stop(). The returned input buffers are marked as cancelled. This is not necessary at the moment but it gives the pipeline handlers chance to deal with this if they need to. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/software_isp/software_isp.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
index 140cddf3..12d08078 100644
--- a/src/libcamera/software_isp/software_isp.cpp
+++ b/src/libcamera/software_isp/software_isp.cpp
@@ -303,6 +303,8 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input,
return -EINVAL;
}
+ queuedInputBuffers_.push_back(input);
+
for (auto iter = outputs.begin(); iter != outputs.end(); iter++) {
FrameBuffer *const buffer = iter->second;
queuedOutputBuffers_.push_back(buffer);
@@ -329,6 +331,9 @@ int SoftwareIsp::start()
/**
* \brief Stops the Software ISP streaming operation
+ *
+ * All pending buffers are returned back as canceled before this function
+ * returns.
*/
void SoftwareIsp::stop()
{
@@ -344,6 +349,13 @@ void SoftwareIsp::stop()
outputBufferReady.emit(buffer);
}
queuedOutputBuffers_.clear();
+
+ for (auto buffer : queuedInputBuffers_) {
+ FrameMetadata &metadata = buffer->_d()->metadata();
+ metadata.status = FrameMetadata::FrameCancelled;
+ inputBufferReady.emit(buffer);
+ }
+ queuedInputBuffers_.clear();
}
/**
@@ -377,7 +389,11 @@ void SoftwareIsp::statsReady(uint32_t frame, uint32_t bufferId)
void SoftwareIsp::inputReady(FrameBuffer *input)
{
- inputBufferReady.emit(input);
+ if (running_) {
+ ASSERT(queuedInputBuffers_.front() == input);
+ queuedInputBuffers_.pop_front();
+ inputBufferReady.emit(input);
+ }
}
void SoftwareIsp::outputReady(FrameBuffer *output)