[libcamera-devel] [PATCH v2 1/2] libcamera: ipu3: Move Imgu configuration to IPU3CameraData
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Tue Mar 16 11:18:38 CET 2021
The IPU3 IPA needs to know the BayerDownScaler (BDS) configuration to
calculate the statistics grids.
This patch makes it possible for PipelineHandlerIPU3::start() to access
the BDS configuration and later pass the rectangle to the IPU3 IPA
configure method.
Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
---
v2:
- move pipe configuration calculation from validate to configure
- move ipa configuration from start to configure
---
src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++---------------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 2ea13ec9..3f49ded3 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -97,21 +97,23 @@ public:
Status validate() override;
const StreamConfiguration &cio2Format() const { return cio2Configuration_; }
- const ImgUDevice::PipeConfig imguConfig() const { return pipeConfig_; }
/* Cache the combinedTransform_ that will be applied to the sensor */
Transform combinedTransform_;
+ /* Store the pipe configuration */
+ ImgUDevice::PipeConfig pipeConfig_;
+ ImgUDevice::Pipe pipe_{};
+
private:
/*
* The IPU3CameraData instance is guaranteed to be valid as long as the
* corresponding Camera instance is valid. In order to borrow a
* reference to the camera data, store a new reference to the camera.
*/
- const IPU3CameraData *data_;
+ IPU3CameraData *data_;
StreamConfiguration cio2Configuration_;
- ImgUDevice::PipeConfig pipeConfig_;
};
class PipelineHandlerIPU3 : public PipelineHandler
@@ -272,8 +274,7 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
LOG(IPU3, Debug) << "CIO2 configuration: " << cio2Configuration_.toString();
- ImgUDevice::Pipe pipe{};
- pipe.input = cio2Configuration_.size;
+ pipe_.input = cio2Configuration_.size;
/*
* Adjust the configurations if needed and assign streams while
@@ -349,15 +350,15 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
cfg->setStream(const_cast<Stream *>(&data_->outStream_));
mainOutputAvailable = false;
- pipe.main = cfg->size;
+ pipe_.main = cfg->size;
if (yuvCount == 1)
- pipe.viewfinder = pipe.main;
+ pipe_.viewfinder = pipe_.main;
LOG(IPU3, Debug) << "Assigned " << cfg->toString()
<< " to the main output";
} else {
cfg->setStream(const_cast<Stream *>(&data_->vfStream_));
- pipe.viewfinder = cfg->size;
+ pipe_.viewfinder = cfg->size;
LOG(IPU3, Debug) << "Assigned " << cfg->toString()
<< " to the viewfinder output";
@@ -373,16 +374,6 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
}
}
- /* Only compute the ImgU configuration if a YUV stream has been requested. */
- if (yuvCount) {
- pipeConfig_ = data_->imgu_->calculatePipeConfig(&pipe);
- if (pipeConfig_.isNull()) {
- LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
- << "unsupported resolutions.";
- return Invalid;
- }
- }
-
return status;
}
@@ -576,11 +567,15 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
* stream has been requested: return here to skip the ImgU configuration
* part.
*/
- ImgUDevice::PipeConfig imguConfig = config->imguConfig();
- if (imguConfig.isNull())
+
+ config->pipeConfig_ = imgu->calculatePipeConfig(&config->pipe_);
+ if (config->pipeConfig_.isNull()) {
+ LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
+ << "unsupported resolutions.";
return 0;
+ }
- ret = imgu->configure(imguConfig, &cio2Format);
+ ret = imgu->configure(config->pipeConfig_, &cio2Format);
if (ret)
return ret;
@@ -633,6 +628,10 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
return ret;
}
+ std::map<uint32_t, ControlInfoMap> entityControls;
+ entityControls.emplace(0, data->cio2_.sensor()->controls());
+ data->ipa_->configure(entityControls, config->pipeConfig_.bds);
+
return 0;
}
@@ -717,7 +716,6 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)
int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] const ControlList *controls)
{
- std::map<uint32_t, ControlInfoMap> entityControls;
IPU3CameraData *data = cameraData(camera);
CIO2Device *cio2 = &data->cio2_;
ImgUDevice *imgu = data->imgu_;
@@ -744,9 +742,6 @@ int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] const ControlLis
if (ret)
goto error;
- entityControls.emplace(0, data->cio2_.sensor()->controls());
- data->ipa_->configure(entityControls);
-
return 0;
error:
--
2.27.0
More information about the libcamera-devel
mailing list