[PATCH 3/5] libcamera: rkisp1: Switch IPA slots to use bufferId not frame
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Feb 13 14:19:38 CET 2024
Quoting Jacopo Mondi (2024-02-13 12:46:36)
> Hi Dan
>
> On Mon, Feb 12, 2024 at 03:35:30PM +0000, Daniel Scally wrote:
> > In preparation for removing the RkISP1FrameInfo class we need the
> > RkISP1 IPA to emit bufferIds rather than frame numbers for its slots
> > so that the pipeline handler can find the correct buffer properly.
> >
> > Switch the slots; reconfigure the pipeline handler to obtain the
> > correct buffer first before passing it to RkISP1FrameInfo::find()
> > as before; one of its overloads already works with FrameBuffer *.
> >
> > Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
> > ---
> > include/libcamera/ipa/rkisp1.mojom | 4 +-
> > src/ipa/rkisp1/rkisp1.cpp | 4 +-
> > src/libcamera/pipeline/rkisp1/rkisp1.cpp | 59 ++++++++++++++++--------
> > 3 files changed, 44 insertions(+), 23 deletions(-)
> >
> > diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom
> > index 1009e970..4c097622 100644
> > --- a/include/libcamera/ipa/rkisp1.mojom
> > +++ b/include/libcamera/ipa/rkisp1.mojom
> > @@ -36,7 +36,7 @@ interface IPARkISP1Interface {
> > };
> >
> > interface IPARkISP1EventInterface {
> > - paramsBufferReady(uint32 frame);
> > + paramsBufferReady(uint32 bufferId);
> > setSensorControls(uint32 frame, libcamera.ControlList sensorControls);
> > - metadataReady(uint32 frame, libcamera.ControlList metadata);
> > + metadataReady(uint32 bufferId, libcamera.ControlList metadata);
> > };
> > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > index 6544c925..7e01a04d 100644
> > --- a/src/ipa/rkisp1/rkisp1.cpp
> > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > @@ -337,7 +337,7 @@ void IPARkISP1::fillParamsBuffer(const uint32_t frame, const uint32_t bufferId)
>
> I guess this should be ok. The parameters and stats buffers are
> initialized with a cookie
>
> for (std::unique_ptr<FrameBuffer> &buffer : paramBuffers_) {
> buffer->setCookie(ipaBufferId++);
>
> which is used to identify them on the IPA buffer map
>
> rkisp1_params_cfg *params =
> reinterpret_cast<rkisp1_params_cfg *>(
> mappedBuffers_.at(bufferId).planes()[0].data());
>
> There shouldn't be any risk of the ids colliding as we're constantly
> cycling on the same set of buffers and the ownership of the frame
> buffer doesn't change compared to the previous version if I'm not
> mistaken
>
> > for (auto const &algo : algorithms())
> > algo->prepare(context_, frame, frameContext, params);
> >
> > - paramsBufferReady.emit(frame);
> > + paramsBufferReady.emit(bufferId);
> > }
> >
> > void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId,
> > @@ -370,7 +370,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId
> >
> > setControls(frame);
> >
> > - metadataReady.emit(frame, metadata);
> > + metadataReady.emit(bufferId, metadata);
> > }
> >
> > void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index 22e553fe..d4ed38a4 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -376,23 +376,34 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
> > return 0;
> > }
> >
> > -void RkISP1CameraData::paramFilled(unsigned int frame)
> > +void RkISP1CameraData::paramFilled(unsigned int bufferId)
> > {
> > PipelineHandlerRkISP1 *pipe = RkISP1CameraData::pipe();
> > - RkISP1FrameInfo *info = frameInfo_.find(frame);
> > - if (!info)
> > - return;
> >
> > - info->paramBuffer->_d()->metadata().planes()[0].bytesused =
> > - sizeof(struct rkisp1_params_cfg);
> > - pipe->param_->queueBuffer(info->paramBuffer);
> > - pipe->stat_->queueBuffer(info->statBuffer);
> > + for (std::unique_ptr<FrameBuffer> ¶mBuffer : pipe->paramBuffers_) {
> > + if (paramBuffer->cookie() != bufferId)
> > + continue;
> > +
> > + RkISP1FrameInfo *info = frameInfo_.find(paramBuffer.get());
> > + if (!info)
> > + return;
> > +
> > + info->paramBuffer->_d()->metadata().planes()[0].bytesused =
> > + sizeof(struct rkisp1_params_cfg);
> > + pipe->param_->queueBuffer(info->paramBuffer);
> > + pipe->stat_->queueBuffer(info->statBuffer);
> >
> > - if (info->mainPathBuffer)
> > - mainPath_->queueBuffer(info->mainPathBuffer);
> > + if (info->mainPathBuffer)
> > + mainPath_->queueBuffer(info->mainPathBuffer);
> > +
> > + if (selfPath_ && info->selfPathBuffer)
> > + selfPath_->queueBuffer(info->selfPathBuffer);
> > +
> > + return;
> > + }
> >
> > - if (selfPath_ && info->selfPathBuffer)
> > - selfPath_->queueBuffer(info->selfPathBuffer);
> > + LOG(RkISP1, Fatal) << "Can't locate buffer from bufferId";
These Fatal's in the param/stats handling worry me a little though. Can
we be absolutely sure that there should be no reason we can get here?
I.e. Can this happen if say we drop some frames at runtime?
> > + return;
>
> No need for return
>
> > }
> >
> > void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,
> > @@ -401,16 +412,26 @@ void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,
> > delayedCtrls_->push(sensorControls);
> > }
> >
> > -void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata)
> > +void RkISP1CameraData::metadataReady(unsigned int bufferId,
> > + const ControlList &metadata)
> > {
> > - RkISP1FrameInfo *info = frameInfo_.find(frame);
> > - if (!info)
> > - return;
> > + for (std::unique_ptr<FrameBuffer> &statBuffer : pipe()->statBuffers_) {
> > + if (statBuffer->cookie() != bufferId)
> > + continue;
> > +
> > + RkISP1FrameInfo *info = frameInfo_.find(statBuffer.get());
> > + if (!info)
> > + return;
> >
> > - info->request->metadata().merge(metadata);
> > - info->metadataProcessed = true;
> > + info->request->metadata().merge(metadata);
> > + info->metadataProcessed = true;
> > +
> > + pipe()->tryCompleteRequest(info);
> > + return;
> > + }
> >
> > - pipe()->tryCompleteRequest(info);
> > + LOG(RkISP1, Fatal) << "Can't locate buffer from bufferId";
> > + return;
>
> same here
>
> > }
> >
> > /* -----------------------------------------------------------------------------
> > --
> > 2.34.1
> >
More information about the libcamera-devel
mailing list