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:
Laurent Pinchart 2019-01-23 21:53:17 +02:00
parent eb1ecc92ce
commit e597598abf
6 changed files with 66 additions and 36 deletions

View file

@ -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;
} }

View file

@ -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;

View file

@ -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 << "] \""

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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