[PATCH v2 3/5] libcamera: software_isp: Handle queued input buffers on stop

Milan Zamazal mzamazal at redhat.com
Mon Feb 24 21:19:53 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:33PM +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 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().
>> 
>> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> ---
>>  .../internal/software_isp/software_isp.h         |  1 +
>>  src/libcamera/software_isp/software_isp.cpp      | 16 +++++++++++++++-
>>  2 files changed, 16 insertions(+), 1 deletion(-)
>> 
>> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
>> index f2344355..bfe34725 100644
>> --- a/include/libcamera/internal/software_isp/software_isp.h
>> +++ b/include/libcamera/internal/software_isp/software_isp.h
>> @@ -102,6 +102,7 @@ private:
>>  	std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
>>  	bool running_;
>>  	std::deque<FrameBuffer *> queuedOutputBuffers_;
>> +	std::deque<FrameBuffer *> queuedInputBuffers_;
>
> I'd move input before output.
>
>>  };
>>  
>>  } /* namespace libcamera */
>> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
>> index 4339e547..3a605ab2 100644
>> --- a/src/libcamera/software_isp/software_isp.cpp
>> +++ b/src/libcamera/software_isp/software_isp.cpp
>> @@ -301,6 +301,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);
>> @@ -327,6 +329,9 @@ int SoftwareIsp::start()
>>  
>>  /**
>>   * \brief Stops the Software ISP streaming operation
>> + *
>> + * All pending buffers are returned back (output buffers as canceled) before
>> + * this method finishes.
>
> Shouldn't the input buffer be cancelled too ?

Is it necessary to cancel input buffers?  Aren't they just returned for
re-use regardless of their contents (unlike the output buffers where the
validity of the contents matters)?  The input buffer lands in
V4L2VideoDevice::queueBuffer() and I can't see any use of the status
there.

>>   */
>>  void SoftwareIsp::stop()
>>  {
>> @@ -342,6 +347,10 @@ void SoftwareIsp::stop()
>>  		outputBufferReady.emit(buffer);
>>  	}
>>  	queuedOutputBuffers_.clear();
>> +
>> +	for (auto buffer : queuedInputBuffers_)
>> +		inputBufferReady.emit(buffer);
>> +	queuedInputBuffers_.clear();
>>  }
>>  
>>  /**
>> @@ -375,7 +384,12 @@ void SoftwareIsp::statsReady(uint32_t frame, uint32_t bufferId)
>>  
>>  void SoftwareIsp::inputReady(FrameBuffer *input)
>>  {
>> -	inputBufferReady.emit(input);
>> +	if (running_) {
>> +		queuedInputBuffers_.erase(find(queuedInputBuffers_.begin(),
>> +					       queuedInputBuffers_.end(),
>> +					       input));
>
> Same comment as for 2/5.
>
>> +		inputBufferReady.emit(input);
>> +	}
>>  }
>>  
>>  void SoftwareIsp::outputReady(FrameBuffer *output)



More information about the libcamera-devel mailing list