[libcamera-devel] [PATCH v2 18/19] py: Generate bindings for properties

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri May 27 13:03:40 CEST 2022


Hi Tomi,

Thank you for the patch.

On Tue, May 24, 2022 at 02:46:09PM +0300, Tomi Valkeinen wrote:
> Generate bindings for properties in a very similar way as done for
> controls. We do need to distinguish between the two, and thus I added
> --properties flag to gen-py-controls.py.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> ---
>  src/py/libcamera/gen-py-controls.py           | 27 +++++++++++------
>  src/py/libcamera/meson.build                  | 12 ++++++++
>  .../libcamera/py_properties_generated.cpp.in  | 30 +++++++++++++++++++
>  3 files changed, 60 insertions(+), 9 deletions(-)
>  create mode 100644 src/py/libcamera/py_properties_generated.cpp.in
> 
> diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> index e3e1e178..a9264777 100755
> --- a/src/py/libcamera/gen-py-controls.py
> +++ b/src/py/libcamera/gen-py-controls.py
> @@ -21,17 +21,19 @@ def find_common_prefix(strings):
>      return prefix
>  
>  
> -def generate_py(controls):
> +def generate_py(controls, prop_mode):
>      out = ''
>  
> +    mode_name = "properties" if prop_mode else "controls"

s/"/'/g where applicable.

> +
>      for ctrl in controls:
>          name, ctrl = ctrl.popitem()
>  
>          if ctrl.get('draft'):
> -            ns = 'libcamera::controls::draft::'
> +            ns = 'libcamera::{}::draft::'.format(mode_name)
>              container = "draft"
>          else:
> -            ns = 'libcamera::controls::'
> +            ns = 'libcamera::{}::'.format(mode_name)
>              container = "controls"
>  
>          cpp_enum = name + 'Enum'
> @@ -44,12 +46,17 @@ def generate_py(controls):
>  
>          out += '\tpy::enum_<{}{}>({}, \"{}\")\n'.format(ns, cpp_enum, container, cpp_enum)
>  
> -        if name == 'LensShadingMapMode':
> -            prefix = 'LensShadingMapMode'
> -        elif name == 'SceneFlicker':
> -            # If we strip the prefix, we would get '50Hz', which is illegal name
> -            prefix = ''
> +        if not prop_mode:
> +            # Adjustments for controls
> +            if name == 'LensShadingMapMode':
> +                prefix = 'LensShadingMapMode'
> +            elif name == 'SceneFlicker':
> +                # If we strip the prefix, we would get '50Hz', which is illegal name
> +                prefix = ''
> +            else:
> +                prefix = find_common_prefix([e['name'] for e in enum])
>          else:
> +            # Adjustments for properties
>              prefix = find_common_prefix([e['name'] for e in enum])
>  
>          for entry in enum:
> @@ -79,12 +86,14 @@ def main(argv):
>                          help='Input file name.')
>      parser.add_argument('template', type=str,
>                          help='Template file name.')
> +    parser.add_argument('--properties', action='store_true', default=False,
> +                        help='Generate bindings for properties instead of controls')

I'm tempted to instead add a --mode argument that wouldtake either
'controls' or 'properties' as a value, and pass the mode name to
generate_py(). I don't mind too much, so either way,

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

>      args = parser.parse_args(argv[1:])
>  
>      data = open(args.input, 'rb').read()
>      controls = yaml.safe_load(data)['controls']
>  
> -    data = generate_py(controls)
> +    data = generate_py(controls, prop_mode=args.properties)
>  
>      data = fill_template(args.template, data)
>  
> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
> index e8010846..e0010353 100644
> --- a/src/py/libcamera/meson.build
> +++ b/src/py/libcamera/meson.build
> @@ -32,6 +32,18 @@ pycamera_sources += custom_target('py_gen_controls',
>                                    output : ['py_controls_generated.cpp'],
>                                    command : [gen_py_controls, '-o', '@OUTPUT@', '@INPUT@'])
>  
> +# Generate properties
> +
> +gen_py_property_enums_input_files = files([
> +    '../../libcamera/property_ids.yaml',
> +    'py_properties_generated.cpp.in',
> +])
> +
> +pycamera_sources += custom_target('py_gen_properties',
> +                                  input : gen_py_property_enums_input_files,
> +                                  output : ['py_properties_generated.cpp'],
> +                                  command : [gen_py_controls, '--properties', '-o', '@OUTPUT@', '@INPUT@'])
> +
>  # Generate formats
>  
>  gen_py_formats_input_files = files([
> diff --git a/src/py/libcamera/py_properties_generated.cpp.in b/src/py/libcamera/py_properties_generated.cpp.in
> new file mode 100644
> index 00000000..044b2b2a
> --- /dev/null
> +++ b/src/py/libcamera/py_properties_generated.cpp.in
> @@ -0,0 +1,30 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> + *
> + * Python bindings - Auto-generated properties
> + *
> + * This file is auto-generated. Do not edit.
> + */
> +
> +#include <libcamera/property_ids.h>
> +
> +#include <pybind11/smart_holder.h>
> +
> +namespace py = pybind11;
> +
> +class PyProperties
> +{
> +};
> +
> +class PyDraftProperties
> +{
> +};
> +
> +void init_py_properties_generated(py::module& m)
> +{
> +	auto controls = py::class_<PyProperties>(m, "properties");
> +	auto draft = py::class_<PyDraftProperties>(controls, "draft");
> +
> +${controls}
> +}

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list