[PATCH] libcamera: software_isp: Handle signals in the proper thread
Milan Zamazal
mzamazal at redhat.com
Fri Jan 3 19:31:54 CET 2025
Hi Laurent,
Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:
> Hi Milan,
>
> On Thu, Dec 19, 2024 at 10:13:17PM +0100, Milan Zamazal wrote:
>> Barnabás Pőcze writes:
>> > 2024. december 19., csütörtök 11:31 keltezéssel, Milan Zamazal írta:
>> >
>> >> inputBufferReady ready signal in the simple pipeline is handled in the
>> >> pipeline handler thread. Similarly, outputBufferReady and ispStatsReady
>> >> signals should be handled there too, everything should be called from
>> >> the right thread and not block the callers.
>> >>
>> >> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> >> ---
>> >> src/libcamera/pipeline/simple/simple.cpp | 9 +++++++--
>> >> 1 file changed, 7 insertions(+), 2 deletions(-)
>> >>
>> >> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
>> >> index 8ac24e6e..280112f4 100644
>> >> --- a/src/libcamera/pipeline/simple/simple.cpp
>> >> +++ b/src/libcamera/pipeline/simple/simple.cpp
>> >> @@ -548,12 +548,17 @@ int SimpleCameraData::init()
>> >> * bound explicitly to the pipe, which is bound to the pipeline
>> >> * handler thread. The function then simply forwards the call to
>> >> * conversionInputDone().
>> >> + * Similarly for outputBufferReady and ispStatsReady signals.
>> >> */
>> >> swIsp_->inputBufferReady.connect(pipe, [this](FrameBuffer *buffer) {
>> >> this->conversionInputDone(buffer);
>> >> });
>> >> - swIsp_->outputBufferReady.connect(this, &SimpleCameraData::conversionOutputDone);
>> >> - swIsp_->ispStatsReady.connect(this, &SimpleCameraData::ispStatsReady);
>> >> + swIsp_->outputBufferReady.connect(this, [this](FrameBuffer *buffer) {
>> >> + this->conversionOutputDone(buffer);
>> >> + });
>> >> + swIsp_->ispStatsReady.connect(this, [this](uint32_t frame, uint32_t bufferId) {
>> >> + this->ispStatsReady(frame, bufferId);
>> >> + });
>> >> [...]
>> >
>> > The object is still `this`, so I wouldn't expect any difference in behaviour. Is there?
>>
>> Ah, right, should be `pipe', will fix it in v2.
>
> I think it would be better to emit the signals from the camera manager
> thread, instead of relying on the user of the soft ISP to perform
> cross-thread synchronization. That will be less error-prone.
Maybe a stupid question, but how to do it? The signals are emitted from
the corresponding place/thread asynchronously and there is little choice
of the thread to use. At least without passing around some Object bound
to the camera manager thread, which wouldn't be nice either I suppose.
What do I miss?
More information about the libcamera-devel
mailing list