[libcamera-devel] [PATCH] android: camera_device: Always add mandatory metadata entries
Phi-Bang Nguyen
pnguyen at baylibre.com
Sun Mar 28 22:17:15 CEST 2021
The following static metadata entries are mandatory. Without them,
the Android camera service cannot work properly and application will
fail to start (error: "This device doesn't support camera2 API"):
- ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES
- ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS
Fixes: edd4b1dab26b ("android: camera_device: Compute frame durations")
Signed-off-by: Phi-Bang Nguyen <pnguyen at baylibre.com>
---
src/android/camera_device.cpp | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index a8108e3a..4b5d8f97 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -769,6 +769,9 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
int64_t minFrameDurationNsec = -1;
int64_t maxFrameDurationNsec = -1;
+ std::vector<int32_t> availableAeFpsTarget = {
+ 15, 30, 30, 30,
+ };
const auto frameDurationsInfo = controlsInfo.find(&controls::FrameDurations);
if (frameDurationsInfo != controlsInfo.end()) {
minFrameDurationNsec = frameDurationsInfo->second.min().get<int64_t>() * 1000;
@@ -803,12 +806,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
* Register to the camera service {min, max} and {max, max}
* intervals as requested by the metadata documentation.
*/
- int32_t availableAeFpsTarget[] = {
+ availableAeFpsTarget = {
minFps, maxFps, maxFps, maxFps
};
- staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
- availableAeFpsTarget, 4);
}
+ staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
+ availableAeFpsTarget.data(), availableAeFpsTarget.size());
std::vector<int32_t> aeCompensationRange = {
0, 0,
@@ -1140,19 +1143,20 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
availableStallDurations.size());
/* Use the minimum frame duration for all the YUV/RGB formats. */
- if (minFrameDurationNsec > 0) {
- std::vector<int64_t> minFrameDurations;
- minFrameDurations.reserve(streamConfigurations_.size() * 4);
- for (const auto &entry : streamConfigurations_) {
- minFrameDurations.push_back(entry.androidFormat);
- minFrameDurations.push_back(entry.resolution.width);
- minFrameDurations.push_back(entry.resolution.height);
+ std::vector<int64_t> minFrameDurations;
+ minFrameDurations.reserve(streamConfigurations_.size() * 4);
+ for (const auto &entry : streamConfigurations_) {
+ minFrameDurations.push_back(entry.androidFormat);
+ minFrameDurations.push_back(entry.resolution.width);
+ minFrameDurations.push_back(entry.resolution.height);
+ if (minFrameDurationNsec > 0)
minFrameDurations.push_back(minFrameDurationNsec);
- }
- staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
- minFrameDurations.data(),
- minFrameDurations.size());
+ else
+ minFrameDurations.push_back(33333333);
}
+ staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+ minFrameDurations.data(),
+ minFrameDurations.size());
uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
staticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1);
--
2.25.1
More information about the libcamera-devel
mailing list