summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/rkisp1
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-09-25 00:18:43 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-09-30 14:24:42 +0200
commit038e2fd66cd07354e2527e7e9aecd8a849f08799 (patch)
treee9d135aaeada84f88dc102656e0f5f830dda7b2d /src/libcamera/pipeline/rkisp1
parentc2dfdecd056247808a7cb3175df0086cac78ccb2 (diff)
libcamera: pipeline: rkisp1: Move start and stop of path to RkISP1Path
Move the start and stop of a path to RkISP1Path. This allows the importing of buffers to be moved closer the path start/stop simplifying the code. Also by adding a simple running tracker the error logic in PipelineHandlerRkISP1 can be simplified as stop() can always be called. This also removes all external users of RkISP1Path::video_ so it can be made private. 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.cpp53
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1_path.cpp43
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1_path.h8
3 files changed, 51 insertions, 53 deletions
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 71d10005..1eeff4ac 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -770,20 +770,6 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
data->selfPathStream_.configuration().bufferCount,
});
- if (data->mainPathActive_) {
- ret = mainPath_.video_->importBuffers(
- data->mainPathStream_.configuration().bufferCount);
- if (ret < 0)
- goto error;
- }
-
- if (data->selfPathActive_) {
- ret = selfPath_.video_->importBuffers(
- data->selfPathStream_.configuration().bufferCount);
- if (ret < 0)
- goto error;
- }
-
ret = param_->allocateBuffers(maxCount, &paramBuffers_);
if (ret < 0)
goto error;
@@ -813,8 +799,6 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
error:
paramBuffers_.clear();
statBuffers_.clear();
- mainPath_.video_->releaseBuffers();
- selfPath_.video_->releaseBuffers();
return ret;
}
@@ -845,12 +829,6 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)
if (stat_->releaseBuffers())
LOG(RkISP1, Error) << "Failed to release stat buffers";
- if (mainPath_.video_->releaseBuffers())
- LOG(RkISP1, Error) << "Failed to release main path buffers";
-
- if (selfPath_.video_->releaseBuffers())
- LOG(RkISP1, Error) << "Failed to release self path buffers";
-
return 0;
}
@@ -896,15 +874,12 @@ int PipelineHandlerRkISP1::start(Camera *camera)
std::map<unsigned int, IPAStream> streamConfig;
if (data->mainPathActive_) {
- ret = mainPath_.video_->streamOn();
+ ret = mainPath_.start();
if (ret) {
param_->streamOff();
stat_->streamOff();
data->ipa_->stop();
freeBuffers(camera);
-
- LOG(RkISP1, Error)
- << "Failed to start main path " << camera->id();
return ret;
}
@@ -915,18 +890,13 @@ int PipelineHandlerRkISP1::start(Camera *camera)
}
if (data->selfPathActive_) {
- ret = selfPath_.video_->streamOn();
+ ret = selfPath_.start();
if (ret) {
- if (data->mainPathActive_)
- mainPath_.video_->streamOff();
-
+ mainPath_.stop();
param_->streamOff();
stat_->streamOff();
data->ipa_->stop();
freeBuffers(camera);
-
- LOG(RkISP1, Error)
- << "Failed to start self path " << camera->id();
return ret;
}
@@ -963,21 +933,8 @@ void PipelineHandlerRkISP1::stop(Camera *camera)
RkISP1CameraData *data = cameraData(camera);
int ret;
- if (data->selfPathActive_) {
- ret = selfPath_.video_->streamOff();
- if (ret)
- LOG(RkISP1, Warning)
- << "Failed to stop self path for "
- << camera->id();
- }
-
- if (data->mainPathActive_) {
- ret = mainPath_.video_->streamOff();
- if (ret)
- LOG(RkISP1, Warning)
- << "Failed to stop main path for "
- << camera->id();
- }
+ selfPath_.stop();
+ mainPath_.stop();
ret = stat_->streamOff();
if (ret)
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
index 96c18b35..355925eb 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
@@ -20,9 +20,9 @@ LOG_DECLARE_CATEGORY(RkISP1)
RkISP1Path::RkISP1Path(const char *name, const Span<const PixelFormat> &formats,
const Size &minResolution, const Size &maxResolution)
- : video_(nullptr), name_(name), formats_(formats),
+ : name_(name), running_(false), formats_(formats),
minResolution_(minResolution), maxResolution_(maxResolution),
- resizer_(nullptr)
+ resizer_(nullptr), video_(nullptr)
{
}
@@ -149,6 +149,45 @@ int RkISP1Path::configure(const StreamConfiguration &config,
return 0;
}
+int RkISP1Path::start()
+{
+ int ret;
+
+ if (running_)
+ return -EBUSY;
+
+ /* \todo Make buffer count user configurable. */
+ ret = video_->importBuffers(RKISP1_BUFFER_COUNT);
+ if (ret)
+ return ret;
+
+ ret = video_->streamOn();
+ if (ret) {
+ LOG(RkISP1, Error)
+ << "Failed to start " << name_ << " path";
+
+ video_->releaseBuffers();
+ return ret;
+ }
+
+ running_ = true;
+
+ return 0;
+}
+
+void RkISP1Path::stop()
+{
+ if (!running_)
+ return;
+
+ if (video_->streamOff())
+ LOG(RkISP1, Warning) << "Failed to stop " << name_ << " path";
+
+ video_->releaseBuffers();
+
+ running_ = false;
+}
+
namespace {
constexpr Size RKISP1_RSZ_MP_SRC_MIN{ 32, 16 };
constexpr Size RKISP1_RSZ_MP_SRC_MAX{ 4416, 3312 };
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
index 377772ca..e2eb1be9 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
@@ -45,22 +45,24 @@ public:
return video_->exportBuffers(bufferCount, buffers);
}
+ int start();
+ void stop();
+
int queueBuffer(FrameBuffer *buffer) { return video_->queueBuffer(buffer); }
Signal<FrameBuffer *> &bufferReady() { return video_->bufferReady; }
- /* \todo Make video private. */
- V4L2VideoDevice *video_;
-
private:
static constexpr unsigned int RKISP1_BUFFER_COUNT = 4;
const char *name_;
+ bool running_;
const Span<const PixelFormat> formats_;
const Size minResolution_;
const Size maxResolution_;
V4L2Subdevice *resizer_;
+ V4L2VideoDevice *video_;
};
class RkISP1MainPath : public RkISP1Path