mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-26 18:15:06 +03:00
Emit 'cameraAdded' and 'cameraRemoved' from CameraManager to enable hotplug and hot-unplug support in application like QCam. To avoid use-after-free race between the CameraManager and the application, emit the 'cameraRemoved' with the shared_ptr version of <Camera *>. This requires to change the function signature of CameraManager::removeCamera() API. Also, until now, CameraManager::Private::addCamera() transfers the entire ownership of camera shared_ptr to CameraManager using std::move(). This patch changes the signature of Private::addCamera to accept pass-by-value camera parameter. It is done to make it clear from the caller point of view that the pointer within the caller will still be valid after this function returns. With this change in, we can emit the camera pointer via 'cameraAdded' signal without hitting a segfault. Signed-off-by: Umang Jain <email@uajain.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2018, Google Inc.
|
|
*
|
|
* camera_manager.h - Camera management
|
|
*/
|
|
#ifndef __LIBCAMERA_CAMERA_MANAGER_H__
|
|
#define __LIBCAMERA_CAMERA_MANAGER_H__
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <sys/types.h>
|
|
#include <vector>
|
|
|
|
#include <libcamera/object.h>
|
|
#include <libcamera/signal.h>
|
|
|
|
namespace libcamera {
|
|
|
|
class Camera;
|
|
class EventDispatcher;
|
|
|
|
class CameraManager : public Object
|
|
{
|
|
public:
|
|
CameraManager();
|
|
CameraManager(const CameraManager &) = delete;
|
|
CameraManager &operator=(const CameraManager &) = delete;
|
|
~CameraManager();
|
|
|
|
int start();
|
|
void stop();
|
|
|
|
std::vector<std::shared_ptr<Camera>> cameras() const;
|
|
std::shared_ptr<Camera> get(const std::string &name);
|
|
std::shared_ptr<Camera> get(dev_t devnum);
|
|
|
|
void addCamera(std::shared_ptr<Camera> camera,
|
|
const std::vector<dev_t> &devnums);
|
|
void removeCamera(std::shared_ptr<Camera> camera);
|
|
|
|
static const std::string &version() { return version_; }
|
|
|
|
void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
|
|
EventDispatcher *eventDispatcher();
|
|
|
|
Signal<std::shared_ptr<Camera>> cameraAdded;
|
|
Signal<std::shared_ptr<Camera>> cameraRemoved;
|
|
|
|
private:
|
|
static const std::string version_;
|
|
static CameraManager *self_;
|
|
|
|
class Private;
|
|
std::unique_ptr<Private> p_;
|
|
};
|
|
|
|
} /* namespace libcamera */
|
|
|
|
#endif /* __LIBCAMERA_CAMERA_MANAGER_H__ */
|