blob: b3b1a26f55b6f23f5ed60fcefa0ee185ea72fa95 [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
236MetadataBuilder& MetadataBuilder::setSensorActiveArraySize(int x0, int y0,
237 int x1, int y1) {
238 mEntryMap[ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE] =
239 std::vector<int32_t>({x0, y0, x1, y1});
240 return *this;
241}
242
243MetadataBuilder& MetadataBuilder::setControlAeCompensationRange(int32_t min,
244 int32_t max) {
245 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_RANGE] =
246 std::vector<int32_t>({min, max});
247 return *this;
248}
249
250MetadataBuilder& MetadataBuilder::setControlAeCompensationStep(
251 const camera_metadata_rational step) {
252 mEntryMap[ANDROID_CONTROL_AE_COMPENSATION_STEP] =
253 std::vector<camera_metadata_rational>({step});
254 return *this;
255}
256
257MetadataBuilder& MetadataBuilder::setAvailableRequestKeys(
258 const std::vector<int32_t>& keys) {
259 mEntryMap[ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS] = keys;
260 return *this;
261}
262
263MetadataBuilder& MetadataBuilder::setAvailableResultKeys(
264 const std::vector<int32_t>& keys) {
265 mEntryMap[ANDROID_REQUEST_AVAILABLE_RESULT_KEYS] = keys;
266 return *this;
267}
268
269MetadataBuilder& MetadataBuilder::setAvailableCapabilities(
270 const std::vector<camera_metadata_enum_android_request_available_capabilities_t>&
271 capabilities) {
272 mEntryMap[ANDROID_REQUEST_AVAILABLE_CAPABILITIES] =
273 convertTo<uint8_t>(capabilities);
274 return *this;
275}
276
277MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys(
278 const std::vector<camera_metadata_tag_t>& keys) {
279 mEntryMap[ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS] =
280 convertTo<int32_t>(keys);
281 return *this;
282}
283
284MetadataBuilder& MetadataBuilder::setAvailableCharacteristicKeys() {
285 std::vector<camera_metadata_tag_t> availableKeys;
286 availableKeys.reserve(mEntryMap.size());
287 for (const auto& [key, _] : mEntryMap) {
288 if (key != ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS) {
289 availableKeys.push_back(key);
290 }
291 }
292 setAvailableCharacteristicKeys(availableKeys);
293 return *this;
294}
295
296std::unique_ptr<aidl::android::hardware::camera::device::CameraMetadata>
297MetadataBuilder::build() const {
298 CameraMetadata metadataHelper;
299 for (const auto& entry : mEntryMap) {
300 status_t ret = std::visit(
301 [&](auto&& arg) {
302 return metadataHelper.update(entry.first, arg.data(), arg.size());
303 },
304 entry.second);
305 if (ret != NO_ERROR) {
306 ALOGE("Failed to update metadata with key %d - %s: %s", entry.first,
307 get_camera_metadata_tag_name(entry.first),
308 ::android::statusToString(ret).c_str());
309 return nullptr;
310 }
311 }
312
313 const camera_metadata_t* metadata = metadataHelper.getAndLock();
314 if (metadata == nullptr) {
315 ALOGE(
316 "Failure when constructing metadata -> CameraMetadata helper returned "
317 "nullptr");
318 return nullptr;
319 }
320
321 auto aidlMetadata =
322 std::make_unique<aidl::android::hardware::camera::device::CameraMetadata>();
323 const uint8_t* data_ptr = reinterpret_cast<const uint8_t*>(metadata);
324 aidlMetadata->metadata.assign(data_ptr,
325 data_ptr + get_camera_metadata_size(metadata));
326 metadataHelper.unlock(metadata);
327
328 return aidlMetadata;
329}
330
331} // namespace virtualcamera
332} // namespace companion
333} // namespace android