blob: 8996ac7b5e010e12c12fa4bf7c7794c826f77ec8 [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>
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 Sebechlebskybb01c1d2024-02-12 11:41:37 +0100140MetadataBuilder& MetadataBuilder::setAvailableTestPatternModes(
141 const std::vector<camera_metadata_enum_android_sensor_test_pattern_mode>&
142 testPatternModes) {
143 mEntryMap[ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES] =
144 convertTo<int32_t>(testPatternModes);
145 return *this;
146}
147
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100148MetadataBuilder& MetadataBuilder::setFaceDetectMode(
149 const camera_metadata_enum_android_statistics_face_detect_mode_t
150 faceDetectMode) {
151 mEntryMap[ANDROID_STATISTICS_FACE_DETECT_MODE] =
152 asVectorOf<uint8_t>(faceDetectMode);
153 return *this;
154}
155
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100156MetadataBuilder& MetadataBuilder::setControlAvailableModes(
157 const std::vector<camera_metadata_enum_android_control_mode_t>&
158 availableModes) {
159 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
160 convertTo<uint8_t>(availableModes);
161 return *this;
162}
163
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100164MetadataBuilder& MetadataBuilder::setControlMode(
165 const camera_metadata_enum_android_control_mode_t mode) {
166 mEntryMap[ANDROID_CONTROL_MODE] = asVectorOf<uint8_t>(mode);
167 return *this;
168}
169
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100170MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
171 const std::vector<camera_metadata_enum_android_control_scene_mode>&
172 availableSceneModes) {
173 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
174 convertTo<uint8_t>(availableSceneModes);
175 return *this;
176}
177
178MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
179 const std::vector<camera_metadata_enum_android_control_effect_mode>&
180 availableEffects) {
181 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
182 convertTo<uint8_t>(availableEffects);
183 return *this;
184}
185
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100186MetadataBuilder& MetadataBuilder::setControlEffectMode(
187 const camera_metadata_enum_android_control_effect_mode_t effectMode) {
188 mEntryMap[ANDROID_CONTROL_EFFECT_MODE] = asVectorOf<uint8_t>(effectMode);
189 return *this;
190}
191
192MetadataBuilder& MetadataBuilder::setControlAvailableVideoStabilizationModes(
193 const std::vector<
194 camera_metadata_enum_android_control_video_stabilization_mode_t>&
195 videoStabilizationModes) {
196 mEntryMap[ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES] =
197 convertTo<uint8_t>(videoStabilizationModes);
198 return *this;
199}
200
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100201MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
202 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
203 availableModes) {
204 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
205 convertTo<uint8_t>(availableModes);
206 return *this;
207}
208
209MetadataBuilder& MetadataBuilder::setControlAfMode(
210 const camera_metadata_enum_android_control_af_mode_t mode) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100211 mEntryMap[ANDROID_CONTROL_AF_MODE] = asVectorOf<uint8_t>(mode);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100212 return *this;
213}
214
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100215// See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
216MetadataBuilder& MetadataBuilder::setControlAfTrigger(
217 const camera_metadata_enum_android_control_af_trigger_t trigger) {
218 mEntryMap[ANDROID_CONTROL_AF_TRIGGER] = asVectorOf<uint8_t>(trigger);
219 return *this;
220}
221
222MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRanges(
223 const std::vector<FpsRange>& fpsRanges) {
224 std::vector<int32_t> ranges;
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100225 ranges.reserve(2 * fpsRanges.size());
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100226 for (const FpsRange fpsRange : fpsRanges) {
227 ranges.push_back(fpsRange.minFps);
228 ranges.push_back(fpsRange.maxFps);
229 }
230 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] = std::move(ranges);
231 return *this;
232}
233
234MetadataBuilder& MetadataBuilder::setControlAeTargetFpsRange(
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100235 const int32_t minFps, const int32_t maxFps) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100236 mEntryMap[ANDROID_CONTROL_AE_TARGET_FPS_RANGE] =
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100237 std::vector<int32_t>({minFps, maxFps});
238 return *this;
239}
240
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100241MetadataBuilder& MetadataBuilder::setControlAeMode(
242 camera_metadata_enum_android_control_ae_mode_t mode) {
243 mEntryMap[ANDROID_CONTROL_AE_MODE] = asVectorOf<uint8_t>(mode);
244 return *this;
245}
246
247MetadataBuilder& MetadataBuilder::setControlAeAvailableModes(
248 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes) {
249 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_MODES] = convertTo<uint8_t>(modes);
250 return *this;
251}
252
253MetadataBuilder& MetadataBuilder::setControlAePrecaptureTrigger(
254 const camera_metadata_enum_android_control_ae_precapture_trigger_t trigger) {
255 mEntryMap[ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER] =
256 asVectorOf<uint8_t>(trigger);
257 return *this;
258}
259
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100260MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
261 int32_t maxAwbRegions,
262 int32_t maxAfRegions) {
263 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
264 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
265 return *this;
266}
267
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100268MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
269 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
270 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
271 return *this;
272}
273
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100274MetadataBuilder& MetadataBuilder::setControlAwbMode(
275 const camera_metadata_enum_android_control_awb_mode awbMode) {
276 mEntryMap[ANDROID_CONTROL_AWB_MODE] = asVectorOf<uint8_t>(awbMode);
277 return *this;
278}
279
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100280MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
281 const bool awbLockAvailable) {
282 const uint8_t lockAvailable = awbLockAvailable
283 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
284 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
285 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
286 std::vector<uint8_t>({lockAvailable});
287 return *this;
288}
289
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100290MetadataBuilder& MetadataBuilder::setControlAeAvailableAntibandingModes(
291 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
292 antibandingModes) {
293 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES] =
294 convertTo<uint8_t>(antibandingModes);
295 return *this;
296}
297
298MetadataBuilder& MetadataBuilder::setControlAeAntibandingMode(
299 const camera_metadata_enum_android_control_ae_antibanding_mode_t
300 antibandingMode) {
301 mEntryMap[ANDROID_CONTROL_AE_ANTIBANDING_MODE] =
302 asVectorOf<uint8_t>(antibandingMode);
303 return *this;
304}
305
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100306MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
307 const bool aeLockAvailable) {
308 const uint8_t lockAvailable = aeLockAvailable
309 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
310 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
311 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100312 asVectorOf<uint8_t>(lockAvailable);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100313 return *this;
314}
315
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100316MetadataBuilder& MetadataBuilder::setControlAeRegions(
317 const std::vector<ControlRegion>& aeRegions) {
318 std::vector<int32_t> regions;
319 regions.reserve(5 * aeRegions.size());
320 for (const ControlRegion& region : aeRegions) {
321 regions.push_back(region.x0);
322 regions.push_back(region.y0);
323 regions.push_back(region.x1);
324 regions.push_back(region.y1);
325 regions.push_back(region.weight);
326 }
327 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
328 return *this;
329}
330
331MetadataBuilder& MetadataBuilder::setControlAfRegions(
332 const std::vector<ControlRegion>& afRegions) {
333 std::vector<int32_t> regions;
334 regions.reserve(5 * afRegions.size());
335 for (const ControlRegion& region : afRegions) {
336 regions.push_back(region.x0);
337 regions.push_back(region.y0);
338 regions.push_back(region.x1);
339 regions.push_back(region.y1);
340 regions.push_back(region.weight);
341 }
342 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
343 return *this;
344}
345
346MetadataBuilder& MetadataBuilder::setControlAwbRegions(
347 const std::vector<ControlRegion>& awbRegions) {
348 std::vector<int32_t> regions;
349 regions.reserve(5 * awbRegions.size());
350 for (const ControlRegion& region : awbRegions) {
351 regions.push_back(region.x0);
352 regions.push_back(region.y0);
353 regions.push_back(region.x1);
354 regions.push_back(region.y1);
355 regions.push_back(region.weight);
356 }
357 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
358 return *this;
359}
360
361MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
362 const camera_metadata_enum_android_control_capture_intent_t intent) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100363 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] = asVectorOf<uint8_t>(intent);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100364 return *this;
365}
366
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100367MetadataBuilder& MetadataBuilder::setCropRegion(const int32_t x, const int32_t y,
368 const int32_t width,
369 const int32_t height) {
370 mEntryMap[ANDROID_SCALER_CROP_REGION] =
371 std::vector<int32_t>({x, y, width, height});
372 return *this;
373}
374
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100375MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100376 mEntryMap[ANDROID_JPEG_MAX_SIZE] = asVectorOf<int32_t>(size);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100377 return *this;
378}
379
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100380MetadataBuilder& MetadataBuilder::setMaxFrameDuration(
381 const std::chrono::nanoseconds duration) {
382 mEntryMap[ANDROID_SENSOR_INFO_MAX_FRAME_DURATION] =
383 asVectorOf<int64_t>(duration.count());
384 return *this;
385}
386
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100387MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
388 const std::vector<Resolution>& thumbnailSizes) {
389 std::vector<int32_t> sizes;
390 sizes.reserve(thumbnailSizes.size() * 2);
391 for (const Resolution& resolution : thumbnailSizes) {
392 sizes.push_back(resolution.width);
393 sizes.push_back(resolution.height);
394 }
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100395 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = std::move(sizes);
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100396 return *this;
397}
398
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100399MetadataBuilder& MetadataBuilder::setJpegQuality(const uint8_t quality) {
400 mEntryMap[ANDROID_JPEG_QUALITY] = asVectorOf<uint8_t>(quality);
401 return *this;
402}
403
404MetadataBuilder& MetadataBuilder::setJpegThumbnailSize(const int width,
405 const int height) {
406 mEntryMap[ANDROID_JPEG_THUMBNAIL_SIZE] = std::vector<int32_t>({width, height});
407 return *this;
408}
409
410MetadataBuilder& MetadataBuilder::setJpegThumbnailQuality(const uint8_t quality) {
411 mEntryMap[ANDROID_JPEG_THUMBNAIL_QUALITY] = asVectorOf<uint8_t>(quality);
412 return *this;
413}
414
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100415MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
416 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
417 const int32_t maxStallStreams) {
418 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
419 {maxRawStreams, maxProcessedStreams, maxStallStreams});
420 return *this;
421}
422
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100423MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
424 camera_metadata_enum_android_sync_max_latency latency) {
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100425 mEntryMap[ANDROID_SYNC_MAX_LATENCY] = asVectorOf<int32_t>(latency);
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100426 return *this;
427}
428
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100429MetadataBuilder& MetadataBuilder::setPipelineMaxDepth(const uint8_t maxDepth) {
430 mEntryMap[ANDROID_REQUEST_PIPELINE_MAX_DEPTH] = asVectorOf<uint8_t>(maxDepth);
431 return *this;
432}
433
434MetadataBuilder& MetadataBuilder::setPipelineDepth(const uint8_t depth) {
435 mEntryMap[ANDROID_REQUEST_PIPELINE_DEPTH] = asVectorOf<uint8_t>(depth);
436 return *this;
437}
438
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100439MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
440 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
441 requestCapabilities) {
442 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
443 convertTo<uint8_t>(requestCapabilities);
444 return *this;
445}
446
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100447MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
448 const std::vector<StreamConfiguration>& streamConfigurations) {
449 std::vector<int32_t> metadataStreamConfigs;
450 std::vector<int64_t> metadataMinFrameDurations;
451 std::vector<int64_t> metadataStallDurations;
452 metadataStreamConfigs.reserve(streamConfigurations.size());
453 metadataMinFrameDurations.reserve(streamConfigurations.size());
454 metadataStallDurations.reserve(streamConfigurations.size());
455
456 for (const auto& config : streamConfigurations) {
457 metadataStreamConfigs.push_back(config.format);
458 metadataStreamConfigs.push_back(config.width);
459 metadataStreamConfigs.push_back(config.height);
460 metadataStreamConfigs.push_back(
461 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
462
463 metadataMinFrameDurations.push_back(config.format);
464 metadataMinFrameDurations.push_back(config.width);
465 metadataMinFrameDurations.push_back(config.height);
466 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
467
468 metadataStallDurations.push_back(config.format);
469 metadataStallDurations.push_back(config.width);
470 metadataStallDurations.push_back(config.height);
471 metadataStallDurations.push_back(config.minStallDuration.count());
472 }
473
474 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100475 std::move(metadataStreamConfigs);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100476 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100477 std::move(metadataMinFrameDurations);
478 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
479 std::move(metadataStallDurations);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100480
481 return *this;
482}
483
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100484MetadataBuilder& MetadataBuilder::setAvailableAberrationCorrectionModes(
485 const std::vector<camera_metadata_enum_android_color_correction_aberration_mode>&
486 aberrationCorectionModes) {
487 mEntryMap[ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES] =
488 convertTo<uint8_t>(aberrationCorectionModes);
489 return *this;
490}
491
492MetadataBuilder& MetadataBuilder::setAvailableNoiseReductionModes(
493 const std::vector<camera_metadata_enum_android_noise_reduction_mode>&
494 noiseReductionModes) {
495 mEntryMap[ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES] =
496 convertTo<uint8_t>(noiseReductionModes);
497 return *this;
498}
499
500MetadataBuilder& MetadataBuilder::setRequestPartialResultCount(
501 const int partialResultCount) {
502 mEntryMap[ANDROID_REQUEST_PARTIAL_RESULT_COUNT] =
503 asVectorOf<int32_t>(partialResultCount);
504 return *this;
505}
506
507MetadataBuilder& MetadataBuilder::setCroppingType(
508 const camera_metadata_enum_android_scaler_cropping_type croppingType) {
509 mEntryMap[ANDROID_SCALER_CROPPING_TYPE] = asVectorOf<uint8_t>(croppingType);
510 return *this;
511}
512
513MetadataBuilder& MetadataBuilder::setMaxFaceCount(const int maxFaceCount) {
514 mEntryMap[ANDROID_STATISTICS_INFO_MAX_FACE_COUNT] =
515 asVectorOf<int32_t>(maxFaceCount);
516 return *this;
517}
518
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100519MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
520 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100521 asVectorOf<float>(maxZoom);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100522 return *this;
523}
524
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100525MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
526 const float max) {
527 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
528 return *this;
529}
530
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100531MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
532 int x1, int y1) {
533 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
534 std::vector<int32_t>({x0, y0, x1, y1});
535 return *this;
536}
537
Biswarup Pald9be04d2024-01-31 14:35:15 +0000538MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
539 int height) {
540 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
541 std::vector<int32_t>({width, height});
542 return *this;
543}
544
545MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
546 float height) {
547 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
548 std::vector<float>({width, height});
549 return *this;
550}
551
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100552MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
553 int32_t max) {
554 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
555 std::vector<int32_t>({min, max});
556 return *this;
557}
558
559MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
560 const camera_metadata_rational step) {
561 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100562 asVectorOf<camera_metadata_rational>(step);
563 return *this;
564}
565
566MetadataBuilder& MetadataBuilder::setControlAeExposureCompensation(
567 const int32_t exposureCompensation) {
568 mEntryMap[ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION] =
569 asVectorOf<int32_t>(exposureCompensation);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100570 return *this;
571}
572
573MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
574 const std::vector<int32_t>& keys) {
575 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
576 return *this;
577}
578
579MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
580 const std::vector<int32_t>& keys) {
581 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
582 return *this;
583}
584
585MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
586 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
587 capabilities) {
588 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
589 convertTo<uint8_t>(capabilities);
590 return *this;
591}
592
593MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
594 const std::vector<camera_metadata_tag_t>& keys) {
595 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
596 convertTo<int32_t>(keys);
597 return *this;
598}
599
600MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100601 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100602 return *this;
603}
604
605std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100606MetadataBuilder::build() {
607 if (mExtendWithAvailableCharacteristicsKeys) {
608 std::vector<camera_metadata_tag_t> availableKeys;
609 availableKeys.reserve(mEntryMap.size());
610 for (const auto& [key, _] : mEntryMap) {
611 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
612 availableKeys.push_back(key);
613 }
614 }
615 setAvailableCharacteristicKeys(availableKeys);
616 }
617
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100618 CameraMetadata metadataHelper;
619 for (const auto& entry : mEntryMap) {
620 status_t ret = std::visit(
621 [&](auto&& arg) {
622 return metadataHelper.update(entry.first, arg.data(), arg.size());
623 },
624 entry.second);
625 if (ret != NO_ERROR) {
626 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
627 get_camera_metadata_tag_name(entry.first),
628 ::android::statusToString(ret).c_str());
629 return nullptr;
630 }
631 }
632
633 const camera_metadata_t* metadata = metadataHelper.getAndLock();
634 if (metadata == nullptr) {
635 ALOGE(
636 "Failure when constructing metadata -> CameraMetadata helper returned "
637 "nullptr");
638 return nullptr;
639 }
640
641 auto aidlMetadata =
642 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
643 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
644 aidlMetadata->metadata.assign(data_ptr,
645 data_ptr + get_camera_metadata_size(metadata));
646 metadataHelper.unlock(metadata);
647
648 return aidlMetadata;
649}
650
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100651std::optional<int32_t> getJpegQuality(
652 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
653 auto metadata =
654 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
655
656 camera_metadata_ro_entry_t entry;
657 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_QUALITY, &entry) !=
658 OK) {
659 return std::nullopt;
660 }
661
662 return *entry.data.i32;
663}
664
665std::optional<Resolution> getJpegThumbnailSize(
666 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
667 auto metadata =
668 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
669
670 camera_metadata_ro_entry_t entry;
671 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_SIZE,
672 &entry) != OK) {
673 return std::nullopt;
674 }
675
676 return Resolution(entry.data.i32[0], entry.data.i32[1]);
677}
678
679std::optional<int32_t> getJpegThumbnailQuality(
680 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
681 auto metadata =
682 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
683
684 camera_metadata_ro_entry_t entry;
685 if (find_camera_metadata_ro_entry(metadata, ANDROID_JPEG_THUMBNAIL_QUALITY,
686 &entry) != OK) {
687 return std::nullopt;
688 }
689
690 return *entry.data.i32;
691}
692
693std::vector<Resolution> getJpegAvailableThumbnailSizes(
694 const aidl::android::hardware::camera::device::CameraMetadata& cameraMetadata) {
695 auto metadata =
696 reinterpret_cast<const camera_metadata_t*>(cameraMetadata.metadata.data());
697
698 camera_metadata_ro_entry_t entry;
699 if (find_camera_metadata_ro_entry(
700 metadata, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, &entry) != OK) {
701 return {};
702 }
703
704 std::vector<Resolution> thumbnailSizes;
705 thumbnailSizes.reserve(entry.count / 2);
706 for (int i = 0; i < entry.count; i += 2) {
707 thumbnailSizes.emplace_back(entry.data.i32[i], entry.data.i32[i + 1]);
708 }
709 return thumbnailSizes;
710}
711
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100712} // namespace virtualcamera
713} // namespace companion
714} // namespace android