[libcamera-devel,v2,1/3] controls: Split FrameDurations into FrameDuration and FrameDurationLimits
diff mbox series

Message ID 20210524094123.1187354-1-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • [libcamera-devel,v2,1/3] controls: Split FrameDurations into FrameDuration and FrameDurationLimits
Related show

Commit Message

Paul Elder May 24, 2021, 9:41 a.m. UTC
We need a separate control to report the nominal frame duration, but
it's also useful to report the min/max frame duration values that will
be used. Split the FrameDurations control into FrameDuration and
FrameDurationLimits respectively to support both of these.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
 include/libcamera/ipa/raspberrypi.h  | 2 +-
 src/android/camera_device.cpp        | 2 +-
 src/ipa/raspberrypi/raspberrypi.cpp  | 4 ++--
 src/libcamera/control_ids.yaml       | 8 +++++++-
 src/libcamera/pipeline/ipu3/ipu3.cpp | 6 +++---
 5 files changed, 14 insertions(+), 8 deletions(-)

Comments

Laurent Pinchart May 24, 2021, 12:13 p.m. UTC | #1
Hi Paul,

Thank you for the patch.

On Mon, May 24, 2021 at 06:41:21PM +0900, Paul Elder wrote:
> We need a separate control to report the nominal frame duration, but
> it's also useful to report the min/max frame duration values that will
> be used. Split the FrameDurations control into FrameDuration and
> FrameDurationLimits respectively to support both of these.

I'm not 100% sure yet it will be useful to report the adjusted
FrameDurationLimits in metadata, but a separate control for the nominal
frame duration is certainly less confusing.

> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

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

