[libcamera-devel] [RFC PATCH] Documentation: IPU3 IPA Design guide

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Sep 16 15:41:20 CEST 2021


Hi Kieran,

On Thu, Sep 16, 2021 at 01:36:43PM +0100, Kieran Bingham wrote:
> On 13/09/2021 15:29, Umang Jain wrote:
> > On 9/13/21 3:00 AM, Kieran Bingham wrote:
> >> The IPU3 IPA implements the basic 3a using the ImgU ISP.
> > 3a or 3A?
> >>
> >> Provide an overview document to describe it's operations, and provide a
> >> block diagram to help visualise how the components are put together to
> >> assist any new developers exploring the code.
> >>
> >> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> >>
> >> ---
> >> This is really just an RFC: Particularly:
> >>
> >>   - Should this content actually live in Documentation?
> >>     or is it more suited to a page under src/ipa/ipu3/...
> > 
> > 
> > I would probably keep it under Documentation/ but there is already a IPA
> > writing guide. So maybe we need a new dir, to document overviews of
> > existing IPAs?
> 
> Indeed, the existing document really describes the IPA IPC interfaces, I
> wonder if it should be renamed ...
> 
> The aim of this is to provide some overview on how the IPU3 IPA operates
> from a higher level.
> 
> Along with the discussions with Laurent, I'm going to move this to
> src/ipa/ipu3/ipu3-ipa-design-guide.rst for now.

I had assumed it would be moved to ipu3.cpp. Seems like explicit
communication would work better than assumptions.

I'm not sure I want to set a precedent of storing .rst documentation
somewhere else than in the Documentation/ directory. If you want to keep
it as .rst, I think it should stay there, and get compiled to catch
errors. My preference would be ipu3.cpp though.

