diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2019-01-03 16:33:19 +0100 |
---|---|---|
committer | Jacopo Mondi <jacopo@jmondi.org> | 2019-01-09 09:16:47 +0100 |
commit | 4e78147df919b6cbc4f117d6a0229819647d503e (patch) | |
tree | 697d052f0963af2f99254e828343deb62714ef6b /src/libcamera/media_device.cpp | |
parent | b65feafe3244e6a4c794b73260a9dc790daa0f47 (diff) |
libcamera: Add link handling functions
Add a function to the MediaLink class to set the state of a link to
enabled or disabled. The function makes use of an internal MediaDevice
method, which is defined private and only accessible by the MediaLink
setEnabled() function itself.
Also add to MediaDevice a function to reset all links registered in the
media graph.
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/libcamera/media_device.cpp')
-rw-r--r-- | src/libcamera/media_device.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp index ca12caaa..0ee55060 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -387,6 +387,35 @@ MediaLink *MediaDevice::link(const MediaPad *source, const MediaPad *sink) } /** + * \brief Disable all links in the media device + * + * Disable all the media device links, clearing the MEDIA_LNK_FL_ENABLED flag + * on links which are not flagged as IMMUTABLE. + * + * \return 0 on success, or a negative error code otherwise + */ +int MediaDevice::disableLinks() +{ + for (MediaEntity *entity : entities_) { + for (MediaPad *pad : entity->pads()) { + if (!(pad->flags() & MEDIA_PAD_FL_SOURCE)) + continue; + + for (MediaLink *link : pad->links()) { + if (link->flags() & MEDIA_LNK_FL_IMMUTABLE) + continue; + + int ret = link->setEnabled(false); + if (ret) + return ret; + } + } + } + + return 0; +} + +/** * \var MediaDevice::objects_ * \brief Global map of media objects (entities, pads, links) keyed by their * object id. @@ -602,4 +631,50 @@ bool MediaDevice::populateLinks(const struct media_v2_topology &topology) return true; } +/** + * \brief Apply \a flags to a link between two pads + * \param link The link to apply flags to + * \param flags The flags to apply to the link + * + * This function applies the link \a flags (as defined by the MEDIA_LNK_FL_* + * macros from the Media Controller API) to the given \a link. It implements + * low-level link setup as it performs no checks on the validity of the \a + * flags, and assumes that the supplied \a flags are valid for the link (e.g. + * immutable links cannot be disabled). +* + * \sa MediaLink::setEnabled(bool enable) + * + * \return 0 on success, or a negative error code otherwise + */ +int MediaDevice::setupLink(const MediaLink *link, unsigned int flags) +{ + struct media_link_desc linkDesc = { }; + MediaPad *source = link->source(); + MediaPad *sink = link->sink(); + + linkDesc.source.entity = source->entity()->id(); + linkDesc.source.index = source->index(); + linkDesc.source.flags = MEDIA_PAD_FL_SOURCE; + + linkDesc.sink.entity = sink->entity()->id(); + linkDesc.sink.index = sink->index(); + linkDesc.sink.flags = MEDIA_PAD_FL_SINK; + + linkDesc.flags = flags; + + int ret = ioctl(fd_, MEDIA_IOC_SETUP_LINK, &linkDesc); + if (ret) { + ret = -errno; + LOG(Error) << "Failed to setup link: " << strerror(-ret); + return ret; + } + + LOG(Debug) << source->entity()->name() << "[" + << source->index() << "] -> " + << sink->entity()->name() << "[" + << sink->index() << "]: " << flags; + + return 0; +} + } /* namespace libcamera */ |