From 9fb4d454d2b747cd1e97de363e16dda16934f2e2 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Date: Mon, 5 Aug 2024 14:26:01 +0200 Subject: HACK: acquire media device non-exclusiveley Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- include/libcamera/internal/device_enumerator.h | 1 + include/libcamera/internal/media_device.h | 10 ++++++++++ include/libcamera/internal/pipeline_handler.h | 2 ++ 3 files changed, 13 insertions(+) (limited to 'include') diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h index db3532a9..4bc3a27d 100644 --- a/include/libcamera/internal/device_enumerator.h +++ b/include/libcamera/internal/device_enumerator.h @@ -42,6 +42,7 @@ public: virtual int enumerate() = 0; std::shared_ptr<MediaDevice> search(const DeviceMatch &dm); + std::shared_ptr<MediaDevice> searchNonExclusive(const DeviceMatch &dm); Signal<> devicesAdded; diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h index 992184ed..bcbedf5c 100644 --- a/include/libcamera/internal/media_device.h +++ b/include/libcamera/internal/media_device.h @@ -29,9 +29,14 @@ public: ~MediaDevice(); bool acquire(); + bool acquireNonExclusive(); void release(); bool busy() const { return acquired_; } + /* HACKS */ + unsigned int get() { return ++users_; } + unsigned int put() { return --users_; } + bool lock(); void unlock(); @@ -55,6 +60,8 @@ public: int disableLinks(); int fd() const { return fd_.get(); } + int fd(unsigned int context) const { return fds_[context - 1].get(); } + unsigned int numContexts() const { return fds_.size(); } Signal<> disconnected; @@ -63,6 +70,7 @@ protected: private: int open(); + int openMultiple(); void close(); MediaObject *object(unsigned int id); @@ -86,8 +94,10 @@ private: unsigned int hwRevision_; UniqueFD fd_; + std::vector<UniqueFD> fds_; bool valid_; bool acquired_; + unsigned int users_; std::map<unsigned int, MediaObject *> objects_; std::vector<MediaEntity *> entities_; diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 746a34f8..7c316cb9 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -44,6 +44,8 @@ public: virtual bool match(DeviceEnumerator *enumerator) = 0; MediaDevice *acquireMediaDevice(DeviceEnumerator *enumerator, const DeviceMatch &dm); + MediaDevice *acquireMediaDeviceNonExclusive(DeviceEnumerator *enumerator, + const DeviceMatch &dm); bool acquire(); void release(Camera *camera); -- cgit v1.2.1