[libcamera-devel] [PATCH v2 1/3] controls: Split FrameDurations into FrameDuration and FrameDurationLimits
Naushir Patuck
naush at raspberrypi.com
Mon May 24 15:04:38 CEST 2021
Hi Paul,
Thank you for your work.
On Mon, 24 May 2021 at 10:41, Paul Elder <paul.elder at 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 at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210524/2ca08e31/attachment.htm>
More information about the libcamera-devel
mailing list