android: CameraHalManager: Hold CameraDevice with std::unique_ptr

CameraDevice is owned by CameraHalManager. The ownership of the
object is not shared with other classes. So CameraHalManager
should manage CameraDevice with std::unique_ptr.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Hirokazu Honda 2021-03-24 16:07:50 +09:00 committed by Laurent Pinchart
parent 1d8cc0a3ec
commit 212f410c7c
4 changed files with 8 additions and 11 deletions

View file

@ -350,11 +350,10 @@ CameraDevice::~CameraDevice()
delete it.second;
}
std::shared_ptr<CameraDevice> CameraDevice::create(unsigned int id,
std::unique_ptr<CameraDevice> CameraDevice::create(unsigned int id,
const std::shared_ptr<Camera> &cam)
{
CameraDevice *camera = new CameraDevice(id, cam);
return std::shared_ptr<CameraDevice>(camera);
return std::unique_ptr<CameraDevice>(new CameraDevice(id, cam));
}
/*

View file

@ -32,7 +32,7 @@
class CameraDevice : protected libcamera::Loggable
{
public:
static std::shared_ptr<CameraDevice> create(unsigned int id,
static std::unique_ptr<CameraDevice> create(unsigned int id,
const std::shared_ptr<libcamera::Camera> &cam);
~CameraDevice();

View file

@ -36,8 +36,6 @@ CameraHalManager::CameraHalManager()
CameraHalManager::~CameraHalManager()
{
cameras_.clear();
if (cameraManager_) {
cameraManager_->stop();
delete cameraManager_;
@ -125,7 +123,7 @@ void CameraHalManager::cameraAdded(std::shared_ptr<Camera> cam)
}
/* Create a CameraDevice instance to wrap the libcamera Camera. */
std::shared_ptr<CameraDevice> camera = CameraDevice::create(id, std::move(cam));
std::unique_ptr<CameraDevice> camera = CameraDevice::create(id, std::move(cam));
int ret = camera->initialize();
if (ret) {
LOG(HAL, Error) << "Failed to initialize camera: " << cam->id();
@ -155,7 +153,7 @@ void CameraHalManager::cameraRemoved(std::shared_ptr<Camera> cam)
MutexLocker locker(mutex_);
auto iter = std::find_if(cameras_.begin(), cameras_.end(),
[&cam](std::shared_ptr<CameraDevice> &camera) {
[&cam](const std::unique_ptr<CameraDevice> &camera) {
return cam == camera->camera();
});
if (iter == cameras_.end())
@ -192,7 +190,7 @@ int32_t CameraHalManager::cameraLocation(const Camera *cam)
CameraDevice *CameraHalManager::cameraDeviceFromHalId(unsigned int id)
{
auto iter = std::find_if(cameras_.begin(), cameras_.end(),
[id](std::shared_ptr<CameraDevice> &camera) {
[id](const std::unique_ptr<CameraDevice> &camera) {
return camera->id() == id;
});
if (iter == cameras_.end())
@ -244,7 +242,7 @@ void CameraHalManager::setCallbacks(const camera_module_callbacks_t *callbacks)
* Internal cameras are already assumed to be present at module load
* time by the Android framework.
*/
for (std::shared_ptr<CameraDevice> &camera : cameras_) {
for (const std::unique_ptr<CameraDevice> &camera : cameras_) {
unsigned int id = camera->id();
if (id >= firstExternalCameraId_)
callbacks_->camera_device_status_change(callbacks_, id,

View file

@ -52,7 +52,7 @@ private:
libcamera::CameraManager *cameraManager_;
const camera_module_callbacks_t *callbacks_;
std::vector<std::shared_ptr<CameraDevice>> cameras_;
std::vector<std::unique_ptr<CameraDevice>> cameras_;
std::map<std::string, unsigned int> cameraIdsMap_;
Mutex mutex_;