ipa: rkisp1: Use IPAConfig in IPA::configure()
The RkISP1 implementation of IPA::configure() still uses the legacy interface where sensor controls (and eventually lens controls) are passed from the pipeline handler to the IPA in a map. Since the introduction of mojom-based IPA interface definition, it is possible to define custom data types and use them in the interface definition between the pipeline handler and the IPA. Align the RkISP1 IPA::configure() implementation with the one in the IPU3 IPA module by using a custom data type instead of relying on a map to pass controls to the IPA. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
29d6d0e93b
commit
855228f7d5
3 changed files with 24 additions and 24 deletions
|
@ -8,6 +8,11 @@ module ipa.rkisp1;
|
||||||
|
|
||||||
import "include/libcamera/ipa/core.mojom";
|
import "include/libcamera/ipa/core.mojom";
|
||||||
|
|
||||||
|
struct IPAConfigInfo {
|
||||||
|
libcamera.IPACameraSensorInfo sensorInfo;
|
||||||
|
libcamera.ControlInfoMap sensorControls;
|
||||||
|
};
|
||||||
|
|
||||||
interface IPARkISP1Interface {
|
interface IPARkISP1Interface {
|
||||||
init(libcamera.IPASettings settings,
|
init(libcamera.IPASettings settings,
|
||||||
uint32 hwRevision)
|
uint32 hwRevision)
|
||||||
|
@ -15,9 +20,8 @@ interface IPARkISP1Interface {
|
||||||
start() => (int32 ret);
|
start() => (int32 ret);
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
configure(libcamera.IPACameraSensorInfo sensorInfo,
|
configure(IPAConfigInfo configInfo,
|
||||||
map<uint32, libcamera.IPAStream> streamConfig,
|
map<uint32, libcamera.IPAStream> streamConfig)
|
||||||
map<uint32, libcamera.ControlInfoMap> entityControls)
|
|
||||||
=> (int32 ret);
|
=> (int32 ret);
|
||||||
|
|
||||||
mapBuffers(array<libcamera.IPABuffer> buffers);
|
mapBuffers(array<libcamera.IPABuffer> buffers);
|
||||||
|
|
|
@ -53,9 +53,8 @@ public:
|
||||||
int start() override;
|
int start() override;
|
||||||
void stop() override;
|
void stop() override;
|
||||||
|
|
||||||
int configure(const IPACameraSensorInfo &info,
|
int configure(const IPAConfigInfo &ipaConfig,
|
||||||
const std::map<uint32_t, IPAStream> &streamConfig,
|
const std::map<uint32_t, IPAStream> &streamConfig) 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;
|
||||||
|
|
||||||
|
@ -73,7 +72,7 @@ private:
|
||||||
std::map<unsigned int, FrameBuffer> buffers_;
|
std::map<unsigned int, FrameBuffer> buffers_;
|
||||||
std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
|
std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
|
||||||
|
|
||||||
ControlInfoMap ctrls_;
|
ControlInfoMap sensorControls_;
|
||||||
|
|
||||||
/* revision-specific data */
|
/* revision-specific data */
|
||||||
rkisp1_cif_isp_version hwRevision_;
|
rkisp1_cif_isp_version hwRevision_;
|
||||||
|
@ -205,20 +204,16 @@ void IPARkISP1::stop()
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info,
|
int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,
|
||||||
[[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)
|
|
||||||
{
|
{
|
||||||
if (entityControls.empty())
|
sensorControls_ = ipaConfig.sensorControls;
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ctrls_ = entityControls.at(0);
|
const auto itExp = sensorControls_.find(V4L2_CID_EXPOSURE);
|
||||||
|
|
||||||
const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
|
|
||||||
int32_t minExposure = itExp->second.min().get<int32_t>();
|
int32_t minExposure = itExp->second.min().get<int32_t>();
|
||||||
int32_t maxExposure = itExp->second.max().get<int32_t>();
|
int32_t maxExposure = itExp->second.max().get<int32_t>();
|
||||||
|
|
||||||
const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
|
const auto itGain = sensorControls_.find(V4L2_CID_ANALOGUE_GAIN);
|
||||||
int32_t minGain = itGain->second.min().get<int32_t>();
|
int32_t minGain = itGain->second.min().get<int32_t>();
|
||||||
int32_t maxGain = itGain->second.max().get<int32_t>();
|
int32_t maxGain = itGain->second.max().get<int32_t>();
|
||||||
|
|
||||||
|
@ -234,7 +229,8 @@ int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info,
|
||||||
/* Set the hardware revision for the algorithms. */
|
/* Set the hardware revision for the algorithms. */
|
||||||
context_.configuration.hw.revision = hwRevision_;
|
context_.configuration.hw.revision = hwRevision_;
|
||||||
|
|
||||||
const ControlInfo vBlank = ctrls_.find(V4L2_CID_VBLANK)->second;
|
const IPACameraSensorInfo &info = ipaConfig.sensorInfo;
|
||||||
|
const ControlInfo vBlank = sensorControls_.find(V4L2_CID_VBLANK)->second;
|
||||||
context_.configuration.sensor.defVBlank = vBlank.def().get<int32_t>();
|
context_.configuration.sensor.defVBlank = vBlank.def().get<int32_t>();
|
||||||
context_.configuration.sensor.size = info.outputSize;
|
context_.configuration.sensor.size = info.outputSize;
|
||||||
context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate;
|
context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate;
|
||||||
|
@ -352,7 +348,7 @@ void IPARkISP1::setControls(unsigned int frame)
|
||||||
uint32_t exposure = frameContext.agc.exposure;
|
uint32_t exposure = frameContext.agc.exposure;
|
||||||
uint32_t gain = camHelper_->gainCode(frameContext.agc.gain);
|
uint32_t gain = camHelper_->gainCode(frameContext.agc.gain);
|
||||||
|
|
||||||
ControlList ctrls(ctrls_);
|
ControlList ctrls(sensorControls_);
|
||||||
ctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure));
|
ctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure));
|
||||||
ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain));
|
ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain));
|
||||||
|
|
||||||
|
|
|
@ -715,18 +715,18 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Inform IPA of stream configuration and sensor controls. */
|
/* Inform IPA of stream configuration and sensor controls. */
|
||||||
IPACameraSensorInfo sensorInfo = {};
|
ipa::rkisp1::IPAConfigInfo ipaConfig{};
|
||||||
ret = data->sensor_->sensorInfo(&sensorInfo);
|
|
||||||
|
ret = data->sensor_->sensorInfo(&ipaConfig.sensorInfo);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/* \todo Turn this into a hard failure. */
|
/* \todo Turn this into a hard failure. */
|
||||||
LOG(RkISP1, Warning) << "Camera sensor information not available";
|
LOG(RkISP1, Warning) << "Camera sensor information not available";
|
||||||
sensorInfo = {};
|
ipaConfig.sensorInfo = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<uint32_t, ControlInfoMap> entityControls;
|
ipaConfig.sensorControls = data->sensor_->controls();
|
||||||
entityControls.emplace(0, data->sensor_->controls());
|
|
||||||
|
|
||||||
ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls);
|
ret = data->ipa_->configure(ipaConfig, streamConfig);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")";
|
LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")";
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue