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