libcamera: camera_manager: Inherit from Extensible

Use the d-pointer infrastructure offered by the Extensible class to
replace the custom implementation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart
2020-09-21 04:06:34 +03:00
parent 79c34d58c7
commit 549d982f61
2 changed files with 38 additions and 24 deletions

View File

@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <vector>
#include <libcamera/extensible.h>
#include <libcamera/object.h>
#include <libcamera/signal.h>
@@ -20,8 +21,9 @@ namespace libcamera {
class Camera;
class EventDispatcher;
class CameraManager : public Object
class CameraManager : public Object, public Extensible
{
LIBCAMERA_DECLARE_PRIVATE(CameraManager)
public:
CameraManager();
CameraManager(const CameraManager &) = delete;
@@ -50,9 +52,6 @@ public:
private:
static const std::string version_;
static CameraManager *self_;
class Private;
std::unique_ptr<Private> p_;
};
} /* namespace libcamera */

View File

@@ -34,8 +34,10 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(Camera)
class CameraManager::Private : public Thread
class CameraManager::Private : public Extensible::Private, public Thread
{
LIBCAMERA_DECLARE_PUBLIC(CameraManager)
public:
Private(CameraManager *cm);
@@ -62,8 +64,6 @@ private:
void createPipelineHandlers();
void cleanup();
CameraManager *cm_;
std::condition_variable cv_;
bool initialized_;
int status_;
@@ -75,7 +75,7 @@ private:
};
CameraManager::Private::Private(CameraManager *cm)
: cm_(cm), initialized_(false)
: Extensible::Private(cm), initialized_(false)
{
}
@@ -136,6 +136,8 @@ int CameraManager::Private::init()
void CameraManager::Private::createPipelineHandlers()
{
CameraManager *const o = LIBCAMERA_O_PTR();
/*
* \todo Try to read handlers and order from configuration
* file and only fallback on all handlers if there is no
@@ -153,7 +155,7 @@ void CameraManager::Private::createPipelineHandlers()
* all pipelines it can provide.
*/
while (1) {
std::shared_ptr<PipelineHandler> pipe = factory->create(cm_);
std::shared_ptr<PipelineHandler> pipe = factory->create(o);
if (!pipe->match(enumerator_.get()))
break;
@@ -264,7 +266,7 @@ void CameraManager::Private::removeCamera(Camera *camera)
CameraManager *CameraManager::self_ = nullptr;
CameraManager::CameraManager()
: p_(new CameraManager::Private(this))
: Extensible(new CameraManager::Private(this))
{
if (self_)
LOG(Camera, Fatal)
@@ -292,9 +294,11 @@ CameraManager::~CameraManager()
*/
int CameraManager::start()
{
Private *const d = LIBCAMERA_D_PTR();
LOG(Camera, Info) << "libcamera " << version_;
int ret = p_->start();
int ret = d->start();
if (ret)
LOG(Camera, Error) << "Failed to start camera manager: "
<< strerror(-ret);
@@ -314,8 +318,9 @@ int CameraManager::start()
*/
void CameraManager::stop()
{
p_->exit();
p_->wait();
Private *const d = LIBCAMERA_D_PTR();
d->exit();
d->wait();
}
/**
@@ -331,9 +336,11 @@ void CameraManager::stop()
*/
std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
{
MutexLocker locker(p_->mutex_);
const Private *const d = LIBCAMERA_D_PTR();
return p_->cameras_;
MutexLocker locker(d->mutex_);
return d->cameras_;
}
/**
@@ -349,9 +356,11 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
*/
std::shared_ptr<Camera> CameraManager::get(const std::string &id)
{
MutexLocker locker(p_->mutex_);
Private *const d = LIBCAMERA_D_PTR();
for (std::shared_ptr<Camera> camera : p_->cameras_) {
MutexLocker locker(d->mutex_);
for (std::shared_ptr<Camera> camera : d->cameras_) {
if (camera->id() == id)
return camera;
}
@@ -377,10 +386,12 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &id)
*/
std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
{
MutexLocker locker(p_->mutex_);
Private *const d = LIBCAMERA_D_PTR();
auto iter = p_->camerasByDevnum_.find(devnum);
if (iter == p_->camerasByDevnum_.end())
MutexLocker locker(d->mutex_);
auto iter = d->camerasByDevnum_.find(devnum);
if (iter == d->camerasByDevnum_.end())
return nullptr;
return iter->second.lock();
@@ -431,9 +442,11 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
void CameraManager::addCamera(std::shared_ptr<Camera> camera,
const std::vector<dev_t> &devnums)
{
ASSERT(Thread::current() == p_.get());
Private *const d = LIBCAMERA_D_PTR();
p_->addCamera(camera, devnums);
ASSERT(Thread::current() == d);
d->addCamera(camera, devnums);
cameraAdded.emit(camera);
}
@@ -449,9 +462,11 @@ void CameraManager::addCamera(std::shared_ptr<Camera> camera,
*/
void CameraManager::removeCamera(std::shared_ptr<Camera> camera)
{
ASSERT(Thread::current() == p_.get());
Private *const d = LIBCAMERA_D_PTR();
p_->removeCamera(camera.get());
ASSERT(Thread::current() == d);
d->removeCamera(camera.get());
cameraRemoved.emit(camera);
}