blob: 71832d939806db5c8730b04113e4ea3714da94bb [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#ifndef ANDROID_COMPANION_VIRTUALCAMERA_METADATABUILDER_H
18#define ANDROID_COMPANION_VIRTUALCAMERA_METADATABUILDER_H
19
20#include <chrono>
21#include <cstdint>
22#include <map>
23#include <memory>
24#include <variant>
25#include <vector>
26
27#include "aidl/android/hardware/camera/device/CameraMetadata.h"
28#include "system/camera_metadata.h"
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010029#include "util/Util.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010030
31namespace android {
32namespace companion {
33namespace virtualcamera {
34
35// Convenience builder for the
36// aidl::android::hardware::camera::device::CameraMetadata.
37//
38// Calling the same builder setter multiple will overwrite the value.
39// This class is not thread-safe.
40class MetadataBuilder {
41 public:
42 struct StreamConfiguration {
43 int32_t width = 0;
44 int32_t height = 0;
45 int32_t format = 0;
46 // Minimal frame duration - corresponds to maximal FPS for given format.
47 // See ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS in CameraMetadataTag.aidl.
Biswarup Pal6152a302023-12-19 12:44:09 +000048 std::chrono::nanoseconds minFrameDuration{0};
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010049 // Minimal stall duration.
50 // See ANDROID_SCALER_AVAILABLE_STALL_DURATIONS in CameraMetadataTag.aidl.
51 std::chrono::nanoseconds minStallDuration{0};
52 };
53
54 struct ControlRegion {
55 int32_t x0 = 0;
56 int32_t y0 = 0;
57 int32_t x1 = 0;
58 int32_t y1 = 0;
59 int32_t weight = 0;
60 };
61
62 MetadataBuilder() = default;
63 ~MetadataBuilder() = default;
64
65 // See ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL in CameraMetadataTag.aidl.
66 MetadataBuilder& setSupportedHardwareLevel(
67 camera_metadata_enum_android_info_supported_hardware_level_t hwLevel);
68
69 // Whether this camera device has a flash unit
70 // See ANDROID_FLASH_INFO_AVAILABLE in CameraMetadataTag.aidl.
71 MetadataBuilder& setFlashAvailable(bool flashAvailable);
72
73 // See ANDROID_LENS_FACING in CameraMetadataTag.aidl.
74 MetadataBuilder& setLensFacing(
75 camera_metadata_enum_android_lens_facing lensFacing);
76
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010077 // See ANDROID_SENSOR_READOUT_TIMESTAMP in CameraMetadataTag.aidl.
78 MetadataBuilder& setSensorReadoutTimestamp(
79 camera_metadata_enum_android_sensor_readout_timestamp_t
80 sensorReadoutTimestamp);
81
Biswarup Pald9be04d2024-01-31 14:35:15 +000082 // See ANDROID_LENS_FOCAL_LENGTH and ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS
83 // in CameraMetadataTag.aidl.
84 MetadataBuilder& setFocalLength(float focalLength);
85
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010086 // See ANDROID_SENSOR_ORIENTATION in CameraMetadataTag.aidl.
87 MetadataBuilder& setSensorOrientation(int32_t sensorOrientation);
88
89 // Time at start of exposure of first row of the image
90 // sensor active array, in nanoseconds.
91 //
92 // See ANDROID_SENSOR_TIMESTAMP in CameraMetadataTag.aidl.
93 MetadataBuilder& setSensorTimestamp(std::chrono::nanoseconds timestamp);
94
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +010095 // See SENSOR_INFO_TIMESTAMP_SOURCE in CameraCharacteristic.java.
96 MetadataBuilder& setSensorTimestampSource(
97 camera_metadata_enum_android_sensor_info_timestamp_source_t timestampSource);
98
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010099 // See ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE in CameraMetadataTag.aidl.
100 MetadataBuilder& setSensorActiveArraySize(int x0, int y0, int x1, int y1);
101
Biswarup Pald9be04d2024-01-31 14:35:15 +0000102 // See ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE in CameraMetadataTag.aidl.
103 MetadataBuilder& setSensorPixelArraySize(int width, int height);
104
105 // See ANDROID_SENSOR_INFO_PHYSICAL_SIZE in CameraMetadataTag.aidl.
106 MetadataBuilder& setSensorPhysicalSize(float width, float height);
107
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100108 // See ANDROID_STATISTICS_FACE_DETECT_MODE in CameraMetadataTag.aidl.
109 MetadataBuilder& setAvailableFaceDetectModes(
110 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
111 faceDetectMode);
112
113 // Sets available stream configurations along with corresponding minimal frame
114 // durations (corresponding to max fps) and stall durations.
115 //
116 // See ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
117 // ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS and
118 // ANDROID_SCALER_AVAILABLE_STALL_DURATIONS in CameraMetadataTag.aidl.
119 MetadataBuilder& setAvailableOutputStreamConfigurations(
120 const std::vector<StreamConfiguration>& streamConfigurations);
121
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100122 // See ANDROID_CONTROL_AVAILABLE_MODES in CameraMetadataTag.aidl.
123 MetadataBuilder& setControlAvailableModes(
124 const std::vector<camera_metadata_enum_android_control_mode_t>&
125 availableModes);
126
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100127 // See ANDROID_CONTROL_AVAILABLE_SCENE_MODES in CameraMetadataTag.aidl.
128 MetadataBuilder& setControlAvailableSceneModes(
129 const std::vector<camera_metadata_enum_android_control_scene_mode>&
130 availableSceneModes);
131
132 // See ANDROID_CONTROL_AVAILABLE_EFFECTS in CameraMetadataTag.aidl.
133 MetadataBuilder& setControlAvailableEffects(
134 const std::vector<camera_metadata_enum_android_control_effect_mode>&
135 availableEffects);
136
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100137 // See ANDROID_CONTROL_AE_COMPENSATION_RANGE in CameraMetadataTag.aidl.
138 MetadataBuilder& setControlAeCompensationRange(int32_t min, int32_t max);
139
140 // See ANDROID_CONTROL_AE_COMPENSATION_STEP in CameraMetadataTag.aidl.
141 MetadataBuilder& setControlAeCompensationStep(camera_metadata_rational step);
142
143 // See ANDROID_CONTROL_AF_AVAILABLE_MODES in CameraMetadataTag.aidl.
144 MetadataBuilder& setControlAfAvailableModes(
145 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
146 availableModes);
147
148 // See ANDROID_CONTROL_AF_MODE in CameraMetadataTag.aidl.
149 MetadataBuilder& setControlAfMode(
150 const camera_metadata_enum_android_control_af_mode_t mode);
151
152 // See ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES in CameraMetadataTag.aidl.
153 MetadataBuilder& setControlAeAvailableFpsRange(int32_t min, int32_t max);
154
155 // See ANDROID_CONTROL_CAPTURE_INTENT in CameraMetadataTag.aidl.
156 MetadataBuilder& setControlCaptureIntent(
157 camera_metadata_enum_android_control_capture_intent_t intent);
158
159 // See ANDROID_CONTROL_MAX_REGIONS in CameraMetadataTag.aidl.
160 MetadataBuilder& setControlMaxRegions(int32_t maxAeRegions,
161 int32_t maxAwbRegions,
162 int32_t maxAfRegions);
163
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100164 // See ANDROID_CONTROL_AWB_AVAILABLE_MODES in CameraMetadataTag.aidl.
165 MetadataBuilder& setControlAvailableAwbModes(
166 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes);
167
168 // See CONTROL_AWB_LOCK_AVAILABLE in CameraMetadataTag.aidl.
169 MetadataBuilder& setControlAwbLockAvailable(bool awbLockAvailable);
170
171 // See CONTROL_AE_LOCK_AVAILABLE in CameraMetadataTag.aidl.
172 MetadataBuilder& setControlAeLockAvailable(bool aeLockAvailable);
173
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100174 // See ANDROID_CONTROL_AE_REGIONS in CameraMetadataTag.aidl.
175 MetadataBuilder& setControlAeRegions(
176 const std::vector<ControlRegion>& aeRegions);
177
178 // See ANDROID_CONTROL_AWB_REGIONS in CameraMetadataTag.aidl.
179 MetadataBuilder& setControlAwbRegions(
180 const std::vector<ControlRegion>& awbRegions);
181
182 // See ANDROID_CONTROL_AF_REGIONS in CameraMetadataTag.aidl.
183 MetadataBuilder& setControlAfRegions(
184 const std::vector<ControlRegion>& afRegions);
185
186 // The size of the compressed JPEG image, in bytes.
187 //
188 // See ANDROID_JPEG_SIZE in CameraMetadataTag.aidl.
189 MetadataBuilder& setMaxJpegSize(int32_t size);
190
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100191 // See JPEG_AVAILABLE_THUMBNAIL_SIZES in CameraCharacteristic.java.
192 MetadataBuilder& setJpegAvailableThumbnailSizes(
193 const std::vector<Resolution>& thumbnailSizes);
194
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100195 // The maximum numbers of different types of output streams
196 // that can be configured and used simultaneously by a camera device.
197 //
198 // See ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS in CameraMetadataTag.aidl.
199 MetadataBuilder& setMaxNumberOutputStreams(int32_t maxRawStreams,
200 int32_t maxProcessedStreams,
201 int32_t maxStallStreams);
202
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100203 // See ANDROID_SYNC_MAX_LATENCY in CameraMetadataTag.aidl.
204 MetadataBuilder& setSyncMaxLatency(
205 camera_metadata_enum_android_sync_max_latency setSyncMaxLatency);
206
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100207 // See ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM in CameraMetadataTag.aidl.
208 MetadataBuilder& setAvailableMaxDigitalZoom(const float maxZoom);
209
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100210 // See ANDROID_CONTROL_ZOOM_RATIO_RANGE in CameraMetadataTag.aidl.
211 MetadataBuilder& setControlZoomRatioRange(float min, float max);
212
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100213 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
214 MetadataBuilder& setAvailableRequestCapabilities(
215 const std::vector<
216 camera_metadata_enum_android_request_available_capabilities_t>&
217 requestCapabilities);
218
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100219 // A list of all keys that the camera device has available to use with
220 // CaptureRequest.
221 //
222 // See ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
223 MetadataBuilder& setAvailableRequestKeys(const std::vector<int32_t>& keys);
224
225 // A list of all keys that the camera device has available to use with
226 // CaptureResult.
227 //
228 // See ANDROID_RESULT_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
229 MetadataBuilder& setAvailableResultKeys(const std::vector<int32_t>& keys);
230
231 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
232 MetadataBuilder& setAvailableCapabilities(
233 const std::vector<
234 camera_metadata_enum_android_request_available_capabilities_t>&
235 capabilities);
236
237 // A list of all keys that the camera device has available to use.
238 //
239 // See ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS in CameraMetadataTag.aidl.
240 MetadataBuilder& setAvailableCharacteristicKeys(
241 const std::vector<camera_metadata_tag_t>& keys);
242
243 // Extends metadata with ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100244 // containing all set tags.
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100245 MetadataBuilder& setAvailableCharacteristicKeys();
246
247 // Build CameraMetadata instance.
248 //
249 // Returns nullptr in case something went wrong.
250 std::unique_ptr<::aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100251 build();
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100252
253 private:
254 // Maps metadata tags to vectors of values for the given tag.
255 std::map<camera_metadata_tag_t,
256 std::variant<std::vector<int64_t>, std::vector<int32_t>,
257 std::vector<uint8_t>, std::vector<float>,
258 std::vector<camera_metadata_rational_t>>>
259 mEntryMap;
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100260 // Extend metadata with ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS.
261 bool mExtendWithAvailableCharacteristicsKeys = false;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100262};
263
264} // namespace virtualcamera
265} // namespace companion
266} // namespace android
267
268#endif // ANDROID_COMPANION_VIRTUALCAMERA_METADATABUILDER_H