Home | History | Annotate | Download | only in ndk
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      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 /**
     18  * @addtogroup Camera
     19  * @{
     20  */
     21 
     22 /**
     23  * @file NdkCameraManager.h
     24  */
     25 
     26 /*
     27  * This file defines an NDK API.
     28  * Do not remove methods.
     29  * Do not change method signatures.
     30  * Do not change the value of constants.
     31  * Do not change the size of any of the classes defined in here.
     32  * Do not reference types that are not part of the NDK.
     33  * Do not #include files that aren't part of the NDK.
     34  */
     35 
     36 #ifndef _NDK_CAMERA_MANAGER_H
     37 #define _NDK_CAMERA_MANAGER_H
     38 
     39 #include "NdkCameraError.h"
     40 #include "NdkCameraMetadata.h"
     41 #include "NdkCameraDevice.h"
     42 
     43 #ifdef __cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 /**
     48  * ACameraManager is opaque type that provides access to camera service.
     49  *
     50  * A pointer can be obtained using {@link ACameraManager_create} method.
     51  */
     52 typedef struct ACameraManager ACameraManager;
     53 
     54 /**
     55  * Create ACameraManager instance.
     56  *
     57  * <p>The ACameraManager is responsible for
     58  * detecting, characterizing, and connecting to {@link ACameraDevice}s.</p>
     59  *
     60  * <p>The caller must call {@link ACameraManager_delete} to free the resources once it is done
     61  * using the ACameraManager instance.</p>
     62  *
     63  * @return a {@link ACameraManager} instance.
     64  *
     65  */
     66 ACameraManager* ACameraManager_create();
     67 
     68 /**
     69  * <p>Delete the {@link ACameraManager} instance and free its resources. </p>
     70  *
     71  * @param manager the {@link ACameraManager} instance to be deleted.
     72  */
     73 void ACameraManager_delete(ACameraManager* manager);
     74 
     75 /// Struct to hold list of camera devices
     76 typedef struct ACameraIdList {
     77     int numCameras;          ///< Number of connected camera devices
     78     const char** cameraIds;  ///< list of identifier of connected camera devices
     79 } ACameraIdList;
     80 
     81 /**
     82  * Create a list of currently connected camera devices, including
     83  * cameras that may be in use by other camera API clients.
     84  *
     85  * <p>Non-removable cameras use integers starting at 0 for their
     86  * identifiers, while removable cameras have a unique identifier for each
     87  * individual device, even if they are the same model.</p>
     88  *
     89  * <p>ACameraManager_getCameraIdList will allocate and return an {@link ACameraIdList}.
     90  * The caller must call {@link ACameraManager_deleteCameraIdList} to free the memory</p>
     91  *
     92  * @param manager the {@link ACameraManager} of interest
     93  * @param cameraIdList the output {@link ACameraIdList} will be filled in here if the method call
     94  *        succeeds.
     95  *
     96  * @return <ul>
     97  *         <li>{@link ACAMERA_OK} if the method call succeeds.</li>
     98  *         <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if manager or cameraIdList is NULL.</li>
     99  *         <li>{@link ACAMERA_ERROR_CAMERA_DISCONNECTED} if connection to camera service fails.</li>
    100  *         <li>{@link ACAMERA_ERROR_NOT_ENOUGH_MEMORY} if allocating memory fails.</li></ul>
    101  */
    102 camera_status_t ACameraManager_getCameraIdList(ACameraManager* manager,
    103                                               /*out*/ACameraIdList** cameraIdList);
    104 
    105 /**
    106  * Delete a list of camera devices allocated via {@link ACameraManager_getCameraIdList}.
    107  *
    108  * @param cameraIdList the {@link ACameraIdList} to be deleted.
    109  */
    110 void ACameraManager_deleteCameraIdList(ACameraIdList* cameraIdList);
    111 
    112 /**
    113  * Definition of camera availability callbacks.
    114  *
    115  * @param context The optional application context provided by user in
    116  *                {@link ACameraManager_AvailabilityCallbacks}.
    117  * @param cameraId The ID of the camera device whose availability is changing. The memory of this
    118  *                 argument is owned by camera framework and will become invalid immediately after
    119  *                 this callback returns.
    120  */
    121 typedef void (*ACameraManager_AvailabilityCallback)(void* context, const char* cameraId);
    122 
    123 /**
    124  * A listener for camera devices becoming available or unavailable to open.
    125  *
    126  * <p>Cameras become available when they are no longer in use, or when a new
    127  * removable camera is connected. They become unavailable when some
    128  * application or service starts using a camera, or when a removable camera
    129  * is disconnected.</p>
    130  *
    131  * @see ACameraManager_registerAvailabilityCallback
    132  */
    133 typedef struct ACameraManager_AvailabilityListener {
    134     /// Optional application context.
    135     void*                               context;
    136     /// Called when a camera becomes available
    137     ACameraManager_AvailabilityCallback onCameraAvailable;
    138     /// Called when a camera becomes unavailable
    139     ACameraManager_AvailabilityCallback onCameraUnavailable;
    140 } ACameraManager_AvailabilityCallbacks;
    141 
    142 /**
    143  * Register camera availability callbacks.
    144  *
    145  * <p>onCameraUnavailable will be called whenever a camera device is opened by any camera API client.
    146  * Other camera API clients may still be able to open such a camera device, evicting the existing
    147  * client if they have higher priority than the existing client of a camera device.
    148  * See {@link ACameraManager_openCamera} for more details.</p>
    149  *
    150  * <p>The callbacks will be called on a dedicated thread shared among all ACameraManager
    151  * instances.</p>
    152  *
    153  * <p>Since this callback will be registered with the camera service, remember to unregister it
    154  * once it is no longer needed; otherwise the callback will continue to receive events
    155  * indefinitely and it may prevent other resources from being released. Specifically, the
    156  * callbacks will be invoked independently of the general activity lifecycle and independently
    157  * of the state of individual ACameraManager instances.</p>
    158  *
    159  * @param manager the {@link ACameraManager} of interest.
    160  * @param callback the {@link ACameraManager_AvailabilityCallbacks} to be registered.
    161  *
    162  * @return <ul>
    163  *         <li>{@link ACAMERA_OK} if the method call succeeds.</li>
    164  *         <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if manager or callback is NULL, or
    165  *                  {ACameraManager_AvailabilityCallbacks#onCameraAvailable} or
    166  *                  {ACameraManager_AvailabilityCallbacks#onCameraUnavailable} is NULL.</li></ul>
    167  */
    168 camera_status_t ACameraManager_registerAvailabilityCallback(
    169         ACameraManager* manager, const ACameraManager_AvailabilityCallbacks* callback);
    170 
    171 /**
    172  * Unregister camera availability callbacks.
    173  *
    174  * <p>Removing a callback that isn't registered has no effect.</p>
    175  *
    176  * @param manager the {@link ACameraManager} of interest.
    177  * @param callback the {@link ACameraManager_AvailabilityCallbacks} to be unregistered.
    178  *
    179  * @return <ul>
    180  *         <li>{@link ACAMERA_OK} if the method call succeeds.</li>
    181  *         <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if callback,
    182  *                  {ACameraManager_AvailabilityCallbacks#onCameraAvailable} or
    183  *                  {ACameraManager_AvailabilityCallbacks#onCameraUnavailable} is NULL.</li></ul>
    184  */
    185 camera_status_t ACameraManager_unregisterAvailabilityCallback(
    186         ACameraManager* manager, const ACameraManager_AvailabilityCallbacks* callback);
    187 
    188 /**
    189  * Query the capabilities of a camera device. These capabilities are
    190  * immutable for a given camera.
    191  *
    192  * <p>See {@link ACameraMetadata} document and {@link NdkCameraMetadataTags.h} for more details.</p>
    193  *
    194  * <p>The caller must call {@link ACameraMetadata_free} to free the memory of the output
    195  * characteristics.</p>
    196  *
    197  * @param manager the {@link ACameraManager} of interest.
    198  * @param cameraId the ID string of the camera device of interest.
    199  * @param characteristics the output {@link ACameraMetadata} will be filled here if the method call
    200  *        succeeeds.
    201  *
    202  * @return <ul>
    203  *         <li>{@link ACAMERA_OK} if the method call succeeds.</li>
    204  *         <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if manager, cameraId, or characteristics
    205  *                  is NULL, or cameraId does not match any camera devices connected.</li>
    206  *         <li>{@link ACAMERA_ERROR_CAMERA_DISCONNECTED} if connection to camera service fails.</li>
    207  *         <li>{@link ACAMERA_ERROR_NOT_ENOUGH_MEMORY} if allocating memory fails.</li>
    208  *         <li>{@link ACAMERA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
    209  */
    210 camera_status_t ACameraManager_getCameraCharacteristics(
    211         ACameraManager* manager, const char* cameraId,
    212         /*out*/ACameraMetadata** characteristics);
    213 
    214 /**
    215  * Open a connection to a camera with the given ID. The opened camera device will be
    216  * returned in the `device` parameter.
    217  *
    218  * <p>Use {@link ACameraManager_getCameraIdList} to get the list of available camera
    219  * devices. Note that even if an id is listed, open may fail if the device
    220  * is disconnected between the calls to {@link ACameraManager_getCameraIdList} and
    221  * {@link ACameraManager_openCamera}, or if a higher-priority camera API client begins using the
    222  * camera device.</p>
    223  *
    224  * <p>Devices for which the
    225  * {@link ACameraManager_AvailabilityCallbacks#onCameraUnavailable} callback has been called due to
    226  * the device being in use by a lower-priority, background camera API client can still potentially
    227  * be opened by calling this method when the calling camera API client has a higher priority
    228  * than the current camera API client using this device.  In general, if the top, foreground
    229  * activity is running within your application process, your process will be given the highest
    230  * priority when accessing the camera, and this method will succeed even if the camera device is
    231  * in use by another camera API client. Any lower-priority application that loses control of the
    232  * camera in this way will receive an
    233  * {@link ACameraDevice_stateCallbacks#onDisconnected} callback.</p>
    234  *
    235  * <p>Once the camera is successfully opened,the ACameraDevice can then be set up
    236  * for operation by calling {@link ACameraDevice_createCaptureSession} and
    237  * {@link ACameraDevice_createCaptureRequest}.</p>
    238  *
    239  * <p>If the camera becomes disconnected after this function call returns,
    240  * {@link ACameraDevice_stateCallbacks#onDisconnected} with a
    241  * ACameraDevice in the disconnected state will be called.</p>
    242  *
    243  * <p>If the camera runs into error after this function call returns,
    244  * {@link ACameraDevice_stateCallbacks#onError} with a
    245  * ACameraDevice in the error state will be called.</p>
    246  *
    247  * @param manager the {@link ACameraManager} of interest.
    248  * @param cameraId the ID string of the camera device to be opened.
    249  * @param callback the {@link ACameraDevice_StateCallbacks} associated with the opened camera device.
    250  * @param device the opened {@link ACameraDevice} will be filled here if the method call succeeds.
    251  *
    252  * @return <ul>
    253  *         <li>{@link ACAMERA_OK} if the method call succeeds.</li>
    254  *         <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if manager, cameraId, callback, or device
    255  *                  is NULL, or cameraId does not match any camera devices connected.</li>
    256  *         <li>{@link ACAMERA_ERROR_CAMERA_DISCONNECTED} if connection to camera service fails.</li>
    257  *         <li>{@link ACAMERA_ERROR_NOT_ENOUGH_MEMORY} if allocating memory fails.</li>
    258  *         <li>{@link ACAMERA_ERROR_CAMERA_IN_USE} if camera device is being used by a higher
    259  *                   priority camera API client.</li>
    260  *         <li>{@link ACAMERA_ERROR_MAX_CAMERA_IN_USE} if the system-wide limit for number of open
    261  *                   cameras or camera resources has been reached, and more camera devices cannot be
    262  *                   opened until previous instances are closed.</li>
    263  *         <li>{@link ACAMERA_ERROR_CAMERA_DISABLED} if the camera is disabled due to a device
    264  *                   policy, and cannot be opened.</li>
    265  *         <li>{@link ACAMERA_ERROR_PERMISSION_DENIED} if the application does not have permission
    266  *                   to open camera.</li>
    267  *         <li>{@link ACAMERA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
    268  */
    269 camera_status_t ACameraManager_openCamera(
    270         ACameraManager* manager, const char* cameraId,
    271         ACameraDevice_StateCallbacks* callback,
    272         /*out*/ACameraDevice** device);
    273 
    274 #ifdef __cplusplus
    275 } // extern "C"
    276 #endif
    277 
    278 #endif //_NDK_CAMERA_MANAGER_H
    279 
    280 /** @} */
    281