[RFC PATCH v1] pipeline: rkisp1: Avoid unnecessary indirection in `std::map`
Kieran Bingham
kieran.bingham at ideasonboard.com
Sat Jan 11 18:39:19 CET 2025
Quoting Barnabás Pőcze (2025-01-11 11:47:41)
> There is no reason to allocate the `RkISP1FrameInfo` objects
> dynamically, and then store raw pointers in the `std::map`.
>
> Instead, store the objects directly in the map. This removes
> the need for manully calling new/delete, simplifies the code,
> and eliminates one memory allocation per frame.
This sounds awesome. But I think this pattern has been replicated in
other pipeline handlers, could you check IPU3Frames::Info as well
please? And any others that might have the same constructs.
> Signed-off-by: Barnabás Pőcze <pobrn at protonmail.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/pipeline/rkisp1/rkisp1.cpp | 76 +++++++++++-------------
> 1 file changed, 34 insertions(+), 42 deletions(-)
>
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 35c793da9..111acc35b 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -84,7 +84,7 @@ public:
>
> private:
> PipelineHandlerRkISP1 *pipe_;
> - std::map<unsigned int, RkISP1FrameInfo *> frameInfo_;
> + std::map<unsigned int, RkISP1FrameInfo> frameInfo_;
> };
>
> class RkISP1CameraData : public Camera::Private
> @@ -269,49 +269,45 @@ RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *req
> mainPathBuffer = request->findBuffer(&data->mainPathStream_);
> selfPathBuffer = request->findBuffer(&data->selfPathStream_);
>
> - RkISP1FrameInfo *info = new RkISP1FrameInfo;
> + auto [it, inserted] = frameInfo_.try_emplace(frame);
> + ASSERT(inserted);
>
> - info->frame = frame;
> - info->request = request;
> - info->paramBuffer = paramBuffer;
> - info->mainPathBuffer = mainPathBuffer;
> - info->selfPathBuffer = selfPathBuffer;
> - info->statBuffer = statBuffer;
> - info->paramDequeued = false;
> - info->metadataProcessed = false;
> + auto &info = it->second;
>
> - frameInfo_[frame] = info;
> + info.frame = frame;
> + info.request = request;
> + info.paramBuffer = paramBuffer;
> + info.mainPathBuffer = mainPathBuffer;
> + info.selfPathBuffer = selfPathBuffer;
> + info.statBuffer = statBuffer;
> + info.paramDequeued = false;
> + info.metadataProcessed = false;
>
> - return info;
> + return &info;
> }
>
> int RkISP1Frames::destroy(unsigned int frame)
> {
> - RkISP1FrameInfo *info = find(frame);
> - if (!info)
> + auto it = frameInfo_.find(frame);
> + if (it == frameInfo_.end())
> return -ENOENT;
>
> - pipe_->availableParamBuffers_.push(info->paramBuffer);
> - pipe_->availableStatBuffers_.push(info->statBuffer);
> - pipe_->availableMainPathBuffers_.push(info->mainPathBuffer);
> -
> - frameInfo_.erase(info->frame);
> + auto &info = it->second;
> + pipe_->availableParamBuffers_.push(info.paramBuffer);
> + pipe_->availableStatBuffers_.push(info.statBuffer);
> + pipe_->availableMainPathBuffers_.push(info.mainPathBuffer);
>
> - delete info;
> + frameInfo_.erase(it);
>
> return 0;
> }
>
> void RkISP1Frames::clear()
> {
> - for (const auto &entry : frameInfo_) {
> - RkISP1FrameInfo *info = entry.second;
> -
> - pipe_->availableParamBuffers_.push(info->paramBuffer);
> - pipe_->availableStatBuffers_.push(info->statBuffer);
> - pipe_->availableMainPathBuffers_.push(info->mainPathBuffer);
> -
> - delete info;
> + for (const auto &[frame, info] : frameInfo_) {
> + pipe_->availableParamBuffers_.push(info.paramBuffer);
> + pipe_->availableStatBuffers_.push(info.statBuffer);
> + pipe_->availableMainPathBuffers_.push(info.mainPathBuffer);
> }
>
> frameInfo_.clear();
> @@ -322,7 +318,7 @@ RkISP1FrameInfo *RkISP1Frames::find(unsigned int frame)
> auto itInfo = frameInfo_.find(frame);
>
> if (itInfo != frameInfo_.end())
> - return itInfo->second;
> + return &itInfo->second;
>
> LOG(RkISP1, Fatal) << "Can't locate info from frame";
>
> @@ -331,14 +327,12 @@ RkISP1FrameInfo *RkISP1Frames::find(unsigned int frame)
>
> RkISP1FrameInfo *RkISP1Frames::find(FrameBuffer *buffer)
> {
> - for (auto &itInfo : frameInfo_) {
> - RkISP1FrameInfo *info = itInfo.second;
> -
> - if (info->paramBuffer == buffer ||
> - info->statBuffer == buffer ||
> - info->mainPathBuffer == buffer ||
> - info->selfPathBuffer == buffer)
> - return info;
> + for (auto &[frame, info] : frameInfo_) {
> + if (info.paramBuffer == buffer ||
> + info.statBuffer == buffer ||
> + info.mainPathBuffer == buffer ||
> + info.selfPathBuffer == buffer)
> + return &info;
> }
>
> LOG(RkISP1, Fatal) << "Can't locate info from buffer";
> @@ -348,11 +342,9 @@ RkISP1FrameInfo *RkISP1Frames::find(FrameBuffer *buffer)
>
> RkISP1FrameInfo *RkISP1Frames::find(Request *request)
> {
> - for (auto &itInfo : frameInfo_) {
> - RkISP1FrameInfo *info = itInfo.second;
> -
> - if (info->request == request)
> - return info;
> + for (auto &[frame, info] : frameInfo_) {
> + if (info.request == request)
> + return &info;
> }
>
> LOG(RkISP1, Fatal) << "Can't locate info from request";
> --
> 2.47.1
>
>
More information about the libcamera-devel
mailing list