[libcamera-devel] [PATCH v6 1/9] libcamera: control_serializer: Save serialized ControlInfoMap in a cache
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Feb 1 22:40:41 CET 2021
Hi Paul,
Thank you for the patch.
On Mon, Dec 28, 2020 at 06:48:11PM +0900, paul.elder at ideasonboard.com wrote:
> On Sun, Dec 27, 2020 at 12:36:15PM +0100, Niklas Söderlund wrote:
> > On 2020-12-24 17:15:26 +0900, Paul Elder wrote:
> > > The ControlSerializer saves all ControlInfoMaps that it has already
> > > (de)serialized, in order to (de)serialize ControlLists that contain the
> > > ControlInfoMaps. Leverage this to cache ControlInfoMaps, such that the
> > > ControlSerializer will not re-(de)serialize a ControlInfoMap that it has
> > > previously (de)serialized.
> > >
> > > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > >
> > > ---
> > > New in v6
> > > ---
> > > .../libcamera/internal/control_serializer.h | 1 +
> > > src/libcamera/control_serializer.cpp | 30 +++++++++++++++++++
> > > 2 files changed, 31 insertions(+)
> > >
> > > diff --git a/include/libcamera/internal/control_serializer.h b/include/libcamera/internal/control_serializer.h
> > > index 0ab29d9a..76cb3c10 100644
> > > --- a/include/libcamera/internal/control_serializer.h
> > > +++ b/include/libcamera/internal/control_serializer.h
> > > @@ -33,6 +33,7 @@ public:
> > > template<typename T>
> > > T deserialize(ByteStreamBuffer &buffer);
> > >
> > > + bool isCached(const ControlInfoMap *infoMap);
Blank line here ?
> > > private:
> > > static size_t binarySize(const ControlValue &value);
> > > static size_t binarySize(const ControlInfo &info);
> > > diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
> > > index 258db6df..4cf1c720 100644
> > > --- a/src/libcamera/control_serializer.cpp
> > > +++ b/src/libcamera/control_serializer.cpp
> > > @@ -173,6 +173,11 @@ void ControlSerializer::store(const ControlInfo &info, ByteStreamBuffer &buffer)
> > > int ControlSerializer::serialize(const ControlInfoMap &infoMap,
> > > ByteStreamBuffer &buffer)
> > > {
> > > + if (isCached(&infoMap)) {
> > > + LOG(Serializer, Info) << "Serializing ControlInfoMap from cache";
> >
> > I wonder if this and the one below should be Debug messages?
>
> Yeah it should be.
And I think should mention that serialization is skipped, not that the
ControlInfoMap is serialized from the cache.
LOG(Serializer, Debug)
<< "Skipping already serialized ControlInfoMap";
> > > + return 0;
> > > + }
> > > +
> > > /* Compute entries and data required sizes. */
> > > size_t entriesSize = infoMap.size()
> > > * sizeof(struct ipa_control_info_entry);
> > > @@ -347,6 +352,12 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &
> > > return {};
> > > }
> > >
> > > + auto iter = infoMaps_.find(hdr->handle);
> > > + if (iter != infoMaps_.end()) {
> > > + LOG(Serializer, Info) << "Deserializing ControlInfoMap from cache";
Debug here too, and maybe
LOG(Serializer, Info) << "Use cached ControlInfoMap";
as you don't deserialize it.
> > > + return iter->second;
> > > + }
> >
> > I think you should either fold the check from isChached() in above or
> > add a isCached(unsigned int) and use it here. I'm leaning towards the
> > former as then if we switch to C++20 we could use
> > std::map<>::contains().
>
> I don't see how the former would work. The latter would just be the same
> as what's here, and it's only used once.
>
> > > +
> > > if (hdr->version != IPA_CONTROLS_FORMAT_VERSION) {
> > > LOG(Serializer, Error)
> > > << "Unsupported controls format version "
> > > @@ -485,4 +496,23 @@ ControlList ControlSerializer::deserialize<ControlList>(ByteStreamBuffer &buffer
> > > return ctrls;
> > > }
> > >
> > > +/**
> > > + * \brief Check if some ControlInfoMap is cached
> >
> > s/some/a/
> >
> > > + * \param[in] infoMap The ControlInfoMap to check
> > > + *
> > > + * The ControlSerializer caches all ControlInfoMaps that it has (de)serialized.
> > > + * This function checks if \a infoMap is in the cache.
> > > + *
> > > + * \return True if \a infoMap is in the cache or if \a infoMap is
> > > + * controls::controls, false otherwise
> >
> > controls::controls ?
>
> Oh, it should be nullptr here. I was thinking about ControlLists that
> use controls::controls.
And I'd drop this, as you never pass nullptr to this function.
* \return True if \a infoMap is in the cache or false otherwise
> > > + */
> > > +bool ControlSerializer::isCached(const ControlInfoMap *infoMap)
And I'd pass a const reference instead of a const pointer, to make sure
it can never be null.
> > > +{
> > > + if (!infoMap)
> > > + return true;
> > > +
This can be dropped.
> > > + auto iter = infoMapHandles_.find(infoMap);
> > > + return iter != infoMapHandles_.end();
You can just return
return infoMapHandles_.count(infoMap);
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > +}
> > > +
> > > } /* namespace libcamera */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list