> That will keep the overview document in the actual component for now.
> 
> It may be that we write further 'generic' IPA design guides, which may
> take inspiration from this, and could live in Documentation, but I think
> I/we need to spend some dedicated cycles on how we clean up our
> documentation anyway, so I'd rather keep this file close to it's
> implementation for now.
> 
> >>
> >>   - This is not complete to document all functionality
> >>     but gives an overview of the current implementation
> >>
> >>   - Is there anything anyone would find helpful for me to
> >>     extend/write about on this?
> >>
> >>   - It could likely get merged in with some of the work
> >>     that Jean-Michel is doing, and might duplicate some of
> >>     the parts he is documenting, but this was an aim to
> >>     write a single page overview as a getting started with
> >>     the IPU3 IPA ....
> >>
> >>
> >>   .../guides/ipu3-ipa-design-guide.rst          | 144 ++++++++++++++++++
> >>   1 file changed, 144 insertions(+)
> >>   create mode 100644 Documentation/guides/ipu3-ipa-design-guide.rst
> >>
> >> diff --git a/Documentation/guides/ipu3-ipa-design-guide.rst
> >> b/Documentation/guides/ipu3-ipa-design-guide.rst
> >> new file mode 100644
> >> index 000000000000..a1d0f13fbb00
> >> --- /dev/null
> >> +++ b/Documentation/guides/ipu3-ipa-design-guide.rst
> >> @@ -0,0 +1,144 @@
> >> +IPU3 IPA Architecture Design and Overview
> >> +=========================================
> >> +
> >> +The IPU3 IPA is built as a modular and extensible framework with an
> >> +upper layer to manage the interactions with the pipeline handler, and
> >> +the image processing algorithms split to compartmentalise the processing
> >> +required for each accellerator cluster provided by the ImgU ISP.
> >> +
> >> +The core IPU3 class is responsible for initialisation and construction
> >
> > s/IPU3/IPAIPU3 maybe?
> >
> >> +of the algorithm components, processing controls set by the requests
> >> +from applications, and managing events from the Pipeline handler.
> >> +
> >> +::
> >> +
> >> +        ┌───────────────────────────────────────────┐
> >> +        │      IPU3 Pipeline Handler                │
> >> +        │   ┌────────┐    ┌────────┐    ┌────────┐  │
> >> +        │   │        │    │        │    │        │  │
> >> +        │   │ Sensor ├───►│  CIO2  ├───►│  ImgU  ├──►
> >> +        │   │        │    │        │    │        │  │
> >> +        │   └────────┘    └────────┘    └─▲────┬─┘  │    P: Parameter Buffer
> >> +        │                                 │P   │    │    S: Statistics Buffer
> >> +        │                                 │    │S   │
> >> +        └─┬───┬───┬──────┬────┬────┬────┬─┴────▼─┬──┘    1: init()
> >> +          │   │   │      │ ▲  │ ▲  │ ▲  │ ▲      │       2: configure()
> >> +          │1  │2  │3     │4│  │4│  │4│  │4│      │5      3: mapBuffers(), start()
> >> +          ▼   ▼   ▼      ▼ │  ▼ │  ▼ │  ▼ │      ▼       4: processEvent()
> >> +        ┌──────────────────┴────┴────┴────┴─────────┐    5: stop(), unmapBuffers()
> >> +        │ IPU3 IPA                                  │
> >> +        │                 ┌───────────────────────┐ │
> >> +        │ ┌───────────┐   │ Algorithms            │ │
> >> +        │ │IPAContext │   │          ┌─────────┐  │ │
> >> +        │ │ ┌───────┐ │   │          │ ...     │  │ │
> >> +        │ │ │       │ │   │        ┌─┴───────┐ │  │ │
> >> +        │ │ │  SC   │ │   │        │ Tonemap ├─┘  │ │
> >> +        │ │ │       │ ◄───►      ┌─┴───────┐ │    │ │
> >> +        │ │ ├───────┤ │   │      │ AWB     ├─┘    │ │
> >> +        │ │ │       │ │   │    ┌─┴───────┐ │      │ │
> >> +        │ │ │  FC   │ │   │    │ AGC     ├─┘      │ │
> >> +        │ │ │       │ │   │    │         │        │ │
> >> +        │ │ └───────┘ │   │    └─────────┘        │ │
> >> +        │ └───────────┘   └───────────────────────┘ │
> >> +        └───────────────────────────────────────────┘
> >> +         SC: IPASessionConfiguration
> >> +         FC: IPAFrameContext(s)
> >> +
> >> +The IPA instance is constructed and initialised at the point a Camera is
> >> +created by the IPU3 pipeline handler. The initialisation call provides
> >> +details about which Camera Sensor is being used, and the controls that
> >> +it has available, along with their defaults and ranges.
> > 
> > Brief line about how sensor controls are used in IPA will be useful?
> > This will explain "why" sensor controls are passed to IPA and what IPA
> > does with it (for e.g gather necessary info to run algorithms).
> 
> I have wondered about putting a CameraSensorHelper box in the IPA too,
> but I thought that would be too cluttered, and I don't think it adds
> much to convey the context of the running IPA (at least for the moment) ...
> 
> But it might certainly be worth explaining about how controls are also
> sent to the pipeline handler. I'll see if I can add a section:
> 
> Controls
> ~~~~~~~~
> 
> The AutoExposure and AutoGain (AGC) algorithm differs slightly from the
> others as it requires operating directly on the sensor, as opposed to
> through the ImgU ISP. To support this, there is a dedicated action
> `ActionSetSensorControls` to allow the IPA to request controls to be set
> on the camera sensor through the pipeline handler.
> 
> >> +
> >> +Buffers
> >> +~~~~~~~
> >> +
> >> +The IPA will have Parameter and Statistics buffers shared with it from
> >> +the IPU3 Pipeline handler. These buffers will be passed to the IPA
> >> +before the ``start()`` operation occurs.
> >> +
> >> +The IPA will map the buffers into CPU accessible memory, associated with
> >> +a buffer ID, and further events for sending or receiving parameter and
> >> +statistics buffers will reference the ID to avoid expensive memory
> >> +mapping operations, or the passing of file handles during streaming.
> >> +
> >> +After the ``stop()`` operation occurs, these buffers will be unmapped,
> >> +and no further access to the buffers is permitted.
> >> +
> >> +Context
> >> +~~~~~~~
> >> +
> >> +Algorithm calls will always have the ``IPAContext`` available to them.
> >> +This context comprises of two parts:
> >> +
> >> +-  IPA Session Configuration
> >> +-  IPA Frame Context
> >> +
> >> +The session configuration structure ``IPASessionConfiguration``
> >> +represents constant parameters determined from either before streaming
> >> +commenced during ``configure()`` or updated parameters when processing
> >> +controls.
> >> +
> >> +The IPA Frame Context provides the storage for algorithms for a single
> >> +frame operation.
> >> +
> >> +The ``IPAFrameContext`` structure may be extended to an array, list, or
> >> +queue to store historical state for each frame, allowing algorithms to
> >> +obtain and reference results of calculations which are deeply pipelined.
> >> +This may only be done if an algorithm needs to know the context that was
> >> +applied at the frame the statistics were produced for, rather than the
> >> +previous or current frame.
> >> +
> >> +Presently there is a single ``IPAFrameContext`` without historical data,
> >> +and the context is maintained and updated through successive processing
> >> +operations.
> >> +
> >> +Operating
> >> +~~~~~~~~~
> >> +
> >> +There are three main parts of interactions with the algorithms for the
> >> +IPU3 IPA to operate when running:
> >> +
> >> +-  configure()
> >> +-  processEvent(``EventFillParams``)
> > 
> > 
> > One liner explanation for EventFillParams is missing. It should be
> > present in Pre-frame preparation section, no? Can you please include a
> > brief line analogous to "EventStatReady" event in the Post-frame
> > completion section?
> 
> Ah yes, indeed they should both be covered in the same way, so that's
> missing thanks.
> 
> I've updated it.
> 
> > Other than that, looks fine to me:
> > 
> > Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> > 
> >> +-  processEvent(``EventStatReady``)
> >> +
> >> +The configuration phase allows the pipeline-handler to inform the IPA of
> >> +the current stream configurations, which is then passed into each
> >> +algorithm to provide an opportunity to identify and track state of the
> >> +hardware, such as image size or ImgU pipeline configurations.
> >> +
> >> +Pre-frame preparation
> >> +~~~~~~~~~~~~~~~~~~~~~
> >> +
> >> +When configured, the IPA is notified by the pipeline handler of the
> >> +Camera ``start()`` event, after which incoming requests will be queued
> >> +for processing, requiring a parameter buffer (``ipu3_uapi_params``) to
> >> +be populated for the ImgU. This is passed directly to each algorithm
> >> +through the ``prepare()`` call allowing the ISP configuration to be
> >> +updated for the needs of each component that the algorithm is
> >> +responsible for.
> >> +
> >> +The algorithm should set the use flag (``ipu3_uapi_flags``) for any
> >> +structure that it modifies, and it should take care to ensure that any
> >> +structure set by a use flag is fully initialised to suitable values.
> >> +
> >> +The parameter buffer is returned to the pipeline handler through the
> >> +``ActionParamFilled`` event, and from there queued to the ImgU along
> >> +with a raw frame captured with the CIO2.
> >> +
> >> +Post-frame completion
> >> +~~~~~~~~~~~~~~~~~~~~~
> >> +
> >> +When the capture of an image is completed, and successfully processed
> >> +through the ImgU, the generated statistics buffer
> >> +(``ipu3_uapi_stats_3a``) is given to the IPA through the
> >> +``EventStatReady`` event. This provides the IPA with an opportunity to
> >> +examine the results of the ISP and run the calculations required by each
> >> +algorithm on the new data. The algorithms may require context from the
> >> +operations of other algorithms, for example, the AWB might choose to use
> >> +a scene brightness determined by the AGC. It is important that the
> >> +algorithms are ordered to ensure that required results are determined
> >> +before they are needed.
> >> +
> >> +The ordering of the algorithm processing is determined by their
> >> +placement in the ``IPU3::algorithms_`` ordered list.

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list