[libcamera-devel] [PATCH] utils: rkisp1: gen-csc-table: Add support for inverting the CSC

Jacopo Mondi jacopo at jmondi.org
Wed Sep 28 08:25:27 CEST 2022


Hi Laurent

On Wed, Sep 28, 2022 at 02:27:07AM +0300, Laurent Pinchart via libcamera-devel wrote:
> Add a -i/--invert command line argument to invert the YCbCr encoding and
> output a YCbCr to RGB matrix.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks
  j

> ---
>  utils/rkisp1/gen-csc-table.py | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/utils/rkisp1/gen-csc-table.py b/utils/rkisp1/gen-csc-table.py
> index 2fb702746421..83aea357966a 100755
> --- a/utils/rkisp1/gen-csc-table.py
> +++ b/utils/rkisp1/gen-csc-table.py
> @@ -7,6 +7,7 @@
>
>  import argparse
>  import enum
> +import numpy as np
>  import sys
>
>
> @@ -63,7 +64,7 @@ class Quantization(enum.Enum):
>      LIMITED = 1
>
>
> -def scale_coeff(coeff, quantization, luma, precision):
> +def scale_coeff(coeff, quantization, luma, precision, invert):
>      """Scale a coefficient to the output range dictated by the quantization and
>      the precision.
>
> @@ -91,6 +92,9 @@ def scale_coeff(coeff, quantization, luma, precision):
>      else:
>          out_range = 240 - 16
>
> +    if invert:
> +        in_range, out_range = out_range, in_range
> +
>      return coeff * out_range / in_range * (1 << precision)
>
>
> @@ -150,6 +154,8 @@ def main(argv):
>          description='Generate color space conversion table coefficients with '
>          'configurable fixed-point precision.'
>      )
> +    parser.add_argument('--invert', '-i', action='store_true',
> +                        help='Invert the color space conversion (YUV -> RGB)')
>      parser.add_argument('--precision', '-p', default='Q1.7',
>                          help='The output fixed point precision in Q notation (sign bit excluded)')
>      parser.add_argument('--quantization', '-q', choices=['full', 'limited'],
> @@ -166,12 +172,15 @@ def main(argv):
>      encoding = encodings[args.encoding]
>      quantization = Quantization[args.quantization.upper()]
>
> +    if args.invert:
> +        encoding = np.linalg.inv(encoding)
> +
>      # Scale and round the encoding coefficients based on the precision and
>      # quantization range.
>      luma = True
>      scaled_coeffs = []
>      for line in encoding:
> -        line = [scale_coeff(coeff, quantization, luma, precision.fractional) for coeff in line]
> +        line = [scale_coeff(coeff, quantization, luma, precision.fractional, args.invert) for coeff in line]
>          scaled_coeffs.append(line)
>          luma = False
>
> @@ -188,7 +197,7 @@ def main(argv):
>      # Print the result as C code.
>      nbits = 1 << (precision.total - 1).bit_length()
>      nbytes = nbits // 4
> -    print(f'static const u{nbits} rgb2yuv_{args.encoding}_{quantization.name.lower()}_coeffs[] = {{')
> +    print(f'static const u{nbits} {"yuv2rgb" if args.invert else "rgb2yuv"}_{args.encoding}_{quantization.name.lower()}_coeffs[] = {{')
>
>      for line in rounded_coeffs:
>          line = [f'0x{coeff:0{nbytes}x}' for coeff in line]
> --
> Regards,
>
> Laurent Pinchart
>


More information about the libcamera-devel mailing list