[libcamera-devel] [PATCH 1/9] libcamera: Introduce option to customize behavior for a camera module
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Feb 16 01:57:14 CET 2022
Hi Han-lin,
On Wed, Feb 09, 2022 at 03:19:09PM +0800, Han-Lin Chen wrote:
> Introduce option to customize behavior for a camera module, which might
> alter the camera characteristic and should be set before inspecting it.
>
> Re-use the Control generation infrastructure to generate options and define
> the first 'PipelineConfigFile' option, which allows user to specify
> preference for pipeline configuration.
When thinking about this, I wasn't envisioning passing the configuration
file to libcamera through the C++ API, but looking for it in standard
locations on the file system. Could you explain the reason why you think
this should be dynamic ?
> Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
> ---
> include/libcamera/ipa/ipa_controls.h | 1 +
> include/libcamera/meson.build | 3 +-
> include/libcamera/option_ids.h.in | 36 +++++++++++++++++
> src/libcamera/control_serializer.cpp | 12 ++++++
> src/libcamera/option_ids.cpp.in | 58 ++++++++++++++++++++++++++++
> src/libcamera/option_ids.yaml | 16 ++++++++
> 6 files changed, 125 insertions(+), 1 deletion(-)
> create mode 100644 include/libcamera/option_ids.h.in
> create mode 100644 src/libcamera/option_ids.cpp.in
> create mode 100644 src/libcamera/option_ids.yaml
>
> diff --git a/include/libcamera/ipa/ipa_controls.h b/include/libcamera/ipa/ipa_controls.h
> index da1a7596..8173a2e5 100644
> --- a/include/libcamera/ipa/ipa_controls.h
> +++ b/include/libcamera/ipa/ipa_controls.h
> @@ -18,6 +18,7 @@ extern "C" {
> enum ipa_controls_id_map_type {
> IPA_CONTROL_ID_MAP_CONTROLS,
> IPA_CONTROL_ID_MAP_PROPERTIES,
> + IPA_CONTROL_ID_MAP_OPTIONS,
Do you have use cases for passing a configuration file to the IPA
modules ? As IPA modules are sandboxed, they don't have unrestricted
access to the filesystem. I think this could create issues, especially
if the path to the configuration is under the control of an application.
> IPA_CONTROL_ID_MAP_V4L2,
> };
>
> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> index 408b7acf..a9b71bc3 100644
> --- a/include/libcamera/meson.build
> +++ b/include/libcamera/meson.build
> @@ -31,10 +31,11 @@ install_headers(libcamera_public_headers,
>
> libcamera_headers_install_dir = get_option('includedir') / libcamera_include_dir
>
> -# control_ids.h and property_ids.h
> +# control_ids.h, property_ids.h, and option_ids.h
> control_source_files = [
> 'control_ids',
> 'property_ids',
> + 'option_ids',
> ]
>
> control_headers = []
> diff --git a/include/libcamera/option_ids.h.in b/include/libcamera/option_ids.h.in
> new file mode 100644
> index 00000000..53058a4b
> --- /dev/null
> +++ b/include/libcamera/option_ids.h.in
> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2022, Google Inc.
> + *
> + * option_ids.h - Option ID list
> + *
> + * This file is auto-generated. Do not edit.
> + */
> +
> +#pragma once
> +
> +#include <stdint.h>
> +
> +#include <libcamera/controls.h>
> +
> +namespace libcamera {
> +
> +namespace options {
> +
> +enum {
> +${ids}
> +};
> +
> +${controls}
> +
> +namespace draft {
> +
> +${draft_controls}
> +
> +} /* namespace draft */
> +
> +extern const ControlIdMap options;
> +
> +} /* namespace options */
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
> index e87d2362..dc8d2906 100644
> --- a/src/libcamera/control_serializer.cpp
> +++ b/src/libcamera/control_serializer.cpp
> @@ -16,6 +16,7 @@
>
> #include <libcamera/control_ids.h>
> #include <libcamera/controls.h>
> +#include <libcamera/option_ids.h>
> #include <libcamera/property_ids.h>
>
> #include <libcamera/ipa/ipa_controls.h>
> @@ -239,6 +240,8 @@ int ControlSerializer::serialize(const ControlInfoMap &infoMap,
> enum ipa_controls_id_map_type idMapType;
> if (idmap == &controls::controls)
> idMapType = IPA_CONTROL_ID_MAP_CONTROLS;
> + else if (idmap == &options::options)
> + idMapType = IPA_CONTROL_ID_MAP_OPTIONS;
> else if (idmap == &properties::properties)
> idMapType = IPA_CONTROL_ID_MAP_PROPERTIES;
> else
> @@ -333,6 +336,8 @@ int ControlSerializer::serialize(const ControlList &list,
> enum ipa_controls_id_map_type idMapType;
> if (idmap == &controls::controls)
> idMapType = IPA_CONTROL_ID_MAP_CONTROLS;
> + else if (idmap == &options::options)
> + idMapType = IPA_CONTROL_ID_MAP_OPTIONS;
> else if (idmap == &properties::properties)
> idMapType = IPA_CONTROL_ID_MAP_PROPERTIES;
> else
> @@ -458,6 +463,9 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &
> case IPA_CONTROL_ID_MAP_CONTROLS:
> idMap = &controls::controls;
> break;
> + case IPA_CONTROL_ID_MAP_OPTIONS:
> + idMap = &options::options;
> + break;
> case IPA_CONTROL_ID_MAP_PROPERTIES:
> idMap = &properties::properties;
> break;
> @@ -589,6 +597,10 @@ ControlList ControlSerializer::deserialize<ControlList>(ByteStreamBuffer &buffer
> idMap = &controls::controls;
> break;
>
> + case IPA_CONTROL_ID_MAP_OPTIONS:
> + idMap = &options::options;
> + break;
> +
> case IPA_CONTROL_ID_MAP_PROPERTIES:
> idMap = &properties::properties;
> break;
> diff --git a/src/libcamera/option_ids.cpp.in b/src/libcamera/option_ids.cpp.in
> new file mode 100644
> index 00000000..adfd0633
> --- /dev/null
> +++ b/src/libcamera/option_ids.cpp.in
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2022, Google Inc.
> + *
> + * option_ids.cpp : Option ID list
> + *
> + * This file is auto-generated. Do not edit.
> + */
> +
> +#include <libcamera/option_ids.h>
> +
> +/**
> + * \file option_ids.h
> + * \brief Camera option identifiers
> + */
> +
> +namespace libcamera {
> +
> +/**
> + * \brief Namespace for libcamera options
> + */
> +namespace options {
> +
> +${controls_doc}
> +
> +/**
> + * \brief Namespace for libcamera draft options
> + */
> +namespace draft {
> +
> +${draft_controls_doc}
> +
> +} /* namespace draft */
> +
> +#ifndef __DOXYGEN__
> +/*
> + * Keep the options definitions hidden from doxygen as it incorrectly parses
> + * them as functions.
> + */
> +${controls_def}
> +
> +namespace draft {
> +
> +${draft_controls_def}
> +
> +} /* namespace draft */
> +#endif
> +
> +/**
> + * \brief List of all supported libcamera options
> + */
> +extern const ControlIdMap options {
> +${controls_map}
> +};
> +
> +} /* namespace options */
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/option_ids.yaml b/src/libcamera/option_ids.yaml
> new file mode 100644
> index 00000000..3f9304be
> --- /dev/null
> +++ b/src/libcamera/option_ids.yaml
> @@ -0,0 +1,16 @@
> +# SPDX-License-Identifier: LGPL-2.1-or-later
> +#
> +# Copyright (C) 2022, Google Inc.
> +#
> +%YAML 1.2
> +---
> +controls:
> + - PipelineConfigFile:
> + type: string
> + description: |
> + Some platform supports customizing pipeline configuration preference
> + for a camera module. The structure and contents of the configuration
> + file is specific to each platform in YAML format. The PipelineConfigFile
> + option can be used to specify the path to load the configuration file.
I'm not totally thrilled about using ControlList for this, I feel it may
be a bit over-engineered, but I suppose I'll understand the rationale
better after reviewing the whole series.
> +
> +...
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list