[libcamera-devel,v2,03/10] libcamera: properties: Generate libcamera properties

Message ID 20191205204350.28196-4-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Introduce camera properties
Related show

Commit Message

Jacopo Mondi Dec. 5, 2019, 8:43 p.m. UTC
Re-use the Control generation infrastructure to generate libcamera properties.

Introduce three additional files, one that enumerates the properties ids
(include/libcamera/property_ids.h) and one the defines Control<> instances,
one for each property (src/libcamera/property_ids.cpp) and provide
properties definitions in src/libcamera/property_ids.yaml

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 include/libcamera/meson.build       | 26 +++++++++++------
 include/libcamera/property_ids.h.in | 33 ++++++++++++++++++++++
 src/libcamera/meson.build           | 21 ++++++++------
 src/libcamera/property_ids.cpp.in   | 43 +++++++++++++++++++++++++++++
 src/libcamera/property_ids.yaml     | 34 +++++++++++++++++++++++
 5 files changed, 140 insertions(+), 17 deletions(-)
 create mode 100644 include/libcamera/property_ids.h.in
 create mode 100644 src/libcamera/property_ids.cpp.in
 create mode 100644 src/libcamera/property_ids.yaml

Comments

Niklas Söderlund Dec. 6, 2019, 9:42 p.m. UTC | #1
Hi Jacopo,

Thanks for your work.

On 2019-12-05 21:43:43 +0100, Jacopo Mondi wrote:
> Re-use the Control generation infrastructure to generate libcamera properties.
> 
> Introduce three additional files, one that enumerates the properties ids
> (include/libcamera/property_ids.h) and one the defines Control<> instances,
> one for each property (src/libcamera/property_ids.cpp) and provide
> properties definitions in src/libcamera/property_ids.yaml

This is also hard for me to parse, how about

Introduce three additional files,

- include/libcamera/property_ids.h
  Defines the properties ids.

- src/libcamera/property_ids.cpp
  Defines the properties Control<> instances.

- src/libcamera/property_ids.yaml
  Provide properties definitions.

> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  include/libcamera/meson.build       | 26 +++++++++++------
>  include/libcamera/property_ids.h.in | 33 ++++++++++++++++++++++
>  src/libcamera/meson.build           | 21 ++++++++------
>  src/libcamera/property_ids.cpp.in   | 43 +++++++++++++++++++++++++++++
>  src/libcamera/property_ids.yaml     | 34 +++++++++++++++++++++++
>  5 files changed, 140 insertions(+), 17 deletions(-)
>  create mode 100644 include/libcamera/property_ids.h.in
>  create mode 100644 src/libcamera/property_ids.cpp.in
>  create mode 100644 src/libcamera/property_ids.yaml
> 
> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> index 99abf0609940..25f503660960 100644
> --- a/include/libcamera/meson.build
> +++ b/include/libcamera/meson.build
> @@ -23,15 +23,23 @@ install_headers(libcamera_api,
>  
>  gen_controls = files('../../src/libcamera/gen-controls.py')
>  
> -control_ids_h = custom_target('control_ids_h',
> -                              input : files('../../src/libcamera/control_ids.yaml', 'control_ids.h.in'),
> -                              output : 'control_ids.h',
> -                              depend_files : gen_controls,
> -                              command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> -                              install : true,
> -                              install_dir : join_paths('include', include_dir))
> -
> -libcamera_api += control_ids_h
> +control_source_files = [
> +    'control_ids',
> +    'property_ids',
> +]
> +
> +control_headers = []
> +
> +foreach header : control_source_files
> +    input_files = files('../../src/libcamera/' + header +'.yaml', header + '.h.in')
> +    control_headers += custom_target(header + '_h',
> +                                     input : input_files,
> +                                     output : header + '.h',
> +                                     depend_files : gen_controls,
> +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> +                                     install : true,
> +                                     install_dir : join_paths('include', include_dir))
> +endforeach

I would have split this commit in two and added the foreach loop in a 
separate patch.

>  
>  gen_header = files('gen-header.sh')
>  
> diff --git a/include/libcamera/property_ids.h.in b/include/libcamera/property_ids.h.in
> new file mode 100644
> index 000000000000..62799b3e8c54
> --- /dev/null
> +++ b/include/libcamera/property_ids.h.in
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * property_ids.h : Property ID list
> + *
> + * This file is auto-generated. Do not edit.
> + */
> +
> +#ifndef __LIBCAMERA_PROPERTY_IDS_H__
> +#define __LIBCAMERA_PROPERTY_IDS_H__
> +
> +#include <stdint.h>
> +
> +#include <libcamera/controls.h>
> +
> +namespace libcamera {
> +
> +namespace properties {
> +
> +enum {
> +${ids}
> +};
> +
> +${controls}
> +
> +extern const ControlIdMap properties;
> +
> +} /* namespace propertiess */
> +
> +} /* namespace libcamera */
> +
> +#endif // __LIBCAMERA_PROPERTY_IDS_H__
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index c4f965bd7413..14aff6e5fc13 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -67,14 +67,19 @@ endif
>  
>  gen_controls = files('gen-controls.py')
>  
> -control_ids_cpp = custom_target('control_ids_cpp',
> -                                input : files('control_ids.yaml', 'control_ids.cpp.in'),
> -                                output : 'control_ids.cpp',
> -                                depend_files : gen_controls,
> -                                command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> -
> -libcamera_sources += control_ids_cpp
> -libcamera_sources += control_ids_h
> +control_sources = []
> +
> +foreach source : control_source_files
> +    input_files = files(source +'.yaml', source + '.cpp.in')
> +    control_sources += custom_target(source + '_cpp',
> +                                     input : input_files,
> +                                     output : source + '.cpp',
> +                                     depend_files : gen_controls,
> +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> +endforeach

Same here the foreach conversion could be put together with the one 
above in a separate patch.

> +
> +libcamera_sources += control_headers
> +libcamera_sources += control_sources
>  
>  gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
>  
> diff --git a/src/libcamera/property_ids.cpp.in b/src/libcamera/property_ids.cpp.in
> new file mode 100644
> index 000000000000..bfdd823f63b0
> --- /dev/null
> +++ b/src/libcamera/property_ids.cpp.in
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * property_ids.cpp : Property ID list
> + *
> + * This file is auto-generated. Do not edit.
> + */
> +
> +#include <libcamera/property_ids.h>
> +
> +/**
> + * \file property_ids.h
> + * \brief Camera property identifiers
> + */
> +
> +namespace libcamera {
> +
> +/**
> + * \brief Namespace for libcamera properties
> + */
> +namespace properties {
> +
> +${controls_doc}
> +
> +#ifndef __DOXYGEN__
> +/*
> + * Keep the properties definitions hidden from doxygen as it incorrectly parses
> + * them as functions.
> + */
> +${controls_def}
> +#endif
> +
> +/**
> + * \brief List of all supported libcamera properties
> + */
> +extern const ControlIdMap properties {
> +${controls_map}
> +};
> +
> +} /* namespace properties */
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml
> new file mode 100644
> index 000000000000..6ab5be83bc49
> --- /dev/null
> +++ b/src/libcamera/property_ids.yaml
> @@ -0,0 +1,34 @@
> +# SPDX-License-Identifier: LGPL-2.1-or-later
> +#
> +# Copyright (C) 2019, Google Inc.
> +#
> +%YAML 1.2
> +---
> +controls:
> +  - Location:
> +      type: int32_t
> +      description: |
> +        Camera mounting location
> +      values:
> +        - CAMERA_LOCATION_FRONT:
> +          value: 0
> +          description: |
> +            The camera is mounted on the front side of the device, facing the
> +            user
> +        - CAMERA_LOCATION_BACK:
> +          value: 1
> +          description: |
> +            The camera is mounted on the back facing side of the device
> +        - CAMERA_LOCATION_EXTERNAL:
> +          value: 2
> +          description: |
> +            The camera is attached to the device in a way that allows it to
> +            move freely
> +
> +  - Rotation:
> +      type: int32_t
> +      description: |
> +        Camera mounting rotation expressed as counterclockwise rotation degrees
> +        towards the axis perpendicular to the sensor surface and directed away
> +        from it

I know writing this description is really hard. This is the best one I 
seen so far and not sure I can do better. Only missing peace of 
information is where 0 degrees rotation really means. On a hand held 
device is that if the camera of a handheld device is not rotated while 
holding it in portrait or landscape mode?

> +...
> -- 
> 2.23.0
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Niklas Söderlund Dec. 6, 2019, 10:44 p.m. UTC | #2
On 2019-12-06 22:42:04 +0100, Niklas Söderlund wrote:
> Hi Jacopo,
> 
> Thanks for your work.
> 
> On 2019-12-05 21:43:43 +0100, Jacopo Mondi wrote:
> > Re-use the Control generation infrastructure to generate libcamera properties.
> > 
> > Introduce three additional files, one that enumerates the properties ids
> > (include/libcamera/property_ids.h) and one the defines Control<> instances,
> > one for each property (src/libcamera/property_ids.cpp) and provide
> > properties definitions in src/libcamera/property_ids.yaml
> 
> This is also hard for me to parse, how about
> 
> Introduce three additional files,
> 
> - include/libcamera/property_ids.h
>   Defines the properties ids.
> 
> - src/libcamera/property_ids.cpp
>   Defines the properties Control<> instances.
> 
> - src/libcamera/property_ids.yaml
>   Provide properties definitions.
> 
> > 
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > ---
> >  include/libcamera/meson.build       | 26 +++++++++++------
> >  include/libcamera/property_ids.h.in | 33 ++++++++++++++++++++++
> >  src/libcamera/meson.build           | 21 ++++++++------
> >  src/libcamera/property_ids.cpp.in   | 43 +++++++++++++++++++++++++++++
> >  src/libcamera/property_ids.yaml     | 34 +++++++++++++++++++++++
> >  5 files changed, 140 insertions(+), 17 deletions(-)
> >  create mode 100644 include/libcamera/property_ids.h.in
> >  create mode 100644 src/libcamera/property_ids.cpp.in
> >  create mode 100644 src/libcamera/property_ids.yaml
> > 
> > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> > index 99abf0609940..25f503660960 100644
> > --- a/include/libcamera/meson.build
> > +++ b/include/libcamera/meson.build
> > @@ -23,15 +23,23 @@ install_headers(libcamera_api,
> >  
> >  gen_controls = files('../../src/libcamera/gen-controls.py')
> >  
> > -control_ids_h = custom_target('control_ids_h',
> > -                              input : files('../../src/libcamera/control_ids.yaml', 'control_ids.h.in'),
> > -                              output : 'control_ids.h',
> > -                              depend_files : gen_controls,
> > -                              command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> > -                              install : true,
> > -                              install_dir : join_paths('include', include_dir))
> > -
> > -libcamera_api += control_ids_h
> > +control_source_files = [
> > +    'control_ids',
> > +    'property_ids',
> > +]
> > +
> > +control_headers = []
> > +
> > +foreach header : control_source_files
> > +    input_files = files('../../src/libcamera/' + header +'.yaml', header + '.h.in')
> > +    control_headers += custom_target(header + '_h',
> > +                                     input : input_files,
> > +                                     output : header + '.h',
> > +                                     depend_files : gen_controls,
> > +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> > +                                     install : true,
> > +                                     install_dir : join_paths('include', include_dir))
> > +endforeach
> 
> I would have split this commit in two and added the foreach loop in a 
> separate patch.
> 
> >  
> >  gen_header = files('gen-header.sh')
> >  
> > diff --git a/include/libcamera/property_ids.h.in b/include/libcamera/property_ids.h.in
> > new file mode 100644
> > index 000000000000..62799b3e8c54
> > --- /dev/null
> > +++ b/include/libcamera/property_ids.h.in
> > @@ -0,0 +1,33 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2019, Google Inc.
> > + *
> > + * property_ids.h : Property ID list
> > + *
> > + * This file is auto-generated. Do not edit.
> > + */
> > +
> > +#ifndef __LIBCAMERA_PROPERTY_IDS_H__
> > +#define __LIBCAMERA_PROPERTY_IDS_H__
> > +
> > +#include <stdint.h>
> > +
> > +#include <libcamera/controls.h>
> > +
> > +namespace libcamera {
> > +
> > +namespace properties {
> > +
> > +enum {
> > +${ids}
> > +};
> > +
> > +${controls}
> > +
> > +extern const ControlIdMap properties;
> > +
> > +} /* namespace propertiess */
> > +
> > +} /* namespace libcamera */
> > +
> > +#endif // __LIBCAMERA_PROPERTY_IDS_H__
> > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> > index c4f965bd7413..14aff6e5fc13 100644
> > --- a/src/libcamera/meson.build
> > +++ b/src/libcamera/meson.build
> > @@ -67,14 +67,19 @@ endif
> >  
> >  gen_controls = files('gen-controls.py')
> >  
> > -control_ids_cpp = custom_target('control_ids_cpp',
> > -                                input : files('control_ids.yaml', 'control_ids.cpp.in'),
> > -                                output : 'control_ids.cpp',
> > -                                depend_files : gen_controls,
> > -                                command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> > -
> > -libcamera_sources += control_ids_cpp
> > -libcamera_sources += control_ids_h
> > +control_sources = []
> > +
> > +foreach source : control_source_files
> > +    input_files = files(source +'.yaml', source + '.cpp.in')
> > +    control_sources += custom_target(source + '_cpp',
> > +                                     input : input_files,
> > +                                     output : source + '.cpp',
> > +                                     depend_files : gen_controls,
> > +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> > +endforeach
> 
> Same here the foreach conversion could be put together with the one 
> above in a separate patch.
> 
> > +
> > +libcamera_sources += control_headers
> > +libcamera_sources += control_sources
> >  
> >  gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
> >  
> > diff --git a/src/libcamera/property_ids.cpp.in b/src/libcamera/property_ids.cpp.in
> > new file mode 100644
> > index 000000000000..bfdd823f63b0
> > --- /dev/null
> > +++ b/src/libcamera/property_ids.cpp.in
> > @@ -0,0 +1,43 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2019, Google Inc.
> > + *
> > + * property_ids.cpp : Property ID list
> > + *
> > + * This file is auto-generated. Do not edit.
> > + */
> > +
> > +#include <libcamera/property_ids.h>
> > +
> > +/**
> > + * \file property_ids.h
> > + * \brief Camera property identifiers
> > + */
> > +
> > +namespace libcamera {
> > +
> > +/**
> > + * \brief Namespace for libcamera properties
> > + */
> > +namespace properties {
> > +
> > +${controls_doc}
> > +
> > +#ifndef __DOXYGEN__
> > +/*
> > + * Keep the properties definitions hidden from doxygen as it incorrectly parses
> > + * them as functions.
> > + */
> > +${controls_def}
> > +#endif
> > +
> > +/**
> > + * \brief List of all supported libcamera properties
> > + */
> > +extern const ControlIdMap properties {
> > +${controls_map}
> > +};
> > +
> > +} /* namespace properties */
> > +
> > +} /* namespace libcamera */
> > diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml
> > new file mode 100644
> > index 000000000000..6ab5be83bc49
> > --- /dev/null
> > +++ b/src/libcamera/property_ids.yaml
> > @@ -0,0 +1,34 @@
> > +# SPDX-License-Identifier: LGPL-2.1-or-later
> > +#
> > +# Copyright (C) 2019, Google Inc.
> > +#
> > +%YAML 1.2
> > +---
> > +controls:
> > +  - Location:
> > +      type: int32_t
> > +      description: |
> > +        Camera mounting location
> > +      values:
> > +        - CAMERA_LOCATION_FRONT:
> > +          value: 0
> > +          description: |
> > +            The camera is mounted on the front side of the device, facing the
> > +            user
> > +        - CAMERA_LOCATION_BACK:
> > +          value: 1
> > +          description: |
> > +            The camera is mounted on the back facing side of the device
> > +        - CAMERA_LOCATION_EXTERNAL:
> > +          value: 2
> > +          description: |
> > +            The camera is attached to the device in a way that allows it to
> > +            move freely
> > +
> > +  - Rotation:
> > +      type: int32_t
> > +      description: |
> > +        Camera mounting rotation expressed as counterclockwise rotation degrees
> > +        towards the axis perpendicular to the sensor surface and directed away
> > +        from it
> 
> I know writing this description is really hard. This is the best one I 
> seen so far and not sure I can do better. Only missing peace of 
> information is where 0 degrees rotation really means. On a hand held 
> device is that if the camera of a handheld device is not rotated while 
> holding it in portrait or landscape mode?

Reading 9/10 I wonder if we should document a bound here, 0 - 360 
degrees and avoid having all users having to make sure it's in bounds.

> 
> > +...
> > -- 
> > 2.23.0
> > 
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel@lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
> 
> -- 
> Regards,
> Niklas Söderlund
Jacopo Mondi Dec. 8, 2019, 6:15 p.m. UTC | #3
Hi Niklas,

On Fri, Dec 06, 2019 at 10:42:03PM +0100, Niklas Söderlund wrote:
> Hi Jacopo,
>
> Thanks for your work.
>
> On 2019-12-05 21:43:43 +0100, Jacopo Mondi wrote:
> > Re-use the Control generation infrastructure to generate libcamera properties.
> >
> > Introduce three additional files, one that enumerates the properties ids
> > (include/libcamera/property_ids.h) and one the defines Control<> instances,
> > one for each property (src/libcamera/property_ids.cpp) and provide
> > properties definitions in src/libcamera/property_ids.yaml
>
> This is also hard for me to parse, how about
>
> Introduce three additional files,
>
> - include/libcamera/property_ids.h
>   Defines the properties ids.
>
> - src/libcamera/property_ids.cpp
>   Defines the properties Control<> instances.
>
> - src/libcamera/property_ids.yaml
>   Provide properties definitions.
>

I agree, thanks

> >
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > ---
> >  include/libcamera/meson.build       | 26 +++++++++++------
> >  include/libcamera/property_ids.h.in | 33 ++++++++++++++++++++++
> >  src/libcamera/meson.build           | 21 ++++++++------
> >  src/libcamera/property_ids.cpp.in   | 43 +++++++++++++++++++++++++++++
> >  src/libcamera/property_ids.yaml     | 34 +++++++++++++++++++++++
> >  5 files changed, 140 insertions(+), 17 deletions(-)
> >  create mode 100644 include/libcamera/property_ids.h.in
> >  create mode 100644 src/libcamera/property_ids.cpp.in
> >  create mode 100644 src/libcamera/property_ids.yaml
> >
> > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> > index 99abf0609940..25f503660960 100644
> > --- a/include/libcamera/meson.build
> > +++ b/include/libcamera/meson.build
> > @@ -23,15 +23,23 @@ install_headers(libcamera_api,
> >
> >  gen_controls = files('../../src/libcamera/gen-controls.py')
> >
> > -control_ids_h = custom_target('control_ids_h',
> > -                              input : files('../../src/libcamera/control_ids.yaml', 'control_ids.h.in'),
> > -                              output : 'control_ids.h',
> > -                              depend_files : gen_controls,
> > -                              command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> > -                              install : true,
> > -                              install_dir : join_paths('include', include_dir))
> > -
> > -libcamera_api += control_ids_h
> > +control_source_files = [
> > +    'control_ids',
> > +    'property_ids',
> > +]
> > +
> > +control_headers = []
> > +
> > +foreach header : control_source_files
> > +    input_files = files('../../src/libcamera/' + header +'.yaml', header + '.h.in')
> > +    control_headers += custom_target(header + '_h',
> > +                                     input : input_files,
> > +                                     output : header + '.h',
> > +                                     depend_files : gen_controls,
> > +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
> > +                                     install : true,
> > +                                     install_dir : join_paths('include', include_dir))
> > +endforeach
>
> I would have split this commit in two and added the foreach loop in a
> separate patch.

Yes, but, really, why ?

Is this something logically not connected with the introduction of two
new files in the build system ? Is this hard to parse ?

Would you prefer one patch that introduce the new files, and one patch
that integrates them in the build system ? The first patch would not
even compile the newly added items...

>
> >
> >  gen_header = files('gen-header.sh')
> >
> > diff --git a/include/libcamera/property_ids.h.in b/include/libcamera/property_ids.h.in
> > new file mode 100644
> > index 000000000000..62799b3e8c54
> > --- /dev/null
> > +++ b/include/libcamera/property_ids.h.in
> > @@ -0,0 +1,33 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2019, Google Inc.
> > + *
> > + * property_ids.h : Property ID list
> > + *
> > + * This file is auto-generated. Do not edit.
> > + */
> > +
> > +#ifndef __LIBCAMERA_PROPERTY_IDS_H__
> > +#define __LIBCAMERA_PROPERTY_IDS_H__
> > +
> > +#include <stdint.h>
> > +
> > +#include <libcamera/controls.h>
> > +
> > +namespace libcamera {
> > +
> > +namespace properties {
> > +
> > +enum {
> > +${ids}
> > +};
> > +
> > +${controls}
> > +
> > +extern const ControlIdMap properties;
> > +
> > +} /* namespace propertiess */
> > +
> > +} /* namespace libcamera */
> > +
> > +#endif // __LIBCAMERA_PROPERTY_IDS_H__
> > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> > index c4f965bd7413..14aff6e5fc13 100644
> > --- a/src/libcamera/meson.build
> > +++ b/src/libcamera/meson.build
> > @@ -67,14 +67,19 @@ endif
> >
> >  gen_controls = files('gen-controls.py')
> >
> > -control_ids_cpp = custom_target('control_ids_cpp',
> > -                                input : files('control_ids.yaml', 'control_ids.cpp.in'),
> > -                                output : 'control_ids.cpp',
> > -                                depend_files : gen_controls,
> > -                                command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> > -
> > -libcamera_sources += control_ids_cpp
> > -libcamera_sources += control_ids_h
> > +control_sources = []
> > +
> > +foreach source : control_source_files
> > +    input_files = files(source +'.yaml', source + '.cpp.in')
> > +    control_sources += custom_target(source + '_cpp',
> > +                                     input : input_files,
> > +                                     output : source + '.cpp',
> > +                                     depend_files : gen_controls,
> > +                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
> > +endforeach
>
> Same here the foreach conversion could be put together with the one
> above in a separate patch.
>
> > +
> > +libcamera_sources += control_headers
> > +libcamera_sources += control_sources
> >
> >  gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
> >
> > diff --git a/src/libcamera/property_ids.cpp.in b/src/libcamera/property_ids.cpp.in
> > new file mode 100644
> > index 000000000000..bfdd823f63b0
> > --- /dev/null
> > +++ b/src/libcamera/property_ids.cpp.in
> > @@ -0,0 +1,43 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2019, Google Inc.
> > + *
> > + * property_ids.cpp : Property ID list
> > + *
> > + * This file is auto-generated. Do not edit.
> > + */
> > +
> > +#include <libcamera/property_ids.h>
> > +
> > +/**
> > + * \file property_ids.h
> > + * \brief Camera property identifiers
> > + */
> > +
> > +namespace libcamera {
> > +
> > +/**
> > + * \brief Namespace for libcamera properties
> > + */
> > +namespace properties {
> > +
> > +${controls_doc}
> > +
> > +#ifndef __DOXYGEN__
> > +/*
> > + * Keep the properties definitions hidden from doxygen as it incorrectly parses
> > + * them as functions.
> > + */
> > +${controls_def}
> > +#endif
> > +
> > +/**
> > + * \brief List of all supported libcamera properties
> > + */
> > +extern const ControlIdMap properties {
> > +${controls_map}
> > +};
> > +
> > +} /* namespace properties */
> > +
> > +} /* namespace libcamera */
> > diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml
> > new file mode 100644
> > index 000000000000..6ab5be83bc49
> > --- /dev/null
> > +++ b/src/libcamera/property_ids.yaml
> > @@ -0,0 +1,34 @@
> > +# SPDX-License-Identifier: LGPL-2.1-or-later
> > +#
> > +# Copyright (C) 2019, Google Inc.
> > +#
> > +%YAML 1.2
> > +---
> > +controls:
> > +  - Location:
> > +      type: int32_t
> > +      description: |
> > +        Camera mounting location
> > +      values:
> > +        - CAMERA_LOCATION_FRONT:
> > +          value: 0
> > +          description: |
> > +            The camera is mounted on the front side of the device, facing the
> > +            user
> > +        - CAMERA_LOCATION_BACK:
> > +          value: 1
> > +          description: |
> > +            The camera is mounted on the back facing side of the device
> > +        - CAMERA_LOCATION_EXTERNAL:
> > +          value: 2
> > +          description: |
> > +            The camera is attached to the device in a way that allows it to
> > +            move freely
> > +
> > +  - Rotation:
> > +      type: int32_t
> > +      description: |
> > +        Camera mounting rotation expressed as counterclockwise rotation degrees
> > +        towards the axis perpendicular to the sensor surface and directed away
> > +        from it
>
> I know writing this description is really hard. This is the best one I
> seen so far and not sure I can do better. Only missing peace of
> information is where 0 degrees rotation really means. On a hand held
> device is that if the camera of a handheld device is not rotated while
> holding it in portrait or landscape mode?

I think I'm missing the point that both you and Laurent rised here.
To me it's not a matter of the device where the camera in installed,
but how the camera sensor is supposed to be mounted. I'm -sure- it has
a designated upright position, with its pixel (0,0) in its top left
corner (or maybe not, but that depends on the sensor, and I'm sure it
is specified in the manual).

That said, this documentation comes from the DT bindings property I'm
pushing upstream, and while all those details on the sensor mounting
position are fair to be known at that level, for libcamera we might
need something different, I agree. I still don't get what's wrong with
the DT property description though (not the point you have rised).

Thanks
  j

>
> > +...
> > --
> > 2.23.0
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel@lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
>
> --
> Regards,
> Niklas Söderlund

Patch

diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 99abf0609940..25f503660960 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -23,15 +23,23 @@  install_headers(libcamera_api,
 
 gen_controls = files('../../src/libcamera/gen-controls.py')
 
-control_ids_h = custom_target('control_ids_h',
-                              input : files('../../src/libcamera/control_ids.yaml', 'control_ids.h.in'),
-                              output : 'control_ids.h',
-                              depend_files : gen_controls,
-                              command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
-                              install : true,
-                              install_dir : join_paths('include', include_dir))
-
-libcamera_api += control_ids_h
+control_source_files = [
+    'control_ids',
+    'property_ids',
+]
+
+control_headers = []
+
+foreach header : control_source_files
+    input_files = files('../../src/libcamera/' + header +'.yaml', header + '.h.in')
+    control_headers += custom_target(header + '_h',
+                                     input : input_files,
+                                     output : header + '.h',
+                                     depend_files : gen_controls,
+                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'],
+                                     install : true,
+                                     install_dir : join_paths('include', include_dir))
+endforeach
 
 gen_header = files('gen-header.sh')
 
diff --git a/include/libcamera/property_ids.h.in b/include/libcamera/property_ids.h.in
new file mode 100644
index 000000000000..62799b3e8c54
--- /dev/null
+++ b/include/libcamera/property_ids.h.in
@@ -0,0 +1,33 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * property_ids.h : Property ID list
+ *
+ * This file is auto-generated. Do not edit.
+ */
+
+#ifndef __LIBCAMERA_PROPERTY_IDS_H__
+#define __LIBCAMERA_PROPERTY_IDS_H__
+
+#include <stdint.h>
+
+#include <libcamera/controls.h>
+
+namespace libcamera {
+
+namespace properties {
+
+enum {
+${ids}
+};
+
+${controls}
+
+extern const ControlIdMap properties;
+
+} /* namespace propertiess */
+
+} /* namespace libcamera */
+
+#endif // __LIBCAMERA_PROPERTY_IDS_H__
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index c4f965bd7413..14aff6e5fc13 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -67,14 +67,19 @@  endif
 
 gen_controls = files('gen-controls.py')
 
-control_ids_cpp = custom_target('control_ids_cpp',
-                                input : files('control_ids.yaml', 'control_ids.cpp.in'),
-                                output : 'control_ids.cpp',
-                                depend_files : gen_controls,
-                                command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
-
-libcamera_sources += control_ids_cpp
-libcamera_sources += control_ids_h
+control_sources = []
+
+foreach source : control_source_files
+    input_files = files(source +'.yaml', source + '.cpp.in')
+    control_sources += custom_target(source + '_cpp',
+                                     input : input_files,
+                                     output : source + '.cpp',
+                                     depend_files : gen_controls,
+                                     command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
+endforeach
+
+libcamera_sources += control_headers
+libcamera_sources += control_sources
 
 gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
 
diff --git a/src/libcamera/property_ids.cpp.in b/src/libcamera/property_ids.cpp.in
new file mode 100644
index 000000000000..bfdd823f63b0
--- /dev/null
+++ b/src/libcamera/property_ids.cpp.in
@@ -0,0 +1,43 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * property_ids.cpp : Property ID list
+ *
+ * This file is auto-generated. Do not edit.
+ */
+
+#include <libcamera/property_ids.h>
+
+/**
+ * \file property_ids.h
+ * \brief Camera property identifiers
+ */
+
+namespace libcamera {
+
+/**
+ * \brief Namespace for libcamera properties
+ */
+namespace properties {
+
+${controls_doc}
+
+#ifndef __DOXYGEN__
+/*
+ * Keep the properties definitions hidden from doxygen as it incorrectly parses
+ * them as functions.
+ */
+${controls_def}
+#endif
+
+/**
+ * \brief List of all supported libcamera properties
+ */
+extern const ControlIdMap properties {
+${controls_map}
+};
+
+} /* namespace properties */
+
+} /* namespace libcamera */
diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml
new file mode 100644
index 000000000000..6ab5be83bc49
--- /dev/null
+++ b/src/libcamera/property_ids.yaml
@@ -0,0 +1,34 @@ 
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Copyright (C) 2019, Google Inc.
+#
+%YAML 1.2
+---
+controls:
+  - Location:
+      type: int32_t
+      description: |
+        Camera mounting location
+      values:
+        - CAMERA_LOCATION_FRONT:
+          value: 0
+          description: |
+            The camera is mounted on the front side of the device, facing the
+            user
+        - CAMERA_LOCATION_BACK:
+          value: 1
+          description: |
+            The camera is mounted on the back facing side of the device
+        - CAMERA_LOCATION_EXTERNAL:
+          value: 2
+          description: |
+            The camera is attached to the device in a way that allows it to
+            move freely
+
+  - Rotation:
+      type: int32_t
+      description: |
+        Camera mounting rotation expressed as counterclockwise rotation degrees
+        towards the axis perpendicular to the sensor surface and directed away
+        from it
+...