From patchwork Tue Jan 8 17:04:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 183 Return-Path: Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D75A060B2E for ; Tue, 8 Jan 2019 18:04:09 +0100 (CET) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 7B15A200013; Tue, 8 Jan 2019 17:04:09 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 8 Jan 2019 18:04:05 +0100 Message-Id: <20190108170407.4770-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190108170407.4770-1-jacopo@jmondi.org> References: <20190108170407.4770-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/4] libcamera: media_device: Add functions to get a MediaLink X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Jan 2019 17:04:10 -0000 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 Reviewed-by: Laurent Pinchart --- v1->v2: - Drop error handling: let the ioctl fail and report the error - Drop the const qualifier to link() methods - Incorporate comments changes src/libcamera/include/media_device.h | 6 +++ src/libcamera/media_device.cpp | 79 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) -- 2.20.1 diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h index 9f45fc7..397d349 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 b0d10ed..7ce5c22 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -306,6 +306,85 @@ 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 entities, or nullptr if not 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 entities, or nullptr if not 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 entities, nullptr otherwise + */ +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