[PATCH v2 2/5] libcamera: software_isp: Handle queued output buffers on stop

Milan Zamazal mzamazal at redhat.com
Mon Feb 24 21:50:02 CET 2025


Hi Laurent,

thank you for review.

Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:

> Hi Milan,
>
> Thank you for the patch.
>
> On Mon, Feb 24, 2025 at 07:52:32PM +0100, Milan Zamazal wrote:
>> 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 output buffers from the SoftwareIsp
>> slots once SoftwareIsp is stopped.  Let's track the queued output
>> buffers and mark those still pending as canceled in SoftwareIsp::stop
>> and return them to the pipeline handler.
>> 
>> Dealing with input buffers is addressed in a separate patch.
>> 
>> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> ---
>>  .../internal/software_isp/software_isp.h      |  1 +
>>  src/libcamera/software_isp/software_isp.cpp   | 22 ++++++++++++++++---
>>  2 files changed, 20 insertions(+), 3 deletions(-)
>> 
>> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
>> index af0dcc24..f2344355 100644
>> --- a/include/libcamera/internal/software_isp/software_isp.h
>> +++ b/include/libcamera/internal/software_isp/software_isp.h
>> @@ -101,6 +101,7 @@ private:
>>  
>>  	std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
>>  	bool running_;
>> +	std::deque<FrameBuffer *> queuedOutputBuffers_;
>
> #include <deque>
>
>>  };
>>  
>>  } /* namespace libcamera */
>> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
>> index 1a39f4d8..4339e547 100644
>> --- a/src/libcamera/software_isp/software_isp.cpp
>> +++ b/src/libcamera/software_isp/software_isp.cpp
>> @@ -17,6 +17,7 @@
>>  #include <libcamera/formats.h>
>>  #include <libcamera/stream.h>
>>  
>> +#include "libcamera/internal/framebuffer.h"
>>  #include "libcamera/internal/ipa_manager.h"
>>  #include "libcamera/internal/software_isp/debayer_params.h"
>>  
>> @@ -300,8 +301,11 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input,
>>  			return -EINVAL;
>>  	}
>>  
>> -	for (auto iter = outputs.begin(); iter != outputs.end(); iter++)
>> -		process(frame, input, iter->second);
>> +	for (auto iter = outputs.begin(); iter != outputs.end(); iter++) {
>> +		FrameBuffer *const buffer = iter->second;
>> +		queuedOutputBuffers_.push_back(buffer);
>> +		process(frame, input, buffer);
>> +	}
>>  
>>  	return 0;
>>  }
>> @@ -331,6 +335,13 @@ void SoftwareIsp::stop()
>>  
>>  	running_ = false;
>>  	ipa_->stop();
>> +
>> +	for (auto buffer : queuedOutputBuffers_) {
>> +		FrameMetadata &metadata = buffer->_d()->metadata();
>> +		metadata.status = FrameMetadata::FrameCancelled;
>> +		outputBufferReady.emit(buffer);
>> +	}
>> +	queuedOutputBuffers_.clear();
>>  }
>>  
>>  /**
>> @@ -369,7 +380,12 @@ void SoftwareIsp::inputReady(FrameBuffer *input)
>>  
>>  void SoftwareIsp::outputReady(FrameBuffer *output)
>>  {
>> -	outputBufferReady.emit(output);
>> +	if (running_) {
>> +		queuedOutputBuffers_.erase(find(queuedOutputBuffers_.begin(),
>
> s/find/std::find/
>
> and #include <algorithm>.
>
> This being said, the software ISP always processes buffers in order. Do
> we need to call find(), can't we just call pop_front() with an assertion
> to ensure the element matches ?

I can't see any contradiction to this and it works for me so I'll do it
this way in v3.

>> +						queuedOutputBuffers_.end(),
>> +						output));
>> +		outputBufferReady.emit(output);
>> +	}
>>  }
>>  
>>  } /* namespace libcamera */



More information about the libcamera-devel mailing list