blob: b30f2b5087a3d5b95ab13f4624f8684475ad5cee [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
54} // namespace
55
56MetadataBuilder& MetadataBuilder::setSupportedHardwareLevel(
57 camera_metadata_enum_android_info_supported_hardware_level_t hwLevel) {
58 mEntryMap[ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL] =
59 std::vector<uint8_t>({static_cast<uint8_t>(hwLevel)});
60 return *this;
61}
62
63MetadataBuilder& MetadataBuilder::setFlashAvailable(bool flashAvailable) {
64 const uint8_t metadataVal = flashAvailable
65 ? ANDROID_FLASH_INFO_AVAILABLE_TRUE
66 : ANDROID_FLASH_INFO_AVAILABLE_FALSE;
67 mEntryMap[ANDROID_FLASH_INFO_AVAILABLE] = std::vector<uint8_t>({metadataVal});
68 return *this;
69}
70
71MetadataBuilder& MetadataBuilder::setLensFacing(
72 camera_metadata_enum_android_lens_facing lensFacing) {
73 mEntryMap[ANDROID_LENS_FACING] =
74 std::vector<uint8_t>({static_cast<uint8_t>(lensFacing)});
75 return *this;
76}
77
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010078MetadataBuilder& MetadataBuilder::setSensorReadoutTimestamp(
79 const camera_metadata_enum_android_sensor_readout_timestamp_t
80 sensorReadoutTimestamp) {
81 mEntryMap[ANDROID_SENSOR_READOUT_TIMESTAMP] =
82 std::vector<uint8_t>({static_cast<uint8_t>(sensorReadoutTimestamp)});
83 return *this;
84}
85
Biswarup Pald9be04d2024-01-31 14:35:15 +000086MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
87 std::vector<float> focalLengths({focalLength});
88 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = focalLengths;
89 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
90 return *this;
91}
92
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010093MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
94 mEntryMap[ANDROID_SENSOR_ORIENTATION] =
95 std::vector<int32_t>({sensorOrientation});
96 return *this;
97}
98
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010099MetadataBuilder& MetadataBuilder::setSensorTimestampSource(
100 const camera_metadata_enum_android_sensor_info_timestamp_source_t
101 timestampSource) {
102 mEntryMap[ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE] =
103 std::vector<uint8_t>({static_cast<uint8_t>(timestampSource)});
104 return *this;
105}
106
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100107MetadataBuilder& MetadataBuilder::setSensorTimestamp(
108 std::chrono::nanoseconds timestamp) {
109 mEntryMap[ANDROID_SENSOR_TIMESTAMP] =
110 std::vector<int64_t>({timestamp.count()});
111 return *this;
112}
113
114MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
115 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
116 faceDetectModes) {
117 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
118 convertTo<uint8_t>(faceDetectModes);
119 return *this;
120}
121
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100122MetadataBuilder& MetadataBuilder::setControlAvailableModes(
123 const std::vector<camera_metadata_enum_android_control_mode_t>&
124 availableModes) {
125 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
126 convertTo<uint8_t>(availableModes);
127 return *this;
128}
129
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100130MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
131 const std::vector<camera_metadata_enum_android_control_scene_mode>&
132 availableSceneModes) {
133 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
134 convertTo<uint8_t>(availableSceneModes);
135 return *this;
136}
137
138MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
139 const std::vector<camera_metadata_enum_android_control_effect_mode>&
140 availableEffects) {
141 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
142 convertTo<uint8_t>(availableEffects);
143 return *this;
144}
145
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100146MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
147 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
148 availableModes) {
149 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
150 convertTo<uint8_t>(availableModes);
151 return *this;
152}
153
154MetadataBuilder& MetadataBuilder::setControlAfMode(
155 const camera_metadata_enum_android_control_af_mode_t mode) {
156 mEntryMap[ANDROID_CONTROL_AF_MODE] =
157 std::vector<uint8_t>({static_cast<uint8_t>(mode)});
158 return *this;
159}
160
161MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRange(
162 const int32_t minFps, const int32_t maxFps) {
163 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] =
164 std::vector<int32_t>({minFps, maxFps});
165 return *this;
166}
167
168MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
169 int32_t maxAwbRegions,
170 int32_t maxAfRegions) {
171 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
172 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
173 return *this;
174}
175
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100176MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
177 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
178 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
179 return *this;
180}
181
182MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
183 const bool awbLockAvailable) {
184 const uint8_t lockAvailable = awbLockAvailable
185 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
186 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
187 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
188 std::vector<uint8_t>({lockAvailable});
189 return *this;
190}
191
192MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
193 const bool aeLockAvailable) {
194 const uint8_t lockAvailable = aeLockAvailable
195 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
196 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
197 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
198 std::vector<uint8_t>({lockAvailable});
199 return *this;
200}
201
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100202MetadataBuilder& MetadataBuilder::setControlAeRegions(
203 const std::vector<ControlRegion>& aeRegions) {
204 std::vector<int32_t> regions;
205 regions.reserve(5 * aeRegions.size());
206 for (const ControlRegion& region : aeRegions) {
207 regions.push_back(region.x0);
208 regions.push_back(region.y0);
209 regions.push_back(region.x1);
210 regions.push_back(region.y1);
211 regions.push_back(region.weight);
212 }
213 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
214 return *this;
215}
216
217MetadataBuilder& MetadataBuilder::setControlAfRegions(
218 const std::vector<ControlRegion>& afRegions) {
219 std::vector<int32_t> regions;
220 regions.reserve(5 * afRegions.size());
221 for (const ControlRegion& region : afRegions) {
222 regions.push_back(region.x0);
223 regions.push_back(region.y0);
224 regions.push_back(region.x1);
225 regions.push_back(region.y1);
226 regions.push_back(region.weight);
227 }
228 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
229 return *this;
230}
231
232MetadataBuilder& MetadataBuilder::setControlAwbRegions(
233 const std::vector<ControlRegion>& awbRegions) {
234 std::vector<int32_t> regions;
235 regions.reserve(5 * awbRegions.size());
236 for (const ControlRegion& region : awbRegions) {
237 regions.push_back(region.x0);
238 regions.push_back(region.y0);
239 regions.push_back(region.x1);
240 regions.push_back(region.y1);
241 regions.push_back(region.weight);
242 }
243 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
244 return *this;
245}
246
247MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
248 const camera_metadata_enum_android_control_capture_intent_t intent) {
249 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] =
250 std::vector<uint8_t>({static_cast<uint8_t>(intent)});
251 return *this;
252}
253
254MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
255 mEntryMap[ANDROID_JPEG_MAX_SIZE] = std::vector<int32_t>({size});
256 return *this;
257}
258
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100259MetadataBuilder& MetadataBuilder::setJpegAvailableThumbnailSizes(
260 const std::vector<Resolution>& thumbnailSizes) {
261 std::vector<int32_t> sizes;
262 sizes.reserve(thumbnailSizes.size() * 2);
263 for (const Resolution& resolution : thumbnailSizes) {
264 sizes.push_back(resolution.width);
265 sizes.push_back(resolution.height);
266 }
267 mEntryMap[ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES] = sizes;
268 return *this;
269}
270
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100271MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
272 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
273 const int32_t maxStallStreams) {
274 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
275 {maxRawStreams, maxProcessedStreams, maxStallStreams});
276 return *this;
277}
278
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100279MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
280 camera_metadata_enum_android_sync_max_latency latency) {
281 mEntryMap[ANDROID_SYNC_MAX_LATENCY] =
282 std::vector<int32_t>({static_cast<int32_t>(latency)});
283 return *this;
284}
285
286MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
287 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
288 requestCapabilities) {
289 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
290 convertTo<uint8_t>(requestCapabilities);
291 return *this;
292}
293
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100294MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
295 const std::vector<StreamConfiguration>& streamConfigurations) {
296 std::vector<int32_t> metadataStreamConfigs;
297 std::vector<int64_t> metadataMinFrameDurations;
298 std::vector<int64_t> metadataStallDurations;
299 metadataStreamConfigs.reserve(streamConfigurations.size());
300 metadataMinFrameDurations.reserve(streamConfigurations.size());
301 metadataStallDurations.reserve(streamConfigurations.size());
302
303 for (const auto& config : streamConfigurations) {
304 metadataStreamConfigs.push_back(config.format);
305 metadataStreamConfigs.push_back(config.width);
306 metadataStreamConfigs.push_back(config.height);
307 metadataStreamConfigs.push_back(
308 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
309
310 metadataMinFrameDurations.push_back(config.format);
311 metadataMinFrameDurations.push_back(config.width);
312 metadataMinFrameDurations.push_back(config.height);
313 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
314
315 metadataStallDurations.push_back(config.format);
316 metadataStallDurations.push_back(config.width);
317 metadataStallDurations.push_back(config.height);
318 metadataStallDurations.push_back(config.minStallDuration.count());
319 }
320
321 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
322 metadataStreamConfigs;
323 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
324 metadataMinFrameDurations;
Biswarup Pal6152a302023-12-19 12:44:09 +0000325 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] = metadataStallDurations;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100326
327 return *this;
328}
329
330MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
331 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100332 std::vector<float>({maxZoom});
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100333 return *this;
334}
335
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100336MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
337 const float max) {
338 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
339 return *this;
340}
341
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100342MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
343 int x1, int y1) {
344 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
345 std::vector<int32_t>({x0, y0, x1, y1});
346 return *this;
347}
348
Biswarup Pald9be04d2024-01-31 14:35:15 +0000349MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
350 int height) {
351 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
352 std::vector<int32_t>({width, height});
353 return *this;
354}
355
356MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
357 float height) {
358 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
359 std::vector<float>({width, height});
360 return *this;
361}
362
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100363MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
364 int32_t max) {
365 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
366 std::vector<int32_t>({min, max});
367 return *this;
368}
369
370MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
371 const camera_metadata_rational step) {
372 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
373 std::vector<camera_metadata_rational>({step});
374 return *this;
375}
376
377MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
378 const std::vector<int32_t>& keys) {
379 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
380 return *this;
381}
382
383MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
384 const std::vector<int32_t>& keys) {
385 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
386 return *this;
387}
388
389MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
390 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
391 capabilities) {
392 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
393 convertTo<uint8_t>(capabilities);
394 return *this;
395}
396
397MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
398 const std::vector<camera_metadata_tag_t>& keys) {
399 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
400 convertTo<int32_t>(keys);
401 return *this;
402}
403
404MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100405 mExtendWithAvailableCharacteristicsKeys = true;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100406 return *this;
407}
408
409std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100410MetadataBuilder::build() {
411 if (mExtendWithAvailableCharacteristicsKeys) {
412 std::vector<camera_metadata_tag_t> availableKeys;
413 availableKeys.reserve(mEntryMap.size());
414 for (const auto& [key, _] : mEntryMap) {
415 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
416 availableKeys.push_back(key);
417 }
418 }
419 setAvailableCharacteristicKeys(availableKeys);
420 }
421
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100422 CameraMetadata metadataHelper;
423 for (const auto& entry : mEntryMap) {
424 status_t ret = std::visit(
425 [&](auto&& arg) {
426 return metadataHelper.update(entry.first, arg.data(), arg.size());
427 },
428 entry.second);
429 if (ret != NO_ERROR) {
430 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
431 get_camera_metadata_tag_name(entry.first),
432 ::android::statusToString(ret).c_str());
433 return nullptr;
434 }
435 }
436
437 const camera_metadata_t* metadata = metadataHelper.getAndLock();
438 if (metadata == nullptr) {
439 ALOGE(
440 "Failure when constructing metadata -> CameraMetadata helper returned "
441 "nullptr");
442 return nullptr;
443 }
444
445 auto aidlMetadata =
446 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
447 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
448 aidlMetadata->metadata.assign(data_ptr,
449 data_ptr + get_camera_metadata_size(metadata));
450 metadataHelper.unlock(metadata);
451
452 return aidlMetadata;
453}
454
455} // namespace virtualcamera
456} // namespace companion
457} // namespace android