blob: bf4758f0c0003ff027aa469b503f991b1266144e [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"
34#include "utils/Errors.h"
35
36namespace android {
37namespace companion {
38namespace virtualcamera {
39
40namespace {
41
42using ::android::hardware::camera::common::helper::CameraMetadata;
43
44template <typename To, typename From>
45std::vector<To> convertTo(const std::vector<From>& from) {
46 std::vector<To> to;
47 to.reserve(from.size());
48 std::transform(from.begin(), from.end(), std::back_inserter(to),
49 [](const From& x) { return static_cast<To>(x); });
50 return to;
51}
52
53} // namespace
54
55MetadataBuilder& MetadataBuilder::setSupportedHardwareLevel(
56 camera_metadata_enum_android_info_supported_hardware_level_t hwLevel) {
57 mEntryMap[ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL] =
58 std::vector<uint8_t>({static_cast<uint8_t>(hwLevel)});
59 return *this;
60}
61
62MetadataBuilder& MetadataBuilder::setFlashAvailable(bool flashAvailable) {
63 const uint8_t metadataVal = flashAvailable
64 ? ANDROID_FLASH_INFO_AVAILABLE_TRUE
65 : ANDROID_FLASH_INFO_AVAILABLE_FALSE;
66 mEntryMap[ANDROID_FLASH_INFO_AVAILABLE] = std::vector<uint8_t>({metadataVal});
67 return *this;
68}
69
70MetadataBuilder& MetadataBuilder::setLensFacing(
71 camera_metadata_enum_android_lens_facing lensFacing) {
72 mEntryMap[ANDROID_LENS_FACING] =
73 std::vector<uint8_t>({static_cast<uint8_t>(lensFacing)});
74 return *this;
75}
76
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010077MetadataBuilder& MetadataBuilder::setSensorReadoutTimestamp(
78 const camera_metadata_enum_android_sensor_readout_timestamp_t
79 sensorReadoutTimestamp) {
80 mEntryMap[ANDROID_SENSOR_READOUT_TIMESTAMP] =
81 std::vector<uint8_t>({static_cast<uint8_t>(sensorReadoutTimestamp)});
82 return *this;
83}
84
Biswarup Pald9be04d2024-01-31 14:35:15 +000085MetadataBuilder& MetadataBuilder::setFocalLength(float focalLength) {
86 std::vector<float> focalLengths({focalLength});
87 mEntryMap[ANDROID_LENS_FOCAL_LENGTH] = focalLengths;
88 mEntryMap[ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS] = focalLengths;
89 return *this;
90}
91
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010092MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
93 mEntryMap[ANDROID_SENSOR_ORIENTATION] =
94 std::vector<int32_t>({sensorOrientation});
95 return *this;
96}
97
98MetadataBuilder& MetadataBuilder::setSensorTimestamp(
99 std::chrono::nanoseconds timestamp) {
100 mEntryMap[ANDROID_SENSOR_TIMESTAMP] =
101 std::vector<int64_t>({timestamp.count()});
102 return *this;
103}
104
105MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
106 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
107 faceDetectModes) {
108 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
109 convertTo<uint8_t>(faceDetectModes);
110 return *this;
111}
112
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100113MetadataBuilder& MetadataBuilder::setControlAvailableModes(
114 const std::vector<camera_metadata_enum_android_control_mode_t>&
115 availableModes) {
116 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
117 convertTo<uint8_t>(availableModes);
118 return *this;
119}
120
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100121MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
122 const std::vector<camera_metadata_enum_android_control_scene_mode>&
123 availableSceneModes) {
124 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
125 convertTo<uint8_t>(availableSceneModes);
126 return *this;
127}
128
129MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
130 const std::vector<camera_metadata_enum_android_control_effect_mode>&
131 availableEffects) {
132 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
133 convertTo<uint8_t>(availableEffects);
134 return *this;
135}
136
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100137MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
138 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
139 availableModes) {
140 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
141 convertTo<uint8_t>(availableModes);
142 return *this;
143}
144
145MetadataBuilder& MetadataBuilder::setControlAfMode(
146 const camera_metadata_enum_android_control_af_mode_t mode) {
147 mEntryMap[ANDROID_CONTROL_AF_MODE] =
148 std::vector<uint8_t>({static_cast<uint8_t>(mode)});
149 return *this;
150}
151
152MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRange(
153 const int32_t minFps, const int32_t maxFps) {
154 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] =
155 std::vector<int32_t>({minFps, maxFps});
156 return *this;
157}
158
159MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
160 int32_t maxAwbRegions,
161 int32_t maxAfRegions) {
162 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
163 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
164 return *this;
165}
166
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100167MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
168 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
169 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
170 return *this;
171}
172
173MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
174 const bool awbLockAvailable) {
175 const uint8_t lockAvailable = awbLockAvailable
176 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
177 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
178 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
179 std::vector<uint8_t>({lockAvailable});
180 return *this;
181}
182
183MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
184 const bool aeLockAvailable) {
185 const uint8_t lockAvailable = aeLockAvailable
186 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
187 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
188 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
189 std::vector<uint8_t>({lockAvailable});
190 return *this;
191}
192
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100193MetadataBuilder& MetadataBuilder::setControlAeRegions(
194 const std::vector<ControlRegion>& aeRegions) {
195 std::vector<int32_t> regions;
196 regions.reserve(5 * aeRegions.size());
197 for (const ControlRegion& region : aeRegions) {
198 regions.push_back(region.x0);
199 regions.push_back(region.y0);
200 regions.push_back(region.x1);
201 regions.push_back(region.y1);
202 regions.push_back(region.weight);
203 }
204 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
205 return *this;
206}
207
208MetadataBuilder& MetadataBuilder::setControlAfRegions(
209 const std::vector<ControlRegion>& afRegions) {
210 std::vector<int32_t> regions;
211 regions.reserve(5 * afRegions.size());
212 for (const ControlRegion& region : afRegions) {
213 regions.push_back(region.x0);
214 regions.push_back(region.y0);
215 regions.push_back(region.x1);
216 regions.push_back(region.y1);
217 regions.push_back(region.weight);
218 }
219 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
220 return *this;
221}
222
223MetadataBuilder& MetadataBuilder::setControlAwbRegions(
224 const std::vector<ControlRegion>& awbRegions) {
225 std::vector<int32_t> regions;
226 regions.reserve(5 * awbRegions.size());
227 for (const ControlRegion& region : awbRegions) {
228 regions.push_back(region.x0);
229 regions.push_back(region.y0);
230 regions.push_back(region.x1);
231 regions.push_back(region.y1);
232 regions.push_back(region.weight);
233 }
234 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
235 return *this;
236}
237
238MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
239 const camera_metadata_enum_android_control_capture_intent_t intent) {
240 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] =
241 std::vector<uint8_t>({static_cast<uint8_t>(intent)});
242 return *this;
243}
244
245MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
246 mEntryMap[ANDROID_JPEG_MAX_SIZE] = std::vector<int32_t>({size});
247 return *this;
248}
249
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100250MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
251 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
252 const int32_t maxStallStreams) {
253 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
254 {maxRawStreams, maxProcessedStreams, maxStallStreams});
255 return *this;
256}
257
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100258MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
259 camera_metadata_enum_android_sync_max_latency latency) {
260 mEntryMap[ANDROID_SYNC_MAX_LATENCY] =
261 std::vector<int32_t>({static_cast<int32_t>(latency)});
262 return *this;
263}
264
265MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
266 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
267 requestCapabilities) {
268 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
269 convertTo<uint8_t>(requestCapabilities);
270 return *this;
271}
272
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100273MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
274 const std::vector<StreamConfiguration>& streamConfigurations) {
275 std::vector<int32_t> metadataStreamConfigs;
276 std::vector<int64_t> metadataMinFrameDurations;
277 std::vector<int64_t> metadataStallDurations;
278 metadataStreamConfigs.reserve(streamConfigurations.size());
279 metadataMinFrameDurations.reserve(streamConfigurations.size());
280 metadataStallDurations.reserve(streamConfigurations.size());
281
282 for (const auto& config : streamConfigurations) {
283 metadataStreamConfigs.push_back(config.format);
284 metadataStreamConfigs.push_back(config.width);
285 metadataStreamConfigs.push_back(config.height);
286 metadataStreamConfigs.push_back(
287 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
288
289 metadataMinFrameDurations.push_back(config.format);
290 metadataMinFrameDurations.push_back(config.width);
291 metadataMinFrameDurations.push_back(config.height);
292 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
293
294 metadataStallDurations.push_back(config.format);
295 metadataStallDurations.push_back(config.width);
296 metadataStallDurations.push_back(config.height);
297 metadataStallDurations.push_back(config.minStallDuration.count());
298 }
299
300 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
301 metadataStreamConfigs;
302 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
303 metadataMinFrameDurations;
Biswarup Pal6152a302023-12-19 12:44:09 +0000304 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] = metadataStallDurations;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100305
306 return *this;
307}
308
309MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
310 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100311 std::vector<float>({maxZoom});
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100312 return *this;
313}
314
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100315MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
316 const float max) {
317 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
318 return *this;
319}
320
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100321MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
322 int x1, int y1) {
323 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
324 std::vector<int32_t>({x0, y0, x1, y1});
325 return *this;
326}
327
Biswarup Pald9be04d2024-01-31 14:35:15 +0000328MetadataBuilder& MetadataBuilder::setSensorPixelArraySize(int width,
329 int height) {
330 mEntryMap[ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE] =
331 std::vector<int32_t>({width, height});
332 return *this;
333}
334
335MetadataBuilder& MetadataBuilder::setSensorPhysicalSize(float width,
336 float height) {
337 mEntryMap[ANDROID_SENSOR_INFO_PHYSICAL_SIZE] =
338 std::vector<float>({width, height});
339 return *this;
340}
341
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100342MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
343 int32_t max) {
344 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
345 std::vector<int32_t>({min, max});
346 return *this;
347}
348
349MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
350 const camera_metadata_rational step) {
351 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
352 std::vector<camera_metadata_rational>({step});
353 return *this;
354}
355
356MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
357 const std::vector<int32_t>& keys) {
358 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
359 return *this;
360}
361
362MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
363 const std::vector<int32_t>& keys) {
364 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
365 return *this;
366}
367
368MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
369 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
370 capabilities) {
371 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
372 convertTo<uint8_t>(capabilities);
373 return *this;
374}
375
376MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
377 const std::vector<camera_metadata_tag_t>& keys) {
378 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
379 convertTo<int32_t>(keys);
380 return *this;
381}
382
383MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
384 std::vector<camera_metadata_tag_t> availableKeys;
385 availableKeys.reserve(mEntryMap.size());
386 for (const auto& [key, _] : mEntryMap) {
387 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
388 availableKeys.push_back(key);
389 }
390 }
391 setAvailableCharacteristicKeys(availableKeys);
392 return *this;
393}
394
395std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
396MetadataBuilder::build() const {
397 CameraMetadata metadataHelper;
398 for (const auto& entry : mEntryMap) {
399 status_t ret = std::visit(
400 [&](auto&& arg) {
401 return metadataHelper.update(entry.first, arg.data(), arg.size());
402 },
403 entry.second);
404 if (ret != NO_ERROR) {
405 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
406 get_camera_metadata_tag_name(entry.first),
407 ::android::statusToString(ret).c_str());
408 return nullptr;
409 }
410 }
411
412 const camera_metadata_t* metadata = metadataHelper.getAndLock();
413 if (metadata == nullptr) {
414 ALOGE(
415 "Failure when constructing metadata -> CameraMetadata helper returned "
416 "nullptr");
417 return nullptr;
418 }
419
420 auto aidlMetadata =
421 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
422 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
423 aidlMetadata->metadata.assign(data_ptr,
424 data_ptr + get_camera_metadata_size(metadata));
425 metadataHelper.unlock(metadata);
426
427 return aidlMetadata;
428}
429
430} // namespace virtualcamera
431} // namespace companion
432} // namespace android