ipa: rkisp1: Replace event-based ops with dedicated functions
The IPARkISP1Interface currently uses event-type based structures in order to communicate with the pipeline-handler (and vice-versa). Replace the event based structures with dedicated functions associated to each operation. The translated naming scheme of operations to dedicated functions: ActionV4L2Set => setSensorControls ActionParamFilled => paramsBufferReady ActionMetadata => metdataReady EventSignalStatBuffer => processStatsBuffer() EventQueueRequest => queueRequest() The lexical of IPARkISP1::metadataReady() will now conflict with the metadataReady Signal being introduced in this patch as part of the interface change. Hence, rename IPARkISP1::metadataReady() to IPARkISP1::prepareReady() to prevent the conflict. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Tested-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
parent
db269cc4b3
commit
c7d4599565
3 changed files with 59 additions and 131 deletions
|
@ -8,28 +8,6 @@ module ipa.rkisp1;
|
||||||
|
|
||||||
import "include/libcamera/ipa/core.mojom";
|
import "include/libcamera/ipa/core.mojom";
|
||||||
|
|
||||||
enum RkISP1Operations {
|
|
||||||
ActionV4L2Set = 1,
|
|
||||||
ActionParamFilled = 2,
|
|
||||||
ActionMetadata = 3,
|
|
||||||
EventSignalStatBuffer = 4,
|
|
||||||
EventQueueRequest = 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RkISP1Event {
|
|
||||||
RkISP1Operations op;
|
|
||||||
uint32 frame;
|
|
||||||
uint32 bufferId;
|
|
||||||
libcamera.ControlList controls;
|
|
||||||
libcamera.ControlList sensorControls;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RkISP1Action {
|
|
||||||
RkISP1Operations op;
|
|
||||||
libcamera.ControlList controls;
|
|
||||||
libcamera.ControlList sensorControls;
|
|
||||||
};
|
|
||||||
|
|
||||||
interface IPARkISP1Interface {
|
interface IPARkISP1Interface {
|
||||||
init(libcamera.IPASettings settings,
|
init(libcamera.IPASettings settings,
|
||||||
uint32 hwRevision)
|
uint32 hwRevision)
|
||||||
|
@ -45,9 +23,14 @@ interface IPARkISP1Interface {
|
||||||
mapBuffers(array<libcamera.IPABuffer> buffers);
|
mapBuffers(array<libcamera.IPABuffer> buffers);
|
||||||
unmapBuffers(array<uint32> ids);
|
unmapBuffers(array<uint32> ids);
|
||||||
|
|
||||||
[async] processEvent(RkISP1Event ev);
|
[async] queueRequest(uint32 frame, uint32 bufferId,
|
||||||
|
libcamera.ControlList reqControls);
|
||||||
|
[async] processStatsBuffer(uint32 frame, uint32 bufferId,
|
||||||
|
libcamera.ControlList sensorControls);
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IPARkISP1EventInterface {
|
interface IPARkISP1EventInterface {
|
||||||
queueFrameAction(uint32 frame, RkISP1Action action);
|
paramsBufferReady(uint32 frame);
|
||||||
|
setSensorControls(uint32 frame, libcamera.ControlList sensorControls);
|
||||||
|
metadataReady(uint32 frame, libcamera.ControlList metadata);
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,16 +51,14 @@ public:
|
||||||
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 RkISP1Event &event) override;
|
|
||||||
|
|
||||||
|
void queueRequest(const uint32_t frame, const uint32_t bufferId,
|
||||||
|
const ControlList &controls) override;
|
||||||
|
void processStatsBuffer(const uint32_t frame, const uint32_t bufferId,
|
||||||
|
const ControlList &sensorControls) override;
|
||||||
private:
|
private:
|
||||||
void queueRequest(unsigned int frame, rkisp1_params_cfg *params,
|
|
||||||
const ControlList &controls);
|
|
||||||
void updateStatistics(unsigned int frame,
|
|
||||||
const rkisp1_stat_buffer *stats);
|
|
||||||
|
|
||||||
void setControls(unsigned int frame);
|
void setControls(unsigned int frame);
|
||||||
void metadataReady(unsigned int frame, unsigned int aeState);
|
void prepareMetadata(unsigned int frame, unsigned int aeState);
|
||||||
|
|
||||||
std::map<unsigned int, FrameBuffer> buffers_;
|
std::map<unsigned int, FrameBuffer> buffers_;
|
||||||
std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
|
std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
|
||||||
|
@ -231,60 +229,34 @@ void IPARkISP1::unmapBuffers(const std::vector<unsigned int> &ids)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPARkISP1::processEvent(const RkISP1Event &event)
|
void IPARkISP1::queueRequest(const uint32_t frame, const uint32_t bufferId,
|
||||||
|
[[maybe_unused]] const ControlList &controls)
|
||||||
{
|
{
|
||||||
switch (event.op) {
|
|
||||||
case EventSignalStatBuffer: {
|
|
||||||
unsigned int frame = event.frame;
|
|
||||||
unsigned int bufferId = event.bufferId;
|
|
||||||
|
|
||||||
const rkisp1_stat_buffer *stats =
|
|
||||||
reinterpret_cast<rkisp1_stat_buffer *>(
|
|
||||||
mappedBuffers_.at(bufferId).planes()[0].data());
|
|
||||||
|
|
||||||
context_.frameContext.sensor.exposure =
|
|
||||||
event.sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
|
|
||||||
context_.frameContext.sensor.gain =
|
|
||||||
camHelper_->gain(event.sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
|
|
||||||
|
|
||||||
updateStatistics(frame, stats);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EventQueueRequest: {
|
|
||||||
unsigned int frame = event.frame;
|
|
||||||
unsigned int bufferId = event.bufferId;
|
|
||||||
|
|
||||||
rkisp1_params_cfg *params =
|
rkisp1_params_cfg *params =
|
||||||
reinterpret_cast<rkisp1_params_cfg *>(
|
reinterpret_cast<rkisp1_params_cfg *>(
|
||||||
mappedBuffers_.at(bufferId).planes()[0].data());
|
mappedBuffers_.at(bufferId).planes()[0].data());
|
||||||
|
|
||||||
queueRequest(frame, params, event.controls);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
LOG(IPARkISP1, Error) << "Unknown event " << event.op;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IPARkISP1::queueRequest(unsigned int frame, rkisp1_params_cfg *params,
|
|
||||||
[[maybe_unused]] const ControlList &controls)
|
|
||||||
{
|
|
||||||
/* Prepare parameters buffer. */
|
/* Prepare parameters buffer. */
|
||||||
memset(params, 0, sizeof(*params));
|
memset(params, 0, sizeof(*params));
|
||||||
|
|
||||||
for (auto const &algo : algorithms_)
|
for (auto const &algo : algorithms_)
|
||||||
algo->prepare(context_, params);
|
algo->prepare(context_, params);
|
||||||
|
|
||||||
RkISP1Action op;
|
paramsBufferReady.emit(frame);
|
||||||
op.op = ActionParamFilled;
|
|
||||||
|
|
||||||
queueFrameAction.emit(frame, op);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPARkISP1::updateStatistics(unsigned int frame,
|
void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId,
|
||||||
const rkisp1_stat_buffer *stats)
|
const ControlList &sensorControls)
|
||||||
{
|
{
|
||||||
|
const rkisp1_stat_buffer *stats =
|
||||||
|
reinterpret_cast<rkisp1_stat_buffer *>(
|
||||||
|
mappedBuffers_.at(bufferId).planes()[0].data());
|
||||||
|
|
||||||
|
context_.frameContext.sensor.exposure =
|
||||||
|
sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
|
||||||
|
context_.frameContext.sensor.gain =
|
||||||
|
camHelper_->gain(sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
|
||||||
|
|
||||||
unsigned int aeState = 0;
|
unsigned int aeState = 0;
|
||||||
|
|
||||||
for (auto const &algo : algorithms_)
|
for (auto const &algo : algorithms_)
|
||||||
|
@ -292,37 +264,29 @@ void IPARkISP1::updateStatistics(unsigned int frame,
|
||||||
|
|
||||||
setControls(frame);
|
setControls(frame);
|
||||||
|
|
||||||
metadataReady(frame, aeState);
|
prepareMetadata(frame, aeState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPARkISP1::setControls(unsigned int frame)
|
void IPARkISP1::setControls(unsigned int frame)
|
||||||
{
|
{
|
||||||
RkISP1Action op;
|
|
||||||
op.op = ActionV4L2Set;
|
|
||||||
|
|
||||||
uint32_t exposure = context_.frameContext.agc.exposure;
|
uint32_t exposure = context_.frameContext.agc.exposure;
|
||||||
uint32_t gain = camHelper_->gainCode(context_.frameContext.agc.gain);
|
uint32_t gain = camHelper_->gainCode(context_.frameContext.agc.gain);
|
||||||
|
|
||||||
ControlList ctrls(ctrls_);
|
ControlList ctrls(ctrls_);
|
||||||
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));
|
||||||
op.sensorControls = ctrls;
|
|
||||||
|
|
||||||
queueFrameAction.emit(frame, op);
|
setSensorControls.emit(frame, ctrls);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPARkISP1::metadataReady(unsigned int frame, unsigned int aeState)
|
void IPARkISP1::prepareMetadata(unsigned int frame, unsigned int aeState)
|
||||||
{
|
{
|
||||||
ControlList ctrls(controls::controls);
|
ControlList ctrls(controls::controls);
|
||||||
|
|
||||||
if (aeState)
|
if (aeState)
|
||||||
ctrls.set(controls::AeLocked, aeState == 2);
|
ctrls.set(controls::AeLocked, aeState == 2);
|
||||||
|
|
||||||
RkISP1Action op;
|
metadataReady.emit(frame, ctrls);
|
||||||
op.op = ActionMetadata;
|
|
||||||
op.controls = ctrls;
|
|
||||||
|
|
||||||
queueFrameAction.emit(frame, op);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace ipa::rkisp1 */
|
} /* namespace ipa::rkisp1 */
|
||||||
|
|
|
@ -104,8 +104,9 @@ public:
|
||||||
std::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;
|
std::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void queueFrameAction(unsigned int frame,
|
void paramFilled(unsigned int frame);
|
||||||
const ipa::rkisp1::RkISP1Action &action);
|
void setSensorControls(unsigned int frame,
|
||||||
|
const ControlList &sensorControls);
|
||||||
|
|
||||||
void metadataReady(unsigned int frame, const ControlList &metadata);
|
void metadataReady(unsigned int frame, const ControlList &metadata);
|
||||||
};
|
};
|
||||||
|
@ -316,8 +317,9 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
|
||||||
if (!ipa_)
|
if (!ipa_)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
ipa_->queueFrameAction.connect(this,
|
ipa_->setSensorControls.connect(this, &RkISP1CameraData::setSensorControls);
|
||||||
&RkISP1CameraData::queueFrameAction);
|
ipa_->paramsBufferReady.connect(this, &RkISP1CameraData::paramFilled);
|
||||||
|
ipa_->metadataReady.connect(this, &RkISP1CameraData::metadataReady);
|
||||||
|
|
||||||
int ret = ipa_->init(IPASettings{ "", sensor_->model() }, hwRevision);
|
int ret = ipa_->init(IPASettings{ "", sensor_->model() }, hwRevision);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -328,20 +330,12 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RkISP1CameraData::queueFrameAction(unsigned int frame,
|
void RkISP1CameraData::paramFilled(unsigned int frame)
|
||||||
const ipa::rkisp1::RkISP1Action &action)
|
|
||||||
{
|
{
|
||||||
switch (action.op) {
|
|
||||||
case ipa::rkisp1::ActionV4L2Set: {
|
|
||||||
const ControlList &controls = action.sensorControls;
|
|
||||||
delayedCtrls_->push(controls);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ipa::rkisp1::ActionParamFilled: {
|
|
||||||
PipelineHandlerRkISP1 *pipe = RkISP1CameraData::pipe();
|
PipelineHandlerRkISP1 *pipe = RkISP1CameraData::pipe();
|
||||||
RkISP1FrameInfo *info = frameInfo_.find(frame);
|
RkISP1FrameInfo *info = frameInfo_.find(frame);
|
||||||
if (!info)
|
if (!info)
|
||||||
break;
|
return;
|
||||||
|
|
||||||
pipe->param_->queueBuffer(info->paramBuffer);
|
pipe->param_->queueBuffer(info->paramBuffer);
|
||||||
pipe->stat_->queueBuffer(info->statBuffer);
|
pipe->stat_->queueBuffer(info->statBuffer);
|
||||||
|
@ -351,16 +345,12 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame,
|
||||||
|
|
||||||
if (info->selfPathBuffer)
|
if (info->selfPathBuffer)
|
||||||
selfPath_->queueBuffer(info->selfPathBuffer);
|
selfPath_->queueBuffer(info->selfPathBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,
|
||||||
}
|
const ControlList &sensorControls)
|
||||||
case ipa::rkisp1::ActionMetadata:
|
{
|
||||||
metadataReady(frame, action.controls);
|
delayedCtrls_->push(sensorControls);
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG(RkISP1, Error) << "Unknown action " << action.op;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata)
|
void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata)
|
||||||
|
@ -865,13 +855,8 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
|
||||||
if (!info)
|
if (!info)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
ipa::rkisp1::RkISP1Event ev;
|
data->ipa_->queueRequest(data->frame_, info->paramBuffer->cookie(),
|
||||||
ev.op = ipa::rkisp1::EventQueueRequest;
|
request->controls());
|
||||||
ev.frame = data->frame_;
|
|
||||||
ev.bufferId = info->paramBuffer->cookie();
|
|
||||||
ev.controls = request->controls();
|
|
||||||
data->ipa_->processEvent(ev);
|
|
||||||
|
|
||||||
data->frame_++;
|
data->frame_++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1120,12 +1105,8 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
|
||||||
if (data->frame_ <= buffer->metadata().sequence)
|
if (data->frame_ <= buffer->metadata().sequence)
|
||||||
data->frame_ = buffer->metadata().sequence + 1;
|
data->frame_ = buffer->metadata().sequence + 1;
|
||||||
|
|
||||||
ipa::rkisp1::RkISP1Event ev;
|
data->ipa_->processStatsBuffer(info->frame, info->statBuffer->cookie(),
|
||||||
ev.op = ipa::rkisp1::EventSignalStatBuffer;
|
data->delayedCtrls_->get(buffer->metadata().sequence));
|
||||||
ev.frame = info->frame;
|
|
||||||
ev.bufferId = info->statBuffer->cookie();
|
|
||||||
ev.sensorControls = data->delayedCtrls_->get(buffer->metadata().sequence);
|
|
||||||
data->ipa_->processEvent(ev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1)
|
REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue