ipa: rkisp1: Return error from IPA's configure method if it fails

The IPA of rkisp1 relies on some of the camera's controls.
Therefore it can't work if those controls are not given.
Return -EINVAL from 'configure' in that case.
Also return error from the pipeline's 'configure' method
if the IPA configure fails.

Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Dafna Hirschfeld 2021-03-09 07:38:28 +01:00 committed by Laurent Pinchart
parent 3b338aa5e7
commit f4fe8cf588
3 changed files with 16 additions and 12 deletions

View file

@ -31,7 +31,7 @@ interface IPARkISP1Interface {
configure(CameraSensorInfo sensorInfo, configure(CameraSensorInfo sensorInfo,
map<uint32, IPAStream> streamConfig, map<uint32, IPAStream> streamConfig,
map<uint32, ControlInfoMap> entityControls) => (); map<uint32, ControlInfoMap> entityControls) => (int32 ret);
mapBuffers(array<IPABuffer> buffers); mapBuffers(array<IPABuffer> buffers);
unmapBuffers(array<uint32> ids); unmapBuffers(array<uint32> ids);

View file

@ -38,9 +38,9 @@ public:
int start() override { return 0; } int start() override { return 0; }
void stop() override {} void stop() override {}
void configure(const CameraSensorInfo &info, int configure(const CameraSensorInfo &info,
const std::map<uint32_t, IPAStream> &streamConfig, const std::map<uint32_t, IPAStream> &streamConfig,
const std::map<uint32_t, ControlInfoMap> &entityControls) override; const std::map<uint32_t, ControlInfoMap> &entityControls) override;
void mapBuffers(const std::vector<IPABuffer> &buffers) override; void mapBuffers(const std::vector<IPABuffer> &buffers) override;
void unmapBuffers(const std::vector<unsigned int> &ids) override; void unmapBuffers(const std::vector<unsigned int> &ids) override;
void processEvent(const ipa::rkisp1::RkISP1Event &event) override; void processEvent(const ipa::rkisp1::RkISP1Event &event) override;
@ -75,25 +75,25 @@ private:
* assemble one. Make sure the reported sensor information are relevant * assemble one. Make sure the reported sensor information are relevant
* before accessing them. * before accessing them.
*/ */
void IPARkISP1::configure([[maybe_unused]] const CameraSensorInfo &info, int IPARkISP1::configure([[maybe_unused]] const CameraSensorInfo &info,
[[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig, [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig,
const std::map<uint32_t, ControlInfoMap> &entityControls) const std::map<uint32_t, ControlInfoMap> &entityControls)
{ {
if (entityControls.empty()) if (entityControls.empty())
return; return -EINVAL;
ctrls_ = entityControls.at(0); ctrls_ = entityControls.at(0);
const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE); const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
if (itExp == ctrls_.end()) { if (itExp == ctrls_.end()) {
LOG(IPARkISP1, Error) << "Can't find exposure control"; LOG(IPARkISP1, Error) << "Can't find exposure control";
return; return -EINVAL;
} }
const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN); const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
if (itGain == ctrls_.end()) { if (itGain == ctrls_.end()) {
LOG(IPARkISP1, Error) << "Can't find gain control"; LOG(IPARkISP1, Error) << "Can't find gain control";
return; return -EINVAL;
} }
autoExposure_ = true; autoExposure_ = true;
@ -111,6 +111,7 @@ void IPARkISP1::configure([[maybe_unused]] const CameraSensorInfo &info,
<< " Gain: " << minGain_ << "-" << maxGain_; << " Gain: " << minGain_ << "-" << maxGain_;
setControls(0); setControls(0);
return 0;
} }
void IPARkISP1::mapBuffers(const std::vector<IPABuffer> &buffers) void IPARkISP1::mapBuffers(const std::vector<IPABuffer> &buffers)

View file

@ -653,8 +653,11 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
std::map<uint32_t, ControlInfoMap> entityControls; std::map<uint32_t, ControlInfoMap> entityControls;
entityControls.emplace(0, data->sensor_->controls()); entityControls.emplace(0, data->sensor_->controls());
data->ipa_->configure(sensorInfo, streamConfig, entityControls); ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls);
if (ret) {
LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")";
return ret;
}
return 0; return 0;
} }