[libcamera-devel] [PATCH 1/5] libcamera: Add support for ancillary links to MediaLink
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Nov 28 23:02:28 CET 2021
Hi Daniel,
Thank you for the patch.
On Fri, Nov 26, 2021 at 12:31:14AM +0000, Daniel Scally wrote:
> Update the MediaLink class to include members suitable for the new
> type of media_v2_link, connecting two instances of MediaEntity
> rather than MediaPads
>
> Signed-off-by: Daniel Scally <djrscally at gmail.com>
> ---
>
> Adding new members and a new constructor here seemed in the end like the least
> impactful and probably cleanest method of doing this, as otherwise the source
> and sink would need to become MediaObjects and be cast everywhere.
I'm not really thrilled by this. Given that the purpose of ancillary
links is to expose the relationship between a primary device and its
ancillary devices, and given that those relationships don't carry any
other property than their existence, I think adding a
const std::vector<MediaEntity *> ancillaryEntities() const;
(naming bikeshedding accepted) function to the MediaEntity class should
be enough, without a need to extend the MediaLink API.
> include/libcamera/internal/media_object.h | 10 ++++++++++
> src/libcamera/media_object.cpp | 24 ++++++++++++++++++++++-
> 2 files changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/include/libcamera/internal/media_object.h b/include/libcamera/internal/media_object.h
> index 6ae22c67..79c71325 100644
> --- a/include/libcamera/internal/media_object.h
> +++ b/include/libcamera/internal/media_object.h
> @@ -45,6 +45,8 @@ class MediaLink : public MediaObject
> public:
> MediaPad *source() const { return source_; }
> MediaPad *sink() const { return sink_; }
> + MediaEntity *primary() const { return primary_; };
> + MediaEntity *ancillary() const { return ancillary_; };
> unsigned int flags() const { return flags_; }
> int setEnabled(bool enable);
>
> @@ -55,9 +57,13 @@ private:
>
> MediaLink(const struct media_v2_link *link,
> MediaPad *source, MediaPad *sink);
> + MediaLink(const struct media_v2_link *link,
> + MediaEntity *primary, MediaEntity *ancillary);
>
> MediaPad *source_;
> MediaPad *sink_;
> + MediaEntity *primary_;
> + MediaEntity *ancillary_;
> unsigned int flags_;
> };
>
> @@ -104,12 +110,15 @@ public:
> unsigned int deviceMinor() const { return minor_; }
>
> const std::vector<MediaPad *> &pads() const { return pads_; }
> + const std::vector<MediaLink *> &ancillary_links() const { return ancillary_links_; }
>
> const MediaPad *getPadByIndex(unsigned int index) const;
> const MediaPad *getPadById(unsigned int id) const;
>
> int setDeviceNode(const std::string &deviceNode);
>
> + void addLink(MediaLink *link);
> +
> private:
> LIBCAMERA_DISABLE_COPY_AND_MOVE(MediaEntity)
>
> @@ -129,6 +138,7 @@ private:
> unsigned int minor_;
>
> std::vector<MediaPad *> pads_;
> + std::vector<MediaLink *> ancillary_links_;
> };
>
> } /* namespace libcamera */
> diff --git a/src/libcamera/media_object.cpp b/src/libcamera/media_object.cpp
> index f425d044..e903d5ef 100644
> --- a/src/libcamera/media_object.cpp
> +++ b/src/libcamera/media_object.cpp
> @@ -134,7 +134,7 @@ int MediaLink::setEnabled(bool enable)
> }
>
> /**
> - * \brief Construct a MediaLink
> + * \brief Construct a MediaLink between two pads
> * \param[in] link The media link kernel data
> * \param[in] source The source pad at the origin of the link
> * \param[in] sink The sink pad at the destination of the link
> @@ -146,6 +146,19 @@ MediaLink::MediaLink(const struct media_v2_link *link, MediaPad *source,
> {
> }
>
> +/**
> + * \brief Construct a MediaLink between two entities
> + * \param[in] link The media link kernel data
> + * \param[in] primary The primary entity at the origin of the link
> + * \param[in] ancillary The ancillary entity at the destination of the link
> + */
> +MediaLink::MediaLink(const struct media_v2_link *link, MediaEntity *primary,
> + MediaEntity *ancillary)
> + : MediaObject(primary->device(), link->id), primary_(primary),
> + ancillary_(ancillary), flags_(link->flags)
> +{
> +}
> +
> /**
> * \fn MediaLink::source()
> * \brief Retrieve the link's source pad
> @@ -378,6 +391,15 @@ int MediaEntity::setDeviceNode(const std::string &deviceNode)
> return 0;
> }
>
> +/**
> + * \brief Add an ancillary link to the MediaEntity
> + * \param[in] link Pointer to the MediaLink class
> + */
> +void MediaEntity::addLink(MediaLink *link)
> +{
> + ancillary_links_.push_back(link);
> +}
> +
> /**
> * \brief Construct a MediaEntity
> * \param[in] dev The media device this entity belongs to
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list