blob: 5669e124a8279680bfc6ae0ee4ddc7c329fa2395 [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
18#define LOG_TAG "MetadataBuilder"
19
20#include "MetadataBuilder.h"
21
22#include <algorithm>
23#include <cstdint>
24#include <iterator>
25#include <memory>
26#include <utility>
27#include <variant>
28#include <vector>
29
30#include "CameraMetadata.h"
31#include "aidl/android/hardware/camera/device/CameraMetadata.h"
32#include "log/log.h"
33#include "system/camera_metadata.h"
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010034#include "util/Util.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010035#include "utils/Errors.h"
36
37namespace android {
38namespace companion {
39namespace virtualcamera {
40
41namespace {
42
43using ::android::hardware::camera::common::helper::CameraMetadata;
44
45template <typename To, typename From>
46std::vector<To> convertTo(const std::vector<From>& from) {
47 std::vector<To> to;
48 to.reserve(from.size());
49 std::transform(from.begin(), from.end(), std::back_inserter(to),
50 [](const From& x) { return static_cast<To>(x); });
51 return to;
52}
53
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010054template <typename To, typename From>
55std::vector<To> asVectorOf(const From from) {
56 return std::vector<To>({static_cast<To>(from)});
57}
58
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010059} // namespace
60
61MetadataBuilder& MetadataBuilder::setSupportedHardwareLevel(
62 camera_metadata_enum_android_info_supported_hardware_level_t hwLevel) {
63 mEntryMap[ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010064 asVectorOf<uint8_t>(hwLevel);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010065 return *this;
66}
67
68MetadataBuilder& MetadataBuilder::setFlashAvailable(bool flashAvailable) {
69 const uint8_t metadataVal = flashAvailable
70 ? ANDROID_FLASH_INFO_AVAILABLE_TRUE
71 : ANDROID_FLASH_INFO_AVAILABLE_FALSE;
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010072 mEntryMap[ANDROID_FLASH_INFO_AVAILABLE] = asVectorOf<uint8_t>(metadataVal);
73 return *this;
74}
75
76MetadataBuilder& MetadataBuilder::setFlashState(
77 const camera_metadata_enum_android_flash_state_t flashState) {
78 mEntryMap[ANDROID_FLASH_STATE] = asVectorOf<uint8_t>(flashState);
79 return *this;
80}
81
82MetadataBuilder& MetadataBuilder::setFlashMode(
83 const camera_metadata_enum_android_flash_mode_t flashMode) {
84 mEntryMap[ANDROID_FLASH_MODE] = asVectorOf<uint8_t>(flashMode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010085 return *this;
86}
87
88MetadataBuilder& MetadataBuilder::setLensFacing(
89 camera_metadata_enum_android_lens_facing lensFacing) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010090 mEntryMap[ANDROID_LENS_FACING] = asVectorOf<uint8_t>(lensFacing);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010091 return *this;
92}
93
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010094MetadataBuilder& MetadataBuilder::setSensorReadoutTimestamp(
95 const camera_metadata_enum_android_sensor_readout_timestamp_t
96 sensorReadoutTimestamp) {
97 mEntryMap[ANDROID_SENSOR_READOUT_TIMESTAMP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010098 asVectorOf<uint8_t>(sensorReadoutTimestamp);
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010099 return *this;
100}
101
Biswarup Pald9be04d2024-01-31 14:35:15 +0000102MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
103 std::vector<float> focalLengths({focalLength});
104 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = focalLengths;
105 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
106 return *this;
107}
108
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100109MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100110 mEntryMap[ANDROID_SENSOR_ORIENTATION] = asVectorOf<int32_t>(sensorOrientation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100111 return *this;
112}
113
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100114MetadataBuilder& MetadataBuilder::setSensorTimestampSource(
115 const camera_metadata_enum_android_sensor_info_timestamp_source_t
116 timestampSource) {
117 mEntryMap[ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100118 asVectorOf<uint8_t>(timestampSource);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100119 return *this;
120}
121
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100122MetadataBuilder& MetadataBuilder::setSensorTimestamp(
123 std::chrono::nanoseconds timestamp) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100124 mEntryMap[ANDROID_SENSOR_TIMESTAMP] = asVectorOf<int64_t>(timestamp.count());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100125 return *this;
126}
127
128MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
129 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
130 faceDetectModes) {
131 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
132 convertTo<uint8_t>(faceDetectModes);
133 return *this;
134}
135
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100136MetadataBuilder& MetadataBuilder::setFaceDetectMode(
137 const camera_metadata_enum_android_statistics_face_detect_mode_t
138 faceDetectMode) {
139 mEntryMap[ANDROID_STATISTICS_FACE_DETECT_MODE] =
140 asVectorOf<uint8_t>(faceDetectMode);
141 return *this;
142}
143
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100144MetadataBuilder& MetadataBuilder::setControlAvailableModes(
145 const std::vector<camera_metadata_enum_android_control_mode_t>&
146 availableModes) {
147 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
148 convertTo<uint8_t>(availableModes);
149 return *this;
150}
151
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100152MetadataBuilder& MetadataBuilder::setControlMode(
153 const camera_metadata_enum_android_control_mode_t mode) {
154 mEntryMap[ANDROID_CONTROL_MODE] = asVectorOf<uint8_t>(mode);
155 return *this;
156}
157
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100158MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
159 const std::vector<camera_metadata_enum_android_control_scene_mode>&
160 availableSceneModes) {
161 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
162 convertTo<uint8_t>(availableSceneModes);
163 return *this;
164}
165
166MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
167 const std::vector<camera_metadata_enum_android_control_effect_mode>&
168 availableEffects) {
169 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
170 convertTo<uint8_t>(availableEffects);
171 return *this;
172}
173
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100174MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
175 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
176 availableModes) {
177 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
178 convertTo<uint8_t>(availableModes);
179 return *this;
180}
181
182MetadataBuilder& MetadataBuilder::setControlAfMode(
183 const camera_metadata_enum_android_control_af_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100184 mEntryMap[ANDROID_CONTROL_AF_MODE] = asVectorOf<uint8_t>(mode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100185 return *this;
186}
187
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100188// See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
189MetadataBuilder& MetadataBuilder::setControlAfTrigger(
190 const camera_metadata_enum_android_control_af_trigger_t trigger) {
191 mEntryMap[ANDROID_CONTROL_AF_TRIGGER] = asVectorOf<uint8_t>(trigger);
192 return *this;
193}
194
195MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRanges(
196 const std::vector<FpsRange>& fpsRanges) {
197 std::vector<int32_t> ranges;
198 ranges.resize(2 * fpsRanges.size());
199 for (const FpsRange fpsRange : fpsRanges) {
200 ranges.push_back(fpsRange.minFps);
201 ranges.push_back(fpsRange.maxFps);
202 }
203 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] = std::move(ranges);
204 return *this;
205}
206
207MetadataBuilder& MetadataBuilder::setControlAeTargetFpsRange(
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100208 const int32_t minFps, const int32_t maxFps) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100209 mEntryMap[ANDROID_CONTROL_AE_TARGET_FPS_RANGE] =
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100210 std::vector<int32_t>({minFps, maxFps});
211 return *this;
212}
213
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100214MetadataBuilder& MetadataBuilder::setControlAeMode(
215 camera_metadata_enum_android_control_ae_mode_t mode) {
216 mEntryMap[ANDROID_CONTROL_AE_MODE] = asVectorOf<uint8_t>(mode);
217 return *this;
218}
219
220MetadataBuilder& MetadataBuilder::setControlAeAvailableModes(
221 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes) {
222 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_MODES] = convertTo<uint8_t>(modes);
223 return *this;
224}
225
226MetadataBuilder& MetadataBuilder::setControlAePrecaptureTrigger(
227 const camera_metadata_enum_android_control_ae_precapture_trigger_t trigger) {
228 mEntryMap[ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER] =
229 asVectorOf<uint8_t>(trigger);
230 return *this;
231}
232
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100233MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
234 int32_t maxAwbRegions,
235 int32_t maxAfRegions) {
236 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
237 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
238 return *this;
239}
240
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100241MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
242 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
243 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
244 return *this;
245}
246
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100247MetadataBuilder& MetadataBuilder::setControlAwbMode(
248 const camera_metadata_enum_android_control_awb_mode awbMode) {
249 mEntryMap[ANDROID_CONTROL_AWB_MODE] = asVectorOf<uint8_t>(awbMode);
250 return *this;
251}
252
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100253MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
254 const bool awbLockAvailable) {
255 const uint8_t lockAvailable = awbLockAvailable
256 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
257 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
258 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
259 std::vector<uint8_t>({lockAvailable});
260 return *this;
261}
262
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100263MetadataBuilder& MetadataBuilder::setControlAeAvailableAntibandingModes(
264 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
265 antibandingModes) {
266 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES] =
267 convertTo<uint8_t>(antibandingModes);
268 return *this;
269}
270
271MetadataBuilder& MetadataBuilder::setControlAeAntibandingMode(
272 const camera_metadata_enum_android_control_ae_antibanding_mode_t
273 antibandingMode) {
274 mEntryMap[ANDROID_CONTROL_AE_ANTIBANDING_MODE] =
275 asVectorOf<uint8_t>(antibandingMode);
276 return *this;
277}
278
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100279MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
280 const bool aeLockAvailable) {
281 const uint8_t lockAvailable = aeLockAvailable
282 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
283 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
284 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100285 asVectorOf<uint8_t>(lockAvailable);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100286 return *this;
287}
288
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100289MetadataBuilder& MetadataBuilder::setControlAeRegions(
290 const std::vector<ControlRegion>& aeRegions) {
291 std::vector<int32_t> regions;
292 regions.reserve(5 * aeRegions.size());
293 for (const ControlRegion& region : aeRegions) {
294 regions.push_back(region.x0);
295 regions.push_back(region.y0);
296 regions.push_back(region.x1);
297 regions.push_back(region.y1);
298 regions.push_back(region.weight);
299 }
300 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
301 return *this;
302}
303
304MetadataBuilder& MetadataBuilder::setControlAfRegions(
305 const std::vector<ControlRegion>& afRegions) {
306 std::vector<int32_t> regions;
307 regions.reserve(5 * afRegions.size());
308 for (const ControlRegion& region : afRegions) {
309 regions.push_back(region.x0);
310 regions.push_back(region.y0);
311 regions.push_back(region.x1);
312 regions.push_back(region.y1);
313 regions.push_back(region.weight);
314 }
315 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
316 return *this;
317}
318
319MetadataBuilder& MetadataBuilder::setControlAwbRegions(
320 const std::vector<ControlRegion>& awbRegions) {
321 std::vector<int32_t> regions;
322 regions.reserve(5 * awbRegions.size());
323 for (const ControlRegion& region : awbRegions) {
324 regions.push_back(region.x0);
325 regions.push_back(region.y0);
326 regions.push_back(region.x1);
327 regions.push_back(region.y1);
328 regions.push_back(region.weight);
329 }
330 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
331 return *this;
332}
333
334MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
335 const camera_metadata_enum_android_control_capture_intent_t intent) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100336 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] = asVectorOf<uint8_t>(intent);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100337 return *this;
338}
339
340MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100341 mEntryMap[ANDROID_JPEG_MAX_SIZE] = asVectorOf<int32_t>(size);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100342 return *this;
343}
344
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100345MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
346 const std::vector<Resolution>& thumbnailSizes) {
347 std::vector<int32_t> sizes;
348 sizes.reserve(thumbnailSizes.size() * 2);
349 for (const Resolution& resolution : thumbnailSizes) {
350 sizes.push_back(resolution.width);
351 sizes.push_back(resolution.height);
352 }
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100353 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = std::move(sizes);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100354 return *this;
355}
356
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100357MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
358 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
359 const int32_t maxStallStreams) {
360 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
361 {maxRawStreams, maxProcessedStreams, maxStallStreams});
362 return *this;
363}
364
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100365MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
366 camera_metadata_enum_android_sync_max_latency latency) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100367 mEntryMap[ANDROID_SYNC_MAX_LATENCY] = asVectorOf<int32_t>(latency);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100368 return *this;
369}
370
371MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
372 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
373 requestCapabilities) {
374 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
375 convertTo<uint8_t>(requestCapabilities);
376 return *this;
377}
378
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100379MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
380 const std::vector<StreamConfiguration>& streamConfigurations) {
381 std::vector<int32_t> metadataStreamConfigs;
382 std::vector<int64_t> metadataMinFrameDurations;
383 std::vector<int64_t> metadataStallDurations;
384 metadataStreamConfigs.reserve(streamConfigurations.size());
385 metadataMinFrameDurations.reserve(streamConfigurations.size());
386 metadataStallDurations.reserve(streamConfigurations.size());
387
388 for (const auto& config : streamConfigurations) {
389 metadataStreamConfigs.push_back(config.format);
390 metadataStreamConfigs.push_back(config.width);
391 metadataStreamConfigs.push_back(config.height);
392 metadataStreamConfigs.push_back(
393 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
394
395 metadataMinFrameDurations.push_back(config.format);
396 metadataMinFrameDurations.push_back(config.width);
397 metadataMinFrameDurations.push_back(config.height);
398 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
399
400 metadataStallDurations.push_back(config.format);
401 metadataStallDurations.push_back(config.width);
402 metadataStallDurations.push_back(config.height);
403 metadataStallDurations.push_back(config.minStallDuration.count());
404 }
405
406 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100407 std::move(metadataStreamConfigs);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100408 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100409 std::move(metadataMinFrameDurations);
410 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
411 std::move(metadataStallDurations);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100412
413 return *this;
414}
415
416MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
417 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100418 asVectorOf<float>(maxZoom);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100419 return *this;
420}
421
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100422MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
423 const float max) {
424 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
425 return *this;
426}
427
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100428MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
429 int x1, int y1) {
430 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
431 std::vector<int32_t>({x0, y0, x1, y1});
432 return *this;
433}
434
Biswarup Pald9be04d2024-01-31 14:35:15 +0000435MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
436 int height) {
437 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
438 std::vector<int32_t>({width, height});
439 return *this;
440}
441
442MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
443 float height) {
444 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
445 std::vector<float>({width, height});
446 return *this;
447}
448
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100449MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
450 int32_t max) {
451 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
452 std::vector<int32_t>({min, max});
453 return *this;
454}
455
456MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
457 const camera_metadata_rational step) {
458 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100459 asVectorOf<camera_metadata_rational>(step);
460 return *this;
461}
462
463MetadataBuilder& MetadataBuilder::setControlAeExposureCompensation(
464 const int32_t exposureCompensation) {
465 mEntryMap[ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION] =
466 asVectorOf<int32_t>(exposureCompensation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100467 return *this;
468}
469
470MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
471 const std::vector<int32_t>& keys) {
472 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
473 return *this;
474}
475
476MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
477 const std::vector<int32_t>& keys) {
478 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
479 return *this;
480}
481
482MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
483 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
484 capabilities) {
485 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
486 convertTo<uint8_t>(capabilities);
487 return *this;
488}
489
490MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
491 const std::vector<camera_metadata_tag_t>& keys) {
492 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
493 convertTo<int32_t>(keys);
494 return *this;
495}
496
497MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100498 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100499 return *this;
500}
501
502std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100503MetadataBuilder::build() {
504 if (mExtendWithAvailableCharacteristicsKeys) {
505 std::vector<camera_metadata_tag_t> availableKeys;
506 availableKeys.reserve(mEntryMap.size());
507 for (const auto& [key, _] : mEntryMap) {
508 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
509 availableKeys.push_back(key);
510 }
511 }
512 setAvailableCharacteristicKeys(availableKeys);
513 }
514
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100515 CameraMetadata metadataHelper;
516 for (const auto& entry : mEntryMap) {
517 status_t ret = std::visit(
518 [&](auto&& arg) {
519 return metadataHelper.update(entry.first, arg.data(), arg.size());
520 },
521 entry.second);
522 if (ret != NO_ERROR) {
523 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
524 get_camera_metadata_tag_name(entry.first),
525 ::android::statusToString(ret).c_str());
526 return nullptr;
527 }
528 }
529
530 const camera_metadata_t* metadata = metadataHelper.getAndLock();
531 if (metadata == nullptr) {
532 ALOGE(
533 "Failure when constructing metadata -> CameraMetadata helper returned "
534 "nullptr");
535 return nullptr;
536 }
537
538 auto aidlMetadata =
539 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
540 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
541 aidlMetadata->metadata.assign(data_ptr,
542 data_ptr + get_camera_metadata_size(metadata));
543 metadataHelper.unlock(metadata);
544
545 return aidlMetadata;
546}
547
548} // namespace virtualcamera
549} // namespace companion
550} // namespace android