[libcamera-devel] [PATCH v4 16/32] ipa: rkisp1: Convert to use the FCQueue

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Sep 20 16:50:12 CEST 2022


Quoting Laurent Pinchart (2022-09-08 02:41:44)
> From: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> 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 at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> ---

This has been converted to use the updated API for the FCQ, but perhaps
that's implicit.

Otherwise, I thnik this is still mostly my patch, but still it still
does what I think needs to be done ;-)

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


>  src/ipa/rkisp1/ipa_context.cpp |  6 +++---
>  src/ipa/rkisp1/ipa_context.h   |  2 ++
>  src/ipa/rkisp1/rkisp1.cpp      | 34 ++++++++++++++++++++++++----------
>  3 files changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
> index d18f4996aad2..e9846742ee4f 100644
> --- a/src/ipa/rkisp1/ipa_context.cpp
> +++ b/src/ipa/rkisp1/ipa_context.cpp
> @@ -205,8 +205,7 @@ namespace libcamera::ipa::rkisp1 {
>   * \struct IPAFrameContext
>   * \brief Per-frame context for algorithms
>   *
> - * This structure is currently unused and will be replaced by a real per-frame
> - * context.
> + * \todo Populate the frame context for all algorithms
>   */
>  
>  /**
> @@ -219,7 +218,8 @@ namespace libcamera::ipa::rkisp1 {
>   * \var IPAContext::activeState
>   * \brief The IPA active state, storing the latest state for all algorithms
>   *
> - * \todo Introduce per-frame contexts
> + * \var IPAContext::frameContexts
> + * \brief Ring buffer of per-frame contexts
>   */
>  
>  } /* namespace libcamera::ipa::rkisp1 */
> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
> index f6b3e6eb951c..f6aaefffed52 100644
> --- a/src/ipa/rkisp1/ipa_context.h
> +++ b/src/ipa/rkisp1/ipa_context.h
> @@ -97,6 +97,8 @@ struct IPAFrameContext : public FrameContext {
>  struct IPAContext {
>         IPASessionConfiguration configuration;
>         IPAActiveState activeState;
> +
> +       FCQueue<IPAFrameContext> frameContexts;
>  };
>  
>  } /* namespace ipa::rkisp1 */
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 24d5b9647838..c5ed0bb21f67 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";
> @@ -186,6 +196,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
> @@ -223,8 +238,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_;
> @@ -287,8 +304,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.init(frame);
>  
>         for (auto const &algo : algorithms())
>                 algo->queueRequest(context_, frame, frameContext, controls);
> @@ -296,8 +312,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 *>(
> @@ -316,6 +331,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());
> @@ -327,9 +344,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);
>  
> -- 
> Regards,
> 
> Laurent Pinchart
>


More information about the libcamera-devel mailing list