@@ -343,6 +343,18 @@ void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)
{
IPAFrameContext &frameContext = context_.frameContexts.get(frame);
+ /*
+ * \todo: This needs discussion. In raw mode, computeParams is
+ * called without a params buffer, to trigger the setSensorControls
+ * signal. Currently our algorithms don't support prepare calls with
+ * a nullptr. Do we need that or can we safely skip it?
+ */
+ if (bufferId == 0) {
+ ControlList ctrls = getSensorControls(frameContext);
+ setSensorControls.emit(frame, ctrls);
+ return;
+ }
+
RkISP1Params params(context_.configuration.paramFormat,
mappedBuffers_.at(bufferId).planes()[0]);
@@ -1350,6 +1350,12 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
if (data->selfPath_ && info->selfPathBuffer)
data->selfPath_->queueBuffer(info->selfPathBuffer);
+
+ /*
+ * Call computeParams with an empty param buffer to trigger the
+ * setSensorControls signal.
+ */
+ data->ipa_->computeParams(data->frame_, 0);
} else {
data->ipa_->computeParams(data->frame_,
info->paramBuffer->cookie());
After the pipeline restructuring setSensorControls is no longer emitted within process() but within computeParams(). In raw mode computeParams is not called and therefore setSensorControls is never emitted. Fix that by allowing computeParams to be called with an empty bufferId. This strategy is also used for processStats() to ensure that metadata gets filled in raw mode. Then call computeParams within frameStart() when in raw mode. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> --- Changes in v2: - Call computeParams() within queueRequestDevice for now to make the patch easier to follow. Moving computeParams to frameStart() will happen in a later patch. --- src/ipa/rkisp1/rkisp1.cpp | 12 ++++++++++++ src/libcamera/pipeline/rkisp1/rkisp1.cpp | 6 ++++++ 2 files changed, 18 insertions(+)