Home | History | Annotate | Download | only in common
      1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #ifndef __MM_CAMERA_INTERFACE_H__
     31 #define __MM_CAMERA_INTERFACE_H__
     32 
     33 // System dependencies
     34 #include <media/msmb_camera.h>
     35 
     36 // Camera dependencies
     37 #include "cam_intf.h"
     38 #include "cam_queue.h"
     39 
     40 #define MM_CAMERA_MAX_NUM_SENSORS MSM_MAX_CAMERA_SENSORS
     41 #define MM_CAMERA_MAX_NUM_FRAMES CAM_MAX_NUM_BUFS_PER_STREAM
     42 /* num of channels allowed in a camera obj */
     43 #define MM_CAMERA_CHANNEL_MAX 16
     44 
     45 #define PAD_TO_SIZE(size, padding) \
     46         ((size + (typeof(size))(padding - 1)) & \
     47         (typeof(size))(~(padding - 1)))
     48 
     49 #define CEIL_DIVISION(n, d) ((n+d-1)/d)
     50 
     51 /** CAM_DUMP_TO_FILE:
     52  *  @filename: file name
     53  *  @name:filename
     54  *  @index: index of the file
     55  *  @extn: file extension
     56  *  @p_addr: address of the buffer
     57  *  @len: buffer length
     58  *
     59  *  dump the image to the file
     60  **/
     61 #define CAM_DUMP_TO_FILE(path, name, index, extn, p_addr, len) ({ \
     62   size_t rc = 0; \
     63   char filename[FILENAME_MAX]; \
     64   if (index >= 0) \
     65     snprintf(filename, FILENAME_MAX, "%s/%s%d.%s", path, name, index, extn); \
     66   else \
     67     snprintf(filename, FILENAME_MAX, "%s/%s.%s", path, name, extn); \
     68   FILE *fp = fopen(filename, "w+"); \
     69   if (fp) { \
     70     rc = fwrite(p_addr, 1, len, fp); \
     71     LOGE("written size %d", len); \
     72     fclose(fp); \
     73   } else { \
     74     LOGE("open %s failed", filename); \
     75   } \
     76 })
     77 
     78 /* Declaring Buffer structure */
     79 struct mm_camera_buf_def;
     80 
     81 /** mm_camera_plane_def_t : structure for frame plane info
     82 *    @num_planes : num of planes for the frame buffer, to be
     83 *               filled during mem allocation
     84 *    @planes : plane info for the frame buffer, to be filled
     85 *               during mem allocation
     86 **/
     87 typedef struct {
     88     int8_t num_planes;
     89     struct v4l2_plane planes[VIDEO_MAX_PLANES];
     90 } mm_camera_plane_buf_def_t;
     91 
     92 /** mm_camera_user_buf_def_t : structure for frame plane info
     93 *    @num_buffers : num of buffers in this user defined structure
     94 *    @bufs_used : actual number of buffer filled
     95 *    @buf_in_use : flag to notify buffer usage status.
     96 *    @plane_buf : Plane buffer array pointer.
     97 **/
     98 typedef struct {
     99     uint8_t num_buffers;
    100     uint8_t bufs_used;     /*Num of Buffer filled by Kernel*/
    101     uint8_t buf_in_use;  /* Container buffer is freed to fill*/
    102     int32_t buf_idx[MSM_CAMERA_MAX_USER_BUFF_CNT];
    103     struct mm_camera_buf_def *plane_buf;
    104 } mm_camera_user_buf_def_t;
    105 
    106 /** mm_camera_buf_def_t: structure for stream frame buf
    107 *    @stream_id : stream handler to uniquely identify a stream
    108 *               object
    109 *    @buf_idx : index of the buf within the stream bufs, to be
    110 *               filled during mem allocation
    111 *    @timespec_ts : time stamp, to be filled when DQBUF is
    112 *                 called
    113 *    @frame_idx : frame sequence num, to be filled when DQBUF
    114 *    @plane_buf  : Frame plane definition
    115 *    @fd : file descriptor of the frame buffer, to be filled
    116 *        during mem allocation
    117 *    @buffer : pointer to the frame buffer, to be filled during
    118 *            mem allocation
    119 *    @frame_len : length of the whole frame, to be filled during
    120 *               mem allocation
    121 *    @mem_info : user specific pointer to additional mem info
    122 *    @flags:  v4l2_buffer flags, used to report error in data buffers
    123 **/
    124 typedef struct mm_camera_buf_def {
    125     uint32_t stream_id;
    126     cam_stream_type_t stream_type;
    127     cam_stream_buf_type buf_type;
    128     uint32_t buf_idx;
    129     uint8_t is_uv_subsampled;
    130     struct timespec ts;
    131     uint32_t frame_idx;
    132     union {
    133         mm_camera_plane_buf_def_t planes_buf;
    134         mm_camera_user_buf_def_t user_buf;
    135     };
    136     int fd;
    137     void *buffer;
    138     size_t frame_len;
    139     void *mem_info;
    140     uint32_t flags;
    141 } mm_camera_buf_def_t;
    142 
    143 /** mm_camera_super_buf_t: super buf structure for bundled
    144 *   stream frames
    145 *    @camera_handle : camera handler to uniquely identify
    146 *              a camera object
    147 *    @ch_id : channel handler to uniquely ideentify a channel
    148 *           object
    149 *    @num_bufs : number of buffers in the super buf, should not
    150 *              exceeds MAX_STREAM_NUM_IN_BUNDLE
    151 *    @bufs : array of buffers in the bundle
    152 **/
    153 typedef struct {
    154     uint32_t camera_handle;
    155     uint32_t ch_id;
    156     uint32_t num_bufs;
    157     uint8_t bUnlockAEC;
    158     uint8_t bReadyForPrepareSnapshot;
    159     mm_camera_buf_def_t* bufs[MAX_STREAM_NUM_IN_BUNDLE];
    160 } mm_camera_super_buf_t;
    161 
    162 /** mm_camera_req_buf_type_t
    163 * Request type for super buf from channel
    164 **/
    165 typedef enum {
    166     MM_CAMERA_REQ_SUPER_BUF,
    167     MM_CAMERA_REQ_FRAME_SYNC_BUF
    168 } mm_camera_req_buf_type_t;
    169 
    170 /** mm_camera_req_buf_t: Attributes for super buf request
    171 *
    172 *    @type : type of super buf requested
    173 *    @num_buf_requested : num of super bufs requested
    174 *    @num_retro_buf_requested : number of retro bufs requested
    175 *    @primary_only : specifies if only primary camera frame for a dual
    176 *     camera is requested
    177 **/
    178 typedef struct {
    179     mm_camera_req_buf_type_t type;
    180     uint32_t num_buf_requested;
    181     uint32_t num_retro_buf_requested;
    182     uint8_t primary_only;
    183 } mm_camera_req_buf_t;
    184 
    185 typedef cam_event_t mm_camera_event_t;
    186 
    187 /** mm_camera_event_notify_t: function definition for event
    188 *   notify handling
    189 *    @camera_handle : camera handler
    190 *    @evt : pointer to an event struct
    191 *    @user_data: user data pointer
    192 **/
    193 typedef void (*mm_camera_event_notify_t)(uint32_t camera_handle,
    194                                          mm_camera_event_t *evt,
    195                                          void *user_data);
    196 
    197 /** mm_camera_buf_notify_t: function definition for frame notify
    198 *   handling
    199 *    @mm_camera_super_buf_t : received frame buffers
    200 *    @user_data: user data pointer
    201 **/
    202 typedef void (*mm_camera_buf_notify_t) (mm_camera_super_buf_t *bufs,
    203                                         void *user_data);
    204 
    205 /** map_stream_buf_op_t: function definition for operation of
    206 *   mapping stream buffers via domain socket
    207 *    @frame_idx : buffer index within stream buffers
    208 *    @plane_idx    : plane index. If all planes share the same
    209 *                   fd, plane_idx = -1; otherwise, plean_idx is
    210 *                   the index to plane (0..num_of_planes)
    211 *    @fd : file descriptor of the stream buffer
    212 *    @size: size of the stream buffer
    213 *    @buffer: Pointer to buffer to register
    214 *    @userdata : user data pointer
    215 **/
    216 typedef int32_t (*map_stream_buf_op_t) (uint32_t frame_idx,
    217                                         int32_t plane_idx,
    218                                         int fd,
    219                                         size_t size,
    220                                         void *buffer,
    221                                         cam_mapping_buf_type type,
    222                                         void *userdata);
    223 
    224 typedef int32_t (*map_stream_bufs_op_t) (const cam_buf_map_type_list *buf_map_list,
    225                                          void *userdata);
    226 
    227 /** unmap_stream_buf_op_t: function definition for operation of
    228 *                          unmapping stream buffers via domain
    229 *                          socket
    230 *    @frame_idx : buffer index within stream buffers
    231 *    @plane_idx : plane index. If all planes share the same
    232 *                 fd, plane_idx = -1; otherwise, plean_idx is
    233 *                 the index to plane (0..num_of_planes)
    234 *    @userdata : user data pointer
    235 **/
    236 typedef int32_t (*unmap_stream_buf_op_t) (uint32_t frame_idx,
    237                                           int32_t plane_idx,
    238                                           cam_mapping_buf_type type,
    239                                           void *userdata);
    240 
    241 /** mm_camera_map_unmap_ops_tbl_t: virtual table
    242 *                      for mapping/unmapping stream buffers via
    243 *                      domain socket
    244 *    @map_ops : operation for mapping
    245 *    @unmap_ops : operation for unmapping
    246 *    @userdata: user data pointer
    247 **/
    248 typedef struct {
    249     map_stream_buf_op_t map_ops;
    250     map_stream_bufs_op_t bundled_map_ops;
    251     unmap_stream_buf_op_t unmap_ops;
    252     void *userdata;
    253 } mm_camera_map_unmap_ops_tbl_t;
    254 
    255 /** mm_camera_stream_mem_vtbl_t: virtual table for stream
    256 *                      memory allocation and deallocation
    257 *    @get_bufs : function definition for allocating
    258 *                stream buffers
    259 *    @put_bufs : function definition for deallocating
    260 *                stream buffers
    261 *    @user_data: user data pointer
    262 **/
    263 typedef struct {
    264   void *user_data;
    265   int32_t (*set_config_ops) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    266           void *user_data);
    267   int32_t (*get_bufs) (cam_frame_len_offset_t *offset,
    268                        uint8_t *num_bufs,
    269                        uint8_t **initial_reg_flag,
    270                        mm_camera_buf_def_t **bufs,
    271                        mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    272                        void *user_data);
    273   int32_t (*put_bufs) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    274                        void *user_data);
    275   int32_t (*invalidate_buf)(uint32_t index, void *user_data);
    276   int32_t (*clean_invalidate_buf)(uint32_t index, void *user_data);
    277 } mm_camera_stream_mem_vtbl_t;
    278 
    279 /** mm_camera_stream_config_t: structure for stream
    280 *                              configuration
    281 *    @stream_info : pointer to a stream info structure
    282 *    @padding_info: padding info obtained from querycapability
    283 *    @mem_tbl : memory operation table for
    284 *              allocating/deallocating stream buffers
    285 *    @stream_cb_sync : SYNC callback handling stream frame notify
    286 *    @stream_cb : ASYNC callback handling stream frame notify
    287 *    @userdata : user data pointer
    288 **/
    289 typedef struct {
    290     cam_stream_info_t *stream_info;
    291     cam_padding_info_t padding_info;
    292     mm_camera_stream_mem_vtbl_t mem_vtbl;
    293     mm_camera_buf_notify_t stream_cb_sync;
    294     mm_camera_buf_notify_t stream_cb;
    295     void *userdata;
    296 } mm_camera_stream_config_t;
    297 
    298 /** mm_camera_super_buf_notify_mode_t: enum for super uffer
    299 *                                      notification mode
    300 *    @MM_CAMERA_SUPER_BUF_NOTIFY_BURST :
    301 *       ZSL use case: get burst of frames
    302 *    @MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS :
    303 *       get continuous frames: when the super buf is ready
    304 *       dispatch it to HAL
    305 **/
    306 typedef enum {
    307     MM_CAMERA_SUPER_BUF_NOTIFY_BURST = 0,
    308     MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS,
    309     MM_CAMERA_SUPER_BUF_NOTIFY_MAX
    310 } mm_camera_super_buf_notify_mode_t;
    311 
    312 /** mm_camera_super_buf_priority_t: enum for super buffer
    313 *                                   matching priority
    314 *    @MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL :
    315 *       Save the frame no matter focused or not. Currently only
    316 *       this type is supported.
    317 *    @MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS :
    318 *       only queue the frame that is focused. Will enable meta
    319 *       data header to carry focus info
    320 *    @MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING :
    321 *       after shutter, only queue matched exposure index
    322 **/
    323 typedef enum {
    324     MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL = 0,
    325     MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS,
    326     MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING,
    327     MM_CAMERA_SUPER_BUF_PRIORITY_LOW,/* Bundled metadata frame may not match*/
    328     MM_CAMERA_SUPER_BUF_PRIORITY_MAX
    329 } mm_camera_super_buf_priority_t;
    330 
    331 /** mm_camera_advanced_capture_t: enum for advanced capture type.
    332 *    @MM_CAMERA_AF_BRACKETING :
    333 *       to enable AF Bracketig.
    334 *    @MM_CAMERA_AE_BRACKETING :
    335 *       to enable AF Bracketing.
    336 *    @MM_CAMERA_FLASH_BRACKETING :
    337 *       to enable Flash Bracketing.
    338 *    @MM_CAMERA_ZOOM_1X :
    339 *       to enable zoom 1x capture request
    340 **/
    341 typedef enum {
    342    MM_CAMERA_AF_BRACKETING = 0,
    343    MM_CAMERA_AE_BRACKETING,
    344    MM_CAMERA_FLASH_BRACKETING,
    345    MM_CAMERA_ZOOM_1X,
    346    MM_CAMERA_FRAME_CAPTURE,
    347 } mm_camera_advanced_capture_t;
    348 
    349 /** mm_camera_stream_cb_type: enum for stream buffer callback type.
    350 *    @MM_CAMERA_STREAM_CB_TYPE_ASYNC :
    351 *       callback is async type. buffer process done in client thread context
    352 *    @MM_CAMERA_STREAM_CB_TYPE_SYNC :
    353 *       callback is sync type. buffer process done interface thread context
    354 **/
    355 typedef enum {
    356     MM_CAMERA_STREAM_CB_TYPE_ASYNC,
    357     MM_CAMERA_STREAM_CB_TYPE_SYNC,
    358 } mm_camera_stream_cb_type;
    359 
    360 
    361 /** mm_camera_channel_attr_t: structure for defining channel
    362 *                             attributes
    363 *    @notify_mode : notify mode: burst or continuous
    364 *    @water_mark : queue depth. Only valid for burst mode
    365 *    @look_back : look back how many frames from last buf.
    366 *                 Only valid for burst mode
    367 *    @post_frame_skip : after send first frame to HAL, how many
    368 *                     frames needing to be skipped for next
    369 *                     delivery. Only valid for burst mode
    370 *    @max_unmatched_frames : max number of unmatched frames in
    371 *                     queue
    372 *    @enable_frame_sync: Enables frame sync for dual camera
    373 *    @priority : save matched priority frames only
    374 *    @user_expected_frame_id : Number of frames, camera interface
    375 *                     will wait for getting the instant capture frame.
    376 **/
    377 typedef struct {
    378     mm_camera_super_buf_notify_mode_t notify_mode;
    379     uint8_t water_mark;
    380     uint8_t look_back;
    381     uint8_t post_frame_skip;
    382     uint8_t max_unmatched_frames;
    383     uint8_t enable_frame_sync;
    384     mm_camera_super_buf_priority_t priority;
    385     uint8_t user_expected_frame_id;
    386 } mm_camera_channel_attr_t;
    387 
    388 typedef struct {
    389     /** query_capability: fucntion definition for querying static
    390      *                    camera capabilities
    391      *    @camera_handle : camer handler
    392      *  Return value: 0 -- success
    393      *                -1 -- failure
    394      *  Note: would assume cam_capability_t is already mapped
    395      **/
    396     int32_t (*query_capability) (uint32_t camera_handle);
    397 
    398     /** register_event_notify: fucntion definition for registering
    399      *                         for event notification
    400      *    @camera_handle : camer handler
    401      *    @evt_cb : callback for event notify
    402      *    @user_data : user data poiner
    403      *  Return value: 0 -- success
    404      *                -1 -- failure
    405      **/
    406     int32_t (*register_event_notify) (uint32_t camera_handle,
    407                                       mm_camera_event_notify_t evt_cb,
    408                                       void *user_data);
    409 
    410     /** close_camera: fucntion definition for closing a camera
    411      *    @camera_handle : camer handler
    412      *  Return value: 0 -- success
    413      *                -1 -- failure
    414      **/
    415     int32_t (*close_camera) (uint32_t camera_handle);
    416 
    417     /** map_buf: fucntion definition for mapping a camera buffer
    418      *           via domain socket
    419      *    @camera_handle : camer handler
    420      *    @buf_type : type of mapping buffers, can be value of
    421      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    422      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    423      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    424      *    @fd : file descriptor of the stream buffer
    425      *    @size :  size of the stream buffer
    426      *  Return value: 0 -- success
    427      *                -1 -- failure
    428      **/
    429     int32_t (*map_buf) (uint32_t camera_handle,
    430                         uint8_t buf_type,
    431                         int fd,
    432                         size_t size,
    433                         void *buffer);
    434 
    435     /** map_bufs: function definition for mapping multiple camera buffers
    436      *           via domain socket
    437      *    @camera_handle : camera handler
    438      *    @buf_map_list : list of buffers to map
    439      *  Return value: 0 -- success
    440      *                -1 -- failure
    441      **/
    442     int32_t (*map_bufs) (uint32_t camera_handle,
    443                          const cam_buf_map_type_list *buf_map_list);
    444 
    445     /** unmap_buf: fucntion definition for unmapping a camera buffer
    446      *           via domain socket
    447      *    @camera_handle : camer handler
    448      *    @buf_type : type of mapping buffers, can be value of
    449      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    450      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    451      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    452      *  Return value: 0 -- success
    453      *                -1 -- failure
    454      **/
    455     int32_t (*unmap_buf) (uint32_t camera_handle,
    456                           uint8_t buf_type);
    457 
    458     /** set_parms: fucntion definition for setting camera
    459      *             based parameters to server
    460      *    @camera_handle : camer handler
    461      *    @parms : batch for parameters to be set, stored in
    462      *               parm_buffer_t
    463      *  Return value: 0 -- success
    464      *                -1 -- failure
    465      *  Note: would assume parm_buffer_t is already mapped, and
    466      *       according parameter entries to be set are filled in the
    467      *       buf before this call
    468      **/
    469     int32_t (*set_parms) (uint32_t camera_handle,
    470                           parm_buffer_t *parms);
    471 
    472     /** get_parms: fucntion definition for querying camera
    473      *             based parameters from server
    474      *    @camera_handle : camer handler
    475      *    @parms : batch for parameters to be queried, stored in
    476      *               parm_buffer_t
    477      *  Return value: 0 -- success
    478      *                -1 -- failure
    479      *  Note: would assume parm_buffer_t is already mapped, and
    480      *       according parameter entries to be queried are filled in
    481      *       the buf before this call
    482      **/
    483     int32_t (*get_parms) (uint32_t camera_handle,
    484                           parm_buffer_t *parms);
    485 
    486     /** do_auto_focus: fucntion definition for performing auto focus
    487      *    @camera_handle : camer handler
    488      *  Return value: 0 -- success
    489      *                -1 -- failure
    490      *  Note: if this call success, we will always assume there will
    491      *        be an auto_focus event following up.
    492      **/
    493     int32_t (*do_auto_focus) (uint32_t camera_handle);
    494 
    495     /** cancel_auto_focus: fucntion definition for cancelling
    496      *                     previous auto focus request
    497      *    @camera_handle : camer handler
    498     *  Return value: 0 -- success
    499     *                -1 -- failure
    500      **/
    501     int32_t (*cancel_auto_focus) (uint32_t camera_handle);
    502 
    503     /** prepare_snapshot: fucntion definition for preparing hardware
    504      *                    for snapshot.
    505      *    @camera_handle : camer handler
    506      *    @do_af_flag    : flag indicating if AF needs to be done
    507      *                     0 -- no AF needed
    508      *                     1 -- AF needed
    509      *  Return value: 0 -- success
    510      *                -1 -- failure
    511      **/
    512     int32_t (*prepare_snapshot) (uint32_t camera_handle,
    513                                  int32_t do_af_flag);
    514 
    515     /** start_zsl_snapshot: function definition for starting
    516      *                    zsl snapshot.
    517      *    @camera_handle : camer handler
    518      *    @ch_id         : channel id
    519      *  Return value: 0 -- success
    520      *                -1 -- failure
    521      **/
    522     int32_t (*start_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    523 
    524     /** stop_zsl_snapshot: function definition for stopping
    525      *                    zsl snapshot.
    526      *    @camera_handle : camer handler
    527      *    @ch_id         : channel id
    528      *  Return value: 0 -- success
    529      *                -1 -- failure
    530      **/
    531     int32_t (*stop_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    532 
    533     /** add_channel: fucntion definition for adding a channel
    534      *    @camera_handle : camer handler
    535      *    @ch_id : channel handler
    536      *    @attr : pointer to channel attribute structure
    537      *    @channel_cb : callbak to handle bundled super buffer
    538      *    @userdata : user data pointer
    539      *  Return value: channel id, zero is invalid ch_id
    540      * Note: attr, channel_cb, and userdata can be NULL if no
    541      *       superbufCB is needed
    542      **/
    543     uint32_t (*add_channel) (uint32_t camera_handle,
    544                              mm_camera_channel_attr_t *attr,
    545                              mm_camera_buf_notify_t channel_cb,
    546                              void *userdata);
    547 
    548     /** delete_channel: fucntion definition for deleting a channel
    549      *    @camera_handle : camer handler
    550      *    @ch_id : channel handler
    551      *  Return value: 0 -- success
    552      *                -1 -- failure
    553      **/
    554     int32_t (*delete_channel) (uint32_t camera_handle,
    555                                uint32_t ch_id);
    556 
    557     /** get_bundle_info: function definition for querying bundle
    558      *  info of the channel
    559      *    @camera_handle : camera handler
    560      *    @ch_id         : channel handler
    561      *    @bundle_info   : bundle info to be filled in
    562      *  Return value: 0 -- success
    563      *                -1 -- failure
    564      **/
    565     int32_t (*get_bundle_info) (uint32_t camera_handle,
    566                                 uint32_t ch_id,
    567                                 cam_bundle_config_t *bundle_info);
    568 
    569     /** add_stream: fucntion definition for adding a stream
    570      *    @camera_handle : camer handler
    571      *    @ch_id : channel handler
    572      *  Return value: stream_id. zero is invalid stream_id
    573      **/
    574     uint32_t (*add_stream) (uint32_t camera_handle,
    575                             uint32_t ch_id);
    576 
    577     /** delete_stream: fucntion definition for deleting a stream
    578      *    @camera_handle : camer handler
    579      *    @ch_id : channel handler
    580      *    @stream_id : stream handler
    581      *  Return value: 0 -- success
    582      *                -1 -- failure
    583      **/
    584     int32_t (*delete_stream) (uint32_t camera_handle,
    585                               uint32_t ch_id,
    586                               uint32_t stream_id);
    587 
    588     /** link_stream: function definition for linking a stream
    589      *    @camera_handle : camera handle
    590      *    @ch_id : channel handle from which the stream originates
    591      *    @stream_id : stream handle
    592      *    @linked_ch_id: channel handle in which the stream will be linked
    593      *  Return value: 0 -- success
    594      *                -1 -- failure
    595      **/
    596     int32_t (*link_stream) (uint32_t camera_handle,
    597           uint32_t ch_id,
    598           uint32_t stream_id,
    599           uint32_t linked_ch_id);
    600 
    601     /** config_stream: fucntion definition for configuring a stream
    602      *    @camera_handle : camer handler
    603      *    @ch_id : channel handler
    604      *    @stream_id : stream handler
    605      *    @confid : pointer to a stream configuration structure
    606      *  Return value: 0 -- success
    607      *                -1 -- failure
    608      **/
    609     int32_t (*config_stream) (uint32_t camera_handle,
    610                               uint32_t ch_id,
    611                               uint32_t stream_id,
    612                               mm_camera_stream_config_t *config);
    613 
    614     /** map_stream_buf: fucntion definition for mapping
    615      *                 stream buffer via domain socket
    616      *    @camera_handle : camer handler
    617      *    @ch_id : channel handler
    618      *    @stream_id : stream handler
    619      *    @buf_type : type of mapping buffers, can be value of
    620      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    621      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    622      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    623      *    @buf_idx : buffer index within the stream buffers
    624      *    @plane_idx : plane index. If all planes share the same fd,
    625      *               plane_idx = -1; otherwise, plean_idx is the
    626      *               index to plane (0..num_of_planes)
    627      *    @fd : file descriptor of the stream buffer
    628      *    @size :  size of the stream buffer
    629      *  Return value: 0 -- success
    630      *                -1 -- failure
    631      **/
    632     int32_t (*map_stream_buf) (uint32_t camera_handle,
    633                                uint32_t ch_id,
    634                                uint32_t stream_id,
    635                                uint8_t buf_type,
    636                                uint32_t buf_idx,
    637                                int32_t plane_idx,
    638                                int fd,
    639                                size_t size,
    640                                void *buffer);
    641 
    642     /** map_stream_bufs: function definition for mapping multiple
    643      *                 stream buffers via domain socket
    644      *    @camera_handle : camera handler
    645      *    @ch_id : channel handler
    646      *    @buf_map_list : list of buffers to map
    647      *  Return value: 0 -- success
    648      *                -1 -- failure
    649      **/
    650     int32_t (*map_stream_bufs) (uint32_t camera_handle,
    651                                 uint32_t ch_id,
    652                                 const cam_buf_map_type_list *buf_map_list);
    653 
    654     /** unmap_stream_buf: fucntion definition for unmapping
    655      *                 stream buffer via domain socket
    656      *    @camera_handle : camer handler
    657      *    @ch_id : channel handler
    658      *    @stream_id : stream handler
    659      *    @buf_type : type of mapping buffers, can be value of
    660      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    661      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    662      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    663      *    @buf_idx : buffer index within the stream buffers
    664      *    @plane_idx : plane index. If all planes share the same fd,
    665      *               plane_idx = -1; otherwise, plean_idx is the
    666      *               index to plane (0..num_of_planes)
    667      *  Return value: 0 -- success
    668      *                -1 -- failure
    669      **/
    670     int32_t (*unmap_stream_buf) (uint32_t camera_handle,
    671                                  uint32_t ch_id,
    672                                  uint32_t stream_id,
    673                                  uint8_t buf_type,
    674                                  uint32_t buf_idx,
    675                                  int32_t plane_idx);
    676 
    677     /** set_stream_parms: fucntion definition for setting stream
    678      *                    specific parameters to server
    679      *    @camera_handle : camer handler
    680      *    @ch_id : channel handler
    681      *    @stream_id : stream handler
    682      *    @parms : batch for parameters to be set
    683      *  Return value: 0 -- success
    684      *                -1 -- failure
    685      *  Note: would assume parm buffer is already mapped, and
    686      *       according parameter entries to be set are filled in the
    687      *       buf before this call
    688      **/
    689     int32_t (*set_stream_parms) (uint32_t camera_handle,
    690                                  uint32_t ch_id,
    691                                  uint32_t s_id,
    692                                  cam_stream_parm_buffer_t *parms);
    693 
    694     /** get_stream_parms: fucntion definition for querying stream
    695      *                    specific parameters from server
    696      *    @camera_handle : camer handler
    697      *    @ch_id : channel handler
    698      *    @stream_id : stream handler
    699      *    @parms : batch for parameters to be queried
    700      *  Return value: 0 -- success
    701      *                -1 -- failure
    702      *  Note: would assume parm buffer is already mapped, and
    703      *       according parameter entries to be queried are filled in
    704      *       the buf before this call
    705      **/
    706     int32_t (*get_stream_parms) (uint32_t camera_handle,
    707                                  uint32_t ch_id,
    708                                  uint32_t s_id,
    709                                  cam_stream_parm_buffer_t *parms);
    710 
    711     /** start_channel: fucntion definition for starting a channel
    712      *    @camera_handle : camer handler
    713      *    @ch_id : channel handler
    714      *  Return value: 0 -- success
    715      *                -1 -- failure
    716      * This call will start all streams belongs to the channel
    717      **/
    718     int32_t (*start_channel) (uint32_t camera_handle,
    719                               uint32_t ch_id);
    720 
    721     /** stop_channel: fucntion definition for stopping a channel
    722      *    @camera_handle : camer handler
    723      *    @ch_id : channel handler
    724      *  Return value: 0 -- success
    725      *                -1 -- failure
    726      * This call will stop all streams belongs to the channel
    727      **/
    728     int32_t (*stop_channel) (uint32_t camera_handle,
    729                              uint32_t ch_id);
    730 
    731     /** qbuf: fucntion definition for queuing a frame buffer back to
    732      *        kernel for reuse
    733      *    @camera_handle : camer handler
    734      *    @ch_id : channel handler
    735      *    @buf : a frame buffer to be queued back to kernel
    736      *  Return value: 0 -- success
    737      *                -1 -- failure
    738      **/
    739     int32_t (*qbuf) (uint32_t camera_handle,
    740                      uint32_t ch_id,
    741                      mm_camera_buf_def_t *buf);
    742 
    743     /** cancel_buffer: fucntion definition for recalling a frame
    744      *        buffer from the kernel this is most likely when h/w
    745      *        failed to use this buffer and dropped the frame we use
    746      *        this API to recall the buffer and return it to the
    747      *        framework
    748      *    @camera_handle : camer handler
    749      *    @ch_id : channel handler
    750      *    @stream_id : stream handle
    751      *    @buf : a frame buffer to be queued back to kernel
    752      *  Return value: 0 -- success
    753      *                -1 -- failure
    754      **/
    755     int32_t (*cancel_buffer) (uint32_t camera_handle,
    756                      uint32_t ch_id,
    757                      uint32_t stream_id,
    758                      uint32_t buf_idx);
    759 
    760 
    761     /** get_queued_buf_count: fucntion definition for querying queued buf count
    762      *    @camera_handle : camer handler
    763      *    @ch_id : channel handler
    764      *    @stream_id : stream handler
    765      *  Return value: queued buf count
    766      **/
    767     int32_t (*get_queued_buf_count) (uint32_t camera_handle,
    768             uint32_t ch_id,
    769             uint32_t stream_id);
    770 
    771     /** request_super_buf: fucntion definition for requesting frames
    772      *                     from superbuf queue in burst mode
    773      *    @camera_handle : camer handler
    774      *    @ch_id : channel handler
    775      *    @buf : provides info related to the super buf request
    776      *  Return value: 0 -- success
    777      *                -1 -- failure
    778      **/
    779     int32_t (*request_super_buf) (uint32_t camera_handle,
    780                                   uint32_t ch_id,
    781                                   mm_camera_req_buf_t *buf);
    782 
    783     /** cancel_super_buf_request: fucntion definition for canceling
    784      *                     frames dispatched from superbuf queue in
    785      *                     burst mode
    786      *    @camera_handle : camer handler
    787      *    @ch_id : channel handler
    788      *  Return value: 0 -- success
    789      *                -1 -- failure
    790      **/
    791     int32_t (*cancel_super_buf_request) (uint32_t camera_handle,
    792                                          uint32_t ch_id);
    793 
    794     /** flush_super_buf_queue: function definition for flushing out
    795      *                     all frames in the superbuf queue up to frame_idx,
    796      *                     even if frames with frame_idx come in later than
    797      *                     this call.
    798      *    @camera_handle : camer handler
    799      *    @ch_id : channel handler
    800      *    @frame_idx : frame index up until which all superbufs are flushed
    801      *  Return value: 0 -- success
    802      *                -1 -- failure
    803      **/
    804     int32_t (*flush_super_buf_queue) (uint32_t camera_handle,
    805                                       uint32_t ch_id, uint32_t frame_idx);
    806 
    807     /** configure_notify_mode: function definition for configuring the
    808      *                         notification mode of channel
    809      *    @camera_handle : camera handler
    810      *    @ch_id : channel handler
    811      *    @notify_mode : notification mode
    812      *  Return value: 0 -- success
    813      *                -1 -- failure
    814      **/
    815     int32_t (*configure_notify_mode) (uint32_t camera_handle,
    816                                       uint32_t ch_id,
    817                                       mm_camera_super_buf_notify_mode_t notify_mode);
    818 
    819    /** process_advanced_capture: function definition for start/stop advanced capture
    820      *                    for snapshot.
    821      *    @camera_handle : camera handle
    822      *    @ch_id : channel handler
    823      *    @type :  advanced capture type.
    824      *    @trigger    : flag indicating if advanced capture needs to be done
    825      *                     0 -- stop advanced capture
    826      *                     1 -- start advanced capture
    827      *    @in_value: Input value. Configaration
    828      *  Return value: 0 -- success
    829      *                -1 -- failure
    830      **/
    831     int32_t (*process_advanced_capture) (uint32_t camera_handle,
    832              uint32_t ch_id, mm_camera_advanced_capture_t type,
    833              int8_t start_flag, void *in_value);
    834 
    835    /** get_session_id: gets the backend session id from the kernel
    836      *    @camera_handle : camera handle
    837      *    @sessionid : session id to be retrieved
    838      *     Return value: 0 -- success
    839      *                -1 -- failure
    840      *  Note: if this call succeeds, we will get a valid session id
    841      **/
    842     int32_t (*get_session_id) (uint32_t camera_handle,
    843             uint32_t* sessionid);
    844 
    845     /** sync_related_sensors: sends sync cmd
    846       *    @camera_handle : camera handle
    847       *    @related_cam_info : related cam info to be sent to server
    848       *     Return value: 0 -- success
    849       *                -1 -- failure
    850       *  Note: if this call succeeds, we will get linking established in back end
    851       **/
    852      int32_t (*sync_related_sensors) (uint32_t camera_handle,
    853             cam_sync_related_sensors_event_info_t*
    854             related_cam_info);
    855     /** flush: function definition for flush
    856      *  @camera_handle: camera handler
    857      *  Return value: 0 -- success
    858      *               -1 -- failure
    859      **/
    860     int32_t (*flush) (uint32_t camera_handle);
    861 
    862    /** register_stream_buf_cb: fucntion definition for registering special stream callbacks
    863      *    @camera_handle : camer handler
    864      *    @ch_id : channel handler
    865      *    @stream_id : stream handler
    866      *    @buf_cb : callback function pointer
    867      *    @cb_type : Callback type SYNC/ASYNC
    868      *    @userdata : user data pointer
    869      *    Return value: 0 -- success
    870      *                -       1 -- failure
    871      **/
    872     int32_t (*register_stream_buf_cb) (uint32_t camera_handle,
    873             uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
    874             mm_camera_stream_cb_type cb_type, void *userdata);
    875 } mm_camera_ops_t;
    876 
    877 /** mm_camera_vtbl_t: virtual table for camera operations
    878 *    @camera_handle : camera handler which uniquely identifies a
    879 *                   camera object
    880 *    @ops : API call table
    881 **/
    882 typedef struct {
    883     uint32_t camera_handle;
    884     mm_camera_ops_t *ops;
    885 } mm_camera_vtbl_t;
    886 
    887 /* return number of cameras */
    888 uint8_t get_num_of_cameras();
    889 
    890 /* return reference pointer of camera vtbl */
    891 int32_t camera_open(uint8_t camera_idx, mm_camera_vtbl_t **camera_obj);
    892 
    893 /* helper functions */
    894 int32_t mm_stream_calc_offset_preview(cam_stream_info_t *stream_info,
    895         cam_dimension_t *dim,
    896         cam_padding_info_t *padding,
    897         cam_stream_buf_plane_info_t *buf_planes);
    898 
    899 int32_t mm_stream_calc_offset_post_view(cam_format_t fmt,
    900         cam_dimension_t *dim,
    901         cam_stream_buf_plane_info_t *buf_planes);
    902 
    903 int32_t mm_stream_calc_offset_snapshot(cam_format_t fmt,
    904         cam_dimension_t *dim,
    905         cam_padding_info_t *padding,
    906         cam_stream_buf_plane_info_t *buf_planes);
    907 
    908 int32_t mm_stream_calc_offset_raw(cam_format_t fmt,
    909         cam_dimension_t *dim,
    910         cam_padding_info_t *padding,
    911         cam_stream_buf_plane_info_t *buf_planes);
    912 
    913 int32_t mm_stream_calc_offset_video(cam_format_t fmt,
    914         cam_dimension_t *dim,
    915         cam_stream_buf_plane_info_t *buf_planes);
    916 
    917 int32_t mm_stream_calc_offset_metadata(cam_dimension_t *dim,
    918         cam_padding_info_t *padding,
    919         cam_stream_buf_plane_info_t *buf_planes);
    920 
    921 int32_t mm_stream_calc_offset_postproc(cam_stream_info_t *stream_info,
    922         cam_padding_info_t *padding,
    923         cam_stream_buf_plane_info_t *buf_planes);
    924 
    925 int32_t mm_stream_calc_offset_analysis(cam_format_t fmt,
    926         cam_dimension_t *dim,
    927         cam_padding_info_t *padding,
    928         cam_stream_buf_plane_info_t *buf_planes);
    929 
    930 uint32_t mm_stream_calc_lcm (int32_t num1, int32_t num2);
    931 
    932 struct camera_info *get_cam_info(uint32_t camera_id, cam_sync_type_t *pCamType);
    933 
    934 uint8_t is_yuv_sensor(uint32_t camera_id);
    935 
    936 #endif /*__MM_CAMERA_INTERFACE_H__*/
    937