Message ID | 20210805222436.6263-2-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@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; > } > > /** >
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; } /**
Add a new field to the MediaEntity class to tell the type of interface 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@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(-)