[v3,26/29] libcamera: Add and implement LensDewarpEnable control
diff mbox series

Message ID 20251125162851.2301793-27-stefan.klug@ideasonboard.com
State Accepted
Headers show
Series
  • Full dewarper support on imx8mp
Related show

Commit Message

Stefan Klug Nov. 25, 2025, 4:28 p.m. UTC
Add a LensDewarpEnable control to enable or disable lens dewarping if it
is configured. Implement it inside the dw100 converter module.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

---

Changes in v3:
- Moved control handling into converter module
- Moved yaml handling into converter module
- Collected tag

Changes in v2:
- Merged control definition and usage into one patch
- Improved control description
- Fixed actual handling of LensDewarpEnable control that got lost in a
  previous rebase
---
 src/libcamera/control_ids_core.yaml         |  7 +++++++
 src/libcamera/converter/converter_dw100.cpp | 12 ++++++++++++
 2 files changed, 19 insertions(+)

Comments

Kieran Bingham Nov. 25, 2025, 5:52 p.m. UTC | #1
Quoting Stefan Klug (2025-11-25 16:28:38)
> Add a LensDewarpEnable control to enable or disable lens dewarping if it
> is configured. Implement it inside the dw100 converter module.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
> 

All self contained in the module that handles it. Just what I like :-)


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> ---
> 
> Changes in v3:
> - Moved control handling into converter module
> - Moved yaml handling into converter module
> - Collected tag
> 
> Changes in v2:
> - Merged control definition and usage into one patch
> - Improved control description
> - Fixed actual handling of LensDewarpEnable control that got lost in a
>   previous rebase
> ---
>  src/libcamera/control_ids_core.yaml         |  7 +++++++
>  src/libcamera/converter/converter_dw100.cpp | 12 ++++++++++++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/src/libcamera/control_ids_core.yaml b/src/libcamera/control_ids_core.yaml
> index f781865859ac..3bcb475fd102 100644
> --- a/src/libcamera/control_ids_core.yaml
> +++ b/src/libcamera/control_ids_core.yaml
> @@ -1346,4 +1346,11 @@ controls:
>          reduces the WdrExposureValue until the amount of pixels that are close
>          to saturation is lower than this value.
>  
> +  - LensDewarpEnable:
> +      type: bool
> +      direction: inout
> +      description: |
> +        Enable or disable lens dewarping. This control is only available if lens
> +        dewarp parameters are configured in the tuning file.
> +
>  ...
> diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
> index 03ffd939dc63..7adad1b502f0 100644
> --- a/src/libcamera/converter/converter_dw100.cpp
> +++ b/src/libcamera/converter/converter_dw100.cpp
> @@ -343,6 +343,9 @@ void ConverterDW100Module::updateControlInfos(const Stream *stream, ControlInfoM
>         controls[&controls::ScalerCrop] = ControlInfo(Rectangle(sensorCrop_.x, sensorCrop_.y, 1, 1),
>                                                       sensorCrop_, sensorCrop_);
>  
> +       if (dewarpParams_.has_value())
> +               controls[&controls::LensDewarpEnable] = ControlInfo(false, true, true);
> +
>         if (!converter_.supportsRequests())
>                 LOG(Converter, Warning)
>                         << "dw100 kernel driver has no requests support."
> @@ -366,6 +369,12 @@ void ConverterDW100Module::setControls(const Stream *stream, const ControlList &
>         auto &info = vertexMaps_[stream];
>         auto &vertexMap = info.map;
>  
> +       const auto &lensDewarpEnable = controls.get(controls::LensDewarpEnable);
> +       if (lensDewarpEnable) {
> +               vertexMap.setLensDewarpEnable(*lensDewarpEnable);
> +               info.update = true;
> +       }
> +
>         const auto &crop = controls.get(controls::ScalerCrop);
>         if (crop) {
>                 vertexMap.setScalerCrop(*crop);
> @@ -394,6 +403,9 @@ void ConverterDW100Module::populateMetadata(const Stream *stream, ControlList &m
>         auto &vertexMap = vertexMaps_[stream].map;
>  
>         meta.set(controls::ScalerCrop, vertexMap.effectiveScalerCrop());
> +
> +       if (dewarpParams_.has_value())
> +               meta.set(controls::LensDewarpEnable, vertexMap.lensDewarpEnable());
>  }
>  
>  /**
> -- 
> 2.51.0
>

Patch
diff mbox series

diff --git a/src/libcamera/control_ids_core.yaml b/src/libcamera/control_ids_core.yaml
index f781865859ac..3bcb475fd102 100644
--- a/src/libcamera/control_ids_core.yaml
+++ b/src/libcamera/control_ids_core.yaml
@@ -1346,4 +1346,11 @@  controls:
         reduces the WdrExposureValue until the amount of pixels that are close
         to saturation is lower than this value.
 
+  - LensDewarpEnable:
+      type: bool
+      direction: inout
+      description: |
+        Enable or disable lens dewarping. This control is only available if lens
+        dewarp parameters are configured in the tuning file.
+
 ...
diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
index 03ffd939dc63..7adad1b502f0 100644
--- a/src/libcamera/converter/converter_dw100.cpp
+++ b/src/libcamera/converter/converter_dw100.cpp
@@ -343,6 +343,9 @@  void ConverterDW100Module::updateControlInfos(const Stream *stream, ControlInfoM
 	controls[&controls::ScalerCrop] = ControlInfo(Rectangle(sensorCrop_.x, sensorCrop_.y, 1, 1),
 						      sensorCrop_, sensorCrop_);
 
+	if (dewarpParams_.has_value())
+		controls[&controls::LensDewarpEnable] = ControlInfo(false, true, true);
+
 	if (!converter_.supportsRequests())
 		LOG(Converter, Warning)
 			<< "dw100 kernel driver has no requests support."
@@ -366,6 +369,12 @@  void ConverterDW100Module::setControls(const Stream *stream, const ControlList &
 	auto &info = vertexMaps_[stream];
 	auto &vertexMap = info.map;
 
+	const auto &lensDewarpEnable = controls.get(controls::LensDewarpEnable);
+	if (lensDewarpEnable) {
+		vertexMap.setLensDewarpEnable(*lensDewarpEnable);
+		info.update = true;
+	}
+
 	const auto &crop = controls.get(controls::ScalerCrop);
 	if (crop) {
 		vertexMap.setScalerCrop(*crop);
@@ -394,6 +403,9 @@  void ConverterDW100Module::populateMetadata(const Stream *stream, ControlList &m
 	auto &vertexMap = vertexMaps_[stream].map;
 
 	meta.set(controls::ScalerCrop, vertexMap.effectiveScalerCrop());
+
+	if (dewarpParams_.has_value())
+		meta.set(controls::LensDewarpEnable, vertexMap.lensDewarpEnable());
 }
 
 /**