[libcamera-devel] [PATCH 06/16] android: capabilties: Assume controls::FrameDurationLimits is supported

Jacopo Mondi jacopo at jmondi.org
Tue Aug 31 11:41:38 CEST 2021


Hi Paul,

On Tue, Aug 31, 2021 at 11:21:02AM +0900, Paul Elder wrote:
> Hi Jacopo,
>
> On Fri, Aug 27, 2021 at 02:07:47PM +0200, Jacopo Mondi wrote:
> > As we now collect the per-stream frame durations at
> > initializeStreamConfigurations() times, the Camera is now guaranteed to
> > support the controls::FrameDurationLimits control.
> >
> > Remove the check for its presence when populating the
> > ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES static metadata.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> >  src/android/camera_capabilities.cpp | 83 ++++++++++++++---------------
> >  1 file changed, 41 insertions(+), 42 deletions(-)
> >
> > diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
> > index 723a4fd5a880..c45d74189aaa 100644
> > --- a/src/android/camera_capabilities.cpp
> > +++ b/src/android/camera_capabilities.cpp
> > @@ -858,55 +858,54 @@ int CameraCapabilities::initializeStaticMetadata()
> >  	staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_MODES,
> >  				  aeAvailableModes);
> >
> > +	/* Initialize the AE frame duration limits. */
> >  	int64_t minFrameDurationNsec = -1;
> >  	int64_t maxFrameDurationNsec = -1;
> >  	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;
> > +	minFrameDurationNsec = frameDurationsInfo->second.min().get<int64_t>() * 1000;
> > +	maxFrameDurationNsec = frameDurationsInfo->second.max().get<int64_t>() * 1000;
>
> Why not just initialize these directly?

You're right, I'll do so!

Thanks
   j

>
>
> Otherwise, looks good.
>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
>
> >
> > -		/*
> > -		 * Adjust the minimum frame duration to comply with Android
> > -		 * requirements. The camera service mandates all preview/record
> > -		 * streams to have a minimum frame duration < 33,366 milliseconds
> > -		 * (see MAX_PREVIEW_RECORD_DURATION_NS in the camera service
> > -		 * implementation).
> > -		 *
> > -		 * If we're close enough (+ 500 useconds) to that value, round
> > -		 * the minimum frame duration of the camera to an accepted
> > -		 * value.
> > -		 */
> > -		static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / 29.97;
> > -		if (minFrameDurationNsec > MAX_PREVIEW_RECORD_DURATION_NS &&
> > -		    minFrameDurationNsec < MAX_PREVIEW_RECORD_DURATION_NS + 500000)
> > -			minFrameDurationNsec = MAX_PREVIEW_RECORD_DURATION_NS - 1000;
> > +	/*
> > +	 * Adjust the minimum frame duration to comply with Android
> > +	 * requirements. The camera service mandates all preview/record
> > +	 * streams to have a minimum frame duration < 33,366 milliseconds
> > +	 * (see MAX_PREVIEW_RECORD_DURATION_NS in the camera service
> > +	 * implementation).
> > +	 *
> > +	 * If we're close enough (+ 500 useconds) to that value, round
> > +	 * the minimum frame duration of the camera to an accepted
> > +	 * value.
> > +	 */
> > +	static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / 29.97;
> > +	if (minFrameDurationNsec > MAX_PREVIEW_RECORD_DURATION_NS &&
> > +	    minFrameDurationNsec < MAX_PREVIEW_RECORD_DURATION_NS + 500000)
> > +		minFrameDurationNsec = MAX_PREVIEW_RECORD_DURATION_NS - 1000;
> >
> > -		/*
> > -		 * The AE routine frame rate limits are computed using the frame
> > -		 * duration limits, as libcamera clips the AE routine to the
> > -		 * frame durations.
> > -		 */
> > -		int32_t maxFps = std::round(1e9 / minFrameDurationNsec);
> > -		int32_t minFps = std::round(1e9 / maxFrameDurationNsec);
> > -		minFps = std::max(1, minFps);
> > +	/*
> > +	 * The AE routine frame rate limits are computed using the frame
> > +	 * duration limits, as libcamera clips the AE routine to the
> > +	 * frame durations.
> > +	 */
> > +	int32_t maxFps = std::round(1e9 / minFrameDurationNsec);
> > +	int32_t minFps = std::round(1e9 / maxFrameDurationNsec);
> > +	minFps = std::max(1, minFps);
> >
> > -		/*
> > -		 * Force rounding errors so that we have the proper frame
> > -		 * durations for when we reuse these variables later
> > -		 */
> > -		minFrameDurationNsec = 1e9 / maxFps;
> > -		maxFrameDurationNsec = 1e9 / minFps;
> > +	/*
> > +	 * Force rounding errors so that we have the proper frame
> > +	 * durations for when we reuse these variables later
> > +	 */
> > +	minFrameDurationNsec = 1e9 / maxFps;
> > +	maxFrameDurationNsec = 1e9 / minFps;
> >
> > -		/*
> > -		 * Register to the camera service {min, max} and {max, max}
> > -		 * intervals as requested by the metadata documentation.
> > -		 */
> > -		int32_t availableAeFpsTarget[] = {
> > -			minFps, maxFps, maxFps, maxFps
> > -		};
> > -		staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
> > -					  availableAeFpsTarget);
> > -	}
> > +	/*
> > +	 * Register to the camera service {min, max} and {max, max}
> > +	 * intervals as requested by the metadata documentation.
> > +	 */
> > +	int32_t availableAeFpsTarget[] = {
> > +		minFps, maxFps, maxFps, maxFps
> > +	};
> > +	staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
> > +				  availableAeFpsTarget);
> >
> >  	std::vector<int32_t> aeCompensationRange = {
> >  		0, 0,
> > --
> > 2.32.0
> >


More information about the libcamera-devel mailing list