summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-05-01 03:22:46 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-07-17 02:13:50 +0300
commit2c0fad508cf64624b22cca74e623eb2a2f2c29ef (patch)
treecaf97c82f85c20f2a5d8392414cea11f112d6cec
parent89682ea1c433f84f004ba4fe852ce56458e593a2 (diff)
libcamera: pipeline: raspberrypi: Start IPA when starting camera
The IPA is meant to be started when starting the camera, and stopped when stopping it. It was so far started early in order to handle the IPAInterface::processEvent() call related to lens shading table allocation before IPAInterface::configure() to pass the table to the IPA. Now that the lens shading table is passed through configure(), starting the IPA early isn't needed anymore. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index c309ba42..718749af 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -302,10 +302,6 @@ public:
vcsm_.free(lsTable_);
lsTable_ = nullptr;
}
-
- /* Stop the IPA proxy thread. */
- if (ipa_)
- ipa_->stop();
}
void frameStarted(uint32_t sequence);
@@ -802,6 +798,16 @@ int PipelineHandlerRPi::start(Camera *camera)
ret = queueAllBuffers(camera);
if (ret) {
LOG(RPI, Error) << "Failed to queue buffers";
+ stop(camera);
+ return ret;
+ }
+
+ /* Start the IPA. */
+ ret = data->ipa_->start();
+ if (ret) {
+ LOG(RPI, Error)
+ << "Failed to start IPA for " << camera->name();
+ stop(camera);
return ret;
}
@@ -812,8 +818,10 @@ int PipelineHandlerRPi::start(Camera *camera)
V4L2DeviceFormat sensorFormat;
data->unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
ret = data->isp_[Isp::Input].dev()->setFormat(&sensorFormat);
- if (ret)
+ if (ret) {
+ stop(camera);
return ret;
+ }
/* Enable SOF event generation. */
data->unicam_[Unicam::Image].dev()->setFrameStartEnabled(true);
@@ -857,6 +865,9 @@ void PipelineHandlerRPi::stop(Camera *camera)
data->bayerQueue_ = std::queue<FrameBuffer *>{};
data->embeddedQueue_ = std::queue<FrameBuffer *>{};
+ /* Stop the IPA. */
+ data->ipa_->stop();
+
freeBuffers(camera);
}
@@ -1106,15 +1117,7 @@ int RPiCameraData::loadIPA()
.configurationFile = ipa_->configurationFile(sensor_->model() + ".json")
};
- ipa_->init(settings);
-
- /*
- * Startup the IPA thread now. Without this call, none of the IPA API
- * functions will run.
- *
- * It only gets stopped in the class destructor.
- */
- return ipa_->start();
+ return ipa_->init(settings);
}
int RPiCameraData::configureIPA()