[libcamera-devel] [PATCH 1/2] pipeline: raspberrypi: Fix under-allocation of embedded data buffers
Jacopo Mondi
jacopo at jmondi.org
Wed Dec 1 15:02:08 CET 2021
Hi David
On Tue, Nov 30, 2021 at 11:22:58AM +0000, David Plowman wrote:
> The code was reducing the number of raw stream buffers allocated when
> the application is providing some of its own. However, it was not
> taking account of the fact that the application cannot supply embedded
> data buffers, so it must always allocate a reasonable minimum number
> of these buffers (possibly more than the number of raw stream buffers)
> to prevent frame drops.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thanks
j
> ---
> .../pipeline/raspberrypi/raspberrypi.cpp | 25 ++++++++++++-------
> 1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index e31fa3b2..045725dd 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1248,18 +1248,25 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
> /* Decide how many internal buffers to allocate. */
> for (auto const stream : data->streams_) {
> unsigned int numBuffers;
> -
> - if (stream == &data->unicam_[Unicam::Image] ||
> - stream == &data->unicam_[Unicam::Embedded]) {
> + /*
> + * For Unicam, allocate a minimum of 4 buffers as we want
> + * to avoid any frame drops.
> + */
> + constexpr unsigned int minBuffers = 4;
> + if (stream == &data->unicam_[Unicam::Image]) {
> /*
> - * For Unicam, allocate a minimum of 4 buffers as we want
> - * to avoid any frame drops. If an application has configured
> - * a RAW stream, allocate additional buffers to make up the
> - * minimum, but ensure we have at least 2 sets of internal
> - * buffers to use to minimise frame drops.
> + * If an application has configured a RAW stream, allocate
> + * additional buffers to make up the minimum, but ensure
> + * we have at least 2 sets of internal buffers to use to
> + * minimise frame drops.
> */
> - constexpr unsigned int minBuffers = 4;
> numBuffers = std::max<int>(2, minBuffers - numRawBuffers);
> + } else if (stream == &data->unicam_[Unicam::Embedded]) {
> + /*
> + * Embedded data buffers are (currently) for internal use,
> + * so allocate the minimum required to avoid frame drops.
> + */
> + numBuffers = minBuffers;
> } else {
> /*
> * Since the ISP runs synchronous with the IPA and requests,
> --
> 2.30.2
>
More information about the libcamera-devel
mailing list