[libcamera-devel] [PATCH] android: camera_mode: Resize 'data' vectors
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Dec 1 16:06:30 CET 2020
Hi Jacopo,
Thank you for the patch.
On Tue, Dec 01, 2020 at 04:00:56PM +0100, Jacopo Mondi wrote:
> The CameraDevice::getStaticMetadata() function populates the
> entries for Android's static metadata by walking the ControlInfo
> supported values reported by the libcamera pipeline.
>
> For each entry a vector of the size of the maximum number of possible
> entries is reserved, populated and then stored in the Android's metadata
> pack.
>
> The number of actual entries to be passed to Android is computed using
> the vector's size which, for this reason, shall be resized to the actual
> number of entries it stores.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> This patch fixes cros_camera_test:
> Camera3DeviceTest/Camera3DeviceDefaultSettings.ConstructDefaultSettings/1
> ---
> src/android/camera_device.cpp | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index d43db3600b20..d559f0fc4b81 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -602,8 +602,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
> if (infoMap != controlsInfo.end()) {
> for (const auto &value : infoMap->second.values())
> data.push_back(value.get<int32_t>());
> + data.resize(infoMap->second.values().size());
> } else {
> data.push_back(ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF);
> + data.resize(1);
> }
Wouldn't it be better to avoid creating the vector with a too large size
then ? Maybe something along the lines of the following ?
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 4690346e05cb..a4d4914c2f80 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -596,7 +596,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
/* Color correction static metadata. */
{
- std::vector<uint8_t> data(3);
+ std::vector<uint8_t> data;
+ data.reserve(3);
const auto &infoMap = controlsInfo.find(&controls::draft::ColorCorrectionAberrationMode);
if (infoMap != controlsInfo.end()) {
for (const auto &value : infoMap->second.values())
> staticMetadata_->addEntry(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
> data.data(), data.size());
> @@ -803,8 +805,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
> if (infoMap != controlsInfo.end()) {
> for (const auto &value : infoMap->second.values())
> data.push_back(value.get<int32_t>());
> + data.resize(infoMap->second.values().size());
> } else {
> data.push_back(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF);
> + data.resize(1);
> }
> staticMetadata_->addEntry(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES,
> data.data(), data.size());
> @@ -871,8 +875,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
> if (infoMap != controlsInfo.end()) {
> for (const auto &value : infoMap->second.values())
> data.push_back(value.get<int32_t>());
> + data.resize(infoMap->second.values().size());
> } else {
> data.push_back(ANDROID_NOISE_REDUCTION_MODE_OFF);
> + data.resize(1);
> }
> staticMetadata_->addEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
> data.data(), data.size());
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list