1/*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17 * @addtogroup OH_Camera
18 * @{
19 *
20 * @brief Provide the definition of the C interface for the camera module.
21 *
22 * @syscap SystemCapability.Multimedia.Camera.Core
23 *
24 * @since 11
25 * @version 1.0
26 */
27
28/**
29 * @file camera_manager.h
30 *
31 * @brief Declare the camera manager concepts.
32 *
33 * @library libohcamera.so
34 * @kit CameraKit
35 * @syscap SystemCapability.Multimedia.Camera.Core
36 * @since 11
37 * @version 1.0
38 */
39
40#ifndef NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H
41#define NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H
42
43#include <stdint.h>
44#include <stdio.h>
45#include "camera.h"
46#include "camera_input.h"
47#include "capture_session.h"
48#include "preview_output.h"
49#include "video_output.h"
50#include "photo_output.h"
51#include "metadata_output.h"
52
53#ifdef __cplusplus
54extern "C" {
55#endif
56
57/**
58 * @brief Camera manager status callback to be called in {@link CameraManager_Callbacks}.
59 *
60 * @param cameraManager the {@link Camera_Manager} which deliver the callback.
61 * @param status the {@link Camera_StatusInfo} of each camera device.
62 * @since 11
63 */
64typedef void (*OH_CameraManager_StatusCallback)(Camera_Manager* cameraManager, Camera_StatusInfo* status);
65
66/**
67 * @brief Camera manager torch status callback.
68 *
69 * @param cameraManager the {@link Camera_Manager} which deliver the callback.
70 * @param status the {@link Camera_TorchStatusInfo} of the torch.
71 * @since 12
72 */
73typedef void (*OH_CameraManager_TorchStatusCallback)(Camera_Manager* cameraManager, Camera_TorchStatusInfo* status);
74
75/**
76 * @brief Camera manager fold status info callback.
77 *
78 * @param cameraManager the {@link Camera_Manager} which deliver the callback.
79 * @param foldStatusInfo the {@link Camera_FoldStatusInfo} of the device.
80 * @since 13
81 */
82typedef void (*OH_CameraManager_OnFoldStatusInfoChange)(Camera_Manager* cameraManager,
83    Camera_FoldStatusInfo* foldStatusInfo);
84
85/**
86 * @brief A listener for camera devices status.
87 *
88 * @see OH_CameraManager_RegisterCallback
89 * @since 11
90 * @version 1.0
91 */
92typedef struct CameraManager_Callbacks {
93    /**
94     * Camera status change event.
95     */
96    OH_CameraManager_StatusCallback onCameraStatus;
97} CameraManager_Callbacks;
98
99/**
100 * @brief Register camera status change event callback.
101 *
102 * @param cameraManager the {@link Camera_Manager} instance.
103 * @param callback the {@link CameraManager_Callbacks} to be registered.
104 * @return {@link #CAMERA_OK} if the method call succeeds.
105 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
106 * @since 11
107 */
108Camera_ErrorCode OH_CameraManager_RegisterCallback(Camera_Manager* cameraManager, CameraManager_Callbacks* callback);
109
110/**
111 * @brief Unregister camera status change event callback.
112 *
113 * @param cameraManager the {@link Camera_Manager} instance.
114 * @param callback the {@link CameraManager_Callbacks} to be unregistered.
115 * @return {@link #CAMERA_OK} if the method call succeeds.
116 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
117 * @since 11
118 */
119Camera_ErrorCode OH_CameraManager_UnregisterCallback(Camera_Manager* cameraManager, CameraManager_Callbacks* callback);
120
121/**
122 * @brief Register torch status change event callback.
123 *
124 * @param cameraManager the {@link Camera_Manager} instance.
125 * @param torchStatusCallback the {@link OH_CameraManager_TorchStatusCallback} to be registered.
126 * @return {@link #CAMERA_OK} if the method call succeeds.
127 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
128 * @since 12
129 */
130Camera_ErrorCode OH_CameraManager_RegisterTorchStatusCallback(Camera_Manager* cameraManager,
131    OH_CameraManager_TorchStatusCallback torchStatusCallback);
132
133/**
134 * @brief Unregister torch status change event callback.
135 *
136 * @param cameraManager the {@link Camera_Manager} instance.
137 * @param torchStatusCallback the {@link OH_CameraManager_TorchStatusCallback} to be unregistered.
138 * @return {@link #CAMERA_OK} if the method call succeeds.
139 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
140 * @since 12
141 */
142Camera_ErrorCode OH_CameraManager_UnregisterTorchStatusCallback(Camera_Manager* cameraManager,
143    OH_CameraManager_TorchStatusCallback torchStatusCallback);
144
145/**
146 * @brief Register fold status info change event callback.
147 *
148 * @param cameraManager the {@link Camera_Manager} instance.
149 * @param foldStatusInfoCallback the {@link OH_CameraManager_OnFoldStatusInfoChange} to be registered.
150 * @return {@link #CAMERA_OK} if the method call succeeds.
151 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
152 * @since 13
153 */
154Camera_ErrorCode OH_CameraManager_RegisterFoldStatusInfoCallback(Camera_Manager* cameraManager,
155    OH_CameraManager_OnFoldStatusInfoChange foldStatusInfoCallback);
156
157/**
158 * @brief Unregister fold status info change event callback.
159 *
160 * @param cameraManager the {@link Camera_Manager} instance.
161 * @param foldStatusInfoCallback the {@link OH_CameraManager_OnFoldStatusInfoChange} to be unregistered.
162 * @return {@link #CAMERA_OK} if the method call succeeds.
163 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
164 * @since 13
165 */
166Camera_ErrorCode OH_CameraManager_UnregisterFoldStatusInfoCallback(Camera_Manager* cameraManager,
167    OH_CameraManager_OnFoldStatusInfoChange foldStatusInfoCallback);
168
169/**
170 * @brief Gets supported camera descriptions.
171 *
172 * @param cameraManager the {@link Camera_Manager} instance.
173 * @param cameras the supported {@link Camera_Device} list will be filled
174 *        if the method call succeeds.
175 * @param size the size of supported {@link Camera_Device} list will be filled
176 *        if the method call succeeds.
177 * @return {@link #CAMERA_OK} if the method call succeeds.
178 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
179 * @since 11
180 */
181Camera_ErrorCode OH_CameraManager_GetSupportedCameras(Camera_Manager* cameraManager,
182    Camera_Device** cameras, uint32_t* size);
183
184/**
185 * @brief Delete supported camera.
186 *
187 * @param cameraManager the {@link Camera_Manager} instance.
188 * @param cameras the {@link Camera_Device} list to be deleted.
189 * @return {@link #CAMERA_OK} if the method call succeeds.
190 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
191 * @since 11
192 */
193Camera_ErrorCode OH_CameraManager_DeleteSupportedCameras(Camera_Manager* cameraManager,
194    Camera_Device* cameras, uint32_t size);
195
196/**
197 * @brief Gets the supported output capability for the specific camera and specific mode.
198 *
199 * @param cameraManager the {@link Camera_Manager} instance.
200 * @param cameras the {@link Camera_Device} to be queryed.
201 * @param cameraOutputCapability the supported {@link Camera_OutputCapability} will be filled
202 *        if the method call succeeds.
203 * @return {@link #CAMERA_OK} if the method call succeeds.
204 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
205 * @since 11
206 */
207Camera_ErrorCode OH_CameraManager_GetSupportedCameraOutputCapability(Camera_Manager* cameraManager,
208    const Camera_Device* camera, Camera_OutputCapability** cameraOutputCapability);
209
210/**
211 * @brief Gets supported output capability for specific camera and specific sceneMode.
212 *
213 * @param cameraManager the {@link Camera_Manager} instance.
214 * @param camera the {@link Camera_Device} to be queryed.
215 * @param sceneMode the {@link Camera_SceneMode} to be queryed.
216 * @param cameraOutputCapability the supported {@link Camera_OutputCapability} will be filled
217 *        if the method call succeeds.
218 * @return {@link #CAMERA_OK} if the method call succeeds.
219 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
220 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
221 * @since 12
222 */
223Camera_ErrorCode OH_CameraManager_GetSupportedCameraOutputCapabilityWithSceneMode(Camera_Manager* cameraManager,
224    const Camera_Device* camera, Camera_SceneMode sceneMode, Camera_OutputCapability** cameraOutputCapability);
225
226/**
227 * @brief Delete the supported output capability.
228 *
229 * @param cameraManager the {@link Camera_Manager} instance.
230 * @param cameraOutputCapability the {@link Camera_OutputCapability} to be deleted.
231 * @return {@link #CAMERA_OK} if the method call succeeds.
232 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
233 * @since 11
234 */
235Camera_ErrorCode OH_CameraManager_DeleteSupportedCameraOutputCapability(Camera_Manager* cameraManager,
236    Camera_OutputCapability* cameraOutputCapability);
237
238/**
239 * @brief Determine whether camera is muted.
240 *
241 * @param cameraManager the {@link Camera_Manager} instance.
242 * @param isCameraMuted whether camera is muted will be filled if the method call succeeds.
243 * @return {@link #CAMERA_OK} if the method call succeeds.
244 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
245 * @since 11
246 */
247Camera_ErrorCode OH_CameraManager_IsCameraMuted(Camera_Manager* cameraManager, bool* isCameraMuted);
248
249/**
250 * @brief Create a capture session instance.The default session mode is photo session.
251 *
252 * @param cameraManager the {@link Camera_Manager} instance.
253 * @param captureSession the {@link Camera_CaptureSession} will be created
254 *        if the method call succeeds.
255 * @return {@link #CAMERA_OK} if the method call succeeds.
256 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
257 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
258 * @since 11
259 */
260Camera_ErrorCode OH_CameraManager_CreateCaptureSession(Camera_Manager* cameraManager,
261    Camera_CaptureSession** captureSession);
262
263/**
264 * @brief Create a camera input instance.
265 *
266 * @param cameraManager the {@link Camera_Manager} instance.
267 * @param camera the {@link Camera_Device} which use to create {@link Camera_Input}.
268 * @param cameraInput the {@link Camera_Input} will be created if the method call succeeds.
269 * @return {@link #CAMERA_OK} if the method call succeeds.
270 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
271 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
272 * @permission ohos.permission.CAMERA
273 * @since 11
274 */
275Camera_ErrorCode OH_CameraManager_CreateCameraInput(Camera_Manager* cameraManager,
276    const Camera_Device* camera, Camera_Input** cameraInput);
277
278/**
279 * @brief Create a camera input instance.
280 *
281 * @param cameraManager the {@link Camera_Manager} instance.
282 * @param position the {@link Camera_Position} which use to create {@link Camera_Input}.
283 * @param type the {@link Camera_Type} which use to create {@link Camera_Input}.
284 * @param cameraInput the {@link Camera_Input} will be created if the method call succeeds.
285 * @return {@link #CAMERA_OK} if the method call succeeds.
286 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
287 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
288 * @permission ohos.permission.CAMERA
289 * @since 11
290 */
291Camera_ErrorCode OH_CameraManager_CreateCameraInput_WithPositionAndType(Camera_Manager* cameraManager,
292    Camera_Position position, Camera_Type type, Camera_Input** cameraInput);
293
294/**
295 * @brief Create a preview output instance.
296 *
297 * @param cameraManager the {@link Camera_Manager} instance.
298 * @param profile the {@link Camera_Profile} to create {@link Camera_PreviewOutput}.
299 * @param surfaceId the which use to create {@link Camera_PreviewOutput}.
300 * @param previewOutput the {@link Camera_PreviewOutput} will be created if the method call succeeds.
301 * @return {@link #CAMERA_OK} if the method call succeeds.
302 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
303 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
304 * @since 11
305 */
306Camera_ErrorCode OH_CameraManager_CreatePreviewOutput(Camera_Manager* cameraManager, const Camera_Profile* profile,
307    const char* surfaceId, Camera_PreviewOutput** previewOutput);
308
309/**
310 * @brief Create a preview output instance used in preconfig.
311 *
312 * @param cameraManager the {@link Camera_Manager} instance.
313 * @param surfaceId the which use to create {@link Camera_PreviewOutput}.
314 * @param previewOutput the {@link Camera_PreviewOutput} will be created if the method call succeeds.
315 * @return {@link #CAMERA_OK} if the method call succeeds.
316 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
317 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
318 * @since 12
319 */
320Camera_ErrorCode OH_CameraManager_CreatePreviewOutputUsedInPreconfig(Camera_Manager* cameraManager,
321    const char* surfaceId, Camera_PreviewOutput** previewOutput);
322
323/**
324 * @brief Create a photo output instance.
325 *
326 * @param cameraManager the {@link Camera_Manager} instance.
327 * @param profile the {@link Camera_Profile} to create {@link Camera_PhotoOutput}.
328 * @param surfaceId the which use to create {@link Camera_PhotoOutput}.
329 * @param photoOutput the {@link Camera_PhotoOutput} will be created if the method call succeeds.
330 * @return {@link #CAMERA_OK} if the method call succeeds.
331 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
332 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
333 * @since 11
334 */
335Camera_ErrorCode OH_CameraManager_CreatePhotoOutput(Camera_Manager* cameraManager, const Camera_Profile* profile,
336    const char* surfaceId, Camera_PhotoOutput** photoOutput);
337
338/**
339 * @brief Create a photo output instance used in preconfig.
340 *
341 * @param cameraManager the {@link Camera_Manager} instance.
342 * @param surfaceId the which use to create {@link Camera_PhotoOutput}.
343 * @param photoOutput the {@link Camera_PhotoOutput} will be created if the method call succeeds.
344 * @return {@link #CAMERA_OK} if the method call succeeds.
345 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
346 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
347 * @since 12
348 */
349Camera_ErrorCode OH_CameraManager_CreatePhotoOutputUsedInPreconfig(Camera_Manager* cameraManager,
350    const char* surfaceId, Camera_PhotoOutput** photoOutput);
351
352/**
353 * @brief Create a photo output instance without surfaceId.
354 *
355 * @param cameraManager the {@link Camera_Manager} instance.
356 * @param profile the {@link Camera_Profile} to create {@link Camera_PhotoOutput}.
357 * @param photoOutput the {@link Camera_PhotoOutput} will be created if the method call succeeds.
358 * @return {@link #CAMERA_OK} if the method call succeeds.
359 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
360 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
361 * @since 12
362 */
363Camera_ErrorCode OH_CameraManager_CreatePhotoOutputWithoutSurface(Camera_Manager *cameraManager,
364    const Camera_Profile *profile, Camera_PhotoOutput **photoOutput);
365
366/**
367 * @brief Create a video output instance.
368 *
369 * @param cameraManager the {@link Camera_Manager} instance.
370 * @param profile the {@link Camera_VideoProfile} to create {@link Camera_VideoOutput}.
371 * @param surfaceId the which use to create {@link Camera_VideoOutput}.
372 * @param videoOutput the {@link Camera_VideoOutput} will be created if the method call succeeds.
373 * @return {@link #CAMERA_OK} if the method call succeeds.
374 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
375 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
376 * @since 11
377 */
378Camera_ErrorCode OH_CameraManager_CreateVideoOutput(Camera_Manager* cameraManager, const Camera_VideoProfile* profile,
379    const char* surfaceId, Camera_VideoOutput** videoOutput);
380
381/**
382 * @brief Create a video output instance used in preconfig.
383 *
384 * @param cameraManager the {@link Camera_Manager} instance.
385 * @param surfaceId the which use to create {@link Camera_VideoOutput}.
386 * @param videoOutput the {@link Camera_VideoOutput} will be created if the method call succeeds.
387 * @return {@link #CAMERA_OK} if the method call succeeds.
388 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
389 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
390 * @since 12
391 */
392Camera_ErrorCode OH_CameraManager_CreateVideoOutputUsedInPreconfig(Camera_Manager* cameraManager,
393    const char* surfaceId, Camera_VideoOutput** videoOutput);
394
395/**
396 * @brief Create a metadata output instance.
397 *
398 * @param cameraManager the {@link Camera_Manager} instance.
399 * @param profile the {@link Camera_MetadataObjectType} to create {@link Camera_MetadataOutput}.
400 * @param metadataOutput the {@link Camera_MetadataOutput} will be created if the method call succeeds.
401 * @return {@link #CAMERA_OK} if the method call succeeds.
402 *         {@link #INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
403 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
404 * @since 11
405 */
406Camera_ErrorCode OH_CameraManager_CreateMetadataOutput(Camera_Manager* cameraManager,
407    const Camera_MetadataObjectType* profile, Camera_MetadataOutput** metadataOutput);
408
409/**
410 * @brief Gets supported scene mode for specific camera.
411 *
412 * @param camera the {@link Camera_Device} to be queryed.
413 * @param sceneModes the supported {@link Camera_SceneMode} will be filled if the method call succeeds.
414 * @param size the size of supported {@link Camera_SceneMode} list will be filled if the method call succeeds.
415 * @return {@link #CAMERA_OK} if the method call succeeds.
416 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
417 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
418 * @since 12
419 */
420Camera_ErrorCode OH_CameraManager_GetSupportedSceneModes(Camera_Device* camera,
421    Camera_SceneMode** sceneModes, uint32_t* size);
422
423/**
424 * @brief Delete the scene mode.
425 *
426 * @param cameraManager the {@link Camera_Manager} instance.
427 * @param sceneModes the {@link Camera_SceneMode} to be deleted.
428 * @return {@link #CAMERA_OK} if the method call succeeds.
429 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
430 * @since 12
431 */
432Camera_ErrorCode OH_CameraManager_DeleteSceneModes(Camera_Manager* cameraManager, Camera_SceneMode* sceneModes);
433
434/**
435 * @brief Check if the device supports torch.
436 *
437 * @param cameraManager the {@link Camera_Manager} instance.
438 * @param isTorchSupported whether the device supports torch.
439 * @return {@link #CAMERA_OK} if the method call succeeds.
440 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
441 * @since 12
442 */
443Camera_ErrorCode OH_CameraManager_IsTorchSupported(Camera_Manager* cameraManager,
444    bool* isTorchSupported);
445
446/**
447 * @brief Check whether the device supports the torch with the specified torch mode.
448 *
449 * @param cameraManager the {@link Camera_Manager} instance.
450 * @param torchMode the {@link Camera_TorchMode} to be checked.
451 * @param isTorchSupported whether device supports the torch mode.
452 * @return {@link #CAMERA_OK} if the method call succeeds.
453 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
454 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
455 * @since 12
456 */
457Camera_ErrorCode OH_CameraManager_IsTorchSupportedByTorchMode(Camera_Manager* cameraManager,
458    Camera_TorchMode torchMode, bool* isTorchSupported);
459
460/**
461 * @brief Set camera torch mode.
462 *
463 * @param cameraManager the {@link Camera_Manager} instance.
464 * @param torchMode the {@link Camera_TorchMode} to be set.
465 * @return {@link #CAMERA_OK} if the method call succeeds.
466 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
467 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
468 * @since 12
469 */
470Camera_ErrorCode OH_CameraManager_SetTorchMode(Camera_Manager* cameraManager,
471    Camera_TorchMode torchMode);
472
473#ifdef __cplusplus
474}
475#endif
476
477#endif // NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H
478/** @} */