libcamera: pipeline_handler: Store the camera manager pointer
Instead of passing the camera manager pointer to the match() function, and later to more PipelineHandler functions, store it in the PipelineHandler::manager_ member variable at construction time and access it from there. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
eb1ecc92ce
commit
e597598abf
6 changed files with 66 additions and 36 deletions
|
@ -98,8 +98,8 @@ int CameraManager::start()
|
||||||
* all pipelines it can provide.
|
* all pipelines it can provide.
|
||||||
*/
|
*/
|
||||||
while (1) {
|
while (1) {
|
||||||
PipelineHandler *pipe = factory->create();
|
PipelineHandler *pipe = factory->create(this);
|
||||||
if (!pipe->match(this, enumerator_.get())) {
|
if (!pipe->match(enumerator_.get())) {
|
||||||
delete pipe;
|
delete pipe;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,13 @@ class DeviceEnumerator;
|
||||||
class PipelineHandler
|
class PipelineHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~PipelineHandler() { };
|
PipelineHandler(CameraManager *manager);
|
||||||
|
virtual ~PipelineHandler();
|
||||||
|
|
||||||
virtual bool match(CameraManager *manager, DeviceEnumerator *enumerator) = 0;
|
virtual bool match(DeviceEnumerator *enumerator) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CameraManager *manager_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PipelineHandlerFactory
|
class PipelineHandlerFactory
|
||||||
|
@ -30,7 +34,7 @@ public:
|
||||||
PipelineHandlerFactory(const char *name);
|
PipelineHandlerFactory(const char *name);
|
||||||
virtual ~PipelineHandlerFactory() { };
|
virtual ~PipelineHandlerFactory() { };
|
||||||
|
|
||||||
virtual PipelineHandler *create() = 0;
|
virtual PipelineHandler *create(CameraManager *manager) = 0;
|
||||||
|
|
||||||
const std::string &name() const { return name_; }
|
const std::string &name() const { return name_; }
|
||||||
|
|
||||||
|
@ -42,11 +46,13 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#define REGISTER_PIPELINE_HANDLER(handler) \
|
#define REGISTER_PIPELINE_HANDLER(handler) \
|
||||||
class handler##Factory : public PipelineHandlerFactory { \
|
class handler##Factory : public PipelineHandlerFactory \
|
||||||
|
{ \
|
||||||
public: \
|
public: \
|
||||||
handler##Factory() : PipelineHandlerFactory(#handler) { } \
|
handler##Factory() : PipelineHandlerFactory(#handler) {} \
|
||||||
PipelineHandler *create() final { \
|
PipelineHandler *create(CameraManager *manager) final \
|
||||||
return new handler(); \
|
{ \
|
||||||
|
return new handler(manager); \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
static handler##Factory global_##handler##Factory;
|
static handler##Factory global_##handler##Factory;
|
||||||
|
|
|
@ -23,20 +23,20 @@ LOG_DEFINE_CATEGORY(IPU3)
|
||||||
class PipelineHandlerIPU3 : public PipelineHandler
|
class PipelineHandlerIPU3 : public PipelineHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PipelineHandlerIPU3();
|
PipelineHandlerIPU3(CameraManager *manager);
|
||||||
~PipelineHandlerIPU3();
|
~PipelineHandlerIPU3();
|
||||||
|
|
||||||
bool match(CameraManager *manager, DeviceEnumerator *enumerator);
|
bool match(DeviceEnumerator *enumerator);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MediaDevice *cio2_;
|
MediaDevice *cio2_;
|
||||||
MediaDevice *imgu_;
|
MediaDevice *imgu_;
|
||||||
|
|
||||||
void registerCameras(CameraManager *manager);
|
void registerCameras();
|
||||||
};
|
};
|
||||||
|
|
||||||
PipelineHandlerIPU3::PipelineHandlerIPU3()
|
PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
|
||||||
: cio2_(nullptr), imgu_(nullptr)
|
: PipelineHandler(manager), cio2_(nullptr), imgu_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3()
|
||||||
imgu_ = nullptr;
|
imgu_ = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PipelineHandlerIPU3::match(CameraManager *manager, DeviceEnumerator *enumerator)
|
bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
|
||||||
{
|
{
|
||||||
DeviceMatch cio2_dm("ipu3-cio2");
|
DeviceMatch cio2_dm("ipu3-cio2");
|
||||||
cio2_dm.add("ipu3-csi2 0");
|
cio2_dm.add("ipu3-csi2 0");
|
||||||
|
@ -106,7 +106,7 @@ bool PipelineHandlerIPU3::match(CameraManager *manager, DeviceEnumerator *enumer
|
||||||
if (cio2_->disableLinks())
|
if (cio2_->disableLinks())
|
||||||
goto error_close_cio2;
|
goto error_close_cio2;
|
||||||
|
|
||||||
registerCameras(manager);
|
registerCameras();
|
||||||
|
|
||||||
cio2_->close();
|
cio2_->close();
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ error_release_mdev:
|
||||||
* media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four
|
* media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four
|
||||||
* CIO2 CSI-2 receivers.
|
* CIO2 CSI-2 receivers.
|
||||||
*/
|
*/
|
||||||
void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
|
void PipelineHandlerIPU3::registerCameras()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* For each CSI-2 receiver on the IPU3, create a Camera if an
|
* For each CSI-2 receiver on the IPU3, create a Camera if an
|
||||||
|
@ -172,7 +172,7 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
|
||||||
|
|
||||||
std::string cameraName = sensor->name() + " " + std::to_string(id);
|
std::string cameraName = sensor->name() + " " + std::to_string(id);
|
||||||
std::shared_ptr<Camera> camera = Camera::create(cameraName);
|
std::shared_ptr<Camera> camera = Camera::create(cameraName);
|
||||||
manager->addCamera(std::move(camera));
|
manager_->addCamera(std::move(camera));
|
||||||
|
|
||||||
LOG(IPU3, Info)
|
LOG(IPU3, Info)
|
||||||
<< "Registered Camera[" << numCameras << "] \""
|
<< "Registered Camera[" << numCameras << "] \""
|
||||||
|
|
|
@ -17,17 +17,17 @@ namespace libcamera {
|
||||||
class PipelineHandlerUVC : public PipelineHandler
|
class PipelineHandlerUVC : public PipelineHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PipelineHandlerUVC();
|
PipelineHandlerUVC(CameraManager *manager);
|
||||||
~PipelineHandlerUVC();
|
~PipelineHandlerUVC();
|
||||||
|
|
||||||
bool match(CameraManager *manager, DeviceEnumerator *enumerator);
|
bool match(DeviceEnumerator *enumerator);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MediaDevice *dev_;
|
MediaDevice *dev_;
|
||||||
};
|
};
|
||||||
|
|
||||||
PipelineHandlerUVC::PipelineHandlerUVC()
|
PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)
|
||||||
: dev_(nullptr)
|
: PipelineHandler(manager), dev_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ PipelineHandlerUVC::~PipelineHandlerUVC()
|
||||||
dev_->release();
|
dev_->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumerator)
|
bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
|
||||||
{
|
{
|
||||||
DeviceMatch dm("uvcvideo");
|
DeviceMatch dm("uvcvideo");
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera
|
||||||
dev_->acquire();
|
dev_->acquire();
|
||||||
|
|
||||||
std::shared_ptr<Camera> camera = Camera::create(dev_->model());
|
std::shared_ptr<Camera> camera = Camera::create(dev_->model());
|
||||||
manager->addCamera(std::move(camera));
|
manager_->addCamera(std::move(camera));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,17 +17,17 @@ namespace libcamera {
|
||||||
class PipeHandlerVimc : public PipelineHandler
|
class PipeHandlerVimc : public PipelineHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PipeHandlerVimc();
|
PipeHandlerVimc(CameraManager *manager);
|
||||||
~PipeHandlerVimc();
|
~PipeHandlerVimc();
|
||||||
|
|
||||||
bool match(CameraManager *manager, DeviceEnumerator *enumerator);
|
bool match(DeviceEnumerator *enumerator);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MediaDevice *dev_;
|
MediaDevice *dev_;
|
||||||
};
|
};
|
||||||
|
|
||||||
PipeHandlerVimc::PipeHandlerVimc()
|
PipeHandlerVimc::PipeHandlerVimc(CameraManager *manager)
|
||||||
: dev_(nullptr)
|
: PipelineHandler(manager), dev_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ PipeHandlerVimc::~PipeHandlerVimc()
|
||||||
dev_->release();
|
dev_->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator)
|
bool PipeHandlerVimc::match(DeviceEnumerator *enumerator)
|
||||||
{
|
{
|
||||||
DeviceMatch dm("vimc");
|
DeviceMatch dm("vimc");
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator
|
||||||
* object is modeled.
|
* object is modeled.
|
||||||
*/
|
*/
|
||||||
std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera");
|
std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera");
|
||||||
manager->addCamera(std::move(camera));
|
manager_->addCamera(std::move(camera));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,18 +34,30 @@ LOG_DEFINE_CATEGORY(Pipeline)
|
||||||
* with the pipelines it supports and creates corresponding Camera devices.
|
* with the pipelines it supports and creates corresponding Camera devices.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Construct a PipelineHandler instance
|
||||||
|
* \param[in] manager The camera manager
|
||||||
|
*/
|
||||||
|
PipelineHandler::PipelineHandler(CameraManager *manager)
|
||||||
|
: manager_(manager)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PipelineHandler::~PipelineHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \fn PipelineHandler::match(DeviceEnumerator *enumerator)
|
* \fn PipelineHandler::match(DeviceEnumerator *enumerator)
|
||||||
* \brief Match media devices and create camera instances
|
* \brief Match media devices and create camera instances
|
||||||
* \param manager The camera manager
|
|
||||||
* \param enumerator The enumerator providing all media devices found in the
|
* \param enumerator The enumerator providing all media devices found in the
|
||||||
* system
|
* system
|
||||||
*
|
*
|
||||||
* This function is the main entry point of the pipeline handler. It is called
|
* This function is the main entry point of the pipeline handler. It is called
|
||||||
* by the camera manager with the \a manager and \a enumerator passed as
|
* by the camera manager with the \a enumerator passed as an argument. It shall
|
||||||
* arguments. It shall acquire from the \a enumerator all the media devices it
|
* acquire from the \a enumerator all the media devices it needs for a single
|
||||||
* needs for a single pipeline, create one or multiple Camera instances and
|
* pipeline, create one or multiple Camera instances and register them with the
|
||||||
* register them with the \a manager.
|
* camera manager.
|
||||||
*
|
*
|
||||||
* If all media devices needed by the pipeline handler are found, they must all
|
* If all media devices needed by the pipeline handler are found, they must all
|
||||||
* be acquired by a call to MediaDevice::acquire(). This function shall then
|
* be acquired by a call to MediaDevice::acquire(). This function shall then
|
||||||
|
@ -66,6 +78,15 @@ LOG_DEFINE_CATEGORY(Pipeline)
|
||||||
* created, or false otherwise
|
* created, or false otherwise
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \var PipelineHandler::manager_
|
||||||
|
* \brief The Camera manager associated with the pipeline handler
|
||||||
|
*
|
||||||
|
* The camera manager pointer is stored in the pipeline handler for the
|
||||||
|
* convenience of pipeline handler implementations. It remains valid and
|
||||||
|
* constant for the whole lifetime of the pipeline handler.
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class PipelineHandlerFactory
|
* \class PipelineHandlerFactory
|
||||||
* \brief Registration of PipelineHandler classes and creation of instances
|
* \brief Registration of PipelineHandler classes and creation of instances
|
||||||
|
@ -96,8 +117,11 @@ PipelineHandlerFactory::PipelineHandlerFactory(const char *name)
|
||||||
/**
|
/**
|
||||||
* \fn PipelineHandlerFactory::create()
|
* \fn PipelineHandlerFactory::create()
|
||||||
* \brief Create an instance of the PipelineHandler corresponding to the factory
|
* \brief Create an instance of the PipelineHandler corresponding to the factory
|
||||||
|
* \param[in] manager The camera manager
|
||||||
*
|
*
|
||||||
* This virtual function is implemented by the REGISTER_PIPELINE_HANDLER() macro.
|
* This virtual function is implemented by the REGISTER_PIPELINE_HANDLER()
|
||||||
|
* macro. It creates a pipeline handler instance associated with the camera
|
||||||
|
* \a manager.
|
||||||
*
|
*
|
||||||
* \return a pointer to a newly constructed instance of the PipelineHandler
|
* \return a pointer to a newly constructed instance of the PipelineHandler
|
||||||
* subclass corresponding to the factory
|
* subclass corresponding to the factory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue