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