[libcamera-devel] [PATCH v1 2/2] pipeline: raspberrypi: Fix the buffer count calculation for the ISP input stream

David Plowman david.plowman at raspberrypi.com
Tue Feb 1 10:47:09 CET 2022


Hi Naush

Thanks for this patch. Weird how we never noticed this problem before!

On Tue, 1 Feb 2022 at 09:27, Naushir Patuck <naush at raspberrypi.com> wrote:
>
> The ISP input stream currently only allocates a single slot in the
> V4L2VideoDevice cache as it follows the number of buffers allocated for use.
> However, this is wrong as the ISP input stream imports buffers from Unicam
> image stream.  As a consequence of this, only one cache slot was used during
> runtime for the ISP input stream, and if multiple buffers were to be queued
> simultaneously, the queue operation would return a failure.
>
> Fix this by passing the same number of RAW buffers available from the Unicam
> image stream. Additionally, double this count in the cases where buffers could
> be allocated externally from the application.

I agree this sounds like it wants a better solution, but is definitely
beyond the scope of this (relatively small but important) fix. So:

Reviewed-by: David Plowman <david.plowman at raspberrypi.com>

Thanks!
David

>
> Bug: https://github.com/raspberrypi/libcamera-apps/issues/236
>      https://github.com/raspberrypi/libcamera-apps/issues/238
>      https://github.com/raspberrypi/libcamera-apps/issues/240
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 8 ++++++++
>  src/libcamera/pipeline/raspberrypi/rpi_stream.cpp  | 3 ++-
>  2 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 6a46e6bc89fa..49af56edc1f9 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1382,6 +1382,14 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
>                          * minimise frame drops.
>                          */
>                         numBuffers = std::max<int>(2, minBuffers - numRawBuffers);
> +               } else if (stream == &data->isp_[Isp::Input]) {
> +                       /*
> +                        * ISP input buffers are imported from Unicam, so follow
> +                        * similar logic as above to count all the RAW buffers
> +                        * available.
> +                        */
> +                       numBuffers = numRawBuffers + std::max<int>(2, minBuffers - numRawBuffers);
> +
>                 } else if (stream == &data->unicam_[Unicam::Embedded]) {
>                         /*
>                          * Embedded data buffers are (currently) for internal use,
> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> index a4159e20b068..a421ad09ba50 100644
> --- a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> @@ -111,11 +111,12 @@ int Stream::prepareBuffers(unsigned int count)
>          * If this is an external stream, we must allocate slots for buffers that
>          * might be externally allocated. We have no indication of how many buffers
>          * may be used, so this might overallocate slots in the buffer cache.
> +        * Similarly, if this stream is only importing buffers, we do the same.
>          *
>          * \todo Find a better heuristic, or, even better, an exact solution to
>          * this issue.
>          */
> -       if (isExternal())
> +       if (isExternal() || importOnly_)
>                 count = count * 2;
>
>         return dev_->importBuffers(count);
> --
> 2.25.1
>


More information about the libcamera-devel mailing list