blob: eba48c4d4edfc9f352f1c416ec450a76e2ed5599 [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
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010085MetadataBuilder& MetadataBuilder::setSensorOrientation(int32_t sensorOrientation) {
86 mEntryMap[ANDROID_SENSOR_ORIENTATION] =
87 std::vector<int32_t>({sensorOrientation});
88 return *this;
89}
90
91MetadataBuilder& MetadataBuilder::setSensorTimestamp(
92 std::chrono::nanoseconds timestamp) {
93 mEntryMap[ANDROID_SENSOR_TIMESTAMP] =
94 std::vector<int64_t>({timestamp.count()});
95 return *this;
96}
97
98MetadataBuilder& MetadataBuilder::setAvailableFaceDetectModes(
99 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
100 faceDetectModes) {
101 mEntryMap[ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES] =
102 convertTo<uint8_t>(faceDetectModes);
103 return *this;
104}
105
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100106MetadataBuilder& MetadataBuilder::setControlAvailableModes(
107 const std::vector<camera_metadata_enum_android_control_mode_t>&
108 availableModes) {
109 mEntryMap[ANDROID_CONTROL_AVAILABLE_MODES] =
110 convertTo<uint8_t>(availableModes);
111 return *this;
112}
113
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100114MetadataBuilder& MetadataBuilder::setControlAvailableSceneModes(
115 const std::vector<camera_metadata_enum_android_control_scene_mode>&
116 availableSceneModes) {
117 mEntryMap[ANDROID_CONTROL_AVAILABLE_SCENE_MODES] =
118 convertTo<uint8_t>(availableSceneModes);
119 return *this;
120}
121
122MetadataBuilder& MetadataBuilder::setControlAvailableEffects(
123 const std::vector<camera_metadata_enum_android_control_effect_mode>&
124 availableEffects) {
125 mEntryMap[ANDROID_CONTROL_AVAILABLE_EFFECTS] =
126 convertTo<uint8_t>(availableEffects);
127 return *this;
128}
129
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100130MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
131 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
132 availableModes) {
133 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
134 convertTo<uint8_t>(availableModes);
135 return *this;
136}
137
138MetadataBuilder& MetadataBuilder::setControlAfMode(
139 const camera_metadata_enum_android_control_af_mode_t mode) {
140 mEntryMap[ANDROID_CONTROL_AF_MODE] =
141 std::vector<uint8_t>({static_cast<uint8_t>(mode)});
142 return *this;
143}
144
145MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRange(
146 const int32_t minFps, const int32_t maxFps) {
147 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] =
148 std::vector<int32_t>({minFps, maxFps});
149 return *this;
150}
151
152MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
153 int32_t maxAwbRegions,
154 int32_t maxAfRegions) {
155 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
156 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
157 return *this;
158}
159
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100160MetadataBuilder& MetadataBuilder::setControlAvailableAwbModes(
161 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes) {
162 mEntryMap[ANDROID_CONTROL_AWB_AVAILABLE_MODES] = convertTo<uint8_t>(awbModes);
163 return *this;
164}
165
166MetadataBuilder& MetadataBuilder::setControlAwbLockAvailable(
167 const bool awbLockAvailable) {
168 const uint8_t lockAvailable = awbLockAvailable
169 ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
170 : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
171 mEntryMap[ANDROID_CONTROL_AWB_LOCK_AVAILABLE] =
172 std::vector<uint8_t>({lockAvailable});
173 return *this;
174}
175
176MetadataBuilder& MetadataBuilder::setControlAeLockAvailable(
177 const bool aeLockAvailable) {
178 const uint8_t lockAvailable = aeLockAvailable
179 ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
180 : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
181 mEntryMap[ANDROID_CONTROL_AE_LOCK_AVAILABLE] =
182 std::vector<uint8_t>({lockAvailable});
183 return *this;
184}
185
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100186MetadataBuilder& MetadataBuilder::setControlAeRegions(
187 const std::vector<ControlRegion>& aeRegions) {
188 std::vector<int32_t> regions;
189 regions.reserve(5 * aeRegions.size());
190 for (const ControlRegion& region : aeRegions) {
191 regions.push_back(region.x0);
192 regions.push_back(region.y0);
193 regions.push_back(region.x1);
194 regions.push_back(region.y1);
195 regions.push_back(region.weight);
196 }
197 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
198 return *this;
199}
200
201MetadataBuilder& MetadataBuilder::setControlAfRegions(
202 const std::vector<ControlRegion>& afRegions) {
203 std::vector<int32_t> regions;
204 regions.reserve(5 * afRegions.size());
205 for (const ControlRegion& region : afRegions) {
206 regions.push_back(region.x0);
207 regions.push_back(region.y0);
208 regions.push_back(region.x1);
209 regions.push_back(region.y1);
210 regions.push_back(region.weight);
211 }
212 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
213 return *this;
214}
215
216MetadataBuilder& MetadataBuilder::setControlAwbRegions(
217 const std::vector<ControlRegion>& awbRegions) {
218 std::vector<int32_t> regions;
219 regions.reserve(5 * awbRegions.size());
220 for (const ControlRegion& region : awbRegions) {
221 regions.push_back(region.x0);
222 regions.push_back(region.y0);
223 regions.push_back(region.x1);
224 regions.push_back(region.y1);
225 regions.push_back(region.weight);
226 }
227 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
228 return *this;
229}
230
231MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
232 const camera_metadata_enum_android_control_capture_intent_t intent) {
233 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] =
234 std::vector<uint8_t>({static_cast<uint8_t>(intent)});
235 return *this;
236}
237
238MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
239 mEntryMap[ANDROID_JPEG_MAX_SIZE] = std::vector<int32_t>({size});
240 return *this;
241}
242
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100243MetadataBuilder& MetadataBuilder::setMaxNumberOutputStreams(
244 const int32_t maxRawStreams, const int32_t maxProcessedStreams,
245 const int32_t maxStallStreams) {
246 mEntryMap[ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS] = std::vector<int32_t>(
247 {maxRawStreams, maxProcessedStreams, maxStallStreams});
248 return *this;
249}
250
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100251MetadataBuilder& MetadataBuilder::setSyncMaxLatency(
252 camera_metadata_enum_android_sync_max_latency latency) {
253 mEntryMap[ANDROID_SYNC_MAX_LATENCY] =
254 std::vector<int32_t>({static_cast<int32_t>(latency)});
255 return *this;
256}
257
258MetadataBuilder& MetadataBuilder::setAvailableRequestCapabilities(
259 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
260 requestCapabilities) {
261 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
262 convertTo<uint8_t>(requestCapabilities);
263 return *this;
264}
265
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100266MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
267 const std::vector<StreamConfiguration>& streamConfigurations) {
268 std::vector<int32_t> metadataStreamConfigs;
269 std::vector<int64_t> metadataMinFrameDurations;
270 std::vector<int64_t> metadataStallDurations;
271 metadataStreamConfigs.reserve(streamConfigurations.size());
272 metadataMinFrameDurations.reserve(streamConfigurations.size());
273 metadataStallDurations.reserve(streamConfigurations.size());
274
275 for (const auto& config : streamConfigurations) {
276 metadataStreamConfigs.push_back(config.format);
277 metadataStreamConfigs.push_back(config.width);
278 metadataStreamConfigs.push_back(config.height);
279 metadataStreamConfigs.push_back(
280 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
281
282 metadataMinFrameDurations.push_back(config.format);
283 metadataMinFrameDurations.push_back(config.width);
284 metadataMinFrameDurations.push_back(config.height);
285 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
286
287 metadataStallDurations.push_back(config.format);
288 metadataStallDurations.push_back(config.width);
289 metadataStallDurations.push_back(config.height);
290 metadataStallDurations.push_back(config.minStallDuration.count());
291 }
292
293 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
294 metadataStreamConfigs;
295 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
296 metadataMinFrameDurations;
Biswarup Pal6152a302023-12-19 12:44:09 +0000297 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] = metadataStallDurations;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100298
299 return *this;
300}
301
302MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
303 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100304 std::vector<float>({maxZoom});
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100305 return *this;
306}
307
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100308MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
309 const float max) {
310 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
311 return *this;
312}
313
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100314MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
315 int x1, int y1) {
316 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
317 std::vector<int32_t>({x0, y0, x1, y1});
318 return *this;
319}
320
321MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
322 int32_t max) {
323 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
324 std::vector<int32_t>({min, max});
325 return *this;
326}
327
328MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
329 const camera_metadata_rational step) {
330 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
331 std::vector<camera_metadata_rational>({step});
332 return *this;
333}
334
335MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
336 const std::vector<int32_t>& keys) {
337 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
338 return *this;
339}
340
341MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
342 const std::vector<int32_t>& keys) {
343 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
344 return *this;
345}
346
347MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
348 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
349 capabilities) {
350 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
351 convertTo<uint8_t>(capabilities);
352 return *this;
353}
354
355MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
356 const std::vector<camera_metadata_tag_t>& keys) {
357 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
358 convertTo<int32_t>(keys);
359 return *this;
360}
361
362MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
363 std::vector<camera_metadata_tag_t> availableKeys;
364 availableKeys.reserve(mEntryMap.size());
365 for (const auto& [key, _] : mEntryMap) {
366 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
367 availableKeys.push_back(key);
368 }
369 }
370 setAvailableCharacteristicKeys(availableKeys);
371 return *this;
372}
373
374std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
375MetadataBuilder::build() const {
376 CameraMetadata metadataHelper;
377 for (const auto& entry : mEntryMap) {
378 status_t ret = std::visit(
379 [&](auto&& arg) {
380 return metadataHelper.update(entry.first, arg.data(), arg.size());
381 },
382 entry.second);
383 if (ret != NO_ERROR) {
384 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
385 get_camera_metadata_tag_name(entry.first),
386 ::android::statusToString(ret).c_str());
387 return nullptr;
388 }
389 }
390
391 const camera_metadata_t* metadata = metadataHelper.getAndLock();
392 if (metadata == nullptr) {
393 ALOGE(
394 "Failure when constructing metadata -> CameraMetadata helper returned "
395 "nullptr");
396 return nullptr;
397 }
398
399 auto aidlMetadata =
400 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
401 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
402 aidlMetadata->metadata.assign(data_ptr,
403 data_ptr + get_camera_metadata_size(metadata));
404 metadataHelper.unlock(metadata);
405
406 return aidlMetadata;
407}
408
409} // namespace virtualcamera
410} // namespace companion
411} // namespace android