<div dir="ltr"><div dir="ltr">Hi David,<div><br></div><div>Thank you for fixing this.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 11 Nov 2022 at 13:30, David Plowman via libcamera-devel <<a href="mailto:libcamera-devel@lists.libcamera.org">libcamera-devel@lists.libcamera.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This notifies pipeline handlers when a camera is released, in case<br>
they want to free any resources or memory buffers.<br>
<br>
Signed-off-by: David Plowman <<a href="mailto:david.plowman@raspberrypi.com" target="_blank">david.plowman@raspberrypi.com</a>><br></blockquote><div><br></div><div>Reviewed-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
 include/libcamera/internal/pipeline_handler.h |  4 +++-<br>
 src/libcamera/camera.cpp                      |  2 +-<br>
 src/libcamera/pipeline_handler.cpp            | 16 +++++++++++++++-<br>
 3 files changed, 19 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h<br>
index 96aab9d6..ec4f662d 100644<br>
--- a/include/libcamera/internal/pipeline_handler.h<br>
+++ b/include/libcamera/internal/pipeline_handler.h<br>
@@ -46,7 +46,7 @@ public:<br>
                                        const DeviceMatch &dm);<br>
<br>
        bool acquire();<br>
-       void release();<br>
+       void release(Camera *camera);<br>
<br>
        virtual std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,<br>
                const StreamRoles &roles) = 0;<br>
@@ -74,6 +74,8 @@ protected:<br>
        virtual int queueRequestDevice(Camera *camera, Request *request) = 0;<br>
        virtual void stopDevice(Camera *camera) = 0;<br>
<br>
+       virtual void releaseDevice(Camera *camera);<br>
+<br>
        CameraManager *manager_;<br>
<br>
 private:<br>
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp<br>
index c4f65c1a..2d947a44 100644<br>
--- a/src/libcamera/camera.cpp<br>
+++ b/src/libcamera/camera.cpp<br>
@@ -870,7 +870,7 @@ int Camera::release()<br>
                return ret == -EACCES ? -EBUSY : ret;<br>
<br>
        if (d->isAcquired())<br>
-               d->pipe_->release();<br>
+               d->pipe_->release(this);<br>
<br>
        d->setState(Private::CameraAvailable);<br>
<br>
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp<br>
index 825aff5a..cfade490 100644<br>
--- a/src/libcamera/pipeline_handler.cpp<br>
+++ b/src/libcamera/pipeline_handler.cpp<br>
@@ -183,6 +183,7 @@ bool PipelineHandler::acquire()<br>
<br>
 /**<br>
  * \brief Release exclusive access to the pipeline handler<br>
+ * \param[in] camera The camera for which to release data<br>
  *<br>
  * This function releases access to the pipeline handler previously acquired by<br>
  * a call to acquire(). Every release() call shall match a previous successful<br>
@@ -196,7 +197,7 @@ bool PipelineHandler::acquire()<br>
  *<br>
  * \sa acquire()<br>
  */<br>
-void PipelineHandler::release()<br>
+void PipelineHandler::release(Camera *camera)<br>
 {<br>
        MutexLocker locker(lock_);<br>
<br>
@@ -204,9 +205,22 @@ void PipelineHandler::release()<br>
<br>
        unlockMediaDevices();<br>
<br>
+       releaseDevice(camera);<br>
+<br>
        --useCount_;<br>
 }<br>
<br>
+/**<br>
+ * \brief Release resources associated with this camera<br>
+ * \param[in] camera The camera for which to release resources<br>
+ *<br>
+ * Pipeline handlers may override this in order to perform cleanup operations<br>
+ * when a camera is released, such as freeing memory.<br>
+ */<br>
+void PipelineHandler::releaseDevice([[maybe_unused]] Camera *camera)<br>
+{<br>
+}<br>
+<br>
 void PipelineHandler::unlockMediaDevices()<br>
 {<br>
        for (std::shared_ptr<MediaDevice> &media : mediaDevices_)<br>
-- <br>
2.30.2<br>
<br>
</blockquote></div></div>