blob: 4eeff6776bd9d3d829d9c937c8f47a4e662c6d07 [file] [log] [blame]
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01001/*
Biswarup Pal6152a302023-12-19 12:44:09 +00002 * Copyright 2023 The Android Open Source Project
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// #define LOG_NDEBUG 0
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +010018#define LOG_TAG "MetadataUtil"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010019
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +010020#include "MetadataUtil.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010021
22#include <algorithm>
23#include <cstdint>
24#include <iterator>
25#include <memory>
Vadim Caen11dfd932024-03-05 09:57:20 +010026#include <optional>
Vadim Caenc0aff132024-03-12 17:20:07 +010027#include <string>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010028#include <utility>
29#include <variant>
30#include <vector>
31
32#include "CameraMetadata.h"
33#include "aidl/android/hardware/camera/device/CameraMetadata.h"
34#include "log/log.h"
35#include "system/camera_metadata.h"
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010036#include "util/Util.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010037#include "utils/Errors.h"
38
39namespace android {
40namespace companion {
41namespace virtualcamera {
42
43namespace {
44
45using ::android::hardware::camera::common::helper::CameraMetadata;
46
47template <typename To, typename From>
48std::vector<To> convertTo(const std::vector<From>& from) {
49 std::vector<To> to;
50 to.reserve(from.size());
51 std::transform(from.begin(), from.end(), std::back_inserter(to),
52 [](const From& x) { return static_cast<To>(x); });
53 return to;
54}
55
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010056template <typename To, typename From>
57std::vector<To> asVectorOf(const From from) {
58 return std::vector<To>({static_cast<To>(from)});
59}
60
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010061} // namespace
62
63MetadataBuilder& MetadataBuilder::setSupportedHardwareLevel(
Vadim Caen11dfd932024-03-05 09:57:20 +010064 const camera_metadata_enum_android_info_supported_hardware_level_t hwLevel) {
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010065 mEntryMap[ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010066 asVectorOf<uint8_t>(hwLevel);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010067 return *this;
68}
69
Biswarup Pal37a75182024-01-16 15:53:35 +000070MetadataBuilder& MetadataBuilder::setDeviceId(int32_t deviceId) {
71 mEntryMap[ANDROID_INFO_DEVICE_ID] = std::vector<int32_t>({deviceId});
72 return *this;
73}
74
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010075MetadataBuilder& MetadataBuilder::setFlashAvailable(bool flashAvailable) {
76 const uint8_t metadataVal = flashAvailable
77 ? ANDROID_FLASH_INFO_AVAILABLE_TRUE
78 : ANDROID_FLASH_INFO_AVAILABLE_FALSE;
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010079 mEntryMap[ANDROID_FLASH_INFO_AVAILABLE] = asVectorOf<uint8_t>(metadataVal);
80 return *this;
81}
82
83MetadataBuilder& MetadataBuilder::setFlashState(
84 const camera_metadata_enum_android_flash_state_t flashState) {
85 mEntryMap[ANDROID_FLASH_STATE] = asVectorOf<uint8_t>(flashState);
86 return *this;
87}
88
89MetadataBuilder& MetadataBuilder::setFlashMode(
90 const camera_metadata_enum_android_flash_mode_t flashMode) {
91 mEntryMap[ANDROID_FLASH_MODE] = asVectorOf<uint8_t>(flashMode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010092 return *this;
93}
94
95MetadataBuilder& MetadataBuilder::setLensFacing(
Vadim Caen11dfd932024-03-05 09:57:20 +010096 const camera_metadata_enum_android_lens_facing lensFacing) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010097 mEntryMap[ANDROID_LENS_FACING] = asVectorOf<uint8_t>(lensFacing);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010098 return *this;
99}
100
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +0100101MetadataBuilder& MetadataBuilder::setSensorReadoutTimestamp(
102 const camera_metadata_enum_android_sensor_readout_timestamp_t
103 sensorReadoutTimestamp) {
104 mEntryMap[ANDROID_SENSOR_READOUT_TIMESTAMP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100105 asVectorOf<uint8_t>(sensorReadoutTimestamp);
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +0100106 return *this;
107}
108
Biswarup Pal8ad8bc52024-02-08 13:41:44 +0000109MetadataBuilder& MetadataBuilder::setAvailableFocalLengths(
110 const std::vector<float>& focalLengths) {
Biswarup Pald9be04d2024-01-31 14:35:15 +0000111 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
112 return *this;
113}
114
Biswarup Pal8ad8bc52024-02-08 13:41:44 +0000115MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
116 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = asVectorOf<float>(focalLength);
117 return *this;
118}
119
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100120MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100121 mEntryMap[ANDROID_SENSOR_ORIENTATION] = asVectorOf<int32_t>(sensorOrientation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100122 return *this;
123}
124
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100125MetadataBuilder& MetadataBuilder::setSensorTimestampSource(
126 const camera_metadata_enum_android_sensor_info_timestamp_source_t
127 timestampSource) {
128 mEntryMap[ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100129 asVectorOf<uint8_t>(timestampSource);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100130 return *this;
131}
132
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100133MetadataBuilder& MetadataBuilder::setSensorTimestamp(
134 std::chrono::nanoseconds timestamp) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100135 mEntryMap[ANDROID_SENSOR_TIMESTAMP] = asVectorOf<int64_t>(timestamp.count());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100136 return *this;
137}
138
139MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
140 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
141 faceDetectModes) {
142 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
143 convertTo<uint8_t>(faceDetectModes);
144 return *this;
145}
146
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100147MetadataBuilder& MetadataBuilder::setAvailableTestPatternModes(
148 const std::vector<camera_metadata_enum_android_sensor_test_pattern_mode>&
149 testPatternModes) {
150 mEntryMap[ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES] =
151 convertTo<int32_t>(testPatternModes);
152 return *this;
153}
154
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100155MetadataBuilder& MetadataBuilder::setFaceDetectMode(
156 const camera_metadata_enum_android_statistics_face_detect_mode_t
157 faceDetectMode) {
158 mEntryMap[ANDROID_STATISTICS_FACE_DETECT_MODE] =
159 asVectorOf<uint8_t>(faceDetectMode);
160 return *this;
161}
162
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100163MetadataBuilder& MetadataBuilder::setControlAvailableModes(
164 const std::vector<camera_metadata_enum_android_control_mode_t>&
165 availableModes) {
166 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
167 convertTo<uint8_t>(availableModes);
168 return *this;
169}
170
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100171MetadataBuilder& MetadataBuilder::setControlMode(
172 const camera_metadata_enum_android_control_mode_t mode) {
173 mEntryMap[ANDROID_CONTROL_MODE] = asVectorOf<uint8_t>(mode);
174 return *this;
175}
176
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100177MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
178 const std::vector<camera_metadata_enum_android_control_scene_mode>&
179 availableSceneModes) {
180 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
181 convertTo<uint8_t>(availableSceneModes);
182 return *this;
183}
184
Vadim Caen11dfd932024-03-05 09:57:20 +0100185MetadataBuilder& MetadataBuilder::setControlSceneMode(
186 const camera_metadata_enum_android_control_scene_mode sceneMode) {
187 mEntryMap[ANDROID_CONTROL_SCENE_MODE] = asVectorOf<uint8_t>(sceneMode);
188 return *this;
189}
190
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100191MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
192 const std::vector<camera_metadata_enum_android_control_effect_mode>&
193 availableEffects) {
194 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
195 convertTo<uint8_t>(availableEffects);
196 return *this;
197}
198
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100199MetadataBuilder& MetadataBuilder::setControlEffectMode(
200 const camera_metadata_enum_android_control_effect_mode_t effectMode) {
201 mEntryMap[ANDROID_CONTROL_EFFECT_MODE] = asVectorOf<uint8_t>(effectMode);
202 return *this;
203}
204
205MetadataBuilder& MetadataBuilder::setControlAvailableVideoStabilizationModes(
206 const std::vector<
207 camera_metadata_enum_android_control_video_stabilization_mode_t>&
208 videoStabilizationModes) {
209 mEntryMap[ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES] =
210 convertTo<uint8_t>(videoStabilizationModes);
211 return *this;
212}
213
Vadim Caen11dfd932024-03-05 09:57:20 +0100214MetadataBuilder& MetadataBuilder::setControlVideoStabilizationMode(
215 const camera_metadata_enum_android_control_video_stabilization_mode
216 stabilizationMode) {
217 mEntryMap[ANDROID_CONTROL_VIDEO_STABILIZATION_MODE] =
218 asVectorOf<uint8_t>(stabilizationMode);
219 return *this;
220}
221
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100222MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
223 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
224 availableModes) {
225 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
226 convertTo<uint8_t>(availableModes);
227 return *this;
228}
229
230MetadataBuilder& MetadataBuilder::setControlAfMode(
231 const camera_metadata_enum_android_control_af_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100232 mEntryMap[ANDROID_CONTROL_AF_MODE] = asVectorOf<uint8_t>(mode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100233 return *this;
234}
235
Vadim Caen11dfd932024-03-05 09:57:20 +0100236MetadataBuilder& MetadataBuilder::setControlAfState(
237 const camera_metadata_enum_android_control_af_state afState) {
238 mEntryMap[ANDROID_CONTROL_AF_STATE] = asVectorOf<uint8_t>(afState);
239 return *this;
240}
241
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100242// See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
243MetadataBuilder& MetadataBuilder::setControlAfTrigger(
244 const camera_metadata_enum_android_control_af_trigger_t trigger) {
245 mEntryMap[ANDROID_CONTROL_AF_TRIGGER] = asVectorOf<uint8_t>(trigger);
246 return *this;
247}
248
249MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRanges(
250 const std::vector<FpsRange>& fpsRanges) {
251 std::vector<int32_t> ranges;
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100252 ranges.reserve(2 * fpsRanges.size());
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100253 for (const FpsRange fpsRange : fpsRanges) {
254 ranges.push_back(fpsRange.minFps);
255 ranges.push_back(fpsRange.maxFps);
256 }
257 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] = std::move(ranges);
258 return *this;
259}
260
261MetadataBuilder& MetadataBuilder::setControlAeTargetFpsRange(
Vadim Caen11dfd932024-03-05 09:57:20 +0100262 const FpsRange fpsRange) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100263 mEntryMap[ANDROID_CONTROL_AE_TARGET_FPS_RANGE] =
Vadim Caen11dfd932024-03-05 09:57:20 +0100264 std::vector<int32_t>({fpsRange.minFps, fpsRange.maxFps});
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100265 return *this;
266}
267
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100268MetadataBuilder& MetadataBuilder::setControlAeMode(
Vadim Caen11dfd932024-03-05 09:57:20 +0100269 const camera_metadata_enum_android_control_ae_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100270 mEntryMap[ANDROID_CONTROL_AE_MODE] = asVectorOf<uint8_t>(mode);
271 return *this;
272}
273
274MetadataBuilder& MetadataBuilder::setControlAeAvailableModes(
275 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes) {
276 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_MODES] = convertTo<uint8_t>(modes);
277 return *this;
278}
279
280MetadataBuilder& MetadataBuilder::setControlAePrecaptureTrigger(
281 const camera_metadata_enum_android_control_ae_precapture_trigger_t trigger) {
282 mEntryMap[ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER] =
283 asVectorOf<uint8_t>(trigger);
284 return *this;
285}
286
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100287MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
288 int32_t maxAwbRegions,
289 int32_t maxAfRegions) {
290 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
291 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
292 return *this;
293}
294
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100295MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
296 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
297 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
298 return *this;
299}
300
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100301MetadataBuilder& MetadataBuilder::setControlAwbMode(
302 const camera_metadata_enum_android_control_awb_mode awbMode) {
303 mEntryMap[ANDROID_CONTROL_AWB_MODE] = asVectorOf<uint8_t>(awbMode);
304 return *this;
305}
306
Vadim Caen11dfd932024-03-05 09:57:20 +0100307MetadataBuilder& MetadataBuilder::setControlAwbState(
308 const camera_metadata_enum_android_control_awb_state awbState) {
309 mEntryMap[ANDROID_CONTROL_AWB_STATE] = asVectorOf<uint8_t>(awbState);
310 return *this;
311}
312
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100313MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
314 const bool awbLockAvailable) {
315 const uint8_t lockAvailable = awbLockAvailable
316 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
317 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
318 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
319 std::vector<uint8_t>({lockAvailable});
320 return *this;
321}
322
Vadim Caen11dfd932024-03-05 09:57:20 +0100323MetadataBuilder& MetadataBuilder::setControlAwbLock(
324 const camera_metadata_enum_android_control_awb_lock awbLock) {
325 mEntryMap[ANDROID_CONTROL_AWB_LOCK] = asVectorOf<uint8_t>(awbLock);
326 return *this;
327}
328
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100329MetadataBuilder& MetadataBuilder::setControlAeAvailableAntibandingModes(
330 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
331 antibandingModes) {
332 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES] =
333 convertTo<uint8_t>(antibandingModes);
334 return *this;
335}
336
337MetadataBuilder& MetadataBuilder::setControlAeAntibandingMode(
338 const camera_metadata_enum_android_control_ae_antibanding_mode_t
339 antibandingMode) {
340 mEntryMap[ANDROID_CONTROL_AE_ANTIBANDING_MODE] =
341 asVectorOf<uint8_t>(antibandingMode);
342 return *this;
343}
344
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100345MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
346 const bool aeLockAvailable) {
347 const uint8_t lockAvailable = aeLockAvailable
348 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
349 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
350 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100351 asVectorOf<uint8_t>(lockAvailable);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100352 return *this;
353}
354
Vadim Caen11dfd932024-03-05 09:57:20 +0100355MetadataBuilder& MetadataBuilder::setControlAeLock(
356 const camera_metadata_enum_android_control_ae_lock aeLock) {
357 mEntryMap[ANDROID_CONTROL_AE_LOCK] = asVectorOf<uint8_t>(aeLock);
358 return *this;
359}
360
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100361MetadataBuilder& MetadataBuilder::setControlAeRegions(
362 const std::vector<ControlRegion>& aeRegions) {
363 std::vector<int32_t> regions;
364 regions.reserve(5 * aeRegions.size());
365 for (const ControlRegion& region : aeRegions) {
366 regions.push_back(region.x0);
367 regions.push_back(region.y0);
368 regions.push_back(region.x1);
369 regions.push_back(region.y1);
370 regions.push_back(region.weight);
371 }
372 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
373 return *this;
374}
375
376MetadataBuilder& MetadataBuilder::setControlAfRegions(
377 const std::vector<ControlRegion>& afRegions) {
378 std::vector<int32_t> regions;
379 regions.reserve(5 * afRegions.size());
380 for (const ControlRegion& region : afRegions) {
381 regions.push_back(region.x0);
382 regions.push_back(region.y0);
383 regions.push_back(region.x1);
384 regions.push_back(region.y1);
385 regions.push_back(region.weight);
386 }
387 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
388 return *this;
389}
390
391MetadataBuilder& MetadataBuilder::setControlAwbRegions(
392 const std::vector<ControlRegion>& awbRegions) {
393 std::vector<int32_t> regions;
394 regions.reserve(5 * awbRegions.size());
395 for (const ControlRegion& region : awbRegions) {
396 regions.push_back(region.x0);
397 regions.push_back(region.y0);
398 regions.push_back(region.x1);
399 regions.push_back(region.y1);
400 regions.push_back(region.weight);
401 }
402 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
403 return *this;
404}
405
406MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
407 const camera_metadata_enum_android_control_capture_intent_t intent) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100408 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] = asVectorOf<uint8_t>(intent);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100409 return *this;
410}
411
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100412MetadataBuilder& MetadataBuilder::setCropRegion(const int32_t x, const int32_t y,
413 const int32_t width,
414 const int32_t height) {
415 mEntryMap[ANDROID_SCALER_CROP_REGION] =
416 std::vector<int32_t>({x, y, width, height});
417 return *this;
418}
419
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100420MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100421 mEntryMap[ANDROID_JPEG_MAX_SIZE] = asVectorOf<int32_t>(size);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100422 return *this;
423}
424
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100425MetadataBuilder& MetadataBuilder::setMaxFrameDuration(
426 const std::chrono::nanoseconds duration) {
427 mEntryMap[ANDROID_SENSOR_INFO_MAX_FRAME_DURATION] =
428 asVectorOf<int64_t>(duration.count());
429 return *this;
430}
431
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100432MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
433 const std::vector<Resolution>& thumbnailSizes) {
434 std::vector<int32_t> sizes;
435 sizes.reserve(thumbnailSizes.size() * 2);
436 for (const Resolution& resolution : thumbnailSizes) {
437 sizes.push_back(resolution.width);
438 sizes.push_back(resolution.height);
439 }
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100440 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = std::move(sizes);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100441 return *this;
442}
443
Vadim Caenc0aff132024-03-12 17:20:07 +0100444MetadataBuilder& MetadataBuilder::setJpegGpsCoordinates(
445 const GpsCoordinates& gpsCoordinates) {
446 mEntryMap[ANDROID_JPEG_GPS_COORDINATES] =
447 std::vector<double>({gpsCoordinates.latitude, gpsCoordinates.longitude,
448 gpsCoordinates.altitude});
449
450 if (!gpsCoordinates.provider.empty()) {
451 mEntryMap[ANDROID_JPEG_GPS_PROCESSING_METHOD] = std::vector<uint8_t>{
452 gpsCoordinates.provider.begin(), gpsCoordinates.provider.end()};
453 }
454
455 if (gpsCoordinates.timestamp.has_value()) {
456 mEntryMap[ANDROID_JPEG_GPS_TIMESTAMP] =
457 asVectorOf<int64_t>(gpsCoordinates.timestamp.value());
458 }
459 return *this;
460}
461
462MetadataBuilder& MetadataBuilder::setJpegOrientation(const int32_t orientation) {
463 mEntryMap[ANDROID_JPEG_ORIENTATION] = asVectorOf<int32_t>(orientation);
464 return *this;
465}
466
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100467MetadataBuilder& MetadataBuilder::setJpegQuality(const uint8_t quality) {
468 mEntryMap[ANDROID_JPEG_QUALITY] = asVectorOf<uint8_t>(quality);
469 return *this;
470}
471
472MetadataBuilder& MetadataBuilder::setJpegThumbnailSize(const int width,
473 const int height) {
474 mEntryMap[ANDROID_JPEG_THUMBNAIL_SIZE] = std::vector<int32_t>({width, height});
475 return *this;
476}
477
478MetadataBuilder& MetadataBuilder::setJpegThumbnailQuality(const uint8_t quality) {
479 mEntryMap[ANDROID_JPEG_THUMBNAIL_QUALITY] = asVectorOf<uint8_t>(quality);
480 return *this;
481}
482
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100483MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
484 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
485 const int32_t maxStallStreams) {
486 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
487 {maxRawStreams, maxProcessedStreams, maxStallStreams});
488 return *this;
489}
490
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100491MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
Vadim Caen11dfd932024-03-05 09:57:20 +0100492 const camera_metadata_enum_android_sync_max_latency latency) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100493 mEntryMap[ANDROID_SYNC_MAX_LATENCY] = asVectorOf<int32_t>(latency);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100494 return *this;
495}
496
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100497MetadataBuilder& MetadataBuilder::setPipelineMaxDepth(const uint8_t maxDepth) {
498 mEntryMap[ANDROID_REQUEST_PIPELINE_MAX_DEPTH] = asVectorOf<uint8_t>(maxDepth);
499 return *this;
500}
501
502MetadataBuilder& MetadataBuilder::setPipelineDepth(const uint8_t depth) {
503 mEntryMap[ANDROID_REQUEST_PIPELINE_DEPTH] = asVectorOf<uint8_t>(depth);
504 return *this;
505}
506
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100507MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
508 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
509 requestCapabilities) {
510 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
511 convertTo<uint8_t>(requestCapabilities);
512 return *this;
513}
514
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100515MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
516 const std::vector<StreamConfiguration>& streamConfigurations) {
517 std::vector<int32_t> metadataStreamConfigs;
518 std::vector<int64_t> metadataMinFrameDurations;
519 std::vector<int64_t> metadataStallDurations;
520 metadataStreamConfigs.reserve(streamConfigurations.size());
521 metadataMinFrameDurations.reserve(streamConfigurations.size());
522 metadataStallDurations.reserve(streamConfigurations.size());
523
524 for (const auto& config : streamConfigurations) {
525 metadataStreamConfigs.push_back(config.format);
526 metadataStreamConfigs.push_back(config.width);
527 metadataStreamConfigs.push_back(config.height);
528 metadataStreamConfigs.push_back(
529 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
530
531 metadataMinFrameDurations.push_back(config.format);
532 metadataMinFrameDurations.push_back(config.width);
533 metadataMinFrameDurations.push_back(config.height);
534 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
535
536 metadataStallDurations.push_back(config.format);
537 metadataStallDurations.push_back(config.width);
538 metadataStallDurations.push_back(config.height);
539 metadataStallDurations.push_back(config.minStallDuration.count());
540 }
541
542 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100543 std::move(metadataStreamConfigs);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100544 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100545 std::move(metadataMinFrameDurations);
546 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
547 std::move(metadataStallDurations);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100548
549 return *this;
550}
551
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100552MetadataBuilder& MetadataBuilder::setAvailableAberrationCorrectionModes(
553 const std::vector<camera_metadata_enum_android_color_correction_aberration_mode>&
554 aberrationCorectionModes) {
555 mEntryMap[ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES] =
556 convertTo<uint8_t>(aberrationCorectionModes);
557 return *this;
558}
559
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100560MetadataBuilder& MetadataBuilder::setAberrationCorrectionMode(
561 const camera_metadata_enum_android_color_correction_aberration_mode
562 aberrationCorrectionMode) {
563 mEntryMap[ANDROID_COLOR_CORRECTION_ABERRATION_MODE] =
564 asVectorOf<uint8_t>(aberrationCorrectionMode);
565 return *this;
566}
567
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100568MetadataBuilder& MetadataBuilder::setAvailableNoiseReductionModes(
569 const std::vector<camera_metadata_enum_android_noise_reduction_mode>&
570 noiseReductionModes) {
571 mEntryMap[ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES] =
572 convertTo<uint8_t>(noiseReductionModes);
573 return *this;
574}
575
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100576MetadataBuilder& MetadataBuilder::setNoiseReductionMode(
Vadim Caen11dfd932024-03-05 09:57:20 +0100577 const camera_metadata_enum_android_noise_reduction_mode noiseReductionMode) {
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100578 mEntryMap[ANDROID_NOISE_REDUCTION_MODE] =
579 asVectorOf<uint8_t>(noiseReductionMode);
580 return *this;
581}
582
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100583MetadataBuilder& MetadataBuilder::setRequestPartialResultCount(
584 const int partialResultCount) {
585 mEntryMap[ANDROID_REQUEST_PARTIAL_RESULT_COUNT] =
586 asVectorOf<int32_t>(partialResultCount);
587 return *this;
588}
589
590MetadataBuilder& MetadataBuilder::setCroppingType(
591 const camera_metadata_enum_android_scaler_cropping_type croppingType) {
592 mEntryMap[ANDROID_SCALER_CROPPING_TYPE] = asVectorOf<uint8_t>(croppingType);
593 return *this;
594}
595
596MetadataBuilder& MetadataBuilder::setMaxFaceCount(const int maxFaceCount) {
597 mEntryMap[ANDROID_STATISTICS_INFO_MAX_FACE_COUNT] =
598 asVectorOf<int32_t>(maxFaceCount);
599 return *this;
600}
601
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100602MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
603 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100604 asVectorOf<float>(maxZoom);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100605 return *this;
606}
607
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100608MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
609 const float max) {
610 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
611 return *this;
612}
613
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100614MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
615 int x1, int y1) {
616 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
617 std::vector<int32_t>({x0, y0, x1, y1});
618 return *this;
619}
620
Biswarup Pald9be04d2024-01-31 14:35:15 +0000621MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
622 int height) {
623 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
624 std::vector<int32_t>({width, height});
625 return *this;
626}
627
628MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
629 float height) {
630 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
631 std::vector<float>({width, height});
632 return *this;
633}
634
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100635MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
636 int32_t max) {
637 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
638 std::vector<int32_t>({min, max});
639 return *this;
640}
641
642MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
643 const camera_metadata_rational step) {
644 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100645 asVectorOf<camera_metadata_rational>(step);
646 return *this;
647}
648
649MetadataBuilder& MetadataBuilder::setControlAeExposureCompensation(
650 const int32_t exposureCompensation) {
651 mEntryMap[ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION] =
652 asVectorOf<int32_t>(exposureCompensation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100653 return *this;
654}
655
Vadim Caen11dfd932024-03-05 09:57:20 +0100656MetadataBuilder& MetadataBuilder::setControlAeState(
657 const camera_metadata_enum_android_control_ae_state aeState) {
658 mEntryMap[ANDROID_CONTROL_AE_STATE] = asVectorOf<uint8_t>(aeState);
659 return *this;
660}
661
662MetadataBuilder& MetadataBuilder::setStatisticsSceneFlicker(
663 const camera_metadata_enum_android_statistics_scene_flicker sceneFlicker) {
664 mEntryMap[ANDROID_STATISTICS_SCENE_FLICKER] =
665 asVectorOf<uint8_t>(sceneFlicker);
666 return *this;
667}
668
669MetadataBuilder& MetadataBuilder::setStatisticsHotPixelMapMode(
670 const camera_metadata_enum_android_statistics_hot_pixel_map_mode
671 hotPixelMapMode) {
672 mEntryMap[ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE] =
673 asVectorOf<uint8_t>(hotPixelMapMode);
674 return *this;
675}
676
677MetadataBuilder& MetadataBuilder::setStatisticsLensShadingMapMode(
678 const camera_metadata_enum_android_statistics_lens_shading_map_mode
679 lensShadingMapMode) {
680 mEntryMap[ANDROID_STATISTICS_LENS_SHADING_MAP_MODE] =
681 asVectorOf<uint8_t>(lensShadingMapMode);
682 return *this;
683}
684
685MetadataBuilder& MetadataBuilder::setLensOpticalStabilizationMode(
686 const camera_metadata_enum_android_lens_optical_stabilization_mode_t
687 opticalStabilizationMode) {
688 mEntryMap[ANDROID_LENS_OPTICAL_STABILIZATION_MODE] =
689 asVectorOf<uint8_t>(opticalStabilizationMode);
690 return *this;
691}
692
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100693MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
694 const std::vector<int32_t>& keys) {
695 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
696 return *this;
697}
698
699MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
700 const std::vector<int32_t>& keys) {
701 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
702 return *this;
703}
704
705MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
706 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
707 capabilities) {
708 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
709 convertTo<uint8_t>(capabilities);
710 return *this;
711}
712
713MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
714 const std::vector<camera_metadata_tag_t>& keys) {
715 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
716 convertTo<int32_t>(keys);
717 return *this;
718}
719
720MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100721 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100722 return *this;
723}
724
725std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100726MetadataBuilder::build() {
727 if (mExtendWithAvailableCharacteristicsKeys) {
728 std::vector<camera_metadata_tag_t> availableKeys;
729 availableKeys.reserve(mEntryMap.size());
730 for (const auto& [key, _] : mEntryMap) {
731 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
732 availableKeys.push_back(key);
733 }
734 }
735 setAvailableCharacteristicKeys(availableKeys);
736 }
737
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100738 CameraMetadata metadataHelper;
739 for (const auto& entry : mEntryMap) {
740 status_t ret = std::visit(
741 [&](auto&& arg) {
742 return metadataHelper.update(entry.first, arg.data(), arg.size());
743 },
744 entry.second);
745 if (ret != NO_ERROR) {
746 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
747 get_camera_metadata_tag_name(entry.first),
748 ::android::statusToString(ret).c_str());
749 return nullptr;
750 }
751 }
752
753 const camera_metadata_t* metadata = metadataHelper.getAndLock();
754 if (metadata == nullptr) {
755 ALOGE(
756 "Failure when constructing metadata -> CameraMetadata helper returned "
757 "nullptr");
758 return nullptr;
759 }
760
761 auto aidlMetadata =
762 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
763 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
764 aidlMetadata->metadata.assign(data_ptr,
765 data_ptr + get_camera_metadata_size(metadata));
766 metadataHelper.unlock(metadata);
767
768 return aidlMetadata;
769}
770
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100771std::optional<int32_t> getJpegQuality(
772 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
773 auto metadata =
774 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
775
776 camera_metadata_ro_entry_t entry;
777 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_QUALITY, &entry) !=
778 OK) {
779 return std::nullopt;
780 }
781
782 return *entry.data.i32;
783}
784
Vadim Caenc0aff132024-03-12 17:20:07 +0100785int32_t getJpegOrientation(
786 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
787 auto metadata =
788 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
789
790 camera_metadata_ro_entry_t entry;
791 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_ORIENTATION,
792 &entry) != OK) {
793 return 0;
794 }
795
796 return *entry.data.i32;
797}
798
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100799std::optional<Resolution> getJpegThumbnailSize(
800 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
801 auto metadata =
802 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
803
804 camera_metadata_ro_entry_t entry;
805 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_SIZE,
806 &entry) != OK) {
807 return std::nullopt;
808 }
809
810 return Resolution(entry.data.i32[0], entry.data.i32[1]);
811}
812
813std::optional<int32_t> getJpegThumbnailQuality(
814 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
815 auto metadata =
816 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
817
818 camera_metadata_ro_entry_t entry;
819 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_QUALITY,
820 &entry) != OK) {
821 return std::nullopt;
822 }
823
824 return *entry.data.i32;
825}
826
827std::vector<Resolution> getJpegAvailableThumbnailSizes(
828 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
829 auto metadata =
830 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
831
832 camera_metadata_ro_entry_t entry;
833 if (find_camera_metadata_ro_entry(
834 metadata, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, &entry) != OK) {
835 return {};
836 }
837
838 std::vector<Resolution> thumbnailSizes;
839 thumbnailSizes.reserve(entry.count / 2);
840 for (int i = 0; i < entry.count; i += 2) {
841 thumbnailSizes.emplace_back(entry.data.i32[i], entry.data.i32[i + 1]);
842 }
843 return thumbnailSizes;
844}
845
Vadim Caen11dfd932024-03-05 09:57:20 +0100846std::optional<FpsRange> getFpsRange(
847 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
848 auto metadata =
849 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
850
851 camera_metadata_ro_entry_t entry;
852 if (find_camera_metadata_ro_entry(
853 metadata, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &entry) != OK ||
854 entry.count != 2) {
855 return {};
856 }
857
858 FpsRange range{.minFps = entry.data.i32[0], .maxFps = entry.data.i32[1]};
859 return range;
860}
861
862std::optional<camera_metadata_enum_android_control_capture_intent>
863getCaptureIntent(const aidl::android::hardware::camera::device::CameraMetadata&
864 cameraMetadata) {
865 auto metadata =
866 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
867
868 camera_metadata_ro_entry_t entry;
869 if (find_camera_metadata_ro_entry(metadata, ANDROID_CONTROL_CAPTURE_INTENT,
870 &entry) != OK) {
871 return {};
872 }
873
874 return static_cast<camera_metadata_enum_android_control_capture_intent>(
875 entry.data.u8[0]);
876}
877
Vadim Caenc0aff132024-03-12 17:20:07 +0100878std::optional<GpsCoordinates> getGpsCoordinates(
879 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
880 auto metadata =
881 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
882
883 camera_metadata_ro_entry_t entry;
884 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_GPS_COORDINATES,
885 &entry) != OK) {
886 return std::nullopt;
887 }
888
889 GpsCoordinates coordinates{.latitude = entry.data.d[0],
890 .longitude = entry.data.d[1],
891 .altitude = entry.data.d[2]};
892
893 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_GPS_TIMESTAMP,
894 &entry) == OK) {
895 coordinates.timestamp = entry.data.i64[0];
896 }
897
898 // According to types.hal, the string describing the GPS processing method has
899 // a 32 characters size
900 static constexpr float kGpsProviderStringLength = 32;
901 if (find_camera_metadata_ro_entry(
902 metadata, ANDROID_JPEG_GPS_PROCESSING_METHOD, &entry) == OK) {
903 coordinates.provider.assign(
904 reinterpret_cast<const char*>(entry.data.u8),
905 std::min(entry.count, static_cast<size_t>(kGpsProviderStringLength)));
906 }
907
908 return coordinates;
909}
910
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100911std::optional<camera_metadata_enum_android_lens_facing> getLensFacing(
912 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
913 auto metadata =
914 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
915
916 camera_metadata_ro_entry_t entry;
917 if (find_camera_metadata_ro_entry(metadata, ANDROID_LENS_FACING, &entry) !=
918 OK) {
919 return std::nullopt;
920 }
921
922 return static_cast<camera_metadata_enum_android_lens_facing>(entry.data.u8[0]);
923}
924
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100925} // namespace virtualcamera
926} // namespace companion
927} // namespace android