summaryrefslogtreecommitdiff
path: root/src/ipa/rkisp1/rkisp1.cpp
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2022-07-21 13:13:05 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-28 05:41:12 +0300
commit05e6a1937388403a5e754352f94569ef3c4d85c9 (patch)
tree98e45537fc422b20d4358e1713c5431256bceaf0 /src/ipa/rkisp1/rkisp1.cpp
parent9f5ab89fb30c2f9da2b1b57c096c6fdf0793a68e (diff)
ipa: rkisp1: Convert to use the FCQueue
Establish a queue of FrameContexts using the new FCQueue and use it to supply the FrameContext to the algorithms. The algorithms on the RKISP1 do not use this yet themselves, but are able to do so after the introduction of this patch. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/ipa/rkisp1/rkisp1.cpp')
-rw-r--r--src/ipa/rkisp1/rkisp1.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index e6aadb56..04956b2e 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -40,13 +40,18 @@ using namespace std::literals::chrono_literals;
namespace ipa::rkisp1 {
+/* Maximum number of frame contexts to be held */
+static constexpr uint32_t kMaxFrameContexts = 16;
+
class IPARkISP1 : public IPARkISP1Interface, public Module
{
public:
+ IPARkISP1();
+
int init(const IPASettings &settings, unsigned int hwRevision,
ControlInfoMap *ipaControls) override;
int start() override;
- void stop() override {}
+ void stop() override;
int configure(const IPACameraSensorInfo &info,
const std::map<uint32_t, IPAStream> &streamConfig,
@@ -100,6 +105,11 @@ const ControlInfoMap::Map rkisp1Controls{
} /* namespace */
+IPARkISP1::IPARkISP1()
+ : context_({ {}, {}, { kMaxFrameContexts } })
+{
+}
+
std::string IPARkISP1::logPrefix() const
{
return "rkisp1";
@@ -185,6 +195,11 @@ int IPARkISP1::start()
return 0;
}
+void IPARkISP1::stop()
+{
+ context_.frameContexts.clear();
+}
+
/**
* \todo The RkISP1 pipeline currently provides an empty IPACameraSensorInfo
* if the connected sensor does not provide enough information to properly
@@ -222,8 +237,10 @@ int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info,
<< "Exposure: " << minExposure << "-" << maxExposure
<< " Gain: " << minGain << "-" << maxGain;
- /* Clean context at configuration */
- context_ = {};
+ /* Clear the IPA context before the streaming session. */
+ context_.configuration = {};
+ context_.activeState = {};
+ context_.frameContexts.clear();
/* Set the hardware revision for the algorithms. */
context_.configuration.hw.revision = hwRevision_;
@@ -286,8 +303,7 @@ void IPARkISP1::unmapBuffers(const std::vector<unsigned int> &ids)
void IPARkISP1::queueRequest(const uint32_t frame, const ControlList &controls)
{
- /* \todo Obtain the frame context to pass to process from the FCQueue */
- IPAFrameContext frameContext;
+ IPAFrameContext &frameContext = context_.frameContexts.alloc(frame);
for (auto const &algo : algorithms())
algo->queueRequest(context_, frame, frameContext, controls);
@@ -295,8 +311,7 @@ void IPARkISP1::queueRequest(const uint32_t frame, const ControlList &controls)
void IPARkISP1::fillParamsBuffer(const uint32_t frame, const uint32_t bufferId)
{
- /* \todo Obtain the frame context to pass to process from the FCQueue */
- IPAFrameContext frameContext;
+ IPAFrameContext &frameContext = context_.frameContexts.get(frame);
rkisp1_params_cfg *params =
reinterpret_cast<rkisp1_params_cfg *>(
@@ -315,6 +330,8 @@ void IPARkISP1::fillParamsBuffer(const uint32_t frame, const uint32_t bufferId)
void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId,
const ControlList &sensorControls)
{
+ IPAFrameContext &frameContext = context_.frameContexts.get(frame);
+
const rkisp1_stat_buffer *stats =
reinterpret_cast<rkisp1_stat_buffer *>(
mappedBuffers_.at(bufferId).planes()[0].data());
@@ -326,9 +343,6 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId
unsigned int aeState = 0;
- /* \todo Obtain the frame context to pass to process from the FCQueue */
- IPAFrameContext frameContext;
-
for (auto const &algo : algorithms())
algo->process(context_, frame, frameContext, stats);