blob: 119260f95dc1944bba6259333198c5613ad6af55 [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>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010027#include <utility>
28#include <variant>
29#include <vector>
30
31#include "CameraMetadata.h"
32#include "aidl/android/hardware/camera/device/CameraMetadata.h"
33#include "log/log.h"
34#include "system/camera_metadata.h"
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010035#include "util/Util.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010036#include "utils/Errors.h"
37
38namespace android {
39namespace companion {
40namespace virtualcamera {
41
42namespace {
43
44using ::android::hardware::camera::common::helper::CameraMetadata;
45
46template <typename To, typename From>
47std::vector<To> convertTo(const std::vector<From>& from) {
48 std::vector<To> to;
49 to.reserve(from.size());
50 std::transform(from.begin(), from.end(), std::back_inserter(to),
51 [](const From& x) { return static_cast<To>(x); });
52 return to;
53}
54
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010055template <typename To, typename From>
56std::vector<To> asVectorOf(const From from) {
57 return std::vector<To>({static_cast<To>(from)});
58}
59
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010060} // namespace
61
62MetadataBuilder& MetadataBuilder::setSupportedHardwareLevel(
Vadim Caen11dfd932024-03-05 09:57:20 +010063 const camera_metadata_enum_android_info_supported_hardware_level_t hwLevel) {
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010064 mEntryMap[ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010065 asVectorOf<uint8_t>(hwLevel);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010066 return *this;
67}
68
69MetadataBuilder& MetadataBuilder::setFlashAvailable(bool flashAvailable) {
70 const uint8_t metadataVal = flashAvailable
71 ? ANDROID_FLASH_INFO_AVAILABLE_TRUE
72 : ANDROID_FLASH_INFO_AVAILABLE_FALSE;
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010073 mEntryMap[ANDROID_FLASH_INFO_AVAILABLE] = asVectorOf<uint8_t>(metadataVal);
74 return *this;
75}
76
77MetadataBuilder& MetadataBuilder::setFlashState(
78 const camera_metadata_enum_android_flash_state_t flashState) {
79 mEntryMap[ANDROID_FLASH_STATE] = asVectorOf<uint8_t>(flashState);
80 return *this;
81}
82
83MetadataBuilder& MetadataBuilder::setFlashMode(
84 const camera_metadata_enum_android_flash_mode_t flashMode) {
85 mEntryMap[ANDROID_FLASH_MODE] = asVectorOf<uint8_t>(flashMode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010086 return *this;
87}
88
89MetadataBuilder& MetadataBuilder::setLensFacing(
Vadim Caen11dfd932024-03-05 09:57:20 +010090 const camera_metadata_enum_android_lens_facing lensFacing) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010091 mEntryMap[ANDROID_LENS_FACING] = asVectorOf<uint8_t>(lensFacing);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010092 return *this;
93}
94
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010095MetadataBuilder& MetadataBuilder::setSensorReadoutTimestamp(
96 const camera_metadata_enum_android_sensor_readout_timestamp_t
97 sensorReadoutTimestamp) {
98 mEntryMap[ANDROID_SENSOR_READOUT_TIMESTAMP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010099 asVectorOf<uint8_t>(sensorReadoutTimestamp);
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +0100100 return *this;
101}
102
Biswarup Pal8ad8bc52024-02-08 13:41:44 +0000103MetadataBuilder& MetadataBuilder::setAvailableFocalLengths(
104 const std::vector<float>& focalLengths) {
Biswarup Pald9be04d2024-01-31 14:35:15 +0000105 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
106 return *this;
107}
108
Biswarup Pal8ad8bc52024-02-08 13:41:44 +0000109MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
110 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = asVectorOf<float>(focalLength);
111 return *this;
112}
113
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100114MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100115 mEntryMap[ANDROID_SENSOR_ORIENTATION] = asVectorOf<int32_t>(sensorOrientation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100116 return *this;
117}
118
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100119MetadataBuilder& MetadataBuilder::setSensorTimestampSource(
120 const camera_metadata_enum_android_sensor_info_timestamp_source_t
121 timestampSource) {
122 mEntryMap[ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100123 asVectorOf<uint8_t>(timestampSource);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100124 return *this;
125}
126
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100127MetadataBuilder& MetadataBuilder::setSensorTimestamp(
128 std::chrono::nanoseconds timestamp) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100129 mEntryMap[ANDROID_SENSOR_TIMESTAMP] = asVectorOf<int64_t>(timestamp.count());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100130 return *this;
131}
132
133MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
134 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
135 faceDetectModes) {
136 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
137 convertTo<uint8_t>(faceDetectModes);
138 return *this;
139}
140
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100141MetadataBuilder& MetadataBuilder::setAvailableTestPatternModes(
142 const std::vector<camera_metadata_enum_android_sensor_test_pattern_mode>&
143 testPatternModes) {
144 mEntryMap[ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES] =
145 convertTo<int32_t>(testPatternModes);
146 return *this;
147}
148
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100149MetadataBuilder& MetadataBuilder::setFaceDetectMode(
150 const camera_metadata_enum_android_statistics_face_detect_mode_t
151 faceDetectMode) {
152 mEntryMap[ANDROID_STATISTICS_FACE_DETECT_MODE] =
153 asVectorOf<uint8_t>(faceDetectMode);
154 return *this;
155}
156
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100157MetadataBuilder& MetadataBuilder::setControlAvailableModes(
158 const std::vector<camera_metadata_enum_android_control_mode_t>&
159 availableModes) {
160 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
161 convertTo<uint8_t>(availableModes);
162 return *this;
163}
164
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100165MetadataBuilder& MetadataBuilder::setControlMode(
166 const camera_metadata_enum_android_control_mode_t mode) {
167 mEntryMap[ANDROID_CONTROL_MODE] = asVectorOf<uint8_t>(mode);
168 return *this;
169}
170
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100171MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
172 const std::vector<camera_metadata_enum_android_control_scene_mode>&
173 availableSceneModes) {
174 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
175 convertTo<uint8_t>(availableSceneModes);
176 return *this;
177}
178
Vadim Caen11dfd932024-03-05 09:57:20 +0100179MetadataBuilder& MetadataBuilder::setControlSceneMode(
180 const camera_metadata_enum_android_control_scene_mode sceneMode) {
181 mEntryMap[ANDROID_CONTROL_SCENE_MODE] = asVectorOf<uint8_t>(sceneMode);
182 return *this;
183}
184
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100185MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
186 const std::vector<camera_metadata_enum_android_control_effect_mode>&
187 availableEffects) {
188 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
189 convertTo<uint8_t>(availableEffects);
190 return *this;
191}
192
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100193MetadataBuilder& MetadataBuilder::setControlEffectMode(
194 const camera_metadata_enum_android_control_effect_mode_t effectMode) {
195 mEntryMap[ANDROID_CONTROL_EFFECT_MODE] = asVectorOf<uint8_t>(effectMode);
196 return *this;
197}
198
199MetadataBuilder& MetadataBuilder::setControlAvailableVideoStabilizationModes(
200 const std::vector<
201 camera_metadata_enum_android_control_video_stabilization_mode_t>&
202 videoStabilizationModes) {
203 mEntryMap[ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES] =
204 convertTo<uint8_t>(videoStabilizationModes);
205 return *this;
206}
207
Vadim Caen11dfd932024-03-05 09:57:20 +0100208MetadataBuilder& MetadataBuilder::setControlVideoStabilizationMode(
209 const camera_metadata_enum_android_control_video_stabilization_mode
210 stabilizationMode) {
211 mEntryMap[ANDROID_CONTROL_VIDEO_STABILIZATION_MODE] =
212 asVectorOf<uint8_t>(stabilizationMode);
213 return *this;
214}
215
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100216MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
217 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
218 availableModes) {
219 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
220 convertTo<uint8_t>(availableModes);
221 return *this;
222}
223
224MetadataBuilder& MetadataBuilder::setControlAfMode(
225 const camera_metadata_enum_android_control_af_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100226 mEntryMap[ANDROID_CONTROL_AF_MODE] = asVectorOf<uint8_t>(mode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100227 return *this;
228}
229
Vadim Caen11dfd932024-03-05 09:57:20 +0100230MetadataBuilder& MetadataBuilder::setControlAfState(
231 const camera_metadata_enum_android_control_af_state afState) {
232 mEntryMap[ANDROID_CONTROL_AF_STATE] = asVectorOf<uint8_t>(afState);
233 return *this;
234}
235
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100236// See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
237MetadataBuilder& MetadataBuilder::setControlAfTrigger(
238 const camera_metadata_enum_android_control_af_trigger_t trigger) {
239 mEntryMap[ANDROID_CONTROL_AF_TRIGGER] = asVectorOf<uint8_t>(trigger);
240 return *this;
241}
242
243MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRanges(
244 const std::vector<FpsRange>& fpsRanges) {
245 std::vector<int32_t> ranges;
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100246 ranges.reserve(2 * fpsRanges.size());
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100247 for (const FpsRange fpsRange : fpsRanges) {
248 ranges.push_back(fpsRange.minFps);
249 ranges.push_back(fpsRange.maxFps);
250 }
251 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] = std::move(ranges);
252 return *this;
253}
254
255MetadataBuilder& MetadataBuilder::setControlAeTargetFpsRange(
Vadim Caen11dfd932024-03-05 09:57:20 +0100256 const FpsRange fpsRange) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100257 mEntryMap[ANDROID_CONTROL_AE_TARGET_FPS_RANGE] =
Vadim Caen11dfd932024-03-05 09:57:20 +0100258 std::vector<int32_t>({fpsRange.minFps, fpsRange.maxFps});
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100259 return *this;
260}
261
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100262MetadataBuilder& MetadataBuilder::setControlAeMode(
Vadim Caen11dfd932024-03-05 09:57:20 +0100263 const camera_metadata_enum_android_control_ae_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100264 mEntryMap[ANDROID_CONTROL_AE_MODE] = asVectorOf<uint8_t>(mode);
265 return *this;
266}
267
268MetadataBuilder& MetadataBuilder::setControlAeAvailableModes(
269 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes) {
270 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_MODES] = convertTo<uint8_t>(modes);
271 return *this;
272}
273
274MetadataBuilder& MetadataBuilder::setControlAePrecaptureTrigger(
275 const camera_metadata_enum_android_control_ae_precapture_trigger_t trigger) {
276 mEntryMap[ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER] =
277 asVectorOf<uint8_t>(trigger);
278 return *this;
279}
280
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100281MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
282 int32_t maxAwbRegions,
283 int32_t maxAfRegions) {
284 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
285 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
286 return *this;
287}
288
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100289MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
290 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
291 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
292 return *this;
293}
294
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100295MetadataBuilder& MetadataBuilder::setControlAwbMode(
296 const camera_metadata_enum_android_control_awb_mode awbMode) {
297 mEntryMap[ANDROID_CONTROL_AWB_MODE] = asVectorOf<uint8_t>(awbMode);
298 return *this;
299}
300
Vadim Caen11dfd932024-03-05 09:57:20 +0100301MetadataBuilder& MetadataBuilder::setControlAwbState(
302 const camera_metadata_enum_android_control_awb_state awbState) {
303 mEntryMap[ANDROID_CONTROL_AWB_STATE] = asVectorOf<uint8_t>(awbState);
304 return *this;
305}
306
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100307MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
308 const bool awbLockAvailable) {
309 const uint8_t lockAvailable = awbLockAvailable
310 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
311 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
312 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
313 std::vector<uint8_t>({lockAvailable});
314 return *this;
315}
316
Vadim Caen11dfd932024-03-05 09:57:20 +0100317MetadataBuilder& MetadataBuilder::setControlAwbLock(
318 const camera_metadata_enum_android_control_awb_lock awbLock) {
319 mEntryMap[ANDROID_CONTROL_AWB_LOCK] = asVectorOf<uint8_t>(awbLock);
320 return *this;
321}
322
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100323MetadataBuilder& MetadataBuilder::setControlAeAvailableAntibandingModes(
324 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
325 antibandingModes) {
326 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES] =
327 convertTo<uint8_t>(antibandingModes);
328 return *this;
329}
330
331MetadataBuilder& MetadataBuilder::setControlAeAntibandingMode(
332 const camera_metadata_enum_android_control_ae_antibanding_mode_t
333 antibandingMode) {
334 mEntryMap[ANDROID_CONTROL_AE_ANTIBANDING_MODE] =
335 asVectorOf<uint8_t>(antibandingMode);
336 return *this;
337}
338
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100339MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
340 const bool aeLockAvailable) {
341 const uint8_t lockAvailable = aeLockAvailable
342 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
343 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
344 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100345 asVectorOf<uint8_t>(lockAvailable);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100346 return *this;
347}
348
Vadim Caen11dfd932024-03-05 09:57:20 +0100349MetadataBuilder& MetadataBuilder::setControlAeLock(
350 const camera_metadata_enum_android_control_ae_lock aeLock) {
351 mEntryMap[ANDROID_CONTROL_AE_LOCK] = asVectorOf<uint8_t>(aeLock);
352 return *this;
353}
354
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100355MetadataBuilder& MetadataBuilder::setControlAeRegions(
356 const std::vector<ControlRegion>& aeRegions) {
357 std::vector<int32_t> regions;
358 regions.reserve(5 * aeRegions.size());
359 for (const ControlRegion& region : aeRegions) {
360 regions.push_back(region.x0);
361 regions.push_back(region.y0);
362 regions.push_back(region.x1);
363 regions.push_back(region.y1);
364 regions.push_back(region.weight);
365 }
366 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
367 return *this;
368}
369
370MetadataBuilder& MetadataBuilder::setControlAfRegions(
371 const std::vector<ControlRegion>& afRegions) {
372 std::vector<int32_t> regions;
373 regions.reserve(5 * afRegions.size());
374 for (const ControlRegion& region : afRegions) {
375 regions.push_back(region.x0);
376 regions.push_back(region.y0);
377 regions.push_back(region.x1);
378 regions.push_back(region.y1);
379 regions.push_back(region.weight);
380 }
381 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
382 return *this;
383}
384
385MetadataBuilder& MetadataBuilder::setControlAwbRegions(
386 const std::vector<ControlRegion>& awbRegions) {
387 std::vector<int32_t> regions;
388 regions.reserve(5 * awbRegions.size());
389 for (const ControlRegion& region : awbRegions) {
390 regions.push_back(region.x0);
391 regions.push_back(region.y0);
392 regions.push_back(region.x1);
393 regions.push_back(region.y1);
394 regions.push_back(region.weight);
395 }
396 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
397 return *this;
398}
399
400MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
401 const camera_metadata_enum_android_control_capture_intent_t intent) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100402 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] = asVectorOf<uint8_t>(intent);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100403 return *this;
404}
405
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100406MetadataBuilder& MetadataBuilder::setCropRegion(const int32_t x, const int32_t y,
407 const int32_t width,
408 const int32_t height) {
409 mEntryMap[ANDROID_SCALER_CROP_REGION] =
410 std::vector<int32_t>({x, y, width, height});
411 return *this;
412}
413
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100414MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100415 mEntryMap[ANDROID_JPEG_MAX_SIZE] = asVectorOf<int32_t>(size);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100416 return *this;
417}
418
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100419MetadataBuilder& MetadataBuilder::setMaxFrameDuration(
420 const std::chrono::nanoseconds duration) {
421 mEntryMap[ANDROID_SENSOR_INFO_MAX_FRAME_DURATION] =
422 asVectorOf<int64_t>(duration.count());
423 return *this;
424}
425
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100426MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
427 const std::vector<Resolution>& thumbnailSizes) {
428 std::vector<int32_t> sizes;
429 sizes.reserve(thumbnailSizes.size() * 2);
430 for (const Resolution& resolution : thumbnailSizes) {
431 sizes.push_back(resolution.width);
432 sizes.push_back(resolution.height);
433 }
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100434 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = std::move(sizes);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100435 return *this;
436}
437
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100438MetadataBuilder& MetadataBuilder::setJpegQuality(const uint8_t quality) {
439 mEntryMap[ANDROID_JPEG_QUALITY] = asVectorOf<uint8_t>(quality);
440 return *this;
441}
442
443MetadataBuilder& MetadataBuilder::setJpegThumbnailSize(const int width,
444 const int height) {
445 mEntryMap[ANDROID_JPEG_THUMBNAIL_SIZE] = std::vector<int32_t>({width, height});
446 return *this;
447}
448
449MetadataBuilder& MetadataBuilder::setJpegThumbnailQuality(const uint8_t quality) {
450 mEntryMap[ANDROID_JPEG_THUMBNAIL_QUALITY] = asVectorOf<uint8_t>(quality);
451 return *this;
452}
453
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100454MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
455 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
456 const int32_t maxStallStreams) {
457 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
458 {maxRawStreams, maxProcessedStreams, maxStallStreams});
459 return *this;
460}
461
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100462MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
Vadim Caen11dfd932024-03-05 09:57:20 +0100463 const camera_metadata_enum_android_sync_max_latency latency) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100464 mEntryMap[ANDROID_SYNC_MAX_LATENCY] = asVectorOf<int32_t>(latency);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100465 return *this;
466}
467
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100468MetadataBuilder& MetadataBuilder::setPipelineMaxDepth(const uint8_t maxDepth) {
469 mEntryMap[ANDROID_REQUEST_PIPELINE_MAX_DEPTH] = asVectorOf<uint8_t>(maxDepth);
470 return *this;
471}
472
473MetadataBuilder& MetadataBuilder::setPipelineDepth(const uint8_t depth) {
474 mEntryMap[ANDROID_REQUEST_PIPELINE_DEPTH] = asVectorOf<uint8_t>(depth);
475 return *this;
476}
477
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100478MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
479 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
480 requestCapabilities) {
481 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
482 convertTo<uint8_t>(requestCapabilities);
483 return *this;
484}
485
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100486MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
487 const std::vector<StreamConfiguration>& streamConfigurations) {
488 std::vector<int32_t> metadataStreamConfigs;
489 std::vector<int64_t> metadataMinFrameDurations;
490 std::vector<int64_t> metadataStallDurations;
491 metadataStreamConfigs.reserve(streamConfigurations.size());
492 metadataMinFrameDurations.reserve(streamConfigurations.size());
493 metadataStallDurations.reserve(streamConfigurations.size());
494
495 for (const auto& config : streamConfigurations) {
496 metadataStreamConfigs.push_back(config.format);
497 metadataStreamConfigs.push_back(config.width);
498 metadataStreamConfigs.push_back(config.height);
499 metadataStreamConfigs.push_back(
500 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
501
502 metadataMinFrameDurations.push_back(config.format);
503 metadataMinFrameDurations.push_back(config.width);
504 metadataMinFrameDurations.push_back(config.height);
505 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
506
507 metadataStallDurations.push_back(config.format);
508 metadataStallDurations.push_back(config.width);
509 metadataStallDurations.push_back(config.height);
510 metadataStallDurations.push_back(config.minStallDuration.count());
511 }
512
513 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100514 std::move(metadataStreamConfigs);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100515 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100516 std::move(metadataMinFrameDurations);
517 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
518 std::move(metadataStallDurations);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100519
520 return *this;
521}
522
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100523MetadataBuilder& MetadataBuilder::setAvailableAberrationCorrectionModes(
524 const std::vector<camera_metadata_enum_android_color_correction_aberration_mode>&
525 aberrationCorectionModes) {
526 mEntryMap[ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES] =
527 convertTo<uint8_t>(aberrationCorectionModes);
528 return *this;
529}
530
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100531MetadataBuilder& MetadataBuilder::setAberrationCorrectionMode(
532 const camera_metadata_enum_android_color_correction_aberration_mode
533 aberrationCorrectionMode) {
534 mEntryMap[ANDROID_COLOR_CORRECTION_ABERRATION_MODE] =
535 asVectorOf<uint8_t>(aberrationCorrectionMode);
536 return *this;
537}
538
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100539MetadataBuilder& MetadataBuilder::setAvailableNoiseReductionModes(
540 const std::vector<camera_metadata_enum_android_noise_reduction_mode>&
541 noiseReductionModes) {
542 mEntryMap[ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES] =
543 convertTo<uint8_t>(noiseReductionModes);
544 return *this;
545}
546
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100547MetadataBuilder& MetadataBuilder::setNoiseReductionMode(
Vadim Caen11dfd932024-03-05 09:57:20 +0100548 const camera_metadata_enum_android_noise_reduction_mode noiseReductionMode) {
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100549 mEntryMap[ANDROID_NOISE_REDUCTION_MODE] =
550 asVectorOf<uint8_t>(noiseReductionMode);
551 return *this;
552}
553
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100554MetadataBuilder& MetadataBuilder::setRequestPartialResultCount(
555 const int partialResultCount) {
556 mEntryMap[ANDROID_REQUEST_PARTIAL_RESULT_COUNT] =
557 asVectorOf<int32_t>(partialResultCount);
558 return *this;
559}
560
561MetadataBuilder& MetadataBuilder::setCroppingType(
562 const camera_metadata_enum_android_scaler_cropping_type croppingType) {
563 mEntryMap[ANDROID_SCALER_CROPPING_TYPE] = asVectorOf<uint8_t>(croppingType);
564 return *this;
565}
566
567MetadataBuilder& MetadataBuilder::setMaxFaceCount(const int maxFaceCount) {
568 mEntryMap[ANDROID_STATISTICS_INFO_MAX_FACE_COUNT] =
569 asVectorOf<int32_t>(maxFaceCount);
570 return *this;
571}
572
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100573MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
574 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100575 asVectorOf<float>(maxZoom);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100576 return *this;
577}
578
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100579MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
580 const float max) {
581 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
582 return *this;
583}
584
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100585MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
586 int x1, int y1) {
587 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
588 std::vector<int32_t>({x0, y0, x1, y1});
589 return *this;
590}
591
Biswarup Pald9be04d2024-01-31 14:35:15 +0000592MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
593 int height) {
594 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
595 std::vector<int32_t>({width, height});
596 return *this;
597}
598
599MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
600 float height) {
601 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
602 std::vector<float>({width, height});
603 return *this;
604}
605
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100606MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
607 int32_t max) {
608 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
609 std::vector<int32_t>({min, max});
610 return *this;
611}
612
613MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
614 const camera_metadata_rational step) {
615 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100616 asVectorOf<camera_metadata_rational>(step);
617 return *this;
618}
619
620MetadataBuilder& MetadataBuilder::setControlAeExposureCompensation(
621 const int32_t exposureCompensation) {
622 mEntryMap[ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION] =
623 asVectorOf<int32_t>(exposureCompensation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100624 return *this;
625}
626
Vadim Caen11dfd932024-03-05 09:57:20 +0100627MetadataBuilder& MetadataBuilder::setControlAeState(
628 const camera_metadata_enum_android_control_ae_state aeState) {
629 mEntryMap[ANDROID_CONTROL_AE_STATE] = asVectorOf<uint8_t>(aeState);
630 return *this;
631}
632
633MetadataBuilder& MetadataBuilder::setStatisticsSceneFlicker(
634 const camera_metadata_enum_android_statistics_scene_flicker sceneFlicker) {
635 mEntryMap[ANDROID_STATISTICS_SCENE_FLICKER] =
636 asVectorOf<uint8_t>(sceneFlicker);
637 return *this;
638}
639
640MetadataBuilder& MetadataBuilder::setStatisticsHotPixelMapMode(
641 const camera_metadata_enum_android_statistics_hot_pixel_map_mode
642 hotPixelMapMode) {
643 mEntryMap[ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE] =
644 asVectorOf<uint8_t>(hotPixelMapMode);
645 return *this;
646}
647
648MetadataBuilder& MetadataBuilder::setStatisticsLensShadingMapMode(
649 const camera_metadata_enum_android_statistics_lens_shading_map_mode
650 lensShadingMapMode) {
651 mEntryMap[ANDROID_STATISTICS_LENS_SHADING_MAP_MODE] =
652 asVectorOf<uint8_t>(lensShadingMapMode);
653 return *this;
654}
655
656MetadataBuilder& MetadataBuilder::setLensOpticalStabilizationMode(
657 const camera_metadata_enum_android_lens_optical_stabilization_mode_t
658 opticalStabilizationMode) {
659 mEntryMap[ANDROID_LENS_OPTICAL_STABILIZATION_MODE] =
660 asVectorOf<uint8_t>(opticalStabilizationMode);
661 return *this;
662}
663
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100664MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
665 const std::vector<int32_t>& keys) {
666 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
667 return *this;
668}
669
670MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
671 const std::vector<int32_t>& keys) {
672 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
673 return *this;
674}
675
676MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
677 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
678 capabilities) {
679 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
680 convertTo<uint8_t>(capabilities);
681 return *this;
682}
683
684MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
685 const std::vector<camera_metadata_tag_t>& keys) {
686 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
687 convertTo<int32_t>(keys);
688 return *this;
689}
690
691MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100692 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100693 return *this;
694}
695
696std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100697MetadataBuilder::build() {
698 if (mExtendWithAvailableCharacteristicsKeys) {
699 std::vector<camera_metadata_tag_t> availableKeys;
700 availableKeys.reserve(mEntryMap.size());
701 for (const auto& [key, _] : mEntryMap) {
702 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
703 availableKeys.push_back(key);
704 }
705 }
706 setAvailableCharacteristicKeys(availableKeys);
707 }
708
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100709 CameraMetadata metadataHelper;
710 for (const auto& entry : mEntryMap) {
711 status_t ret = std::visit(
712 [&](auto&& arg) {
713 return metadataHelper.update(entry.first, arg.data(), arg.size());
714 },
715 entry.second);
716 if (ret != NO_ERROR) {
717 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
718 get_camera_metadata_tag_name(entry.first),
719 ::android::statusToString(ret).c_str());
720 return nullptr;
721 }
722 }
723
724 const camera_metadata_t* metadata = metadataHelper.getAndLock();
725 if (metadata == nullptr) {
726 ALOGE(
727 "Failure when constructing metadata -> CameraMetadata helper returned "
728 "nullptr");
729 return nullptr;
730 }
731
732 auto aidlMetadata =
733 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
734 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
735 aidlMetadata->metadata.assign(data_ptr,
736 data_ptr + get_camera_metadata_size(metadata));
737 metadataHelper.unlock(metadata);
738
739 return aidlMetadata;
740}
741
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100742std::optional<int32_t> getJpegQuality(
743 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
744 auto metadata =
745 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
746
747 camera_metadata_ro_entry_t entry;
748 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_QUALITY, &entry) !=
749 OK) {
750 return std::nullopt;
751 }
752
753 return *entry.data.i32;
754}
755
756std::optional<Resolution> getJpegThumbnailSize(
757 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
758 auto metadata =
759 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
760
761 camera_metadata_ro_entry_t entry;
762 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_SIZE,
763 &entry) != OK) {
764 return std::nullopt;
765 }
766
767 return Resolution(entry.data.i32[0], entry.data.i32[1]);
768}
769
770std::optional<int32_t> getJpegThumbnailQuality(
771 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
772 auto metadata =
773 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
774
775 camera_metadata_ro_entry_t entry;
776 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_QUALITY,
777 &entry) != OK) {
778 return std::nullopt;
779 }
780
781 return *entry.data.i32;
782}
783
784std::vector<Resolution> getJpegAvailableThumbnailSizes(
785 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
786 auto metadata =
787 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
788
789 camera_metadata_ro_entry_t entry;
790 if (find_camera_metadata_ro_entry(
791 metadata, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, &entry) != OK) {
792 return {};
793 }
794
795 std::vector<Resolution> thumbnailSizes;
796 thumbnailSizes.reserve(entry.count / 2);
797 for (int i = 0; i < entry.count; i += 2) {
798 thumbnailSizes.emplace_back(entry.data.i32[i], entry.data.i32[i + 1]);
799 }
800 return thumbnailSizes;
801}
802
Vadim Caen11dfd932024-03-05 09:57:20 +0100803std::optional<FpsRange> getFpsRange(
804 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
805 auto metadata =
806 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
807
808 camera_metadata_ro_entry_t entry;
809 if (find_camera_metadata_ro_entry(
810 metadata, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &entry) != OK ||
811 entry.count != 2) {
812 return {};
813 }
814
815 FpsRange range{.minFps = entry.data.i32[0], .maxFps = entry.data.i32[1]};
816 return range;
817}
818
819std::optional<camera_metadata_enum_android_control_capture_intent>
820getCaptureIntent(const aidl::android::hardware::camera::device::CameraMetadata&
821 cameraMetadata) {
822 auto metadata =
823 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
824
825 camera_metadata_ro_entry_t entry;
826 if (find_camera_metadata_ro_entry(metadata, ANDROID_CONTROL_CAPTURE_INTENT,
827 &entry) != OK) {
828 return {};
829 }
830
831 return static_cast<camera_metadata_enum_android_control_capture_intent>(
832 entry.data.u8[0]);
833}
834
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100835} // namespace virtualcamera
836} // namespace companion
837} // namespace android