summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2020-11-27 14:56:12 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-12-07 14:03:38 +0000
commitee477efde8e49e26cc02437fd50a45cd439ee65e (patch)
treec31d8625f524aacc831251a6cb06863f8ab4193f
parent8fed613562677dd2402b6f67f0090fcba3301f1f (diff)
pipeline: ipa: raspberrypi: Handle failures during IPA configuration
If the IPA fails during configuration, return an error flag to the pipeline handler and fail the use case gracefully. At present, the IPA configuration can fail for the following reasons: - The sensor is not recognised, and fails to open a CamHelper object. - The pipeline handler did not pass in controls for the ISP and sensor. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--include/libcamera/ipa/raspberrypi.h1
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp12
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp5
3 files changed, 17 insertions, 1 deletions
diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index 2b55dbfc..86c97ffa 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -21,6 +21,7 @@ enum ConfigParameters {
IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
IPA_CONFIG_SENSOR = (1 << 2),
IPA_CONFIG_DROP_FRAMES = (1 << 3),
+ IPA_CONFIG_FAILED = (1 << 4),
};
enum Operations {
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 29d48b1b..5824d3b5 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -197,8 +197,11 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
const IPAOperationData &ipaConfig,
IPAOperationData *result)
{
- if (entityControls.empty())
+ if (entityControls.size() != 2) {
+ LOG(IPARPI, Error) << "No ISP or sensor controls found.";
+ result->operation = RPi::IPA_CONFIG_FAILED;
return;
+ }
result->operation = 0;
@@ -217,6 +220,13 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
if (!helper_) {
helper_ = std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
+ if (!helper_) {
+ LOG(IPARPI, Error) << "Could not create camera helper for "
+ << cameraName;
+ result->operation = RPi::IPA_CONFIG_FAILED;
+ return;
+ }
+
/*
* Pass out the sensor config to the pipeline handler in order
* to setup the staggered writer class.
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 6fcdf557..76252806 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -1194,6 +1194,11 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)
ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig,
&result);
+ if (result.operation & RPi::IPA_CONFIG_FAILED) {
+ LOG(RPI, Error) << "IPA configuration failed!";
+ return -EPIPE;
+ }
+
unsigned int resultIdx = 0;
if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
/*