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