[libcamera-devel] [PATCH 2/5] libcamera: media_device: Add function to get a MediaLink
Jacopo Mondi
jacopo at jmondi.org
Mon Jan 7 09:57:30 CET 2019
Hi Niklas,
On Fri, Jan 04, 2019 at 05:33:16PM +0100, Niklas Söderlund wrote:
> Hi Jacopo,
>
> Thanks for your work.
>
> On 2019-01-03 18:38:56 +0100, Jacopo Mondi wrote:
> > Add three overloaded functions 'link()' to retrieve a link between two
> > pads. Each overloaded implementation exposes a different method to
> > identify the source and sink entities.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > src/libcamera/include/media_device.h | 6 ++
> > src/libcamera/media_device.cpp | 119 +++++++++++++++++++++++++++
> > 2 files changed, 125 insertions(+)
> >
> > diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h
> > index 9f45fc7..3228ad5 100644
> > --- a/src/libcamera/include/media_device.h
> > +++ b/src/libcamera/include/media_device.h
> > @@ -40,6 +40,12 @@ public:
> > const std::vector<MediaEntity *> &entities() const { return entities_; }
> > MediaEntity *getEntityByName(const std::string &name) const;
> >
> > + MediaLink *link(const std::string sourceName, unsigned int sourceIdx,
> > + const std::string sinkName, unsigned int sinkIdx) const;
> > + MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
> > + const MediaEntity *sink, unsigned int sinkIdx) const;
> > + MediaLink *link(const MediaPad *source, const MediaPad *sink) const;
> > +
> > private:
> > std::string driver_;
> > std::string devnode_;
> > diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> > index 2f9490c..6892300 100644
> > --- a/src/libcamera/media_device.cpp
> > +++ b/src/libcamera/media_device.cpp
> > @@ -306,6 +306,125 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> > return nullptr;
> > }
> >
> > +/**
> > + * \brief Return the MediaLink that connects two entities identified by name
> > + * \param sourceName The source entity name
> > + * \param sourceIdx The index of the source pad
> > + * \param sinkName The sink entity name
> > + * \param sinkIdx The index of the sink pad
> > + *
> > + * Find link that connects the pads at index \a sourceIdx of the source
> > + * entity with name \a sourceName, to the pad at index \a sinkIdx of the
> > + * sink entity with name \a sinkName, if any.
> > + *
> > + * \sa MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx, const MediaEntity *sink, unsigned int sinkIdx) const
> > + * \sa MediaDevice::link(const MediaPad *source, const MediaPad *sink) const
> > + *
> > + * \return The link that connects the two entities, nullptr otherwise
> > + */
> > +MediaLink *MediaDevice::link(const std::string sourceName, unsigned int sourceIdx,
> > + const std::string sinkName, unsigned int sinkIdx) const
> > +{
> > + const MediaEntity *source = getEntityByName(sourceName);
> > + if (!source) {
> > + LOG(Error) << "Failed to find entity with name: "
> > + << sourceName << "\n";
> > + return nullptr;
> > + }
> > +
> > + const MediaPad *sourcePad = source->getPadByIndex(sourceIdx);
> > + if (!sourcePad) {
> > + LOG(Error) << "Entity \"" << sourceName << "\" "
> > + << "has no pad at index " << sourceIdx << "\n";
> > + return nullptr;
> > + }
> > +
> > + const MediaEntity *sink = getEntityByName(sinkName);
> > + if (!sink) {
> > + LOG(Error) << "Failed to find entity with name: "
> > + << sinkName << "\n";
> > + return nullptr;
> > + }
> > +
> > + const MediaPad *sinkPad = sink->getPadByIndex(sinkIdx);
> > + if (!sinkPad) {
> > + LOG(Error) << "Entity \"" << sinkName << "\" "
> > + << "has no pad at index " << sinkIdx << "\n";
> > + return nullptr;
> > + }
> > +
> > + return link(sourcePad, sinkPad);
>
> How about just resolving the source and sink MediaEntity's here and then
>
> return link(source, sourceIdx, sink, sinkIdx);
>
> This would reduce the code duplication.
>
Ah, right, no need to search for the source and sink pads here.
I'll fix.
> > +}
> > +
> > +/**
> > + * \brief Return the MediaLink that connects two entities
> > + * \param source The source entity
> > + * \param sourceIdx The index of the source pad
> > + * \param sink The sink entity
> > + * \param sinkIdx The index of the sink pad
> > + *
> > + * Find link that connects the pads at index \a sourceIdx of the source
> > + * entity \a source, to the pad at index \a sinkIdx of the sink entity \a
> > + * sink, if any.
> > + *
> > + * \sa MediaDevice::link(const std::string sourceName, unsigned int sourceIdx, const std::string sinkName, unsigned int sinkIdx) const
> > + * \sa MediaDevice::link(const MediaPad *source, const MediaPad *sink) const
> > + *
> > + * \return The link that connects the two entities, nullptr otherwise
> > + */
> > +MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx,
> > + const MediaEntity *sink, unsigned int sinkIdx) const
> > +{
> > +
> > + const MediaPad *sourcePad = source->getPadByIndex(sourceIdx);
> > + if (!sourcePad) {
> > + LOG(Error) << "Entity \"" << source->name() << "\" "
> > + << "has no pad at index " << sourceIdx << "\n";
> > + return nullptr;
> > + }
> > +
> > + const MediaPad *sinkPad = sink->getPadByIndex(sinkIdx);
> > + if (!sinkPad) {
> > + LOG(Error) << "Entity \"" << sink->name() << "\" "
> > + << "has no pad at index " << sinkIdx << "\n";
> > + return nullptr;
> > + }
> > +
> > + return link(sourcePad, sinkPad);
> > +}
> > +
> > +/**
> > + * \brief Return the MediaLink that connects two pads
> > + * \param source The source pad
> > + * \param sink The sink pad
> > + *
> > + * \sa MediaDevice::link(const std::string sourceName, unsigned int sourceIdx, const std::string sinkName, unsigned int sinkIdx) const
> > + * \sa MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx, const MediaEntity *sink, unsigned int sinkIdx) const
> > + *
> > + * \return The link that connects the two pads, nullptr otherwise
> > + */
> > +MediaLink *MediaDevice::link(const MediaPad *source, const MediaPad *sink) const
> > +{
> > + if (!source || !sink)
> > + return nullptr;
> > +
> > + /*
> > + * Now that we have made sure all instances are valid, compare
> > + * their ids to find a matching link.
> > + */
>
> I like comments in the code it self. I don't like (but I still write
> them my self) comments that are written in this tens, how about.
>
> Compare pad ids to find the link which connects the source and sink
> pads.
>
Ack for this and for the comments style in general.
Thanks
j
> > + for (MediaLink *link : source->links()) {
> > + if (link->sink()->id() != sink->id())
> > + continue;
> > +
> > + if (link->sink()->entity()->id() != sink->entity()->id())
> > + continue;
> > +
> > + return link;
> > + }
> > +
> > + return nullptr;
> > +}
> > +
> > /**
> > * \var MediaDevice::objects_
> > * \brief Global map of media objects (entities, pads, links) keyed by their
> > --
> > 2.20.1
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
>
> --
> Regards,
> Niklas Söderlund
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190107/96444bec/attachment.sig>
More information about the libcamera-devel
mailing list