[libcamera-devel] [PATCH v2 2/2] libcamera: ipu3: cio2: Make use of utils::map_keys() helper
Kieran Bingham
kieran.bingham at ideasonboard.com
Thu Jul 2 10:56:39 CEST 2020
Hi Niklas,
On 01/07/2020 22:56, Niklas Söderlund wrote:
> Hi Kieran,
>
> Thanks for your feedback.
>
> On 2020-07-01 22:42:38 +0100, Kieran Bingham wrote:
>> Hi Niklas,
>>
>> On 01/07/2020 22:09, Niklas Söderlund wrote:
>>> Use a helper instead of local code to retrieve all keys from a map.
>>>
>>
>> I see this is the reason for changing Laurent's patch to return a
>> vector, but couldn't this patch update things to use sets locally?
>>
>> The keys are 'unique' right? Is there a distinct benefit for returning a
>> vector over a set?
>>
>> Perhaps there is a performance improvement with a vector if it doesn't
>> need to ensure uniqueness? But I'd be surprised if it was much... but I
>> don't know.
>>
>> Or is it to prevent updating the functions that the set (vector) is then
>> passed to, i.e. sensor_->getFormat() ?
>
> I would prefer it to be a std::set, but par the discussion around v1 of
> this patch and the last two versions of the series that introduce
> CIO2Devcice (which is now merged) it seemed the quickest way to avoid
> bikeshedding making it a std::vector.
>
> We can always later switch the container to a std::set if it becomes
> less trouble then remember to call std::sort() where it mattes, or for
> that matter start with calling std::sort() in the helper. As it is now
> the helper leaves no guarantees of the order of the keys so we are not
> committing to anything (yet).
>
It seems I've read Jacopo's response first, so now I have a better
understanding of what is needed.
No objections to returning / using a vector as it simplifies things ;-)
--
Kieran
>>
>> --
>> Kieran
>>
>>
>>
>>> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>>> ---
>>> src/libcamera/pipeline/ipu3/cio2.cpp | 19 +++----------------
>>> 1 file changed, 3 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
>>> index aa1459fb3599283b..7941c6845cbc9a9a 100644
>>> --- a/src/libcamera/pipeline/ipu3/cio2.cpp
>>> +++ b/src/libcamera/pipeline/ipu3/cio2.cpp
>>> @@ -95,11 +95,7 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
>>> * utils::set_overlap requires the ranges to be sorted, keep the
>>> * cio2Codes vector sorted in ascending order.
>>> */
>>> - std::vector<unsigned int> cio2Codes;
>>> - cio2Codes.reserve(mbusCodesToInfo.size());
>>> - std::transform(mbusCodesToInfo.begin(), mbusCodesToInfo.end(),
>>> - std::back_inserter(cio2Codes),
>>> - [](auto &pair) { return pair.first; });
>>> + std::vector<unsigned int> cio2Codes = utils::map_keys(mbusCodesToInfo);
>>> const std::vector<unsigned int> &sensorCodes = sensor_->mbusCodes();
>>> if (!utils::set_overlap(sensorCodes.begin(), sensorCodes.end(),
>>> cio2Codes.begin(), cio2Codes.end())) {
>>> @@ -145,12 +141,7 @@ int CIO2Device::configure(const Size &size, V4L2DeviceFormat *outputFormat)
>>> * Apply the selected format to the sensor, the CSI-2 receiver and
>>> * the CIO2 output device.
>>> */
>>> - std::vector<unsigned int> mbusCodes;
>>> - mbusCodes.reserve(mbusCodesToInfo.size());
>>> - std::transform(mbusCodesToInfo.begin(), mbusCodesToInfo.end(),
>>> - std::back_inserter(mbusCodes),
>>> - [](auto &pair) { return pair.first; });
>>> -
>>> + std::vector<unsigned int> mbusCodes = utils::map_keys(mbusCodesToInfo);
>>> sensorFormat = sensor_->getFormat(mbusCodes, size);
>>> ret = sensor_->setFormat(&sensorFormat);
>>> if (ret)
>>> @@ -189,11 +180,7 @@ CIO2Device::generateConfiguration(Size size) const
>>> size = sensor_->resolution();
>>>
>>> /* Query the sensor static information for closest match. */
>>> - std::vector<unsigned int> mbusCodes;
>>> - std::transform(mbusCodesToInfo.begin(), mbusCodesToInfo.end(),
>>> - std::back_inserter(mbusCodes),
>>> - [](auto &pair) { return pair.first; });
>>> -
>>> + std::vector<unsigned int> mbusCodes = utils::map_keys(mbusCodesToInfo);
>>> V4L2SubdeviceFormat sensorFormat = sensor_->getFormat(mbusCodes, size);
>>> if (!sensorFormat.mbus_code) {
>>> LOG(IPU3, Error) << "Sensor does not support mbus code";
>>>
>>
>> --
>> Regards
>> --
>> Kieran
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list