From b65feafe3244e6a4c794b73260a9dc790daa0f47 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Thu, 3 Jan 2019 15:30:53 +0100 Subject: libcamera: media_device: Add functions to get a MediaLink 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 pads. Signed-off-by: Jacopo Mondi --- src/libcamera/include/media_device.h | 6 +++ src/libcamera/media_device.cpp | 80 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) (limited to 'src') diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h index 9f45fc7a..22c32b7e 100644 --- a/src/libcamera/include/media_device.h +++ b/src/libcamera/include/media_device.h @@ -40,6 +40,12 @@ public: const std::vector &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); + MediaLink *link(const MediaEntity *source, unsigned int sourceIdx, + const MediaEntity *sink, unsigned int sinkIdx); + MediaLink *link(const MediaPad *source, const MediaPad *sink); + private: std::string driver_; std::string devnode_; diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp index b0d10edb..ca12caaa 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -306,6 +306,86 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const return nullptr; } +/** + * \brief Retrieve the MediaLink connecting two pads, identified by entity + * names and pad indexes + * \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 the 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 pads, or nullptr if no such a link + * exists + */ +MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceIdx, + const std::string &sinkName, unsigned int sinkIdx) +{ + const MediaEntity *source = getEntityByName(sourceName); + const MediaEntity *sink = getEntityByName(sinkName); + if (!source || !sink) + return nullptr; + + return link(source, sourceIdx, sink, sinkIdx); +} + +/** + * \brief Retrieve the MediaLink connecting two pads, identified by the + * entities they belong to and pad indexes + * \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 the 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 pads, or nullptr if no such a link + * exists + */ +MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx, + const MediaEntity *sink, unsigned int sinkIdx) +{ + + const MediaPad *sourcePad = source->getPadByIndex(sourceIdx); + const MediaPad *sinkPad = sink->getPadByIndex(sinkIdx); + if (!sourcePad || !sinkPad) + return nullptr; + + return link(sourcePad, sinkPad); +} + +/** + * \brief Retrieve 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, or nullptr if no such a link + * exists + */ +MediaLink *MediaDevice::link(const MediaPad *source, const MediaPad *sink) +{ + for (MediaLink *link : source->links()) { + if (link->sink()->id() == sink->id()) + return link; + } + + return nullptr; +} + /** * \var MediaDevice::objects_ * \brief Global map of media objects (entities, pads, links) keyed by their -- cgit v1.2.1