blob: db5a5dd299e4c7cb2dd910544d4c755b320082f5 [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 Pal8ad8bc52024-02-08 13:41:44 +0000102MetadataBuilder& MetadataBuilder::setAvailableFocalLengths(
103 const std::vector<float>& focalLengths) {
Biswarup Pald9be04d2024-01-31 14:35:15 +0000104 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
105 return *this;
106}
107
Biswarup Pal8ad8bc52024-02-08 13:41:44 +0000108MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
109 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = asVectorOf<float>(focalLength);
110 return *this;
111}
112
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100113MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100114 mEntryMap[ANDROID_SENSOR_ORIENTATION] = asVectorOf<int32_t>(sensorOrientation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100115 return *this;
116}
117
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100118MetadataBuilder& MetadataBuilder::setSensorTimestampSource(
119 const camera_metadata_enum_android_sensor_info_timestamp_source_t
120 timestampSource) {
121 mEntryMap[ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100122 asVectorOf<uint8_t>(timestampSource);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100123 return *this;
124}
125
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100126MetadataBuilder& MetadataBuilder::setSensorTimestamp(
127 std::chrono::nanoseconds timestamp) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100128 mEntryMap[ANDROID_SENSOR_TIMESTAMP] = asVectorOf<int64_t>(timestamp.count());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100129 return *this;
130}
131
132MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
133 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
134 faceDetectModes) {
135 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
136 convertTo<uint8_t>(faceDetectModes);
137 return *this;
138}
139
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100140MetadataBuilder& MetadataBuilder::setFaceDetectMode(
141 const camera_metadata_enum_android_statistics_face_detect_mode_t
142 faceDetectMode) {
143 mEntryMap[ANDROID_STATISTICS_FACE_DETECT_MODE] =
144 asVectorOf<uint8_t>(faceDetectMode);
145 return *this;
146}
147
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100148MetadataBuilder& MetadataBuilder::setControlAvailableModes(
149 const std::vector<camera_metadata_enum_android_control_mode_t>&
150 availableModes) {
151 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
152 convertTo<uint8_t>(availableModes);
153 return *this;
154}
155
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100156MetadataBuilder& MetadataBuilder::setControlMode(
157 const camera_metadata_enum_android_control_mode_t mode) {
158 mEntryMap[ANDROID_CONTROL_MODE] = asVectorOf<uint8_t>(mode);
159 return *this;
160}
161
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100162MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
163 const std::vector<camera_metadata_enum_android_control_scene_mode>&
164 availableSceneModes) {
165 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
166 convertTo<uint8_t>(availableSceneModes);
167 return *this;
168}
169
170MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
171 const std::vector<camera_metadata_enum_android_control_effect_mode>&
172 availableEffects) {
173 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
174 convertTo<uint8_t>(availableEffects);
175 return *this;
176}
177
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100178MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
179 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
180 availableModes) {
181 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
182 convertTo<uint8_t>(availableModes);
183 return *this;
184}
185
186MetadataBuilder& MetadataBuilder::setControlAfMode(
187 const camera_metadata_enum_android_control_af_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100188 mEntryMap[ANDROID_CONTROL_AF_MODE] = asVectorOf<uint8_t>(mode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100189 return *this;
190}
191
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100192// See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
193MetadataBuilder& MetadataBuilder::setControlAfTrigger(
194 const camera_metadata_enum_android_control_af_trigger_t trigger) {
195 mEntryMap[ANDROID_CONTROL_AF_TRIGGER] = asVectorOf<uint8_t>(trigger);
196 return *this;
197}
198
199MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRanges(
200 const std::vector<FpsRange>& fpsRanges) {
201 std::vector<int32_t> ranges;
202 ranges.resize(2 * fpsRanges.size());
203 for (const FpsRange fpsRange : fpsRanges) {
204 ranges.push_back(fpsRange.minFps);
205 ranges.push_back(fpsRange.maxFps);
206 }
207 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] = std::move(ranges);
208 return *this;
209}
210
211MetadataBuilder& MetadataBuilder::setControlAeTargetFpsRange(
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100212 const int32_t minFps, const int32_t maxFps) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100213 mEntryMap[ANDROID_CONTROL_AE_TARGET_FPS_RANGE] =
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100214 std::vector<int32_t>({minFps, maxFps});
215 return *this;
216}
217
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100218MetadataBuilder& MetadataBuilder::setControlAeMode(
219 camera_metadata_enum_android_control_ae_mode_t mode) {
220 mEntryMap[ANDROID_CONTROL_AE_MODE] = asVectorOf<uint8_t>(mode);
221 return *this;
222}
223
224MetadataBuilder& MetadataBuilder::setControlAeAvailableModes(
225 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes) {
226 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_MODES] = convertTo<uint8_t>(modes);
227 return *this;
228}
229
230MetadataBuilder& MetadataBuilder::setControlAePrecaptureTrigger(
231 const camera_metadata_enum_android_control_ae_precapture_trigger_t trigger) {
232 mEntryMap[ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER] =
233 asVectorOf<uint8_t>(trigger);
234 return *this;
235}
236
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100237MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
238 int32_t maxAwbRegions,
239 int32_t maxAfRegions) {
240 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
241 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
242 return *this;
243}
244
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100245MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
246 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
247 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
248 return *this;
249}
250
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100251MetadataBuilder& MetadataBuilder::setControlAwbMode(
252 const camera_metadata_enum_android_control_awb_mode awbMode) {
253 mEntryMap[ANDROID_CONTROL_AWB_MODE] = asVectorOf<uint8_t>(awbMode);
254 return *this;
255}
256
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100257MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
258 const bool awbLockAvailable) {
259 const uint8_t lockAvailable = awbLockAvailable
260 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
261 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
262 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
263 std::vector<uint8_t>({lockAvailable});
264 return *this;
265}
266
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100267MetadataBuilder& MetadataBuilder::setControlAeAvailableAntibandingModes(
268 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
269 antibandingModes) {
270 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES] =
271 convertTo<uint8_t>(antibandingModes);
272 return *this;
273}
274
275MetadataBuilder& MetadataBuilder::setControlAeAntibandingMode(
276 const camera_metadata_enum_android_control_ae_antibanding_mode_t
277 antibandingMode) {
278 mEntryMap[ANDROID_CONTROL_AE_ANTIBANDING_MODE] =
279 asVectorOf<uint8_t>(antibandingMode);
280 return *this;
281}
282
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100283MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
284 const bool aeLockAvailable) {
285 const uint8_t lockAvailable = aeLockAvailable
286 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
287 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
288 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100289 asVectorOf<uint8_t>(lockAvailable);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100290 return *this;
291}
292
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100293MetadataBuilder& MetadataBuilder::setControlAeRegions(
294 const std::vector<ControlRegion>& aeRegions) {
295 std::vector<int32_t> regions;
296 regions.reserve(5 * aeRegions.size());
297 for (const ControlRegion& region : aeRegions) {
298 regions.push_back(region.x0);
299 regions.push_back(region.y0);
300 regions.push_back(region.x1);
301 regions.push_back(region.y1);
302 regions.push_back(region.weight);
303 }
304 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
305 return *this;
306}
307
308MetadataBuilder& MetadataBuilder::setControlAfRegions(
309 const std::vector<ControlRegion>& afRegions) {
310 std::vector<int32_t> regions;
311 regions.reserve(5 * afRegions.size());
312 for (const ControlRegion& region : afRegions) {
313 regions.push_back(region.x0);
314 regions.push_back(region.y0);
315 regions.push_back(region.x1);
316 regions.push_back(region.y1);
317 regions.push_back(region.weight);
318 }
319 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
320 return *this;
321}
322
323MetadataBuilder& MetadataBuilder::setControlAwbRegions(
324 const std::vector<ControlRegion>& awbRegions) {
325 std::vector<int32_t> regions;
326 regions.reserve(5 * awbRegions.size());
327 for (const ControlRegion& region : awbRegions) {
328 regions.push_back(region.x0);
329 regions.push_back(region.y0);
330 regions.push_back(region.x1);
331 regions.push_back(region.y1);
332 regions.push_back(region.weight);
333 }
334 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
335 return *this;
336}
337
338MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
339 const camera_metadata_enum_android_control_capture_intent_t intent) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100340 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] = asVectorOf<uint8_t>(intent);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100341 return *this;
342}
343
344MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100345 mEntryMap[ANDROID_JPEG_MAX_SIZE] = asVectorOf<int32_t>(size);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100346 return *this;
347}
348
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100349MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
350 const std::vector<Resolution>& thumbnailSizes) {
351 std::vector<int32_t> sizes;
352 sizes.reserve(thumbnailSizes.size() * 2);
353 for (const Resolution& resolution : thumbnailSizes) {
354 sizes.push_back(resolution.width);
355 sizes.push_back(resolution.height);
356 }
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100357 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = std::move(sizes);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100358 return *this;
359}
360
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100361MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
362 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
363 const int32_t maxStallStreams) {
364 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
365 {maxRawStreams, maxProcessedStreams, maxStallStreams});
366 return *this;
367}
368
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100369MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
370 camera_metadata_enum_android_sync_max_latency latency) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100371 mEntryMap[ANDROID_SYNC_MAX_LATENCY] = asVectorOf<int32_t>(latency);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100372 return *this;
373}
374
375MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
376 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
377 requestCapabilities) {
378 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
379 convertTo<uint8_t>(requestCapabilities);
380 return *this;
381}
382
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100383MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
384 const std::vector<StreamConfiguration>& streamConfigurations) {
385 std::vector<int32_t> metadataStreamConfigs;
386 std::vector<int64_t> metadataMinFrameDurations;
387 std::vector<int64_t> metadataStallDurations;
388 metadataStreamConfigs.reserve(streamConfigurations.size());
389 metadataMinFrameDurations.reserve(streamConfigurations.size());
390 metadataStallDurations.reserve(streamConfigurations.size());
391
392 for (const auto& config : streamConfigurations) {
393 metadataStreamConfigs.push_back(config.format);
394 metadataStreamConfigs.push_back(config.width);
395 metadataStreamConfigs.push_back(config.height);
396 metadataStreamConfigs.push_back(
397 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
398
399 metadataMinFrameDurations.push_back(config.format);
400 metadataMinFrameDurations.push_back(config.width);
401 metadataMinFrameDurations.push_back(config.height);
402 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
403
404 metadataStallDurations.push_back(config.format);
405 metadataStallDurations.push_back(config.width);
406 metadataStallDurations.push_back(config.height);
407 metadataStallDurations.push_back(config.minStallDuration.count());
408 }
409
410 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100411 std::move(metadataStreamConfigs);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100412 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100413 std::move(metadataMinFrameDurations);
414 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
415 std::move(metadataStallDurations);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100416
417 return *this;
418}
419
420MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
421 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100422 asVectorOf<float>(maxZoom);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100423 return *this;
424}
425
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100426MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
427 const float max) {
428 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
429 return *this;
430}
431
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100432MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
433 int x1, int y1) {
434 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
435 std::vector<int32_t>({x0, y0, x1, y1});
436 return *this;
437}
438
Biswarup Pald9be04d2024-01-31 14:35:15 +0000439MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
440 int height) {
441 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
442 std::vector<int32_t>({width, height});
443 return *this;
444}
445
446MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
447 float height) {
448 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
449 std::vector<float>({width, height});
450 return *this;
451}
452
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100453MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
454 int32_t max) {
455 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
456 std::vector<int32_t>({min, max});
457 return *this;
458}
459
460MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
461 const camera_metadata_rational step) {
462 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100463 asVectorOf<camera_metadata_rational>(step);
464 return *this;
465}
466
467MetadataBuilder& MetadataBuilder::setControlAeExposureCompensation(
468 const int32_t exposureCompensation) {
469 mEntryMap[ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION] =
470 asVectorOf<int32_t>(exposureCompensation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100471 return *this;
472}
473
474MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
475 const std::vector<int32_t>& keys) {
476 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
477 return *this;
478}
479
480MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
481 const std::vector<int32_t>& keys) {
482 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
483 return *this;
484}
485
486MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
487 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
488 capabilities) {
489 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
490 convertTo<uint8_t>(capabilities);
491 return *this;
492}
493
494MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
495 const std::vector<camera_metadata_tag_t>& keys) {
496 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
497 convertTo<int32_t>(keys);
498 return *this;
499}
500
501MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100502 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100503 return *this;
504}
505
506std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100507MetadataBuilder::build() {
508 if (mExtendWithAvailableCharacteristicsKeys) {
509 std::vector<camera_metadata_tag_t> availableKeys;
510 availableKeys.reserve(mEntryMap.size());
511 for (const auto& [key, _] : mEntryMap) {
512 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
513 availableKeys.push_back(key);
514 }
515 }
516 setAvailableCharacteristicKeys(availableKeys);
517 }
518
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100519 CameraMetadata metadataHelper;
520 for (const auto& entry : mEntryMap) {
521 status_t ret = std::visit(
522 [&](auto&& arg) {
523 return metadataHelper.update(entry.first, arg.data(), arg.size());
524 },
525 entry.second);
526 if (ret != NO_ERROR) {
527 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
528 get_camera_metadata_tag_name(entry.first),
529 ::android::statusToString(ret).c_str());
530 return nullptr;
531 }
532 }
533
534 const camera_metadata_t* metadata = metadataHelper.getAndLock();
535 if (metadata == nullptr) {
536 ALOGE(
537 "Failure when constructing metadata -> CameraMetadata helper returned "
538 "nullptr");
539 return nullptr;
540 }
541
542 auto aidlMetadata =
543 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
544 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
545 aidlMetadata->metadata.assign(data_ptr,
546 data_ptr + get_camera_metadata_size(metadata));
547 metadataHelper.unlock(metadata);
548
549 return aidlMetadata;
550}
551
552} // namespace virtualcamera
553} // namespace companion
554} // namespace android