summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-01-03 15:30:53 +0100
committerJacopo Mondi <jacopo@jmondi.org>2019-01-08 21:38:42 +0100
commitb65feafe3244e6a4c794b73260a9dc790daa0f47 (patch)
treed25ebb5ec58539b2209f393658b3566db8ae7630
parent6275a14215f2a93b5fcfd95a46619f6e8ffa0add (diff)
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 <jacopo@jmondi.org>
-rw-r--r--src/libcamera/include/media_device.h6
-rw-r--r--src/libcamera/media_device.cpp80
2 files changed, 86 insertions, 0 deletions
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<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);
+ 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
@@ -307,6 +307,86 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
}
/**
+ * \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
* object id.