[RFC PATCH 4/4] pipeline: rkisp1: Prperly handle the bufferCount set in the stream configuration
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Fri May 30 11:58:10 CEST 2025
Hi Kieran
On Tue, May 27, 2025 at 04:39:38PM +0100, Kieran Bingham wrote:
> Quoting Stefan Klug (2025-05-26 22:42:18)
> > The bufferCount is reset to a hardcoded value of 4 in RkISP1Path::validate().
> > Keep the default value of 4 but do not reset it, if it was changed.
> >
> > Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> > ---
> > src/libcamera/pipeline/rkisp1/rkisp1.cpp | 5 +++--
> > src/libcamera/pipeline/rkisp1/rkisp1_path.cpp | 6 ++----
> > src/libcamera/pipeline/rkisp1/rkisp1_path.h | 4 +---
> > 3 files changed, 6 insertions(+), 9 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index af9117c83630..ea94bccd252d 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -791,6 +791,7 @@ PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
> > return nullptr;
> >
> > cfg.colorSpace = colorSpace;
> > + cfg.bufferCount = kPipelineDepth;
>
> Does the user setting this larger now have any effect anywhere at all ?
> or does cfg.bufferCount become unused ?
>
> > config->addConfiguration(cfg);
> > }
> >
> > @@ -1124,14 +1125,14 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL
> > }
> >
> > if (data->mainPath_->isEnabled()) {
> > - ret = mainPath_.start();
> > + ret = mainPath_.start(maxQueuedRequestsDevice());
> > if (ret)
> > return ret;
> > actions += [&]() { mainPath_.stop(); };
> > }
> >
> > if (hasSelfPath_ && data->selfPath_->isEnabled()) {
> > - ret = selfPath_.start();
> > + ret = selfPath_.start(maxQueuedRequestsDevice());
> > if (ret)
> > return ret;
> > }
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
> > index 64018dc5b2f4..2f482fcc1834 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
> > @@ -249,7 +249,6 @@ RkISP1Path::generateConfiguration(const CameraSensor *sensor, const Size &size,
> > StreamConfiguration cfg(formats);
> > cfg.pixelFormat = format;
> > cfg.size = streamSize;
> > - cfg.bufferCount = RKISP1_BUFFER_COUNT;
> >
> > return cfg;
> > }
> > @@ -383,7 +382,6 @@ RkISP1Path::validate(const CameraSensor *sensor,
> >
> > cfg->size.boundTo(maxResolution);
> > cfg->size.expandTo(minResolution);
> > - cfg->bufferCount = RKISP1_BUFFER_COUNT;
> >
> > V4L2DeviceFormat format;
> > format.fourcc = video_->toV4L2PixelFormat(cfg->pixelFormat);
> > @@ -480,7 +478,7 @@ int RkISP1Path::configure(const StreamConfiguration &config,
> > return 0;
> > }
> >
> > -int RkISP1Path::start()
> > +int RkISP1Path::start(unsigned int bufferCount)
> > {
> > int ret;
> >
> > @@ -488,7 +486,7 @@ int RkISP1Path::start()
> > return -EBUSY;
> >
> > /* \todo Make buffer count user configurable. */
> > - ret = video_->importBuffers(RKISP1_BUFFER_COUNT);
> > + ret = video_->importBuffers(bufferCount);
>
>
> So - I think we should do some extra digging here.
>
> I think we might actually want to 'import' the V4L2 maximum here (and in
> general, always) as that's more about setting up the structures that let
> us use externally provided dmabufs and get them into libcamera.
>
> If we now restrict this to '4' but we have '8' separate iterating
> buffers we blow through the v4l2-buffer-cache each iteration.
>
> I think the maximum is something like 32 - and this is a small memory
> cost to allocote so we should be doing this automatically at the
> V4L2VideoDevice::importBuffers() operation.
>
videobuf2 defines
#define VB2_MAX_FRAME (32)
but drivers can override it (I only see the Hantro driver actually
overriding that value, but other drivers could do that in future).
Drivers using the CREATE_BUF ioctl can report the max number of
buffers, but drivers using REQBUFS don't as far as I can tell.
All of this to say that we should probably set the max number of
buffers in the pipeline and not automatically in the V4L2VideoDevice
class.
>
>
> > if (ret)
> > return ret;
> >
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
> > index 430181d371a7..0b60c499ac64 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
> > @@ -58,7 +58,7 @@ public:
> > return video_->exportBuffers(bufferCount, buffers);
> > }
> >
> > - int start();
> > + int start(unsigned int bufferCount);
> > void stop();
> >
> > int queueBuffer(FrameBuffer *buffer) { return video_->queueBuffer(buffer); }
> > @@ -69,8 +69,6 @@ private:
> > void populateFormats();
> > Size filterSensorResolution(const CameraSensor *sensor);
> >
> > - static constexpr unsigned int RKISP1_BUFFER_COUNT = 4;
> > -
> > const char *name_;
> > bool running_;
> >
> > --
> > 2.43.0
> >
More information about the libcamera-devel
mailing list