[libcamera-devel] [PATCH] cam: Fail capture if to few Requests asked for
Niklas Söderlund
niklas.soderlund at ragnatech.se
Mon Feb 8 20:23:54 CET 2021
Hi Laurent,
Thanks for your feedback.
On 2021-02-08 13:36:39 +0200, Laurent Pinchart wrote:
> Hi Niklas,
>
> Thank you for the patch.
>
> On Mon, Feb 08, 2021 at 10:44:16AM +0100, Niklas Söderlund wrote:
> > Running cam with the --capture=N option only queues N Requests to the
> > camera. If N is less then the number of requests needed by the camera to
> > operate cam may deadlock waiting for the camera to complete requests
> > while the camera waits for the application to give it more buffers.
> >
> > Fix this by adding a check in cam to no attempt a capture session if to
> > few requests are requested.
> >
> > Reported-by: Sebastian Fricke <sebastian.fricke at posteo.net>
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> > src/cam/capture.cpp | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp
> > index 7b55fc6770225e2a..18aa97c7cdb55dcc 100644
> > --- a/src/cam/capture.cpp
> > +++ b/src/cam/capture.cpp
> > @@ -90,6 +90,13 @@ int Capture::capture(FrameBufferAllocator *allocator)
> > nbuffers = std::min(nbuffers, allocated);
> > }
> >
> > + if (captureLimit_ && captureLimit_ < nbuffers) {
> > + std::cerr << "Camera requiers at least " << nbuffers
> > + << " reqests to function, " << captureLimit_
> > + << " requested" << std::endl;
> > + return -EINVAL;
> > + }
>
> I'm afraid this isn't right. The pipeline handler may not require
> nbuffers to be queued to operate properly, and this also won't handle
> the end of stream case where some drivers will require enqueing more
> buffers to push the last buffers out.
First off, I agree we should move towards not requiring more then 1
Request queued for a camera to operate popery. But that is the design we
have today and why we added nbuffers. I think it make sens to express
this in cam until we rework our pipelines to not need nbuffers and
instead add scratch buffers or something else.
Further more I don't think we should handle scenarios where we need to
queue more buffers at stream stop. Is this not something v4l2-compliance
checks for? And if we have a pipeline where this does not work we should
fix it in the kernel. But for start conditions there is code in vb2 that
deals with N buffers needs to be queued for capture to start so we need
to handle that somehow in libcamera. Right now this is pushed to
applications and until we rework this I think cam should act on the
information it have instead of dead locking.
>
> We need a more complex solution for this, involving an explicit queue
> depth.
Is this not more needed for operational guarantees of 3A algorithms
unless we are going to have a larger memory footprint by using internal
buffers to keep the algorithms running?
>
> > +
> > /*
> > * TODO: make cam tool smarter to support still capture by for
> > * example pushing a button. For now run all streams all the time.
>
> --
> Regards,
>
> Laurent Pinchart
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list