[libcamera-devel] [PATCH v1 5/9] libcamera: pipeline: raspberrypi: Move configureIPA() to RPiCameraData
Jacopo Mondi
jacopo at jmondi.org
Tue Jun 30 12:38:37 CEST 2020
Hi Laurent,
On Mon, Jun 29, 2020 at 02:19:30AM +0300, Laurent Pinchart wrote:
> The PipelineHandlerRPi::configureIPA() function accesses plenty of
> member data from the RPiCameraData class and no member from the
> PipelineHandlerRPi class. Move it to RPiCameraData where it logically
> belongs.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> .../pipeline/raspberrypi/raspberrypi.cpp | 117 +++++++++---------
> 1 file changed, 58 insertions(+), 59 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 3b5cdf1e1849..0f9237a7f346 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -311,6 +311,8 @@ public:
> void frameStarted(uint32_t sequence);
>
> int loadIPA();
> + int configureIPA();
> +
> void queueFrameAction(unsigned int frame, const IPAOperationData &action);
>
> /* bufferComplete signal handlers. */
> @@ -396,8 +398,6 @@ private:
> return static_cast<RPiCameraData *>(PipelineHandler::cameraData(camera));
> }
>
> - int configureIPA(Camera *camera);
> -
> int queueAllBuffers(Camera *camera);
> int prepareBuffers(Camera *camera);
> void freeBuffers(Camera *camera);
> @@ -752,7 +752,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
> crop.y = (sensorFormat.size.height - crop.height) >> 1;
> data->isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop);
>
> - ret = configureIPA(camera);
> + ret = data->configureIPA();
> if (ret)
> LOG(RPI, Error) << "Failed to configure the IPA: " << ret;
>
> @@ -968,62 +968,6 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
> return true;
> }
>
> -int PipelineHandlerRPi::configureIPA(Camera *camera)
> -{
> - std::map<unsigned int, IPAStream> streamConfig;
> - std::map<unsigned int, const ControlInfoMap &> entityControls;
> - RPiCameraData *data = cameraData(camera);
> -
> - /* Get the device format to pass to the IPA. */
> - V4L2DeviceFormat sensorFormat;
> - data->unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
> - /* Inform IPA of stream configuration and sensor controls. */
> - unsigned int i = 0;
> - for (auto const &stream : data->isp_) {
> - if (stream.isExternal()) {
> - streamConfig[i] = {
> - .pixelFormat = stream.configuration().pixelFormat,
> - .size = stream.configuration().size
> - };
> - }
> - }
> - entityControls.emplace(0, data->unicam_[Unicam::Image].dev()->controls());
> - entityControls.emplace(1, data->isp_[Isp::Input].dev()->controls());
> -
> - /* Allocate the lens shading table via vcsm and pass to the IPA. */
> - if (!data->lsTable_) {
> - data->lsTable_ = data->vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
> - uintptr_t ptr = reinterpret_cast<uintptr_t>(data->lsTable_);
> -
> - if (!data->lsTable_)
> - return -ENOMEM;
> -
> - /*
> - * The vcsm allocation will always be in the memory region
> - * < 32-bits to allow Videocore to access the memory.
> - */
> - IPAOperationData op;
> - op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
> - op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
> - data->vcsm_.getVCHandle(data->lsTable_) };
> - data->ipa_->processEvent(op);
> - }
> -
> - CameraSensorInfo sensorInfo = {};
> - int ret = data->sensor_->sensorInfo(&sensorInfo);
> - if (ret) {
> - LOG(RPI, Error) << "Failed to retrieve camera sensor info";
> - return ret;
> - }
> -
> - /* Ready the IPA - it must know about the sensor resolution. */
> - IPAOperationData ipaConfig;
> - data->ipa_->configure(sensorInfo, streamConfig, entityControls,
> - ipaConfig, nullptr);
> -
> - return 0;
> -}
> -
> int PipelineHandlerRPi::queueAllBuffers(Camera *camera)
> {
> RPiCameraData *data = cameraData(camera);
> @@ -1161,6 +1105,61 @@ int RPiCameraData::loadIPA()
> return ipa_->start();
> }
>
> +int RPiCameraData::configureIPA()
> +{
> + std::map<unsigned int, IPAStream> streamConfig;
> + std::map<unsigned int, const ControlInfoMap &> entityControls;
> +
> + /* Get the device format to pass to the IPA. */
> + V4L2DeviceFormat sensorFormat;
> + unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
> + /* Inform IPA of stream configuration and sensor controls. */
> + unsigned int i = 0;
> + for (auto const &stream : isp_) {
> + if (stream.isExternal()) {
> + streamConfig[i] = {
> + .pixelFormat = stream.configuration().pixelFormat,
> + .size = stream.configuration().size
> + };
> + }
> + }
> + entityControls.emplace(0, unicam_[Unicam::Image].dev()->controls());
> + entityControls.emplace(1, isp_[Isp::Input].dev()->controls());
> +
> + /* Allocate the lens shading table via vcsm and pass to the IPA. */
> + if (!lsTable_) {
> + lsTable_ = vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
> + uintptr_t ptr = reinterpret_cast<uintptr_t>(lsTable_);
> +
> + if (!lsTable_)
> + return -ENOMEM;
> +
> + /*
> + * The vcsm allocation will always be in the memory region
> + * < 32-bits to allow Videocore to access the memory.
> + */
> + IPAOperationData op;
> + op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
> + op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
> + vcsm_.getVCHandle(lsTable_) };
> + ipa_->processEvent(op);
> + }
> +
> + CameraSensorInfo sensorInfo = {};
> + int ret = sensor_->sensorInfo(&sensorInfo);
> + if (ret) {
> + LOG(RPI, Error) << "Failed to retrieve camera sensor info";
> + return ret;
> + }
> +
> + /* Ready the IPA - it must know about the sensor resolution. */
"Ready the IPA" ? I didn't get what you mean :)
nit apart
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thanks
j
> + IPAOperationData ipaConfig;
> + ipa_->configure(sensorInfo, streamConfig, entityControls, ipaConfig,
> + nullptr);
> +
> + return 0;
> +}
> +
> void RPiCameraData::queueFrameAction(unsigned int frame, const IPAOperationData &action)
> {
> /*
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
More information about the libcamera-devel
mailing list