summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libcamera/ipa/raspberrypi.h1
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp53
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp13
3 files changed, 47 insertions, 20 deletions
diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index 86c97ffa..01fe5abc 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -22,6 +22,7 @@ enum ConfigParameters {
IPA_CONFIG_SENSOR = (1 << 2),
IPA_CONFIG_DROP_FRAMES = (1 << 3),
IPA_CONFIG_FAILED = (1 << 4),
+ IPA_CONFIG_STARTUP = (1 << 5),
};
enum Operations {
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index d40e9f09..60cfdc27 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -78,8 +78,7 @@ public:
}
int init(const IPASettings &settings) override;
- int start([[maybe_unused]] const IPAOperationData &data,
- [[maybe_unused]] IPAOperationData *result) override { return 0; }
+ int start(const IPAOperationData &data, IPAOperationData *result) override;
void stop() override {}
void configure(const CameraSensorInfo &sensorInfo,
@@ -154,6 +153,36 @@ int IPARPi::init(const IPASettings &settings)
return 0;
}
+int IPARPi::start(const IPAOperationData &data, IPAOperationData *result)
+{
+ RPiController::Metadata metadata;
+
+ ASSERT(result);
+ result->operation = 0;
+ if (data.operation & RPi::IPA_CONFIG_STARTUP) {
+ /* We have been given some controls to action before start. */
+ queueRequest(data.controls[0]);
+ }
+
+ controller_.SwitchMode(mode_, &metadata);
+
+ /* SwitchMode may supply updated exposure/gain values to use. */
+ AgcStatus agcStatus;
+ agcStatus.shutter_time = 0.0;
+ agcStatus.analogue_gain = 0.0;
+
+ /* SwitchMode may supply updated exposure/gain values to use. */
+ metadata.Get("agc.status", agcStatus);
+ if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {
+ ControlList ctrls(unicamCtrls_);
+ applyAGC(&agcStatus, ctrls);
+ result->controls.emplace_back(ctrls);
+ result->operation |= RPi::IPA_CONFIG_SENSOR;
+ }
+
+ return 0;
+}
+
void IPARPi::setMode(const CameraSensorInfo &sensorInfo)
{
mode_.bitdepth = sensorInfo.bitsPerPixel;
@@ -295,11 +324,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
result->data.push_back(dropFrame);
result->operation |= RPi::IPA_CONFIG_DROP_FRAMES;
- /* These zero values mean not program anything (unless overwritten). */
- struct AgcStatus agcStatus;
- agcStatus.shutter_time = 0.0;
- agcStatus.analogue_gain = 0.0;
-
if (!controllerInit_) {
/* Load the tuning file for this sensor. */
controller_.Read(tuningFile_.c_str());
@@ -307,20 +331,13 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
controllerInit_ = true;
/* Supply initial values for gain and exposure. */
+ ControlList ctrls(unicamCtrls_);
+ AgcStatus agcStatus;
agcStatus.shutter_time = DefaultExposureTime;
agcStatus.analogue_gain = DefaultAnalogueGain;
- }
-
- RPiController::Metadata metadata;
- controller_.SwitchMode(mode_, &metadata);
-
- /* SwitchMode may supply updated exposure/gain values to use. */
- metadata.Get("agc.status", agcStatus);
- if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {
- ControlList ctrls(unicamCtrls_);
applyAGC(&agcStatus, ctrls);
- result->controls.push_back(ctrls);
+ result->controls.emplace_back(ctrls);
result->operation |= RPi::IPA_CONFIG_SENSOR;
}
@@ -834,7 +851,7 @@ void IPARPi::processStats(unsigned int bufferId)
IPAOperationData op;
op.operation = RPi::IPA_ACTION_V4L2_SET_STAGGERED;
- op.controls.push_back(ctrls);
+ op.controls.emplace_back(ctrls);
queueFrameAction.emit(0, op);
}
}
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 791ff199..2ec1f6e7 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -754,8 +754,10 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont
/* Start the IPA. */
IPAOperationData ipaData = {};
IPAOperationData result = {};
- if (controls)
+ if (controls) {
+ ipaData.operation = RPi::IPA_CONFIG_STARTUP;
ipaData.controls.emplace_back(*controls);
+ }
ret = data->ipa_->start(ipaData, &result);
if (ret) {
LOG(RPI, Error)
@@ -764,6 +766,14 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont
return ret;
}
+ /* Apply any gain/exposure settings that the IPA may have passed back. */
+ ASSERT(data->staggeredCtrl_);
+ if (result.operation & RPi::IPA_CONFIG_SENSOR) {
+ const ControlList &ctrls = result.controls[0];
+ if (!data->staggeredCtrl_.set(ctrls))
+ LOG(RPI, Error) << "V4L2 staggered set failed";
+ }
+
/*
* IPA configure may have changed the sensor flips - hence the bayer
* order. Get the sensor format and set the ISP input now.
@@ -784,7 +794,6 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont
* starting. First check that the staggered ctrl has been initialised
* by configure().
*/
- ASSERT(data->staggeredCtrl_);
data->staggeredCtrl_.reset();
data->staggeredCtrl_.write();
data->expectedSequence_ = 0;