diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2018-12-26 11:04:10 +0100 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-01-02 12:35:18 +0200 |
commit | 14291e50b7d9cfbc7bae51f84b97adf44cce6b55 (patch) | |
tree | a44951e7f7261b14c5c041a11d124f64d74f7a52 /src | |
parent | b403cb4550628acd0f1835354558cd5a5b131edf (diff) |
libcamera: media_device: Add DeviceInfo features
Add the features of the DeviceInfo class needed to replace it with
MediaDevice.
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/include/media_device.h | 5 | ||||
-rw-r--r-- | src/libcamera/media_device.cpp | 50 |
2 files changed, 54 insertions, 1 deletions
diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h index d787be39..3fcdb4b4 100644 --- a/src/libcamera/include/media_device.h +++ b/src/libcamera/include/media_device.h @@ -24,6 +24,10 @@ public: MediaDevice(const std::string &devnode); ~MediaDevice(); + bool acquire(); + void release() { acquired_ = false; } + bool busy() const { return acquired_; } + int open(); void close(); @@ -41,6 +45,7 @@ private: std::string devnode_; int fd_; bool valid_; + bool acquired_; std::map<unsigned int, MediaObject *> objects_; MediaObject *object(unsigned int id); diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp index 1bd4f43a..73a866bb 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -53,6 +53,10 @@ namespace libcamera { * This will not invalidate the media graph and all cached media objects remain * valid and can be accessed normally. The device can then be later reopened if * needed to perform other operations that interact with the device node. + * + * Media device can be claimed for exclusive use with acquire(), released with + * release() and tested with busy(). This mechanism is aimed at pipeline + * managers to claim media devices they support during enumeration. */ /** @@ -63,7 +67,7 @@ namespace libcamera { * populated with open() and populate() before the media graph can be queried. */ MediaDevice::MediaDevice(const std::string &devnode) - : devnode_(devnode), fd_(-1), valid_(false) + : devnode_(devnode), fd_(-1), valid_(false), acquired_(false) { } @@ -75,6 +79,50 @@ MediaDevice::~MediaDevice() } /** + * \brief Claim a device for exclusive use + * + * The device claiming mechanism offers simple media device access arbitration + * between multiple users. When the media device is created, it is available to + * all users. Users can query the media graph to determine whether they can + * support the device and, if they do, claim the device for exclusive use. Other + * users are then expected to skip over media devices in use as reported by the + * busy() function. + * + * Once claimed the device shall be released by its user when not needed anymore + * by calling the release() function. + * + * Exclusive access is only guaranteed if all users of the media device abide by + * the device claiming mechanism, as it isn't enforced by the media device + * itself. + * + * \return true if the device was successfully claimed, or false if it was + * already in use + * \sa release(), busy() + */ +bool MediaDevice::acquire() +{ + if (acquired_) + return false; + + acquired_ = true; + return true; +} + +/** + * \fn MediaDevice::release() + * \brief Release a device previously claimed for exclusive use + * \sa acquire(), busy() + */ + +/** + * \fn MediaDevice::busy() + * \brief Check if a device is in use + * \return true if the device has been claimed for exclusive use, or false if it + * is available + * \sa acquire(), release() + */ + +/** * \brief Open a media device and retrieve device information * * Before populating the media graph or performing any operation that interact |