[libcamera-devel] [RFC PATCH v2] ipa: ipu3: Introduce IPAConfigInfo in IPC
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Thu Apr 29 07:30:47 CEST 2021
On 27/04/2021 14:54, Umang Jain wrote:
> Hi JM
>
> On 4/27/21 5:23 PM, Jean-Michel Hautbois wrote:
>> Hi Umang,
>>
>> Thanks for the patch !
>>
>> On 27/04/2021 08:35, Umang Jain wrote:
>>> IPAConfigInfo is a consolidated data structure passed from IPU3
>>> pipeline-handler to IPU3 IPA. This provides a streamlined and
>>> extensible way to provide the configuration data to IPA interface.
>>>
>>> The IPA interface should be common to both closed-source and
>>> open-source IPU3 IPAs. Hence, the structure encompasses additional
>>> configuration information required to init and configure the
>>> closed-source IPA as well.
>>>
>>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>>> ---
>>> Changes in v2:
>>> - Mark as RFC(do not merge) as this is built upon Paul's
>>> [Fix support for core.mojom structs v3] - waiting for merge to master
>>> - Drop cropRegion_ from structure - this is provided from
>>> CameraSensorInfo
>>> itself.
>>> - Doxygen documentation of IPAConfigInfo.
>>> ---
>>> include/libcamera/ipa/ipu3.mojom | 46 ++++++++++++++++++++++++++--
>>> src/ipa/ipu3/ipu3.cpp | 14 ++++-----
>>> src/libcamera/pipeline/ipu3/ipu3.cpp | 9 +++++-
>>> 3 files changed, 58 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/include/libcamera/ipa/ipu3.mojom
>>> b/include/libcamera/ipa/ipu3.mojom
>>> index a717b1e6..acd5cfa4 100644
>>> --- a/include/libcamera/ipa/ipu3.mojom
>>> +++ b/include/libcamera/ipa/ipu3.mojom
>>> @@ -25,13 +25,55 @@ struct IPU3Action {
>>> libcamera.ControlList controls;
>>> };
>>> +/**
>>> + * \struct IPAConfigInfo
>>> + * \brief Information to be passed from IPU3 pipeline-handler to IPA
>>> + *
>>> + * The IPAConfigInfo structure stores the data passed from IPU3
>>> pipeline-handler
>>> + * to the IPAIPU3Interface::configure(). The structure provides
>>> extensibility
>>> + * for additional configuration data as required, for closed-source or
>>> + * open-source IPAs' configure() phases.
>>> + */
>>> +
>>> +/**
>>> + * \var IPAConfigInfo::sensorInfo
>>> + * \brief Camera sensor information
>>> + *
>>> + * Provides the camera sensor information such as model name,
>>> pixel-rate,
>>> + * output-size and so on. Refer to libcamera::CameraSensorInfo for
>>> further
>>> + * details.
>>> + */
>>> +
>>> + /**
>>> + * \var IPAConfigInfo::entityControls
>>> + * \brief Controls supported by the sensor
>>> + *
>>> + * A map of V4L2 controls supported by the sensor in order to read
>>> or write
>>> + * control values to them.
>>> + */
>>> +
>>> + /**
>>> + * \var IPAConfigInfo::bdsOutputSize
>>> + * \brief Size of ImgU BDS rectangle
>>> + */
>>> +
>>> + /**
>>> + * \var IPAConfigInfo::iif
>>> + * \brief Size of ImgU input-feeder rectangle
>>> + */
>>> +struct IPAConfigInfo {
>>> + libcamera.CameraSensorInfo sensorInfo;
>>> + map<uint32, ControlInfoMap> entityControls;
>>> + libcamera.Size bdsOutputSize;
>>> + libcamera.Size iif;
>>> +};
>>> +
>> I think it is interesting, and would like your advice: I would need this
>> same structure for rkisp1 platform, except that the sizes are obviously
>> not the same.
>> And so, I am wondering if we could imagine a more general structure like:
>> struct IPAConfigInfo {
>> libcamera.CameraSensorInfo sensorInfo;
>> map<uint32, ControlInfoMap> entityControls;
>> libcamera.Size ispInputSize;
>> libcamera.Size ispOutputSize;
>> };
>>
>> names and all may have to be reworked but that is the base idea.
>> There is no bds in rkisp1 (afaik) but on both IPU3 and RkIsp1 at least
>> you have an input an output pad size for the ISP node.
> Certainly, this might be a good idea. I am not opposed to it.
>
> The question here is, that is the structure core.mojom worthy, in order
> to be shared between multiple IPAs right? If not, I think we need to
> keep them in <platform IPA>.mojom for now.
>
> And if we want to share the data-structures, we need to work out how all
> existing IPAs (for e.g. Raspberry Pi) can be ported to used that
> IPAConfig structure too. We probably, should address this by looking at
> all the common parameters we need for all the existing IPAs and have a
> patch series that ports every IPA to use that data-structure.
>
> However, there are some risky? situations that can happen, for e.g.
> - An IPA X requiring a parameter Y for configuration and the common
> struct IPAConfig doesn't have a placeholder
> - Parameter Y is added to common struct IPAConfig
> - Parameter Y is unused/nullptr for all IPAs except IPA X
>
> I do not know if adding placeholder for Y is fine in the common struct,
> if fine or not, in the codebase purview.
>
> Thinking about it, the chances of various IPA, having exact
> configuration data (common IPAConfig) are slim. Hence, the IPA authors
> will try hacks for other parameters they need for IPA configuration,
> either as function-params or introducing new structures and passing
> alongside with common struct IPAConfig to the IPA. That would not be
> nice, isn't it?
>
> I might be wrong, so I shall keep an open mind about it. Maybe we can
> track this as a task somewhere too?
>
The idea I had is to have a common structure, and having the IPA
specific ones inherit from this common one.
You would have something like
IPAIPU3ConfigInfo: IPAConfigInfo {
/* myGreatParameters */
}
That one may not make sense though :-).
>>
>>> interface IPAIPU3Interface {
>>> init(libcamera.IPASettings settings) => (int32 ret);
>>> start() => (int32 ret);
>>> stop();
>>> - configure(map<uint32, libcamera.ControlInfoMap> entityControls,
>>> - libcamera.Size bdsOutputSize) => ();
>>> + configure(IPAConfigInfo configInfo);
>>> mapBuffers(array<libcamera.IPABuffer> buffers);
>>> unmapBuffers(array<uint32> ids);
>>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
>>> index f5343547..769c24d3 100644
>>> --- a/src/ipa/ipu3/ipu3.cpp
>>> +++ b/src/ipa/ipu3/ipu3.cpp
>>> @@ -43,8 +43,7 @@ public:
>>> int start() override;
>>> void stop() override {}
>>> - void configure(const std::map<uint32_t, ControlInfoMap>
>>> &entityControls,
>>> - const Size &bdsOutputSize) override;
>>> + void configure(const IPAConfigInfo &configInfo) override;
>>> void mapBuffers(const std::vector<IPABuffer> &buffers) override;
>>> void unmapBuffers(const std::vector<unsigned int> &ids) override;
>>> @@ -139,13 +138,12 @@ void IPAIPU3::calculateBdsGrid(const Size
>>> &bdsOutputSize)
>>> << (int)bdsGrid_.height << " << " <<
>>> (int)bdsGrid_.block_height_log2 << ")";
>>> }
>>> -void IPAIPU3::configure(const std::map<uint32_t, ControlInfoMap>
>>> &entityControls,
>>> - const Size &bdsOutputSize)
>>> +void IPAIPU3::configure(const IPAConfigInfo &configInfo)
>>> {
>>> - if (entityControls.empty())
>>> + if (configInfo.entityControls.empty())
>>> return;
>>> - ctrls_ = entityControls.at(0);
>>> + ctrls_ = configInfo.entityControls.at(0);
>>> const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
>>> if (itExp == ctrls_.end()) {
>>> @@ -169,10 +167,10 @@ void IPAIPU3::configure(const
>>> std::map<uint32_t, ControlInfoMap> &entityControls
>>> params_ = {};
>>> - calculateBdsGrid(bdsOutputSize);
>>> + calculateBdsGrid(configInfo.bdsOutputSize);
>>> awbAlgo_ = std::make_unique<IPU3Awb>();
>>> - awbAlgo_->initialise(params_, bdsOutputSize, bdsGrid_);
>>> + awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);
>>> agcAlgo_ = std::make_unique<IPU3Agc>();
>>> agcAlgo_->initialise(bdsGrid_);
>>> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp
>>> b/src/libcamera/pipeline/ipu3/ipu3.cpp
>>> index 73306cea..b1ff1dbe 100644
>>> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
>>> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
>>> @@ -635,7 +635,14 @@ int PipelineHandlerIPU3::configure(Camera
>>> *camera, CameraConfiguration *c)
>>> std::map<uint32_t, ControlInfoMap> entityControls;
>>> entityControls.emplace(0, data->cio2_.sensor()->controls());
>>> - data->ipa_->configure(entityControls, config->imguConfig().bds);
>>> +
>>> + ipa::ipu3::IPAConfigInfo configInfo;
>>> + configInfo.sensorInfo = sensorInfo;
>>> + configInfo.entityControls = entityControls;
>>> + configInfo.bdsOutputSize = config->imguConfig().bds;
>>> + configInfo.iif = config->imguConfig().iif;
>>> +
>>> + data->ipa_->configure(configInfo);
>>> return 0;
>>> }
>>>
>
More information about the libcamera-devel
mailing list