[libcamera-devel] [PATCH v3 8/8] android: camera_device: Report frame durations
Jacopo Mondi
jacopo at jmondi.org
Fri Jun 5 16:10:02 CEST 2020
Report the minimum frame durations for each collected stream
configuration by inspecting the camera reported FrameDurationLimits
property.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/android/camera_device.cpp | 33 +++++++++++++++++++++++++++++----
src/android/camera_device.h | 3 ++-
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index bbfc2464c908..fdcbada754f6 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -175,7 +175,7 @@ int CameraDevice::initialize()
return ret;
}
- ret = initializeStreamConfigurations();
+ ret = initializeStreamConfigurations(properties);
camera_->release();
return ret;
}
@@ -186,8 +186,27 @@ int CameraDevice::initialize()
* stream configurations to be reported to the Android camera framework through
* the static stream configuration metadata.
*/
-int CameraDevice::initializeStreamConfigurations()
+int CameraDevice::initializeStreamConfigurations(const ControlList &properties)
{
+ /*
+ * Collect minimum frame durations from the camera. Default to it
+ * 33.3 msec if the camera does not report frame duration information.
+ *
+ * \todo The frame durations interval reported by the camera through the
+ * FrameDurationLimits property represents the camera minimum and
+ * maximum durations, regardless of the currently configured image
+ * format and resolution. As we are currently missing an API to report
+ * the frame durations for a specific configuration and Android requires
+ * the minimum frame duration to be reported per-configuration, as of
+ * now report the duration value for all supported stream
+ * configurations.
+ */
+ int64_t minFrameDuration = 33333333;
+ if (properties.contains(properties::FrameDurationLimits)) {
+ Span<const int32_t> durationLimits = properties.get(properties::FrameDurationLimits);
+ minFrameDuration = static_cast<int64_t>(durationLimits[0]);
+ }
+
/*
* Get the maximum output resolutions
* \todo Get this from the camera properties once defined
@@ -316,7 +335,13 @@ int CameraDevice::initializeStreamConfigurations()
status != CameraConfiguration::Valid)
continue;
- streamConfigurations_.push_back({ res, camera3Format.scalerFormat });
+ /*
+ * Default the minimum frame duration and update it
+ * later.
+ */
+ streamConfigurations_.push_back({ res,
+ camera3Format.scalerFormat,
+ minFrameDuration });
}
}
@@ -691,7 +716,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
minFrameDurations.push_back(entry.androidScalerCode);
minFrameDurations.push_back(entry.resolution.width);
minFrameDurations.push_back(entry.resolution.height);
- minFrameDurations.push_back(33333333);
+ minFrameDurations.push_back(entry.minFrameDuration);
}
staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
minFrameDurations.data(),
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index ed11410a5577..b689d67263b0 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -66,9 +66,10 @@ private:
struct Camera3StreamConfiguration {
libcamera::Size resolution;
int androidScalerCode;
+ int64_t minFrameDuration;
};
- int initializeStreamConfigurations();
+ int initializeStreamConfigurations(const libcamera::ControlList &properties);
std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();
void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
--
2.27.0
More information about the libcamera-devel
mailing list