| Message ID | 20251024085130.995967-25-stefan.klug@ideasonboard.com |
|---|---|
| State | New |
| Headers | show |
| Series |
|
| Related | show |
Quoting Stefan Klug (2025-10-24 17:50:48) > If a request too late for controls queuing because the frame context was > already initialised, store the controls and apply them on the next > request. > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> > > ipa: rkisp1: Store controls on when necessary Leftovers from squash? :) > > Store controls for later only when necessary. Add a proper log message for that condition. > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> The code looks good to me though. Paul > --- > src/ipa/rkisp1/rkisp1.cpp | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp > index 23d80bc43c5d..b714e2f10c65 100644 > --- a/src/ipa/rkisp1/rkisp1.cpp > +++ b/src/ipa/rkisp1/rkisp1.cpp > @@ -86,6 +86,7 @@ private: > std::map<unsigned int, MappedFrameBuffer> mappedBuffers_; > > ControlInfoMap sensorControls_; > + ControlList controlsToApply_; > > /* Local parameter storage */ > struct IPAContext context_; > @@ -343,16 +344,33 @@ void IPARkISP1::initializeFrameContext(const uint32_t frame, > IPAFrameContext &frameContext, > const ControlList &controls) > { > - if (frameContext.initialised) > + if (frameContext.initialised) { > + if (!controls.empty()) { > + /* Too late to apply the controls. Store them for later. */ > + LOG(IPARkISP1, Warning) > + << "Request underrun. Controls for frame " > + << frame << " are delayed "; > + controlsToApply_.merge(controls, > + ControlList::MergePolicy::OverwriteExisting); > + } > return; > + } > + > + const ControlList *controls2 = &controls; > + if (!controlsToApply_.empty()) { > + controlsToApply_.merge(controls, ControlList::MergePolicy::OverwriteExisting); > + controls2 = &controlsToApply_; > + } > > frameContext.initialised = true; > for (auto const &a : algorithms()) { > Algorithm *algo = static_cast<Algorithm *>(a.get()); > if (algo->disabled_) > continue; > - algo->queueRequest(context_, frame, frameContext, controls); > + algo->queueRequest(context_, frame, frameContext, *controls2); > } > + > + controlsToApply_.clear(); > } > > void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId) > -- > 2.48.1 >
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index 23d80bc43c5d..b714e2f10c65 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -86,6 +86,7 @@ private: std::map<unsigned int, MappedFrameBuffer> mappedBuffers_; ControlInfoMap sensorControls_; + ControlList controlsToApply_; /* Local parameter storage */ struct IPAContext context_; @@ -343,16 +344,33 @@ void IPARkISP1::initializeFrameContext(const uint32_t frame, IPAFrameContext &frameContext, const ControlList &controls) { - if (frameContext.initialised) + if (frameContext.initialised) { + if (!controls.empty()) { + /* Too late to apply the controls. Store them for later. */ + LOG(IPARkISP1, Warning) + << "Request underrun. Controls for frame " + << frame << " are delayed "; + controlsToApply_.merge(controls, + ControlList::MergePolicy::OverwriteExisting); + } return; + } + + const ControlList *controls2 = &controls; + if (!controlsToApply_.empty()) { + controlsToApply_.merge(controls, ControlList::MergePolicy::OverwriteExisting); + controls2 = &controlsToApply_; + } frameContext.initialised = true; for (auto const &a : algorithms()) { Algorithm *algo = static_cast<Algorithm *>(a.get()); if (algo->disabled_) continue; - algo->queueRequest(context_, frame, frameContext, controls); + algo->queueRequest(context_, frame, frameContext, *controls2); } + + controlsToApply_.clear(); } void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)