[libcamera-devel] [PATCH v2 15/19] py: Re-implement controls geneneration
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri May 27 10:05:13 CEST 2022
Hi Tomi,
Thank you for the patch.
On Tue, May 24, 2022 at 02:46:06PM +0300, Tomi Valkeinen wrote:
> The Python bindings controls generation was not very good. It only
> covered the enums and they were in the main namespace.
>
> This adds the controls somewhat similarly to the C++ side. We will have
> e.g.:
>
> libcamera.controls.Brightness
> libcamera.controls.AeMeteringModeEnum.CentreWeighted
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> ---
> ...py-control-enums.py => gen-py-controls.py} | 20 +++++++++++--------
> src/py/libcamera/meson.build | 16 +++++++++------
> ...ed.cpp.in => py_controls_generated.cpp.in} | 17 +++++++++++++---
> src/py/libcamera/py_main.cpp | 4 ++--
> 4 files changed, 38 insertions(+), 19 deletions(-)
> rename src/py/libcamera/{gen-py-control-enums.py => gen-py-controls.py} (85%)
> rename src/py/libcamera/{py_control_enums_generated.cpp.in => py_controls_generated.cpp.in} (50%)
>
> diff --git a/src/py/libcamera/gen-py-control-enums.py b/src/py/libcamera/gen-py-controls.py
> similarity index 85%
> rename from src/py/libcamera/gen-py-control-enums.py
> rename to src/py/libcamera/gen-py-controls.py
> index 6b2b5362..e3e1e178 100755
> --- a/src/py/libcamera/gen-py-control-enums.py
> +++ b/src/py/libcamera/gen-py-controls.py
> @@ -1,7 +1,7 @@
> #!/usr/bin/env python3
> # SPDX-License-Identifier: GPL-2.0-or-later
> #
> -# Generate Python bindings enums for controls from YAML
> +# Generate Python bindings controls from YAML
>
> import argparse
> import string
> @@ -27,18 +27,22 @@ def generate_py(controls):
> for ctrl in controls:
> name, ctrl = ctrl.popitem()
>
> - enum = ctrl.get('enum')
> - if not enum:
> - continue
> -
> if ctrl.get('draft'):
> ns = 'libcamera::controls::draft::'
> + container = "draft"
> else:
> ns = 'libcamera::controls::'
> + container = "controls"
>
> cpp_enum = name + 'Enum'
I'd move this line after the enum check below.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> - out += '\tpy::enum_<{}{}>(m, \"{}\")\n'.format(ns, cpp_enum, name)
> + out += f'\t{container}.def_readonly_static("{name}", static_cast<const libcamera::ControlId *>(&{ns}{name}));\n\n'
> +
> + enum = ctrl.get('enum')
> + if not enum:
> + continue
> +
> + out += '\tpy::enum_<{}{}>({}, \"{}\")\n'.format(ns, cpp_enum, container, cpp_enum)
>
> if name == 'LensShadingMapMode':
> prefix = 'LensShadingMapMode'
> @@ -54,9 +58,9 @@ def generate_py(controls):
>
> out += '\t\t.value(\"{}\", {}{})\n'.format(py_enum, ns, cpp_enum)
>
> - out += '\t;\n'
> + out += '\t;\n\n'
>
> - return {'enums': out}
> + return {'controls': out}
>
>
> def fill_template(template, data):
> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
> index b705ac1f..e8010846 100644
> --- a/src/py/libcamera/meson.build
> +++ b/src/py/libcamera/meson.build
> @@ -18,17 +18,21 @@ pycamera_sources = files([
> 'py_main.cpp',
> ])
>
> -gen_py_control_enums_input_files = files([
> +# Generate controls
> +
> +gen_py_controls_input_files = files([
> '../../libcamera/control_ids.yaml',
> - 'py_control_enums_generated.cpp.in',
> + 'py_controls_generated.cpp.in',
> ])
>
> -gen_py_control_enums = files('gen-py-control-enums.py')
> +gen_py_controls = files('gen-py-controls.py')
>
> pycamera_sources += custom_target('py_gen_controls',
> - input : gen_py_control_enums_input_files,
> - output : ['py_control_enums_generated.cpp'],
> - command : [gen_py_control_enums, '-o', '@OUTPUT@', '@INPUT@'])
> + input : gen_py_controls_input_files,
> + output : ['py_controls_generated.cpp'],
> + command : [gen_py_controls, '-o', '@OUTPUT@', '@INPUT@'])
> +
> +# Generate formats
>
> gen_py_formats_input_files = files([
> '../../libcamera/formats.yaml',
> diff --git a/src/py/libcamera/py_control_enums_generated.cpp.in b/src/py/libcamera/py_controls_generated.cpp.in
> similarity index 50%
> rename from src/py/libcamera/py_control_enums_generated.cpp.in
> rename to src/py/libcamera/py_controls_generated.cpp.in
> index ed81fbe7..cb8442ba 100644
> --- a/src/py/libcamera/py_control_enums_generated.cpp.in
> +++ b/src/py/libcamera/py_controls_generated.cpp.in
> @@ -2,7 +2,7 @@
> /*
> * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> *
> - * Python bindings - Auto-generated control enums
> + * Python bindings - Auto-generated controls
> *
> * This file is auto-generated. Do not edit.
> */
> @@ -13,7 +13,18 @@
>
> namespace py = pybind11;
>
> -void init_py_control_enums_generated(py::module& m)
> +class PyControls
> {
> -${enums}
> +};
> +
> +class PyDraftControls
> +{
> +};
> +
> +void init_py_controls_generated(py::module& m)
> +{
> + auto controls = py::class_<PyControls>(m, "controls");
> + auto draft = py::class_<PyDraftControls>(controls, "draft");
> +
> +${controls}
> }
> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
> index 5d389942..33ecc1cd 100644
> --- a/src/py/libcamera/py_main.cpp
> +++ b/src/py/libcamera/py_main.cpp
> @@ -131,14 +131,14 @@ static void handleRequestCompleted(Request *req)
> }
>
> void init_py_enums(py::module &m);
> -void init_py_control_enums_generated(py::module &m);
> +void init_py_controls_generated(py::module &m);
> void init_py_formats_generated(py::module &m);
> void init_py_geometry(py::module &m);
>
> PYBIND11_MODULE(_libcamera, m)
> {
> init_py_enums(m);
> - init_py_control_enums_generated(m);
> + init_py_controls_generated(m);
> init_py_geometry(m);
>
> /* Forward declarations */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list