diff options
author | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-04-14 00:43:29 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-05-17 01:33:57 +0200 |
commit | 1a813a5c3ab71a91e327d538d0df5d945e50561e (patch) | |
tree | 2ac615e5dacbb8d36a6408d59994eb7e448a45a9 /src/libcamera/pipeline/rkisp1 | |
parent | ef30be09eb0faba6739b4efee450d0c9751c121b (diff) |
libcamera: media_device: Handle media device fd in acquire() and release()
To gain better control of when a file descriptor is open to the media
device and reduce the work needed in pipeline handler implementations,
handle the file descriptor in acquire() and release().
This changes the current behavior where a file descriptor is only open
when requested by the pipeline handler to that one is always open as
long a media device is acquired. This new behavior is desired to allow
implementing exclusive access to a pipeline handler between 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/rkisp1')
-rw-r--r-- | src/libcamera/pipeline/rkisp1/rkisp1.cpp | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 134d3df4..b94d742d 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -148,10 +148,6 @@ int PipelineHandlerRkISP1::configureStreams(Camera *camera, */ const MediaPad *pad = dphy_->entity()->getPadByIndex(0); - ret = media_->open(); - if (ret < 0) - return ret; - for (MediaLink *link : pad->links()) { bool enable = link->source()->entity() == sensor->entity(); @@ -169,8 +165,6 @@ int PipelineHandlerRkISP1::configureStreams(Camera *camera, break; } - media_->close(); - if (ret < 0) return ret; @@ -352,7 +346,6 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) { const MediaPad *pad; - int ret; DeviceMatch dm("rkisp1"); dm.add("rkisp1-isp-subdev"); @@ -368,35 +361,27 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) media_->acquire(); - ret = media_->open(); - if (ret < 0) - return ret; - /* Create the V4L2 subdevices we will need. */ dphy_ = V4L2Subdevice::fromEntityName(media_.get(), "rockchip-sy-mipi-dphy"); - ret = dphy_->open(); - if (ret < 0) - goto done; + if (dphy_->open() < 0) + return false; isp_ = V4L2Subdevice::fromEntityName(media_.get(), "rkisp1-isp-subdev"); - ret = isp_->open(); - if (ret < 0) - goto done; + if (isp_->open() < 0) + return false; /* Locate and open the capture video node. */ video_ = V4L2Device::fromEntityName(media_.get(), "rkisp1_mainpath"); - ret = video_->open(); - if (ret < 0) - goto done; + if (video_->open() < 0) + return false; video_->bufferReady.connect(this, &PipelineHandlerRkISP1::bufferReady); /* Configure default links. */ - ret = initLinks(); - if (ret < 0) { + if (initLinks() < 0) { LOG(RkISP1, Error) << "Failed to setup links"; - goto done; + return false; } /* @@ -404,18 +389,13 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) * camera instance for each of them. */ pad = dphy_->entity()->getPadByIndex(0); - if (!pad) { - ret = -EINVAL; - goto done; - } + if (!pad) + return false; for (MediaLink *link : pad->links()) createCamera(link->source()->entity()); -done: - media_->close(); - - return ret == 0; + return true; } /* ----------------------------------------------------------------------------- |