[libcamera-devel] [PATCH v3 4/5] pipeline: raspberrypi: Repurpose RPi::Stream::reset()

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Mar 21 12:51:37 CET 2022


Quoting Naushir Patuck via libcamera-devel (2022-03-21 10:27:01)
> The original use of RPi::Stream::reset() was to clear the external flag state
> and free/clear out the framebuffers for the stream. However, the latter is now
> done through PipelineHandlerRPi::configure(). Rework
> PipelineHandlerRPi::configure() to call RPi::Stream::setExternal() instead of
> RPi::Stream::reset() to achieve the same thing.
> 
> Repurpose RPi::Stream::reset() to instead reset the state of the buffer handling
> logic, where all internally allocated buffers are put back into the queue of
> available buffers. As such, rename the function to RPi::Stream::resetbuffers()
> This resetbuffers() is now called from PipelineHandlerRPi::start(), allowing the

/resetbuffers/resetBuffers/ twice above. But could be handled while
applying.


> pipeline handler to correctly deal with start()/stop()/start() sequences and
> reusing the buffers allocated on the first start().
> 
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> Tested-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  7 +++++--
>  src/libcamera/pipeline/raspberrypi/rpi_stream.cpp  | 13 ++++++-------
>  src/libcamera/pipeline/raspberrypi/rpi_stream.h    |  2 +-
>  3 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 92043962494b..0ff6acdceb66 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -693,7 +693,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>         /* Start by freeing all buffers and reset the Unicam and ISP stream states. */
>         data->freeBuffers();
>         for (auto const stream : data->streams_)
> -               stream->reset();
> +               stream->setExternal(false);
>  
>         BayerFormat::Packing packing = BayerFormat::Packing::CSI2;
>         Size maxSize, sensorSize;
> @@ -991,6 +991,9 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>         RPiCameraData *data = cameraData(camera);
>         int ret;
>  
> +       for (auto const stream : data->streams_)
> +               stream->resetBuffers();
> +
>         if (!data->buffersAllocated_) {
>                 /* Allocate buffers for internal pipeline usage. */
>                 ret = prepareBuffers(camera);
> @@ -1031,7 +1034,7 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>         data->unicam_[Unicam::Image].dev()->setFrameStartEnabled(true);
>  
>         /*
> -        * Reset the delayed controls with the gain and exposure values set by
> +        * resetBuffers the delayed controls with the gain and exposure values set by

Possibly a little too much of a match on the find/replace?

Could easily be dropped while applying.


>          * the IPA.
>          */
>         data->delayedCtrls_->reset();
> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> index f446e1ce66c7..7a93efaa29da 100644
> --- a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> @@ -26,10 +26,12 @@ std::string Stream::name() const
>         return name_;
>  }
>  
> -void Stream::reset()
> +void Stream::resetBuffers()
>  {
> -       external_ = false;
> -       clearBuffers();
> +       /* Add all internal buffers to the queue of usable buffers. */
> +       availableBuffers_ = {};

I think this is ok, but I get a bit worried when I see blanket buffer
state changes like that.

> +       for (auto const &buffer : internalBuffers_)
> +               availableBuffers_.push(buffer.get());

Is there any other action that is required to update the state of the
buffer if it was currently in use when this gets called? (Currently I
think the only call site is below so it's fine).


With the above fixes (that can be fixed while applying if suitable)

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

>  }
>  
>  void Stream::setExternal(bool external)
> @@ -97,10 +99,7 @@ int Stream::prepareBuffers(unsigned int count)
>  
>                         /* Add these exported buffers to the internal/external buffer list. */
>                         setExportedBuffers(&internalBuffers_);
> -
> -                       /* Add these buffers to the queue of internal usable buffers. */
> -                       for (auto const &buffer : internalBuffers_)
> -                               availableBuffers_.push(buffer.get());
> +                       resetBuffers();
>                 }
>  
>                 /* We must import all internal/external exported buffers. */
> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.h b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> index d6f49d34f8c8..c37f7e82eef6 100644
> --- a/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> @@ -45,7 +45,7 @@ public:
>         V4L2VideoDevice *dev() const;
>         std::string name() const;
>         bool isImporter() const;
> -       void reset();
> +       void resetBuffers();
>  
>         void setExternal(bool external);
>         bool isExternal() const;
> -- 
> 2.25.1
>


More information about the libcamera-devel mailing list