summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/ipu3/ipu3.cpp
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-04-14 01:48:57 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-05-17 20:35:27 +0200
commitd6a88607479937a9941f1ea2c82a7e5c66b20647 (patch)
treeeff0e2193ef12e2b1e058943fb10d8a171c70e56 /src/libcamera/pipeline/ipu3/ipu3.cpp
parent2e22ee4310d47bc76c9db0da1b6b48f12f032743 (diff)
libcamera: pipeline_handler: Keep track of MediaDevice
Instead of requiring each pipeline handle implementation to keep track of calling release() on its media devices upon deletion, keep track of them in the base class. Add a helper that pipeline handlers shall use to acquire a media device instead of directly interacting with the DeviceEnumerator. This also means that pipeline handler implementations do no need to keep a shared_ptr<> reference to the media devices they store locally as the PipelineHandler base class will keep a shared_ptr<> reference to all media devices consumed for the entire lifetime of the pipeline handler implementation. Centrally keeping track of media devices will also be beneficial to implement exclusive access to pipelines across processes. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/pipeline/ipu3/ipu3.cpp')
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp30
1 files changed, 7 insertions, 23 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 8a6a0e27..75a70e66 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -149,7 +149,6 @@ class PipelineHandlerIPU3 : public PipelineHandler
{
public:
PipelineHandlerIPU3(CameraManager *manager);
- ~PipelineHandlerIPU3();
CameraConfiguration
streamConfiguration(Camera *camera,
@@ -201,8 +200,8 @@ private:
ImgUDevice imgu0_;
ImgUDevice imgu1_;
- std::shared_ptr<MediaDevice> cio2MediaDev_;
- std::shared_ptr<MediaDevice> imguMediaDev_;
+ MediaDevice *cio2MediaDev_;
+ MediaDevice *imguMediaDev_;
};
PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
@@ -210,15 +209,6 @@ PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
{
}
-PipelineHandlerIPU3::~PipelineHandlerIPU3()
-{
- if (cio2MediaDev_)
- cio2MediaDev_->release();
-
- if (imguMediaDev_)
- imguMediaDev_->release();
-}
-
CameraConfiguration
PipelineHandlerIPU3::streamConfiguration(Camera *camera,
const std::vector<StreamUsage> &usages)
@@ -614,20 +604,14 @@ bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
imgu_dm.add("ipu3-imgu 1 viewfinder");
imgu_dm.add("ipu3-imgu 1 3a stat");
- cio2MediaDev_ = enumerator->search(cio2_dm);
+ cio2MediaDev_ = acquireMediaDevice(enumerator, cio2_dm);
if (!cio2MediaDev_)
return false;
- if (!cio2MediaDev_->acquire())
- return false;
-
- imguMediaDev_ = enumerator->search(imgu_dm);
+ imguMediaDev_ = acquireMediaDevice(enumerator, imgu_dm);
if (!imguMediaDev_)
return false;
- if (!imguMediaDev_->acquire())
- return false;
-
/*
* Disable all links that are enabled by default on CIO2, as camera
* creation enables all valid links it finds.
@@ -682,11 +666,11 @@ int PipelineHandlerIPU3::registerCameras()
{
int ret;
- ret = imgu0_.init(imguMediaDev_.get(), 0);
+ ret = imgu0_.init(imguMediaDev_, 0);
if (ret)
return ret;
- ret = imgu1_.init(imguMediaDev_.get(), 1);
+ ret = imgu1_.init(imguMediaDev_, 1);
if (ret)
return ret;
@@ -705,7 +689,7 @@ int PipelineHandlerIPU3::registerCameras()
};
CIO2Device *cio2 = &data->cio2_;
- ret = cio2->init(cio2MediaDev_.get(), id);
+ ret = cio2->init(cio2MediaDev_, id);
if (ret)
continue;