[PATCH 3/5] utils: libtuning: modules: Add skeletal CCM module

Stefan Klug stefan.klug at ideasonboard.com
Fri Apr 12 10:02:17 CEST 2024


Hi Paul,

thanks fo the patch.

On Fri, Apr 05, 2024 at 11:53:33PM +0900, Paul Elder wrote:
> Add a skeletal CCM module just so that we can have some CCM tuning
> values that we can use to test during development of CCM in the IPAs. As
> rkisp1 is the main target, we only add support for rkisp1 for now.
> 
> The parameters are mostly copied from the hardcoded values in ctt,
> except for the metering modes.
> 
> As CCM is called CTK (for crosstalk) in rkisp1, that is the name that
> will be used for rkisp1.
> 
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
>  .../tuning/libtuning/modules/ccm/__init__.py  |  6 ++
>  utils/tuning/libtuning/modules/ccm/ccm.py     | 22 ++++++
>  utils/tuning/libtuning/modules/ccm/rkisp1.py  | 75 +++++++++++++++++++
>  3 files changed, 103 insertions(+)
>  create mode 100644 utils/tuning/libtuning/modules/ccm/__init__.py
>  create mode 100644 utils/tuning/libtuning/modules/ccm/ccm.py
>  create mode 100644 utils/tuning/libtuning/modules/ccm/rkisp1.py
> 
> diff --git a/utils/tuning/libtuning/modules/ccm/__init__.py b/utils/tuning/libtuning/modules/ccm/__init__.py
> new file mode 100644
> index 00000000..a06c356c
> --- /dev/null
> +++ b/utils/tuning/libtuning/modules/ccm/__init__.py
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2024, Paul Elder <paul.elder at ideasonboard.com>
> +
> +from libtuning.modules.ccm.ccm import CCM
> +from libtuning.modules.ccm.rkisp1 import CTKRkISP1
> diff --git a/utils/tuning/libtuning/modules/ccm/ccm.py b/utils/tuning/libtuning/modules/ccm/ccm.py
> new file mode 100644
> index 00000000..7ddf0a8c
> --- /dev/null
> +++ b/utils/tuning/libtuning/modules/ccm/ccm.py
> @@ -0,0 +1,22 @@
> +# SPDX-License-Identifier: BSD-2-Clause
> +#
> +# Copyright (C) 2019, Raspberry Pi Ltd
> +# Copyright (C) 2024, Paul Elder <paul.elder at ideasonboard.com>
> +
> +from ..module import Module
> +
> +import libtuning as lt
> +import libtuning.utils as utils
> +
> +import numpy as np
> +
> +class CCM(Module):
> +    type = 'ccm'
> +    hr_name = 'CCM (Base)'
> +    out_name = 'GenericCCM'
> +
> +    def __init__(self, *,
> +                 debug: list):
> +        super().__init__()
> +
> +        self.debug = debug
> diff --git a/utils/tuning/libtuning/modules/ccm/rkisp1.py b/utils/tuning/libtuning/modules/ccm/rkisp1.py
> new file mode 100644
> index 00000000..5a6caea8
> --- /dev/null
> +++ b/utils/tuning/libtuning/modules/ccm/rkisp1.py
> @@ -0,0 +1,75 @@
> +# SPDX-License-Identifier: BSD-2-Clause
> +#
> +# Copyright (C) 2019, Raspberry Pi Ltd
> +# Copyright (C) 2024, Paul Elder <paul.elder at ideasonboard.com>
> +#
> +# rkisp1.py - Ctk module for tuning rkisp1
> +
> +from .ccm import CCM
> +
> +import libtuning as lt
> +import libtuning.utils as utils
> +
> +from numbers import Number
> +import numpy as np
> +
> +class CTKRkISP1(CCM):
> +    hr_name = 'Crosstalk Correction (RkISP1)'
> +    out_name = 'Ctk'
> +    # \todo Not sure if this is useful. Probably will remove later.
> +    compatible = ['rkisp1']
> +
> +    def __init__(self, **kwargs):
> +        super().__init__(**kwargs)
> +
> +    # We don't actually need anything from the config file
> +    def validate_config(self, config: dict) -> bool:
> +        return True
> +
> +    def _float_to_fixed_4_7(self, d):
> +        mask = 0xf
> +        whole = int(d) & mask
> +
> +        fractional = d % 1
> +        frac = 0
> +        for i in range(0, 7):
> +            fractional *= 2
> +            frac <<= 1
> +            frac |= int(fractional) & 0x1
> +
> +        return (whole << 7) | frac

As discussed this needs to be moved to the IPA

> +
> +    def _generate_ctms(self) -> dict:
> +        ctms = {
> +                '2860': [ 2.12089, -0.52461, -0.59629,
> +                         -0.85342,  2.80445, -0.95103,
> +                         -0.26897, -1.14788,  2.41685 ],
> +                '2960': [ 2.26962, -0.54174, -0.72789,
> +                         -0.77008,  2.60271, -0.83262,
> +                         -0.26036, -1.51254,  2.77289 ],
> +                '3603': [ 2.18644, -0.66148, -0.52496,
> +                         -0.77828,  2.69474, -0.91645,
> +                         -0.25239, -0.83059,  2.08298 ],
> +                '4650': [ 2.18174, -0.70887, -0.47287,
> +                         -0.70196,  2.76426, -1.06231,
> +                         -0.25157, -0.71978,  1.97135 ],
> +                '5858': [ 2.32392, -0.88421, -0.43971,
> +                         -0.63821,  2.58348, -0.94527,
> +                         -0.28541, -0.54112,  1.82653 ],
> +                '7580': [ 2.21175, -0.53242, -0.67933,
> +                         -0.57875,  3.07922, -1.50047,
> +                         -0.27709, -0.73338,  2.01048 ],
> +                }
> +
> +        ret = {}
> +        for ct in ctms:
> +            ret[ct] = [self._float_to_fixed_4_7(weight) for weight in ctms[ct]]
> +        return ret
> +
> +    def process(self, config: dict, images: list, outputs: dict) -> dict:
> +        output = {}
> +
> +        output['ctms'] = self._generate_ctms()

What about the offset vector? Should we initialize it to 0 here? I
missed that on the libipa ctk patch. At least we should zero it out
there.

> +        # \todo Debug functionality
> +
> +        return output
> -- 
> 2.39.2
> 


More information about the libcamera-devel mailing list