> ---
>  include/libcamera/ipa/raspberrypi.h  | 2 +-
>  src/android/camera_device.cpp        | 2 +-
>  src/ipa/raspberrypi/raspberrypi.cpp  | 4 ++--
>  src/libcamera/control_ids.yaml       | 8 +++++++-
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 6 +++---
>  5 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
> index d10c1733..a8790000 100644
> --- a/include/libcamera/ipa/raspberrypi.h
> +++ b/include/libcamera/ipa/raspberrypi.h
> @@ -44,7 +44,7 @@ static const ControlInfoMap Controls = {
>  	{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
>  	{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },
>  	{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> -	{ &controls::FrameDurations, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },
> +	{ &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },
>  	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
>  };
>  
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index b32e8be5..0eea2b95 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -824,7 +824,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  
>  	int64_t minFrameDurationNsec = -1;
>  	int64_t maxFrameDurationNsec = -1;
> -	const auto frameDurationsInfo = controlsInfo.find(&controls::FrameDurations);
> +	const auto frameDurationsInfo = controlsInfo.find(&controls::FrameDurationLimits);
>  	if (frameDurationsInfo != controlsInfo.end()) {
>  		minFrameDurationNsec = frameDurationsInfo->second.min().get<int64_t>() * 1000;
>  		maxFrameDurationNsec = frameDurationsInfo->second.max().get<int64_t>() * 1000;
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 52d91db2..79a327e2 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -860,7 +860,7 @@ void IPARPi::queueRequest(const ControlList &controls)
>  			break;
>  		}
>  
> -		case controls::FRAME_DURATIONS: {
> +		case controls::FRAME_DURATION_LIMITS: {
>  			auto frameDurations = ctrl.second.get<Span<const int64_t>>();
>  			applyFrameDurations(frameDurations[0], frameDurations[1]);
>  			break;
> @@ -1075,7 +1075,7 @@ void IPARPi::applyFrameDurations(double minFrameDuration, double maxFrameDuratio
>  	maxFrameDuration_ = std::max(maxFrameDuration_, minFrameDuration_);
>  
>  	/* Return the validated limits via metadata. */
> -	libcameraMetadata_.set(controls::FrameDurations,
> +	libcameraMetadata_.set(controls::FrameDurationLimits,
>  			       { static_cast<int64_t>(minFrameDuration_),
>  				 static_cast<int64_t>(maxFrameDuration_) });
>  
> diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml
> index 88d81ac4..338fbdc9 100644
> --- a/src/libcamera/control_ids.yaml
> +++ b/src/libcamera/control_ids.yaml
> @@ -323,7 +323,13 @@ controls:
>          step to respect the received gain factor and shall report
>          their total value in the request metadata.
>  
> -  - FrameDurations:
> +  - FrameDuration:
> +      type: int64_t
> +      description: |
> +        The nominal frame duration from start of frame exposure to start of
> +        next exposure, expressed in microseconds.
> +
> +  - FrameDurationLimits:
>        type: int64_t
>        description: |
>          The minimum and maximum (in that order) frame duration,
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 8ae47c6d..6e17753f 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -980,9 +980,9 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
>  		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
>  	}
>  
> -	controls[&controls::FrameDurations] = ControlInfo(frameDurations[0],
> -							  frameDurations[1],
> -							  frameDurations[2]);
> +	controls[&controls::FrameDuration] = ControlInfo(frameDurations[0],
> +							 frameDurations[1],
> +							 frameDurations[2]);
>  
>  	/*
>  	 * Compute the scaler crop limits.
Jacopo Mondi May 24, 2021, 12:22 p.m. UTC | #2
Hi Paul, Laurent,

On Mon, May 24, 2021 at 03:13:15PM +0300, Laurent Pinchart wrote:
> Hi Paul,
>
> Thank you for the patch.
>
> On Mon, May 24, 2021 at 06:41:21PM +0900, Paul Elder wrote:
> > We need a separate control to report the nominal frame duration, but
> > it's also useful to report the min/max frame duration values that will
> > be used. Split the FrameDurations control into FrameDuration and
> > FrameDurationLimits respectively to support both of these.
>
> I'm not 100% sure yet it will be useful to report the adjusted
> FrameDurationLimits in metadata, but a separate control for the nominal
> frame duration is certainly less confusing.
>
> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> > ---

[snip]

> > diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml
> > index 88d81ac4..338fbdc9 100644
> > --- a/src/libcamera/control_ids.yaml
> > +++ b/src/libcamera/control_ids.yaml
> > @@ -323,7 +323,13 @@ controls:
> >          step to respect the received gain factor and shall report
> >          their total value in the request metadata.
> >
> > -  - FrameDurations:
> > +  - FrameDuration:
> > +      type: int64_t
> > +      description: |
> > +        The nominal frame duration from start of frame exposure to start of
> > +        next exposure, expressed in microseconds.

Isn't this a bit poor ? Should we at least specify this is meant to be
returned in metadata only ?


> > +
> > +  - FrameDurationLimits:
> >        type: int64_t
> >        description: |
> >          The minimum and maximum (in that order) frame duration,
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 8ae47c6d..6e17753f 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -980,9 +980,9 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
> >  		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
> >  	}
> >
> > -	controls[&controls::FrameDurations] = ControlInfo(frameDurations[0],
> > -							  frameDurations[1],
> > -							  frameDurations[2]);
> > +	controls[&controls::FrameDuration] = ControlInfo(frameDurations[0],
> > +							 frameDurations[1],
> > +							 frameDurations[2]);
> >
> >  	/*
> >  	 * Compute the scaler crop limits.
>
> --
> Regards,
>
> Laurent Pinchart
Naushir Patuck May 24, 2021, 1:04 p.m. UTC | #3
Hi Paul,

Thank you for your work.

On Mon, 24 May 2021 at 10:41, Paul Elder <paul.elder@ideasonboard.com>
wrote:

> We need a separate control to report the nominal frame duration, but
> it's also useful to report the min/max frame duration values that will
> be used. Split the FrameDurations control into FrameDuration and
> FrameDurationLimits respectively to support both of these.
>
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> ---
>  include/libcamera/ipa/raspberrypi.h  | 2 +-
>  src/android/camera_device.cpp        | 2 +-
>  src/ipa/raspberrypi/raspberrypi.cpp  | 4 ++--
>  src/libcamera/control_ids.yaml       | 8 +++++++-
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 6 +++---
>  5 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.h
> b/include/libcamera/ipa/raspberrypi.h
> index d10c1733..a8790000 100644
> --- a/include/libcamera/ipa/raspberrypi.h
> +++ b/include/libcamera/ipa/raspberrypi.h
> @@ -44,7 +44,7 @@ static const ControlInfoMap Controls = {
>         { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
>         { &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },
>         { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535,
> 65535, 65535, 65535), Rectangle{}) },
> -       { &controls::FrameDurations, ControlInfo(INT64_C(1000),
> INT64_C(1000000000)) },
> +       { &controls::FrameDurationLimits, ControlInfo(INT64_C(1000),
> INT64_C(1000000000)) },
>         { &controls::draft::NoiseReductionMode,
> ControlInfo(controls::draft::NoiseReductionModeValues) },
>  };
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index b32e8be5..0eea2b95 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -824,7 +824,7 @@ const camera_metadata_t
> *CameraDevice::getStaticMetadata()
>
>         int64_t minFrameDurationNsec = -1;
>         int64_t maxFrameDurationNsec = -1;
> -       const auto frameDurationsInfo =
> controlsInfo.find(&controls::FrameDurations);
> +       const auto frameDurationsInfo =
> controlsInfo.find(&controls::FrameDurationLimits);
>         if (frameDurationsInfo != controlsInfo.end()) {
>                 minFrameDurationNsec =
> frameDurationsInfo->second.min().get<int64_t>() * 1000;
>                 maxFrameDurationNsec =
> frameDurationsInfo->second.max().get<int64_t>() * 1000;
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp
> b/src/ipa/raspberrypi/raspberrypi.cpp
> index 52d91db2..79a327e2 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -860,7 +860,7 @@ void IPARPi::queueRequest(const ControlList &controls)
>                         break;
>                 }
>
> -               case controls::FRAME_DURATIONS: {
> +               case controls::FRAME_DURATION_LIMITS: {
>                         auto frameDurations = ctrl.second.get<Span<const
> int64_t>>();
>                         applyFrameDurations(frameDurations[0],
> frameDurations[1]);
>                         break;
> @@ -1075,7 +1075,7 @@ void IPARPi::applyFrameDurations(double
> minFrameDuration, double maxFrameDuratio
>         maxFrameDuration_ = std::max(maxFrameDuration_, minFrameDuration_);
>
>         /* Return the validated limits via metadata. */
> -       libcameraMetadata_.set(controls::FrameDurations,
> +       libcameraMetadata_.set(controls::FrameDurationLimits,
>                                { static_cast<int64_t>(minFrameDuration_),
>                                  static_cast<int64_t>(maxFrameDuration_)
> });
>
> diff --git a/src/libcamera/control_ids.yaml
> b/src/libcamera/control_ids.yaml
> index 88d81ac4..338fbdc9 100644
> --- a/src/libcamera/control_ids.yaml
> +++ b/src/libcamera/control_ids.yaml
> @@ -323,7 +323,13 @@ controls:
>          step to respect the received gain factor and shall report
>          their total value in the request metadata.
>
> -  - FrameDurations:
> +  - FrameDuration:
> +      type: int64_t
> +      description: |
> +        The nominal frame duration from start of frame exposure to start
> of
> +        next exposure, expressed in microseconds.
>

Just a little nit-pick, is nominal the right word here?  If this control
were to return
the frame duration between frame N and frame N-1 for every frame, would it
be
better to replace nominal with instantaneous, as the control value would be
an
accurate representation of the inter-frame duration for that particular
frame.


> +
> +  - FrameDurationLimits:
>        type: int64_t
>        description: |
>          The minimum and maximum (in that order) frame duration,
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp
> b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 8ae47c6d..6e17753f 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -980,9 +980,9 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData
> *data)
>                 frameDurations[i] = frameSize / (sensorInfo.pixelRate /
> 1000000U);
>         }
>
> -       controls[&controls::FrameDurations] =
> ControlInfo(frameDurations[0],
> -
>  frameDurations[1],
> -
>  frameDurations[2]);
> +       controls[&controls::FrameDuration] = ControlInfo(frameDurations[0],
> +                                                        frameDurations[1],
> +
> frameDurations[2]);
>
>         /*
>          * Compute the scaler crop limits.
> --
> 2.27.0
>
>

Patch
diff mbox series

diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index d10c1733..a8790000 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -44,7 +44,7 @@  static const ControlInfoMap Controls = {
 	{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
 	{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },
 	{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
-	{ &controls::FrameDurations, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },
+	{ &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },
 	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
 };
 
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index b32e8be5..0eea2b95 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -824,7 +824,7 @@  const camera_metadata_t *CameraDevice::getStaticMetadata()
 
 	int64_t minFrameDurationNsec = -1;
 	int64_t maxFrameDurationNsec = -1;
-	const auto frameDurationsInfo = controlsInfo.find(&controls::FrameDurations);
+	const auto frameDurationsInfo = controlsInfo.find(&controls::FrameDurationLimits);
 	if (frameDurationsInfo != controlsInfo.end()) {
 		minFrameDurationNsec = frameDurationsInfo->second.min().get<int64_t>() * 1000;
 		maxFrameDurationNsec = frameDurationsInfo->second.max().get<int64_t>() * 1000;
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 52d91db2..79a327e2 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -860,7 +860,7 @@  void IPARPi::queueRequest(const ControlList &controls)
 			break;
 		}
 
-		case controls::FRAME_DURATIONS: {
+		case controls::FRAME_DURATION_LIMITS: {
 			auto frameDurations = ctrl.second.get<Span<const int64_t>>();
 			applyFrameDurations(frameDurations[0], frameDurations[1]);
 			break;
@@ -1075,7 +1075,7 @@  void IPARPi::applyFrameDurations(double minFrameDuration, double maxFrameDuratio
 	maxFrameDuration_ = std::max(maxFrameDuration_, minFrameDuration_);
 
 	/* Return the validated limits via metadata. */
-	libcameraMetadata_.set(controls::FrameDurations,
+	libcameraMetadata_.set(controls::FrameDurationLimits,
 			       { static_cast<int64_t>(minFrameDuration_),
 				 static_cast<int64_t>(maxFrameDuration_) });
 
diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml
index 88d81ac4..338fbdc9 100644
--- a/src/libcamera/control_ids.yaml
+++ b/src/libcamera/control_ids.yaml
@@ -323,7 +323,13 @@  controls:
         step to respect the received gain factor and shall report
         their total value in the request metadata.
 
-  - FrameDurations:
+  - FrameDuration:
+      type: int64_t
+      description: |
+        The nominal frame duration from start of frame exposure to start of
+        next exposure, expressed in microseconds.
+
+  - FrameDurationLimits:
       type: int64_t
       description: |
         The minimum and maximum (in that order) frame duration,
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 8ae47c6d..6e17753f 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -980,9 +980,9 @@  int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
 		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
 	}
 
-	controls[&controls::FrameDurations] = ControlInfo(frameDurations[0],
-							  frameDurations[1],
-							  frameDurations[2]);
+	controls[&controls::FrameDuration] = ControlInfo(frameDurations[0],
+							 frameDurations[1],
+							 frameDurations[2]);
 
 	/*
 	 * Compute the scaler crop limits.