[libcamera-devel,v3,1/3] libcamera: Add pointer to MediaDevice to MediaObject

Message ID 20190108204733.10823-2-jacopo@jmondi.org
State Accepted
Headers show
Series
  • libcamera: media device: Add link handling
Related show

Commit Message

Jacopo Mondi Jan. 8, 2019, 8:47 p.m. UTC
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.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/include/media_object.h |  7 ++++--
 src/libcamera/media_device.cpp       |  4 ++--
 src/libcamera/media_object.cpp       | 33 +++++++++++++++++++++-------
 3 files changed, 32 insertions(+), 12 deletions(-)

Patch

diff --git a/src/libcamera/include/media_object.h b/src/libcamera/include/media_object.h
index 04b9a89..b2c3d8e 100644
--- a/src/libcamera/include/media_object.h
+++ b/src/libcamera/include/media_object.h
@@ -21,14 +21,17 @@  class MediaPad;
 class MediaObject
 {
 public:
+	MediaDevice *device() { return dev_; }
 	unsigned int id() const { return id_; }
 
 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 *dev, const struct media_v2_entity *entity,
 		    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..4ff9620 100644
--- a/src/libcamera/media_object.cpp
+++ b/src/libcamera/media_object.cpp
@@ -42,28 +42,43 @@  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 within the device
+ * \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.
  * This constraint is neither enforced nor checked by the MediaObject.
  */
 
+/**
+ * \fn MediaObject::device()
+ * \brief Retrieve the media device the media object belongs to
+ * \return The MediaDevice
+ */
+
 /**
  * \fn MediaObject::id()
  * \brief Retrieve the media object id
  * \return The media object id
  */
 
+/**
+ * \var MediaObject::dev_
+ * \brief The media device the media object belongs to
+ */
+
 /**
  * \var MediaObject::id_
  * \brief The media object id
@@ -88,7 +103,7 @@  namespace libcamera {
  */
 MediaLink::MediaLink(const struct media_v2_link *link, MediaPad *source,
 		     MediaPad *sink)
-	: MediaObject(link->id), source_(source),
+	: MediaObject(source->device(), link->id), source_(source),
 	  sink_(sink), flags_(link->flags)
 {
 }
@@ -139,7 +154,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->device(), pad->id), index_(pad->index), entity_(entity),
 	  flags_(pad->flags)
 {
 }
@@ -283,13 +298,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)
 {
 }