[libcamera-devel] [PATCH v2 1/4] libcamera: Add pointer to MediaDevice to MediaObject

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Jan 8 19:07:59 CET 2019


Hi Jacopo,

Thank you for the patch.

On Tuesday, 8 January 2019 19:04:04 EET Jacopo Mondi wrote:
> Add a MediaDevice member field to the MediaObject class hierarcy.
> Each media object now has a reference to the media device it belongs to,
> and which it has been created by.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> v1->v2:
> - Use the entity MediaDevice in MediaPad and MediaLink constructors
> - Incorporate comments changes from Laurent and Niklas on v1
> 
>  src/libcamera/include/media_object.h |  7 +++++--
>  src/libcamera/media_device.cpp       |  4 ++--
>  src/libcamera/media_object.cpp       | 27 +++++++++++++++++++--------
>  3 files changed, 26 insertions(+), 12 deletions(-)
> 
> diff --git a/src/libcamera/include/media_object.h
> b/src/libcamera/include/media_object.h index 04b9a89..d92aab3 100644
> --- a/src/libcamera/include/media_object.h
> +++ b/src/libcamera/include/media_object.h
> @@ -22,13 +22,16 @@ class MediaObject
>  {
>  public:
>  	unsigned int id() const { return id_; }
> +	MediaDevice *dev() const { return dev_; }

For the reason explained in v1, I would make this either

	MediaDevice *dev() { return dev_; }
	const MediaDevice *dev() const { return dev_; }

or just

	MediaDevice *dev() { return dev_; }

And I think you can spell the name of the function fully.

>  protected:
>  	friend class MediaDevice;
> 
> -	MediaObject(unsigned int id) : id_(id) { }
> +	MediaObject(MediaDevice *dev, unsigned int id) :
> +		dev_(dev), id_(id) { }
>  	virtual ~MediaObject() { }
> 
> +	MediaDevice *dev_;
>  	unsigned int id_;
>  };
> 
> @@ -93,7 +96,7 @@ public:
>  private:
>  	friend class MediaDevice;
> 
> -	MediaEntity(const struct media_v2_entity *entity,
> +	MediaEntity(MediaDevice *media, const struct media_v2_entity *entity,

If MediaObject is constructed with a MediaDevice *dev, should this be 
MediaDevice *dev too ?

>  		    unsigned int major = 0, unsigned int minor = 0);
>  	MediaEntity(const MediaEntity &) = delete;
>  	~MediaEntity();
> diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> index cf4ff90..b0d10ed 100644
> --- a/src/libcamera/media_device.cpp
> +++ b/src/libcamera/media_device.cpp
> @@ -430,11 +430,11 @@ bool MediaDevice::populateEntities(const struct
> media_v2_topology &topology)
> 
>  		MediaEntity *entity;
>  		if (iface)
> -			entity = new MediaEntity(&mediaEntities[i],
> +			entity = new MediaEntity(this, &mediaEntities[i],
>  						 iface->devnode.major,
>  						 iface->devnode.minor);
>  		else
> -			entity = new MediaEntity(&mediaEntities[i]);
> +			entity = new MediaEntity(this, &mediaEntities[i]);
> 
>  		if (!addObject(entity)) {
>  			delete entity;
> diff --git a/src/libcamera/media_object.cpp b/src/libcamera/media_object.cpp
> index 06a8d64..612550d 100644
> --- a/src/libcamera/media_object.cpp
> +++ b/src/libcamera/media_object.cpp
> @@ -42,16 +42,20 @@ namespace libcamera {
>   * \class MediaObject
>   * \brief Base class for all media objects
>   *
> - * MediaObject is an abstract base class for all media objects in the media
> - * graph. Every media graph object is identified by an id unique in the
> media - * device context, and this base class provides that.
> + * MediaObject is an abstract base class for all media objects in the
> + * media graph. Each object is identified by a reference to the media
> + * device it belongs to and a unique id within that media device.
> + * This base class provide helpers to media objects to keep track of
> + * these identifiers.
>   *
>   * \sa MediaEntity, MediaPad, MediaLink
>   */
> 
>  /**
>   * \fn MediaObject::MediaObject()
> - * \brief Construct a MediaObject with \a id
> + * \brief Construct a MediaObject part of the MediaDevice \a dev,
> + * identified by the \a id unique in within the device

s/in within/within/

> + * \param dev The media device this object belongs to
>   * \param id The media object id
>   *
>   * The caller shall ensure unicity of the object id in the media device
> context. @@ -69,6 +73,11 @@ namespace libcamera {
>   * \brief The media object id
>   */
> 
> +/**
> + * \var MediaObject::dev_
> + * \brief The media device the media object belongs to
> + */
> +

Could you keep this in the same order as in the class definition ?

>  /**
>   * \class MediaLink
>   * \brief The MediaLink represents a link between two pads in the media
> graph. @@ -88,7 +97,7 @@ namespace libcamera {
>   */
>  MediaLink::MediaLink(const struct media_v2_link *link, MediaPad *source,
>  		     MediaPad *sink)
> -	: MediaObject(link->id), source_(source),
> +	: MediaObject(source->dev(), link->id), source_(source),
>  	  sink_(sink), flags_(link->flags)
>  {
>  }
> @@ -139,7 +148,7 @@ MediaLink::MediaLink(const struct media_v2_link *link,
> MediaPad *source, * \param entity The entity the pad belongs to
>   */
>  MediaPad::MediaPad(const struct media_v2_pad *pad, MediaEntity *entity)
> -	: MediaObject(pad->id), index_(pad->index), entity_(entity),
> +	: MediaObject(entity->dev(), pad->id), index_(pad->index),
> entity_(entity), flags_(pad->flags)
>  {
>  }
> @@ -283,13 +292,15 @@ int MediaEntity::setDeviceNode(const std::string
> &devnode)
> 
>  /**
>   * \brief Construct a MediaEntity
> + * \param dev The media device this entity belongs to
>   * \param entity The media entity kernel data
>   * \param major The major number of the entity associated interface
>   * \param minor The minor number of the entity associated interface
>   */
> -MediaEntity::MediaEntity(const struct media_v2_entity *entity,
> +MediaEntity::MediaEntity(MediaDevice *dev,
> +			 const struct media_v2_entity *entity,
>  			 unsigned int major, unsigned int minor)
> -	: MediaObject(entity->id), name_(entity->name),
> +	: MediaObject(dev, entity->id), name_(entity->name),
>  	  major_(major), minor_(minor)
>  {
>  }

With the small issues above fixed,

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

-- 
Regards,

Laurent Pinchart





More information about the libcamera-devel mailing list