blob: 92a48b91b0753967c0ad5a1c063d613e40a68dd7 [file] [log] [blame]
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
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 Sebechlebsky5cb39962023-11-22 17:33:07 +0100106MetadataBuilder& MetadataBuilder::setControlAfAvailableModes(
107 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
108 availableModes) {
109 mEntryMap[ANDROID_CONTROL_AF_AVAILABLE_MODES] =
110 convertTo<uint8_t>(availableModes);
111 return *this;
112}
113
114MetadataBuilder& MetadataBuilder::setControlAfMode(
115 const camera_metadata_enum_android_control_af_mode_t mode) {
116 mEntryMap[ANDROID_CONTROL_AF_MODE] =
117 std::vector<uint8_t>({static_cast<uint8_t>(mode)});
118 return *this;
119}
120
121MetadataBuilder& MetadataBuilder::setControlAeAvailableFpsRange(
122 const int32_t minFps, const int32_t maxFps) {
123 mEntryMap[ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES] =
124 std::vector<int32_t>({minFps, maxFps});
125 return *this;
126}
127
128MetadataBuilder& MetadataBuilder::setControlMaxRegions(int32_t maxAeRegions,
129 int32_t maxAwbRegions,
130 int32_t maxAfRegions) {
131 mEntryMap[ANDROID_CONTROL_MAX_REGIONS] =
132 std::vector<int32_t>({maxAeRegions, maxAwbRegions, maxAfRegions});
133 return *this;
134}
135
136MetadataBuilder& MetadataBuilder::setControlAeRegions(
137 const std::vector<ControlRegion>& aeRegions) {
138 std::vector<int32_t> regions;
139 regions.reserve(5 * aeRegions.size());
140 for (const ControlRegion& region : aeRegions) {
141 regions.push_back(region.x0);
142 regions.push_back(region.y0);
143 regions.push_back(region.x1);
144 regions.push_back(region.y1);
145 regions.push_back(region.weight);
146 }
147 mEntryMap[ANDROID_CONTROL_AE_REGIONS] = std::move(regions);
148 return *this;
149}
150
151MetadataBuilder& MetadataBuilder::setControlAfRegions(
152 const std::vector<ControlRegion>& afRegions) {
153 std::vector<int32_t> regions;
154 regions.reserve(5 * afRegions.size());
155 for (const ControlRegion& region : afRegions) {
156 regions.push_back(region.x0);
157 regions.push_back(region.y0);
158 regions.push_back(region.x1);
159 regions.push_back(region.y1);
160 regions.push_back(region.weight);
161 }
162 mEntryMap[ANDROID_CONTROL_AF_REGIONS] = std::move(regions);
163 return *this;
164}
165
166MetadataBuilder& MetadataBuilder::setControlAwbRegions(
167 const std::vector<ControlRegion>& awbRegions) {
168 std::vector<int32_t> regions;
169 regions.reserve(5 * awbRegions.size());
170 for (const ControlRegion& region : awbRegions) {
171 regions.push_back(region.x0);
172 regions.push_back(region.y0);
173 regions.push_back(region.x1);
174 regions.push_back(region.y1);
175 regions.push_back(region.weight);
176 }
177 mEntryMap[ANDROID_CONTROL_AWB_REGIONS] = std::move(regions);
178 return *this;
179}
180
181MetadataBuilder& MetadataBuilder::setControlCaptureIntent(
182 const camera_metadata_enum_android_control_capture_intent_t intent) {
183 mEntryMap[ANDROID_CONTROL_CAPTURE_INTENT] =
184 std::vector<uint8_t>({static_cast<uint8_t>(intent)});
185 return *this;
186}
187
188MetadataBuilder& MetadataBuilder::setMaxJpegSize(const int32_t size) {
189 mEntryMap[ANDROID_JPEG_MAX_SIZE] = std::vector<int32_t>({size});
190 return *this;
191}
192
193MetadataBuilder& MetadataBuilder::setAvailableOutputStreamConfigurations(
194 const std::vector<StreamConfiguration>& streamConfigurations) {
195 std::vector<int32_t> metadataStreamConfigs;
196 std::vector<int64_t> metadataMinFrameDurations;
197 std::vector<int64_t> metadataStallDurations;
198 metadataStreamConfigs.reserve(streamConfigurations.size());
199 metadataMinFrameDurations.reserve(streamConfigurations.size());
200 metadataStallDurations.reserve(streamConfigurations.size());
201
202 for (const auto& config : streamConfigurations) {
203 metadataStreamConfigs.push_back(config.format);
204 metadataStreamConfigs.push_back(config.width);
205 metadataStreamConfigs.push_back(config.height);
206 metadataStreamConfigs.push_back(
207 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT);
208
209 metadataMinFrameDurations.push_back(config.format);
210 metadataMinFrameDurations.push_back(config.width);
211 metadataMinFrameDurations.push_back(config.height);
212 metadataMinFrameDurations.push_back(config.minFrameDuration.count());
213
214 metadataStallDurations.push_back(config.format);
215 metadataStallDurations.push_back(config.width);
216 metadataStallDurations.push_back(config.height);
217 metadataStallDurations.push_back(config.minStallDuration.count());
218 }
219
220 mEntryMap[ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS] =
221 metadataStreamConfigs;
222 mEntryMap[ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS] =
223 metadataMinFrameDurations;
224 mEntryMap[ANDROID_SCALER_AVAILABLE_STALL_DURATIONS] =
225 metadataMinFrameDurations;
226
227 return *this;
228}
229
230MetadataBuilder& MetadataBuilder::setAvailableMaxDigitalZoom(const float maxZoom) {
231 mEntryMap[ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM] =
232 std::vector<float>(maxZoom);
233 return *this;
234}
235
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100236MetadataBuilder& MetadataBuilder::setControlZoomRatioRange(const float min,
237 const float max) {
238 mEntryMap[ANDROID_CONTROL_ZOOM_RATIO_RANGE] = std::vector<float>({min, max});
239 return *this;
240}
241
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100242MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
243 int x1, int y1) {
244 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
245 std::vector<int32_t>({x0, y0, x1, y1});
246 return *this;
247}
248
249MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
250 int32_t max) {
251 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
252 std::vector<int32_t>({min, max});
253 return *this;
254}
255
256MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
257 const camera_metadata_rational step) {
258 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
259 std::vector<camera_metadata_rational>({step});
260 return *this;
261}
262
263MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
264 const std::vector<int32_t>& keys) {
265 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
266 return *this;
267}
268
269MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
270 const std::vector<int32_t>& keys) {
271 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
272 return *this;
273}
274
275MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
276 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
277 capabilities) {
278 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
279 convertTo<uint8_t>(capabilities);
280 return *this;
281}
282
283MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
284 const std::vector<camera_metadata_tag_t>& keys) {
285 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
286 convertTo<int32_t>(keys);
287 return *this;
288}
289
290MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
291 std::vector<camera_metadata_tag_t> availableKeys;
292 availableKeys.reserve(mEntryMap.size());
293 for (const auto& [key, _] : mEntryMap) {
294 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
295 availableKeys.push_back(key);
296 }
297 }
298 setAvailableCharacteristicKeys(availableKeys);
299 return *this;
300}
301
302std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
303MetadataBuilder::build() const {
304 CameraMetadata metadataHelper;
305 for (const auto& entry : mEntryMap) {
306 status_t ret = std::visit(
307 [&](auto&& arg) {
308 return metadataHelper.update(entry.first, arg.data(), arg.size());
309 },
310 entry.second);
311 if (ret != NO_ERROR) {
312 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
313 get_camera_metadata_tag_name(entry.first),
314 ::android::statusToString(ret).c_str());
315 return nullptr;
316 }
317 }
318
319 const camera_metadata_t* metadata = metadataHelper.getAndLock();
320 if (metadata == nullptr) {
321 ALOGE(
322 "Failure when constructing metadata -> CameraMetadata helper returned "
323 "nullptr");
324 return nullptr;
325 }
326
327 auto aidlMetadata =
328 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
329 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
330 aidlMetadata->metadata.assign(data_ptr,
331 data_ptr + get_camera_metadata_size(metadata));
332 metadataHelper.unlock(metadata);
333
334 return aidlMetadata;
335}
336
337} // namespace virtualcamera
338} // namespace companion
339} // namespace android