[libcamera-devel] [RFCv2 5/7] libcamera: pipeline: rkisp1: Call IPA start() and stop()
Niklas Söderlund
niklas.soderlund at ragnatech.se
Thu Mar 26 17:08:17 CET 2020
Call the IPA start()/stop() functions before/after the camera is
started. This makes sure the IPA functions properly once thread
management is moved into the start/stop interface.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
src/libcamera/pipeline/rkisp1/rkisp1.cpp | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index f49b3a7f0945ac92..3287fd3a18204cbc 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -113,8 +113,8 @@ class RkISP1CameraData : public CameraData
{
public:
RkISP1CameraData(PipelineHandler *pipe)
- : CameraData(pipe), sensor_(nullptr), frame_(0),
- frameInfo_(pipe)
+ : CameraData(pipe), running_(false), sensor_(nullptr),
+ frame_(0), frameInfo_(pipe)
{
}
@@ -125,6 +125,7 @@ public:
int loadIPA();
+ bool running_;
Stream stream_;
CameraSensor *sensor_;
unsigned int frame_;
@@ -394,6 +395,9 @@ int RkISP1CameraData::loadIPA()
void RkISP1CameraData::queueFrameAction(unsigned int frame,
const IPAOperationData &action)
{
+ if (!running_)
+ return;
+
switch (action.operation) {
case RKISP1_IPA_ACTION_V4L2_SET: {
const ControlList &controls = action.controls[0];
@@ -764,10 +768,19 @@ int PipelineHandlerRkISP1::start(Camera *camera)
if (ret)
return ret;
+ ret = data->ipa_->start();
+ if (ret) {
+ freeBuffers(camera);
+ LOG(RkISP1, Error)
+ << "Failed to start IPA " << camera->name();
+ return ret;
+ }
+
data->frame_ = 0;
ret = param_->streamOn();
if (ret) {
+ data->ipa_->stop();
freeBuffers(camera);
LOG(RkISP1, Error)
<< "Failed to start parameters " << camera->name();
@@ -777,6 +790,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)
ret = stat_->streamOn();
if (ret) {
param_->streamOff();
+ data->ipa_->stop();
freeBuffers(camera);
LOG(RkISP1, Error)
<< "Failed to start statistics " << camera->name();
@@ -787,12 +801,14 @@ int PipelineHandlerRkISP1::start(Camera *camera)
if (ret) {
param_->streamOff();
stat_->streamOff();
+ data->ipa_->stop();
freeBuffers(camera);
LOG(RkISP1, Error)
<< "Failed to start camera " << camera->name();
}
+ data->running_ = true;
activeCamera_ = camera;
/* Inform IPA of stream configuration and sensor controls. */
@@ -830,6 +846,10 @@ void PipelineHandlerRkISP1::stop(Camera *camera)
LOG(RkISP1, Warning)
<< "Failed to stop parameters " << camera->name();
+ data->running_ = false;
+
+ data->ipa_->stop();
+
data->timeline_.reset();
freeBuffers(camera);
--
2.25.1
More information about the libcamera-devel
mailing list