blob: 82510c15ff2aea058c7a2be8c03f97135061eaec [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"
29
30namespace android {
31namespace companion {
32namespace virtualcamera {
33
34// Convenience builder for the
35// aidl::android::hardware::camera::device::CameraMetadata.
36//
37// Calling the same builder setter multiple will overwrite the value.
38// This class is not thread-safe.
39class MetadataBuilder {
40 public:
41 struct StreamConfiguration {
42 int32_t width = 0;
43 int32_t height = 0;
44 int32_t format = 0;
45 // Minimal frame duration - corresponds to maximal FPS for given format.
46 // See ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS in CameraMetadataTag.aidl.
Biswarup Pal6152a302023-12-19 12:44:09 +000047 std::chrono::nanoseconds minFrameDuration{0};
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010048 // Minimal stall duration.
49 // See ANDROID_SCALER_AVAILABLE_STALL_DURATIONS in CameraMetadataTag.aidl.
50 std::chrono::nanoseconds minStallDuration{0};
51 };
52
53 struct ControlRegion {
54 int32_t x0 = 0;
55 int32_t y0 = 0;
56 int32_t x1 = 0;
57 int32_t y1 = 0;
58 int32_t weight = 0;
59 };
60
61 MetadataBuilder() = default;
62 ~MetadataBuilder() = default;
63
64 // See ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL in CameraMetadataTag.aidl.
65 MetadataBuilder& setSupportedHardwareLevel(
66 camera_metadata_enum_android_info_supported_hardware_level_t hwLevel);
67
68 // Whether this camera device has a flash unit
69 // See ANDROID_FLASH_INFO_AVAILABLE in CameraMetadataTag.aidl.
70 MetadataBuilder& setFlashAvailable(bool flashAvailable);
71
72 // See ANDROID_LENS_FACING in CameraMetadataTag.aidl.
73 MetadataBuilder& setLensFacing(
74 camera_metadata_enum_android_lens_facing lensFacing);
75
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010076 // See ANDROID_SENSOR_READOUT_TIMESTAMP in CameraMetadataTag.aidl.
77 MetadataBuilder& setSensorReadoutTimestamp(
78 camera_metadata_enum_android_sensor_readout_timestamp_t
79 sensorReadoutTimestamp);
80
Biswarup Pald9be04d2024-01-31 14:35:15 +000081 // See ANDROID_LENS_FOCAL_LENGTH and ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS
82 // in CameraMetadataTag.aidl.
83 MetadataBuilder& setFocalLength(float focalLength);
84
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010085 // See ANDROID_SENSOR_ORIENTATION in CameraMetadataTag.aidl.
86 MetadataBuilder& setSensorOrientation(int32_t sensorOrientation);
87
88 // Time at start of exposure of first row of the image
89 // sensor active array, in nanoseconds.
90 //
91 // See ANDROID_SENSOR_TIMESTAMP in CameraMetadataTag.aidl.
92 MetadataBuilder& setSensorTimestamp(std::chrono::nanoseconds timestamp);
93
94 // See ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE in CameraMetadataTag.aidl.
95 MetadataBuilder& setSensorActiveArraySize(int x0, int y0, int x1, int y1);
96
Biswarup Pald9be04d2024-01-31 14:35:15 +000097 // See ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE in CameraMetadataTag.aidl.
98 MetadataBuilder& setSensorPixelArraySize(int width, int height);
99
100 // See ANDROID_SENSOR_INFO_PHYSICAL_SIZE in CameraMetadataTag.aidl.
101 MetadataBuilder& setSensorPhysicalSize(float width, float height);
102
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100103 // See ANDROID_STATISTICS_FACE_DETECT_MODE in CameraMetadataTag.aidl.
104 MetadataBuilder& setAvailableFaceDetectModes(
105 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
106 faceDetectMode);
107
108 // Sets available stream configurations along with corresponding minimal frame
109 // durations (corresponding to max fps) and stall durations.
110 //
111 // See ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
112 // ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS and
113 // ANDROID_SCALER_AVAILABLE_STALL_DURATIONS in CameraMetadataTag.aidl.
114 MetadataBuilder& setAvailableOutputStreamConfigurations(
115 const std::vector<StreamConfiguration>& streamConfigurations);
116
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100117 // See ANDROID_CONTROL_AVAILABLE_MODES in CameraMetadataTag.aidl.
118 MetadataBuilder& setControlAvailableModes(
119 const std::vector<camera_metadata_enum_android_control_mode_t>&
120 availableModes);
121
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100122 // See ANDROID_CONTROL_AVAILABLE_SCENE_MODES in CameraMetadataTag.aidl.
123 MetadataBuilder& setControlAvailableSceneModes(
124 const std::vector<camera_metadata_enum_android_control_scene_mode>&
125 availableSceneModes);
126
127 // See ANDROID_CONTROL_AVAILABLE_EFFECTS in CameraMetadataTag.aidl.
128 MetadataBuilder& setControlAvailableEffects(
129 const std::vector<camera_metadata_enum_android_control_effect_mode>&
130 availableEffects);
131
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100132 // See ANDROID_CONTROL_AE_COMPENSATION_RANGE in CameraMetadataTag.aidl.
133 MetadataBuilder& setControlAeCompensationRange(int32_t min, int32_t max);
134
135 // See ANDROID_CONTROL_AE_COMPENSATION_STEP in CameraMetadataTag.aidl.
136 MetadataBuilder& setControlAeCompensationStep(camera_metadata_rational step);
137
138 // See ANDROID_CONTROL_AF_AVAILABLE_MODES in CameraMetadataTag.aidl.
139 MetadataBuilder& setControlAfAvailableModes(
140 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
141 availableModes);
142
143 // See ANDROID_CONTROL_AF_MODE in CameraMetadataTag.aidl.
144 MetadataBuilder& setControlAfMode(
145 const camera_metadata_enum_android_control_af_mode_t mode);
146
147 // See ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES in CameraMetadataTag.aidl.
148 MetadataBuilder& setControlAeAvailableFpsRange(int32_t min, int32_t max);
149
150 // See ANDROID_CONTROL_CAPTURE_INTENT in CameraMetadataTag.aidl.
151 MetadataBuilder& setControlCaptureIntent(
152 camera_metadata_enum_android_control_capture_intent_t intent);
153
154 // See ANDROID_CONTROL_MAX_REGIONS in CameraMetadataTag.aidl.
155 MetadataBuilder& setControlMaxRegions(int32_t maxAeRegions,
156 int32_t maxAwbRegions,
157 int32_t maxAfRegions);
158
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100159 // See ANDROID_CONTROL_AWB_AVAILABLE_MODES in CameraMetadataTag.aidl.
160 MetadataBuilder& setControlAvailableAwbModes(
161 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes);
162
163 // See CONTROL_AWB_LOCK_AVAILABLE in CameraMetadataTag.aidl.
164 MetadataBuilder& setControlAwbLockAvailable(bool awbLockAvailable);
165
166 // See CONTROL_AE_LOCK_AVAILABLE in CameraMetadataTag.aidl.
167 MetadataBuilder& setControlAeLockAvailable(bool aeLockAvailable);
168
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100169 // See ANDROID_CONTROL_AE_REGIONS in CameraMetadataTag.aidl.
170 MetadataBuilder& setControlAeRegions(
171 const std::vector<ControlRegion>& aeRegions);
172
173 // See ANDROID_CONTROL_AWB_REGIONS in CameraMetadataTag.aidl.
174 MetadataBuilder& setControlAwbRegions(
175 const std::vector<ControlRegion>& awbRegions);
176
177 // See ANDROID_CONTROL_AF_REGIONS in CameraMetadataTag.aidl.
178 MetadataBuilder& setControlAfRegions(
179 const std::vector<ControlRegion>& afRegions);
180
181 // The size of the compressed JPEG image, in bytes.
182 //
183 // See ANDROID_JPEG_SIZE in CameraMetadataTag.aidl.
184 MetadataBuilder& setMaxJpegSize(int32_t size);
185
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100186 // See ANDROID_SYNC_MAX_LATENCY in CameraMetadataTag.aidl.
187 MetadataBuilder& setSyncMaxLatency(
188 camera_metadata_enum_android_sync_max_latency setSyncMaxLatency);
189
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100190 // See ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM in CameraMetadataTag.aidl.
191 MetadataBuilder& setAvailableMaxDigitalZoom(const float maxZoom);
192
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100193 // See ANDROID_CONTROL_ZOOM_RATIO_RANGE in CameraMetadataTag.aidl.
194 MetadataBuilder& setControlZoomRatioRange(float min, float max);
195
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100196 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
197 MetadataBuilder& setAvailableRequestCapabilities(
198 const std::vector<
199 camera_metadata_enum_android_request_available_capabilities_t>&
200 requestCapabilities);
201
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100202 // A list of all keys that the camera device has available to use with
203 // CaptureRequest.
204 //
205 // See ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
206 MetadataBuilder& setAvailableRequestKeys(const std::vector<int32_t>& keys);
207
208 // A list of all keys that the camera device has available to use with
209 // CaptureResult.
210 //
211 // See ANDROID_RESULT_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
212 MetadataBuilder& setAvailableResultKeys(const std::vector<int32_t>& keys);
213
214 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
215 MetadataBuilder& setAvailableCapabilities(
216 const std::vector<
217 camera_metadata_enum_android_request_available_capabilities_t>&
218 capabilities);
219
220 // A list of all keys that the camera device has available to use.
221 //
222 // See ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS in CameraMetadataTag.aidl.
223 MetadataBuilder& setAvailableCharacteristicKeys(
224 const std::vector<camera_metadata_tag_t>& keys);
225
226 // Extends metadata with ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
227 // containing all previously set tags.
228 MetadataBuilder& setAvailableCharacteristicKeys();
229
230 // Build CameraMetadata instance.
231 //
232 // Returns nullptr in case something went wrong.
233 std::unique_ptr<::aidl::android::hardware::camera::device::CameraMetadata>
234 build() const;
235
236 private:
237 // Maps metadata tags to vectors of values for the given tag.
238 std::map<camera_metadata_tag_t,
239 std::variant<std::vector<int64_t>, std::vector<int32_t>,
240 std::vector<uint8_t>, std::vector<float>,
241 std::vector<camera_metadata_rational_t>>>
242 mEntryMap;
243};
244
245} // namespace virtualcamera
246} // namespace companion
247} // namespace android
248
249#endif // ANDROID_COMPANION_VIRTUALCAMERA_METADATABUILDER_H