@@ -25,6 +25,8 @@ public:
const std::string &name() const;
+ void disconnect();
+
private:
explicit Camera(const std::string &name, class PipelineHandler *pipe);
~Camera();
@@ -33,6 +33,8 @@
namespace libcamera {
+LOG_DECLARE_CATEGORY(Camera)
+
/**
* \class Camera
* \brief Camera device
@@ -86,6 +88,20 @@ const std::string &Camera::name() const
return name_;
}
+/**
+ * \brief Disconnect the camera from the hardware
+ *
+ * When the underlying PipelineHandler is deleted as a result of the hardware
+ * being removed or un-pluged the Camera needs to be disconnected. The pipeline
+ * handler should when it detects that it's being removed notify all cameras it
+ * have created that they are now longer backed by any hardware.
+ */
+void Camera::disconnect()
+{
+ LOG(Camera, Debug) << "Disconnecting camera" << name_;
+ pipe_ = nullptr;
+}
+
Camera::Camera(const std::string &name, class PipelineHandler *pipe)
: name_(name), pipe_(pipe)
{
@@ -44,6 +44,9 @@ PipelineHandlerIPU3::PipelineHandlerIPU3()
PipelineHandlerIPU3::~PipelineHandlerIPU3()
{
+ for (const std::shared_ptr<Camera> &camera : cameras_)
+ camera->disconnect();
+
cameras_.clear();
if (cio2_)
@@ -34,8 +34,10 @@ PipelineHandlerUVC::PipelineHandlerUVC()
PipelineHandlerUVC::~PipelineHandlerUVC()
{
- if (camera_)
+ if (camera_) {
+ camera_->disconnect();
camera_ = nullptr;
+ }
if (dev_)
dev_->release();
@@ -34,8 +34,10 @@ PipeHandlerVimc::PipeHandlerVimc()
PipeHandlerVimc::~PipeHandlerVimc()
{
- if (camera_)
+ if (camera_) {
+ camera_->disconnect();
camera_ = nullptr;
+ }
if (dev_)
dev_->release();
As camera object have the potential to outlive the hardware they represent there is a need to inform the camera it's disconnected from the hardware. At this point it is enough to sever the reference to the pipeline handler which created the camera as that is the only resource the Camera object holds which represents hardware. As we move forward maybe a more elaborate flag is needed to flag that hardware is being removed. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> --- include/libcamera/camera.h | 2 ++ src/libcamera/camera.cpp | 16 ++++++++++++++++ src/libcamera/pipeline/ipu3/ipu3.cpp | 3 +++ src/libcamera/pipeline/uvcvideo.cpp | 4 +++- src/libcamera/pipeline/vimc.cpp | 4 +++- 5 files changed, 27 insertions(+), 2 deletions(-)