[libcamera-devel] [PATCH 01/10] libcamera: media_object: Expose entity type
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Aug 6 15:23:59 CEST 2021
Hi Laurent,
On 05/08/2021 23:24, Laurent Pinchart wrote:
> Add a new field to the MediaEntity class to tell the type of interface
s/tell/identify/
> it exposes to userspace. The MediaEntity constructor is changed to take
> a media_v2_interface pointer instead of just the device node major and
> minor to have access to the interface type.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> include/libcamera/internal/media_object.h | 11 ++++-
> src/libcamera/media_device.cpp | 9 +---
> src/libcamera/media_object.cpp | 50 +++++++++++++++++++++--
> 3 files changed, 57 insertions(+), 13 deletions(-)
>
> diff --git a/include/libcamera/internal/media_object.h b/include/libcamera/internal/media_object.h
> index 2f5d33e1903e..6ae22c679cc5 100644
> --- a/include/libcamera/internal/media_object.h
> +++ b/include/libcamera/internal/media_object.h
> @@ -88,9 +88,17 @@ private:
> class MediaEntity : public MediaObject
> {
> public:
> + enum class Type {
> + Invalid,
> + MediaEntity,
> + V4L2Subdevice,
> + V4L2VideoDevice,
> + };
> +
> const std::string &name() const { return name_; }
> unsigned int function() const { return function_; }
> unsigned int flags() const { return flags_; }
> + Type type() const { return type_; }
> const std::string &deviceNode() const { return deviceNode_; }
> unsigned int deviceMajor() const { return major_; }
> unsigned int deviceMinor() const { return minor_; }
> @@ -108,13 +116,14 @@ private:
> friend class MediaDevice;
>
> MediaEntity(MediaDevice *dev, const struct media_v2_entity *entity,
> - unsigned int major = 0, unsigned int minor = 0);
> + const struct media_v2_interface *iface);
>
> void addPad(MediaPad *pad);
>
> std::string name_;
> unsigned int function_;
> unsigned int flags_;
> + Type type_;
> std::string deviceNode_;
> unsigned int major_;
> unsigned int minor_;
> diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> index fa50264fa253..4d7cb1f566c4 100644
> --- a/src/libcamera/media_device.cpp
> +++ b/src/libcamera/media_device.cpp
> @@ -652,14 +652,7 @@ bool MediaDevice::populateEntities(const struct media_v2_topology &topology)
> */
> struct media_v2_interface *iface =
> findInterface(topology, ent->id);
> -
> - MediaEntity *entity;
> - if (iface)
> - entity = new MediaEntity(this, ent,
> - iface->devnode.major,
> - iface->devnode.minor);
> - else
> - entity = new MediaEntity(this, ent);
> + MediaEntity *entity = new MediaEntity(this, ent, iface);
>
> if (!addObject(entity)) {
> delete entity;
> diff --git a/src/libcamera/media_object.cpp b/src/libcamera/media_object.cpp
> index 815edc8e3b2d..f425d0447241 100644
> --- a/src/libcamera/media_object.cpp
> +++ b/src/libcamera/media_object.cpp
> @@ -247,6 +247,23 @@ void MediaPad::addLink(MediaLink *link)
> * may expose a deviceNode().
> */
>
> +/**
> + * \enum MediaEntity::Type
> + * \brief The type of the interface exposed by the entity to userspace
> + *
> + * \var MediaEntity::Type::Invalid
> + * \brief Invalid or unsupported entity type
> + *
> + * \var MediaEntity::Type::MediaEntity
> + * \brief Plain media entity with no userspace interface
> + *
> + * \var MediaEntity::Type::V4L2VideoDevice
> + * \brief V4L2 video device with a V4L2 video device node
> + *
> + * \var MediaEntity::Type::V4L2Subdevice
> + * \brief V4L2 subdevice with a V4L2 subdev device node
> + */
> +
> /**
> * \fn MediaEntity::name()
> * \brief Retrieve the entity name
> @@ -273,6 +290,15 @@ void MediaPad::addLink(MediaLink *link)
> * \return The entity's flags
> */
>
> +/**
> + * \fn MediaEntity::type()
> + * \brief Retrieve the entity's type
> + *
> + * The entity type identifies the type of interface exposed to userspace.
> + *
> + * \return The entity's type
> + */
> +
> /**
> * \fn MediaEntity::deviceNode()
> * \brief Retrieve the entity's device node path, if any
> @@ -356,16 +382,32 @@ int MediaEntity::setDeviceNode(const std::string &deviceNode)
> * \brief Construct a MediaEntity
> * \param[in] dev The media device this entity belongs to
> * \param[in] entity The media entity kernel data
> - * \param[in] major The major number of the entity associated interface
> - * \param[in] minor The minor number of the entity associated interface
> + * \param[in] iface The entity interface data (may be null)
> */
> MediaEntity::MediaEntity(MediaDevice *dev,
> const struct media_v2_entity *entity,
> - unsigned int major, unsigned int minor)
> + const struct media_v2_interface *iface)
> : MediaObject(dev, entity->id), name_(entity->name),
> function_(entity->function), flags_(entity->flags),
> - major_(major), minor_(minor)
> + type_(Type::MediaEntity), major_(0), minor_(0)
> {
> + if (!iface)
> + return;
> +
> + switch (iface->intf_type) {
> + case MEDIA_INTF_T_V4L_VIDEO:
> + type_ = Type::V4L2VideoDevice;
> + break;
> + case MEDIA_INTF_T_V4L_SUBDEV:
> + type_ = Type::V4L2Subdevice;
> + break;
> + default:
> + type_ = Type::Invalid;
> + return;
> + }
> +
> + major_ = iface->devnode.major;
> + minor_ = iface->devnode.minor;
> }
>
> /**
>
More information about the libcamera-devel
mailing list