blob: 4d2500b6850b978c8106e4d0a93195626047cbb8 [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
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +010017#ifndef ANDROID_COMPANION_VIRTUALCAMERA_METADATAUTIL_H
18#define ANDROID_COMPANION_VIRTUALCAMERA_METADATAUTIL_H
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010019
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
Biswarup Pal37a75182024-01-16 15:53:35 +000069 // See ANDROID_INFO_DEVICE_ID in CameraMetadataTag.aidl.
70 MetadataBuilder& setDeviceId(int32_t deviceId);
71
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010072 // Whether this camera device has a flash unit
73 // See ANDROID_FLASH_INFO_AVAILABLE in CameraMetadataTag.aidl.
74 MetadataBuilder& setFlashAvailable(bool flashAvailable);
75
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +010076 // See FLASH_STATE in CaptureResult.java.
77 MetadataBuilder& setFlashState(
78 camera_metadata_enum_android_flash_state_t flashState);
79
80 // See FLASH_MODE in CaptureRequest.java.
81 MetadataBuilder& setFlashMode(
82 camera_metadata_enum_android_flash_mode_t flashMode);
83
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010084 // See ANDROID_LENS_FACING in CameraMetadataTag.aidl.
85 MetadataBuilder& setLensFacing(
86 camera_metadata_enum_android_lens_facing lensFacing);
87
Jan Sebechlebskya984ffb2024-02-01 09:12:37 +010088 // See ANDROID_SENSOR_READOUT_TIMESTAMP in CameraMetadataTag.aidl.
89 MetadataBuilder& setSensorReadoutTimestamp(
90 camera_metadata_enum_android_sensor_readout_timestamp_t
91 sensorReadoutTimestamp);
92
Biswarup Pal8ad8bc52024-02-08 13:41:44 +000093 // See ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS in CameraMetadataTag.aidl.
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +010094 MetadataBuilder& setAvailableFocalLengths(
95 const std::vector<float>& focalLengths);
Biswarup Pal8ad8bc52024-02-08 13:41:44 +000096
97 // See ANDROID_LENS_FOCAL_LENGTH in CameraMetadataTag.aidl.
Biswarup Pald9be04d2024-01-31 14:35:15 +000098 MetadataBuilder& setFocalLength(float focalLength);
99
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100100 // See ANDROID_SENSOR_ORIENTATION in CameraMetadataTag.aidl.
101 MetadataBuilder& setSensorOrientation(int32_t sensorOrientation);
102
103 // Time at start of exposure of first row of the image
104 // sensor active array, in nanoseconds.
105 //
106 // See ANDROID_SENSOR_TIMESTAMP in CameraMetadataTag.aidl.
107 MetadataBuilder& setSensorTimestamp(std::chrono::nanoseconds timestamp);
108
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100109 // See SENSOR_INFO_TIMESTAMP_SOURCE in CameraCharacteristic.java.
110 MetadataBuilder& setSensorTimestampSource(
111 camera_metadata_enum_android_sensor_info_timestamp_source_t timestampSource);
112
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100113 // See ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE in CameraMetadataTag.aidl.
114 MetadataBuilder& setSensorActiveArraySize(int x0, int y0, int x1, int y1);
115
Biswarup Pald9be04d2024-01-31 14:35:15 +0000116 // See ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE in CameraMetadataTag.aidl.
117 MetadataBuilder& setSensorPixelArraySize(int width, int height);
118
119 // See ANDROID_SENSOR_INFO_PHYSICAL_SIZE in CameraMetadataTag.aidl.
120 MetadataBuilder& setSensorPhysicalSize(float width, float height);
121
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100122 // See ANDROID_STATISTICS_FACE_DETECT_MODE in CameraMetadataTag.aidl.
123 MetadataBuilder& setAvailableFaceDetectModes(
124 const std::vector<camera_metadata_enum_android_statistics_face_detect_mode_t>&
125 faceDetectMode);
126
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100127 // See SENSOR_AVAILABLE_TEST_PATTERN_MODES in CameraCharacteristics.java.
128 MetadataBuilder& setAvailableTestPatternModes(
129 const std::vector<camera_metadata_enum_android_sensor_test_pattern_mode>&
130 testPatternModes);
131
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100132 // See ANDROID_STATISTICS_FACE_DETECT_MODE in CaptureRequest.java.
133 MetadataBuilder& setFaceDetectMode(
134 camera_metadata_enum_android_statistics_face_detect_mode_t faceDetectMode);
135
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100136 // Sets available stream configurations along with corresponding minimal frame
137 // durations (corresponding to max fps) and stall durations.
138 //
139 // See ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
140 // ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS and
141 // ANDROID_SCALER_AVAILABLE_STALL_DURATIONS in CameraMetadataTag.aidl.
142 MetadataBuilder& setAvailableOutputStreamConfigurations(
143 const std::vector<StreamConfiguration>& streamConfigurations);
144
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100145 // See COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES in CameraCharacteristics.java.
146 MetadataBuilder& setAvailableAberrationCorrectionModes(
147 const std::vector<
148 camera_metadata_enum_android_color_correction_aberration_mode>&
149 aberrationCorectionModes);
150
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100151 // See COLOR_CORRECTION_ABERRATION_MODE in CaptureRequest.java.
152 MetadataBuilder& setAberrationCorrectionMode(
153 camera_metadata_enum_android_color_correction_aberration_mode
154 aberrationCorrectionMode);
155
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100156 // See NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES in CameraCharacteristics.java.
157 MetadataBuilder& setAvailableNoiseReductionModes(
158 const std::vector<camera_metadata_enum_android_noise_reduction_mode>&
159 noiseReductionModes);
160
Jan Sebechlebsky4be2bd02024-02-26 18:35:18 +0100161 // See NOISE_REDUCTION_MODE in CaptureRequest.java.
162 MetadataBuilder& setNoiseReductionMode(
163 camera_metadata_enum_android_noise_reduction_mode noiseReductionMode);
164
Jan Sebechlebskyab378202024-02-26 10:50:42 +0100165 // See REQUEST_PARTIAL_RESULT_COUNT in CameraCharacteristics.java.
166 MetadataBuilder& setRequestPartialResultCount(int partialResultCount);
167
168 // See SCALER_CROPPING_TYPE in CameraCharacteristics.java.
169 MetadataBuilder& setCroppingType(
170 camera_metadata_enum_android_scaler_cropping_type croppingType);
171
172 // See STATISTICS_INFO_MAX_FACE_COUNT in CameraCharacteristic.java.
173 MetadataBuilder& setMaxFaceCount(int maxFaceCount);
174
Jan Sebechlebskyb0119fa2023-12-04 10:29:06 +0100175 // See ANDROID_CONTROL_AVAILABLE_MODES in CameraMetadataTag.aidl.
176 MetadataBuilder& setControlAvailableModes(
177 const std::vector<camera_metadata_enum_android_control_mode_t>&
178 availableModes);
179
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100180 // See ANDROID_CONTROL_MODE in CaptureRequest.java.
181 MetadataBuilder& setControlMode(
182 camera_metadata_enum_android_control_mode_t mode);
183
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100184 // See ANDROID_CONTROL_AVAILABLE_SCENE_MODES in CameraMetadataTag.aidl.
185 MetadataBuilder& setControlAvailableSceneModes(
186 const std::vector<camera_metadata_enum_android_control_scene_mode>&
187 availableSceneModes);
188
Vadim Caen11dfd932024-03-05 09:57:20 +0100189 // See ANDROID_CONTROL_SCENE_MODE in CameraMetadataTag.aidl
190 MetadataBuilder& setControlSceneMode(
191 camera_metadata_enum_android_control_scene_mode sceneMode);
192
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100193 // See ANDROID_CONTROL_AVAILABLE_EFFECTS in CameraMetadataTag.aidl.
194 MetadataBuilder& setControlAvailableEffects(
195 const std::vector<camera_metadata_enum_android_control_effect_mode>&
196 availableEffects);
197
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100198 // See CONTROL_EFFECT_MODE in CaptureRequest.java.
199 MetadataBuilder& setControlEffectMode(
200 camera_metadata_enum_android_control_effect_mode_t effectMode);
201
Vadim Caen11dfd932024-03-05 09:57:20 +0100202 // See ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES in CameraMetadataTag.aidl.
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100203 MetadataBuilder& setControlAvailableVideoStabilizationModes(
204 const std::vector<
205 camera_metadata_enum_android_control_video_stabilization_mode_t>&
206 videoStabilizationModes);
207
Vadim Caen11dfd932024-03-05 09:57:20 +0100208 // See ANDROID_CONTROL_VIDEO_STABILIZATION_MODE in CameraMetadataTag.aidl.
209 MetadataBuilder& setControlVideoStabilizationMode(
210 camera_metadata_enum_android_control_video_stabilization_mode
211 stabilizationMode);
212
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100213 // See CONTROL_AE_AVAILABLE_ANTIBANDING_MODES in CameraCharacteristics.java.
214 MetadataBuilder& setControlAeAvailableAntibandingModes(
215 const std::vector<camera_metadata_enum_android_control_ae_antibanding_mode_t>&
216 antibandingModes);
217
218 // See CONTROL_AE_ANTIBANDING_MODE in CaptureRequest.java.
219 MetadataBuilder& setControlAeAntibandingMode(
220 camera_metadata_enum_android_control_ae_antibanding_mode_t antibandingMode);
221
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100222 // See ANDROID_CONTROL_AE_COMPENSATION_RANGE in CameraMetadataTag.aidl.
223 MetadataBuilder& setControlAeCompensationRange(int32_t min, int32_t max);
224
225 // See ANDROID_CONTROL_AE_COMPENSATION_STEP in CameraMetadataTag.aidl.
226 MetadataBuilder& setControlAeCompensationStep(camera_metadata_rational step);
227
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100228 // See ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION in CameraMetadataTag.aidl.
229 MetadataBuilder& setControlAeExposureCompensation(int32_t exposureCompensation);
230
231 // See ANDROID_CONTROL_AE_AVAILABLE_MODES in CameraCharacteristics.java.
232 MetadataBuilder& setControlAeAvailableModes(
233 const std::vector<camera_metadata_enum_android_control_ae_mode_t>& modes);
234
235 // See ANDROID_CONTROL_AE_MODE in CaptureRequest.java.
236 MetadataBuilder& setControlAeMode(
237 camera_metadata_enum_android_control_ae_mode_t step);
238
239 // See ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER in CaptureRequest.java.
240 MetadataBuilder& setControlAePrecaptureTrigger(
241 camera_metadata_enum_android_control_ae_precapture_trigger_t trigger);
242
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100243 // See ANDROID_CONTROL_AF_AVAILABLE_MODES in CameraMetadataTag.aidl.
244 MetadataBuilder& setControlAfAvailableModes(
245 const std::vector<camera_metadata_enum_android_control_af_mode_t>&
246 availableModes);
247
248 // See ANDROID_CONTROL_AF_MODE in CameraMetadataTag.aidl.
249 MetadataBuilder& setControlAfMode(
250 const camera_metadata_enum_android_control_af_mode_t mode);
251
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100252 // See ANDROID_CONTROL_AF_TRIGGER_MODE in CameraMetadataTag.aidl.
253 MetadataBuilder& setControlAfTrigger(
254 const camera_metadata_enum_android_control_af_trigger_t trigger);
255
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100256 // See ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES in CameraMetadataTag.aidl.
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100257 MetadataBuilder& setControlAeAvailableFpsRanges(
258 const std::vector<FpsRange>& fpsRanges);
259
260 // See ANDROID_CONTROL_AE_TARGET_FPS_RANGE in CaptureRequest.java.
Vadim Caen11dfd932024-03-05 09:57:20 +0100261 MetadataBuilder& setControlAeTargetFpsRange(FpsRange fpsRange);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100262
263 // See ANDROID_CONTROL_CAPTURE_INTENT in CameraMetadataTag.aidl.
264 MetadataBuilder& setControlCaptureIntent(
265 camera_metadata_enum_android_control_capture_intent_t intent);
266
267 // See ANDROID_CONTROL_MAX_REGIONS in CameraMetadataTag.aidl.
268 MetadataBuilder& setControlMaxRegions(int32_t maxAeRegions,
269 int32_t maxAwbRegions,
270 int32_t maxAfRegions);
271
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100272 // See ANDROID_CONTROL_AWB_AVAILABLE_MODES in CameraMetadataTag.aidl.
273 MetadataBuilder& setControlAvailableAwbModes(
274 const std::vector<camera_metadata_enum_android_control_awb_mode>& awbModes);
275
Jan Sebechlebskyc3e1a632024-02-06 14:19:05 +0100276 // See ANDROID_CONTROL_AWB_AVAILABLE_MODE in CaptureRequest.java.
277 MetadataBuilder& setControlAwbMode(
278 camera_metadata_enum_android_control_awb_mode awb);
279
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100280 // See CONTROL_AWB_LOCK_AVAILABLE in CameraMetadataTag.aidl.
281 MetadataBuilder& setControlAwbLockAvailable(bool awbLockAvailable);
282
Vadim Caen11dfd932024-03-05 09:57:20 +0100283 // See CONTROL_AWB_LOCK in CameraMetadataTag.aidl
284 MetadataBuilder& setControlAwbLock(
285 camera_metadata_enum_android_control_awb_lock awbLock);
286
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100287 // See CONTROL_AE_LOCK_AVAILABLE in CameraMetadataTag.aidl.
288 MetadataBuilder& setControlAeLockAvailable(bool aeLockAvailable);
289
Vadim Caen11dfd932024-03-05 09:57:20 +0100290 // See CONTROL_AE_LOCK in CameraMetadataTag.aidl.
291 MetadataBuilder& setControlAeLock(
292 camera_metadata_enum_android_control_ae_lock aeLock);
293
294 // See CONTROL_AE_STATE in CameraMetadataTag.aidl
295 MetadataBuilder& setControlAeState(
296 camera_metadata_enum_android_control_ae_state aeState);
297
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100298 // See ANDROID_CONTROL_AE_REGIONS in CameraMetadataTag.aidl.
299 MetadataBuilder& setControlAeRegions(
300 const std::vector<ControlRegion>& aeRegions);
301
302 // See ANDROID_CONTROL_AWB_REGIONS in CameraMetadataTag.aidl.
303 MetadataBuilder& setControlAwbRegions(
304 const std::vector<ControlRegion>& awbRegions);
305
Vadim Caen11dfd932024-03-05 09:57:20 +0100306 // See ANDROID_CONTROL_AWB_STATE in CameraMetadataTag.aidl.
307 MetadataBuilder& setControlAwbState(
308 camera_metadata_enum_android_control_awb_state awbState);
309
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100310 // See ANDROID_SCALER_CROP_REGION in CaptureRequest.java.
311 MetadataBuilder& setCropRegion(int32_t x, int32_t y, int32_t width,
312 int32_t height);
313
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100314 // See ANDROID_CONTROL_AF_REGIONS in CameraMetadataTag.aidl.
315 MetadataBuilder& setControlAfRegions(
316 const std::vector<ControlRegion>& afRegions);
317
Vadim Caen11dfd932024-03-05 09:57:20 +0100318 // See ANDROID_CONTROL_AF_STATE in CameraMetadataTag.aidl.
319 MetadataBuilder& setControlAfState(
320 camera_metadata_enum_android_control_af_state aeftate);
321
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100322 // The size of the compressed JPEG image, in bytes.
323 //
324 // See ANDROID_JPEG_SIZE in CameraMetadataTag.aidl.
325 MetadataBuilder& setMaxJpegSize(int32_t size);
326
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100327 // See SENSOR_INFO_MAX_FRAME_DURATION in CameraCharacteristic.java.
328 MetadataBuilder& setMaxFrameDuration(std::chrono::nanoseconds duration);
329
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100330 // See JPEG_AVAILABLE_THUMBNAIL_SIZES in CameraCharacteristic.java.
331 MetadataBuilder& setJpegAvailableThumbnailSizes(
332 const std::vector<Resolution>& thumbnailSizes);
333
Vadim Caenc0aff132024-03-12 17:20:07 +0100334 // See ANDROID_JPEG_GPS_COORDINATES.
335 MetadataBuilder& setJpegGpsCoordinates(const GpsCoordinates& gpsCoordinates);
336
337 // See JPEG_ORIENTATION in CaptureRequest.java.
338 MetadataBuilder& setJpegOrientation(int32_t orientation);
339
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100340 // See JPEG_QUALITY in CaptureRequest.java.
341 MetadataBuilder& setJpegQuality(uint8_t quality);
342
343 // See JPEG_THUMBNAIL_SIZE in CaptureRequest.java.
344 MetadataBuilder& setJpegThumbnailSize(int width, int height);
345
346 // See JPEG_THUMBNAIL_QUALITY in CaptureRequest.java.
347 MetadataBuilder& setJpegThumbnailQuality(uint8_t quality);
348
Jan Sebechlebsky8ae23592024-02-02 16:08:18 +0100349 // The maximum numbers of different types of output streams
350 // that can be configured and used simultaneously by a camera device.
351 //
352 // See ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS in CameraMetadataTag.aidl.
353 MetadataBuilder& setMaxNumberOutputStreams(int32_t maxRawStreams,
354 int32_t maxProcessedStreams,
355 int32_t maxStallStreams);
356
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100357 // See ANDROID_SYNC_MAX_LATENCY in CameraMetadataTag.aidl.
358 MetadataBuilder& setSyncMaxLatency(
359 camera_metadata_enum_android_sync_max_latency setSyncMaxLatency);
360
Jan Sebechlebskybb01c1d2024-02-12 11:41:37 +0100361 // See REQUEST_PIPELINE_MAX_DEPTH in CameraCharacteristic.java.
362 MetadataBuilder& setPipelineMaxDepth(uint8_t maxDepth);
363
364 // See REQUEST_PIPELINE_DEPTH in CaptureResult.java.
365 MetadataBuilder& setPipelineDepth(uint8_t depth);
366
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100367 // See ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM in CameraMetadataTag.aidl.
368 MetadataBuilder& setAvailableMaxDigitalZoom(const float maxZoom);
369
Jan Sebechlebsky6ab07fe2023-12-05 15:23:34 +0100370 // See ANDROID_CONTROL_ZOOM_RATIO_RANGE in CameraMetadataTag.aidl.
371 MetadataBuilder& setControlZoomRatioRange(float min, float max);
372
Vadim Caen11dfd932024-03-05 09:57:20 +0100373 // See ANDROID_STATISTICS_SCENE_FLICKER in CameraMetadataTag.aidl.
374 MetadataBuilder& setStatisticsSceneFlicker(
375 camera_metadata_enum_android_statistics_scene_flicker sceneFlicker);
376
377 // See ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE in CameraMetadataTag.aidl.
378 MetadataBuilder& setStatisticsHotPixelMapMode(
379 camera_metadata_enum_android_statistics_hot_pixel_map_mode mode);
380
381 // See ANDROID_STATISTICS_LENS_SHADING_MAP_MODE in CameraMetadataTag.aidl.
382 MetadataBuilder& setStatisticsLensShadingMapMode(
383 camera_metadata_enum_android_statistics_lens_shading_map_mode
384 lensShadingMapMode);
385
386 // See ANDROID_LENS_OPTICAL_STABILIZATION_MODE in CameraMetadataTag.aidl.
387 MetadataBuilder& setLensOpticalStabilizationMode(
388 camera_metadata_enum_android_lens_optical_stabilization_mode_t
389 opticalStabilizationMode);
390
Jan Sebechlebsky4425a732024-01-31 11:31:54 +0100391 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
392 MetadataBuilder& setAvailableRequestCapabilities(
393 const std::vector<
394 camera_metadata_enum_android_request_available_capabilities_t>&
395 requestCapabilities);
396
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100397 // A list of all keys that the camera device has available to use with
398 // CaptureRequest.
399 //
400 // See ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
401 MetadataBuilder& setAvailableRequestKeys(const std::vector<int32_t>& keys);
402
403 // A list of all keys that the camera device has available to use with
404 // CaptureResult.
405 //
406 // See ANDROID_RESULT_AVAILABLE_REQUEST_KEYS in CameraMetadataTag.aidl.
407 MetadataBuilder& setAvailableResultKeys(const std::vector<int32_t>& keys);
408
409 // See ANDROID_REQUEST_AVAILABLE_CAPABILITIES in CameraMetadataTag.aidl.
410 MetadataBuilder& setAvailableCapabilities(
411 const std::vector<
412 camera_metadata_enum_android_request_available_capabilities_t>&
413 capabilities);
414
415 // A list of all keys that the camera device has available to use.
416 //
417 // See ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS in CameraMetadataTag.aidl.
418 MetadataBuilder& setAvailableCharacteristicKeys(
419 const std::vector<camera_metadata_tag_t>& keys);
420
421 // Extends metadata with ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100422 // containing all set tags.
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100423 MetadataBuilder& setAvailableCharacteristicKeys();
424
425 // Build CameraMetadata instance.
426 //
427 // Returns nullptr in case something went wrong.
428 std::unique_ptr<::aidl::android::hardware::camera::device::CameraMetadata>
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100429 build();
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100430
431 private:
432 // Maps metadata tags to vectors of values for the given tag.
Vadim Caenc0aff132024-03-12 17:20:07 +0100433 std::map<
434 camera_metadata_tag_t,
435 std::variant<std::vector<int64_t>, std::vector<int32_t>,
436 std::vector<uint8_t>, std::vector<float>,
437 std::vector<camera_metadata_rational_t>, std::vector<double>>>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100438 mEntryMap;
Jan Sebechlebskyad8d35f2024-02-05 11:58:59 +0100439 // Extend metadata with ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS.
440 bool mExtendWithAvailableCharacteristicsKeys = false;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100441};
442
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100443// Returns JPEG_QUALITY from metadata, or nullopt if the key is not present.
444std::optional<int32_t> getJpegQuality(
445 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
446
Vadim Caenc0aff132024-03-12 17:20:07 +0100447// Return JPEG_ORIENTATION from metadata, or 0 if the key is not present
448int32_t getJpegOrientation(
449 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
450
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100451// Returns JPEG_THUMBNAIL_SIZE from metadata, or nullopt if the key is not present.
452std::optional<Resolution> getJpegThumbnailSize(
453 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
454
455// Returns JPEG_THUMBNAIL_QUALITY from metadata, or nullopt if the key is not present.
456std::optional<int32_t> getJpegThumbnailQuality(
457 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
458
459// Returns JPEG_AVAILABLE_THUMBNAIL_SIZES from metadata, or nullopt if the key
460// is not present.
461std::vector<Resolution> getJpegAvailableThumbnailSizes(
462 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
463
Vadim Caen11dfd932024-03-05 09:57:20 +0100464std::optional<FpsRange> getFpsRange(
465 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
466
467std::optional<camera_metadata_enum_android_control_capture_intent> getCaptureIntent(
468 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
469
Vadim Caenc0aff132024-03-12 17:20:07 +0100470// Returns ANDROID_JPEG_GPS_COORDINATES in a GpsCoordinate object or nullopt if
471// the key is not present.
472std::optional<GpsCoordinates> getGpsCoordinates(
473 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
474
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100475std::optional<camera_metadata_enum_android_lens_facing> getLensFacing(
476 const aidl::android::hardware::camera::device::CameraMetadata& metadata);
477
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100478} // namespace virtualcamera
479} // namespace companion
480} // namespace android
481
Jan Sebechlebsky4ce32082024-02-14 16:02:11 +0100482#endif // ANDROID_COMPANION_VIRTUALCAMERA_METADATAUTIL_H