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 *    @cache_flags: Stores cache related read/write flags
    124 **/
    125 typedef struct mm_camera_buf_def {
    126     uint32_t stream_id;
    127     cam_stream_type_t stream_type;
    128     cam_stream_buf_type buf_type;
    129     uint32_t buf_idx;
    130     uint8_t is_uv_subsampled;
    131     struct timespec ts;
    132     uint32_t frame_idx;
    133     union {
    134         mm_camera_plane_buf_def_t planes_buf;
    135         mm_camera_user_buf_def_t user_buf;
    136     };
    137     int fd;
    138     void *buffer;
    139     size_t frame_len;
    140     void *mem_info;
    141     uint32_t flags;
    142     uint32_t cache_flags;
    143 } mm_camera_buf_def_t;
    144 
    145 /** mm_camera_super_buf_t: super buf structure for bundled
    146 *   stream frames
    147 *    @camera_handle : camera handler to uniquely identify
    148 *              a camera object
    149 *    @ch_id : channel handler to uniquely ideentify a channel
    150 *           object
    151 *    @num_bufs : number of buffers in the super buf, should not
    152 *              exceeds MAX_STREAM_NUM_IN_BUNDLE
    153 *    @bufs : array of buffers in the bundle
    154 **/
    155 typedef struct {
    156     uint32_t camera_handle;
    157     uint32_t ch_id;
    158     uint32_t num_bufs;
    159     uint8_t bUnlockAEC;
    160     uint8_t bReadyForPrepareSnapshot;
    161     mm_camera_buf_def_t* bufs[MAX_STREAM_NUM_IN_BUNDLE];
    162 } mm_camera_super_buf_t;
    163 
    164 /** mm_camera_req_buf_type_t
    165 * Request type for super buf from channel
    166 **/
    167 typedef enum {
    168     MM_CAMERA_REQ_SUPER_BUF,
    169     MM_CAMERA_REQ_FRAME_SYNC_BUF
    170 } mm_camera_req_buf_type_t;
    171 
    172 /** mm_camera_req_buf_t: Attributes for super buf request
    173 *
    174 *    @type : type of super buf requested
    175 *    @num_buf_requested : num of super bufs requested
    176 *    @num_retro_buf_requested : number of retro bufs requested
    177 *    @primary_only : specifies if only primary camera frame for a dual
    178 *     camera is requested
    179 **/
    180 typedef struct {
    181     mm_camera_req_buf_type_t type;
    182     uint32_t num_buf_requested;
    183     uint32_t num_retro_buf_requested;
    184     uint8_t primary_only;
    185 } mm_camera_req_buf_t;
    186 
    187 typedef cam_event_t mm_camera_event_t;
    188 
    189 /** mm_camera_event_notify_t: function definition for event
    190 *   notify handling
    191 *    @camera_handle : camera handler
    192 *    @evt : pointer to an event struct
    193 *    @user_data: user data pointer
    194 **/
    195 typedef void (*mm_camera_event_notify_t)(uint32_t camera_handle,
    196                                          mm_camera_event_t *evt,
    197                                          void *user_data);
    198 
    199 /** mm_camera_buf_notify_t: function definition for frame notify
    200 *   handling
    201 *    @mm_camera_super_buf_t : received frame buffers
    202 *    @user_data: user data pointer
    203 **/
    204 typedef void (*mm_camera_buf_notify_t) (mm_camera_super_buf_t *bufs,
    205                                         void *user_data);
    206 
    207 /** map_stream_buf_op_t: function definition for operation of
    208 *   mapping stream buffers via domain socket
    209 *    @frame_idx : buffer index within stream buffers
    210 *    @plane_idx    : plane index. If all planes share the same
    211 *                   fd, plane_idx = -1; otherwise, plean_idx is
    212 *                   the index to plane (0..num_of_planes)
    213 *    @fd : file descriptor of the stream buffer
    214 *    @size: size of the stream buffer
    215 *    @buffer: Pointer to buffer to register
    216 *    @userdata : user data pointer
    217 **/
    218 typedef int32_t (*map_stream_buf_op_t) (uint32_t frame_idx,
    219                                         int32_t plane_idx,
    220                                         int fd,
    221                                         size_t size,
    222                                         void *buffer,
    223                                         cam_mapping_buf_type type,
    224                                         void *userdata);
    225 
    226 typedef int32_t (*map_stream_bufs_op_t) (const cam_buf_map_type_list *buf_map_list,
    227                                          void *userdata);
    228 
    229 /** unmap_stream_buf_op_t: function definition for operation of
    230 *                          unmapping stream buffers via domain
    231 *                          socket
    232 *    @frame_idx : buffer index within stream buffers
    233 *    @plane_idx : plane index. If all planes share the same
    234 *                 fd, plane_idx = -1; otherwise, plean_idx is
    235 *                 the index to plane (0..num_of_planes)
    236 *    @userdata : user data pointer
    237 **/
    238 typedef int32_t (*unmap_stream_buf_op_t) (uint32_t frame_idx,
    239                                           int32_t plane_idx,
    240                                           cam_mapping_buf_type type,
    241                                           void *userdata);
    242 
    243 /** mm_camera_map_unmap_ops_tbl_t: virtual table
    244 *                      for mapping/unmapping stream buffers via
    245 *                      domain socket
    246 *    @map_ops : operation for mapping
    247 *    @unmap_ops : operation for unmapping
    248 *    @userdata: user data pointer
    249 **/
    250 typedef struct {
    251     map_stream_buf_op_t map_ops;
    252     map_stream_bufs_op_t bundled_map_ops;
    253     unmap_stream_buf_op_t unmap_ops;
    254     void *userdata;
    255 } mm_camera_map_unmap_ops_tbl_t;
    256 
    257 /** mm_camera_stream_mem_vtbl_t: virtual table for stream
    258 *                      memory allocation and deallocation
    259 *    @get_bufs : function definition for allocating
    260 *                stream buffers
    261 *    @put_bufs : function definition for deallocating
    262 *                stream buffers
    263 *    @user_data: user data pointer
    264 **/
    265 typedef struct {
    266   void *user_data;
    267   int32_t (*set_config_ops) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    268           void *user_data);
    269   int32_t (*get_bufs) (cam_frame_len_offset_t *offset,
    270                        uint8_t *num_bufs,
    271                        uint8_t **initial_reg_flag,
    272                        mm_camera_buf_def_t **bufs,
    273                        mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    274                        void *user_data);
    275   int32_t (*put_bufs) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    276                        void *user_data);
    277   int32_t (*invalidate_buf)(uint32_t index, void *user_data);
    278   int32_t (*clean_invalidate_buf)(uint32_t index, void *user_data);
    279   int32_t (*clean_buf)(uint32_t index, void *user_data);
    280 } mm_camera_stream_mem_vtbl_t;
    281 
    282 /** mm_camera_stream_config_t: structure for stream
    283 *                              configuration
    284 *    @stream_info : pointer to a stream info structure
    285 *    @padding_info: padding info obtained from querycapability
    286 *    @mem_tbl : memory operation table for
    287 *              allocating/deallocating stream buffers
    288 *    @stream_cb_sync : SYNC callback handling stream frame notify
    289 *    @stream_cb : ASYNC callback handling stream frame notify
    290 *    @userdata : user data pointer
    291 **/
    292 typedef struct {
    293     cam_stream_info_t *stream_info;
    294     cam_padding_info_t padding_info;
    295     mm_camera_stream_mem_vtbl_t mem_vtbl;
    296     mm_camera_buf_notify_t stream_cb_sync;
    297     mm_camera_buf_notify_t stream_cb;
    298     void *userdata;
    299 } mm_camera_stream_config_t;
    300 
    301 /** mm_camera_super_buf_notify_mode_t: enum for super uffer
    302 *                                      notification mode
    303 *    @MM_CAMERA_SUPER_BUF_NOTIFY_BURST :
    304 *       ZSL use case: get burst of frames
    305 *    @MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS :
    306 *       get continuous frames: when the super buf is ready
    307 *       dispatch it to HAL
    308 **/
    309 typedef enum {
    310     MM_CAMERA_SUPER_BUF_NOTIFY_BURST = 0,
    311     MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS,
    312     MM_CAMERA_SUPER_BUF_NOTIFY_MAX
    313 } mm_camera_super_buf_notify_mode_t;
    314 
    315 /** mm_camera_super_buf_priority_t: enum for super buffer
    316 *                                   matching priority
    317 *    @MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL :
    318 *       Save the frame no matter focused or not. Currently only
    319 *       this type is supported.
    320 *    @MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS :
    321 *       only queue the frame that is focused. Will enable meta
    322 *       data header to carry focus info
    323 *    @MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING :
    324 *       after shutter, only queue matched exposure index
    325 **/
    326 typedef enum {
    327     MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL = 0,
    328     MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS,
    329     MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING,
    330     MM_CAMERA_SUPER_BUF_PRIORITY_LOW,/* Bundled metadata frame may not match*/
    331     MM_CAMERA_SUPER_BUF_PRIORITY_MAX
    332 } mm_camera_super_buf_priority_t;
    333 
    334 /** mm_camera_advanced_capture_t: enum for advanced capture type.
    335 *    @MM_CAMERA_AF_BRACKETING :
    336 *       to enable AF Bracketig.
    337 *    @MM_CAMERA_AE_BRACKETING :
    338 *       to enable AF Bracketing.
    339 *    @MM_CAMERA_FLASH_BRACKETING :
    340 *       to enable Flash Bracketing.
    341 *    @MM_CAMERA_ZOOM_1X :
    342 *       to enable zoom 1x capture request
    343 **/
    344 typedef enum {
    345    MM_CAMERA_AF_BRACKETING = 0,
    346    MM_CAMERA_AE_BRACKETING,
    347    MM_CAMERA_FLASH_BRACKETING,
    348    MM_CAMERA_ZOOM_1X,
    349    MM_CAMERA_FRAME_CAPTURE,
    350 } mm_camera_advanced_capture_t;
    351 
    352 /** mm_camera_stream_cb_type: enum for stream buffer callback type.
    353 *    @MM_CAMERA_STREAM_CB_TYPE_ASYNC :
    354 *       callback is async type. buffer process done in client thread context
    355 *    @MM_CAMERA_STREAM_CB_TYPE_SYNC :
    356 *       callback is sync type. buffer process done interface thread context
    357 **/
    358 typedef enum {
    359     MM_CAMERA_STREAM_CB_TYPE_ASYNC,
    360     MM_CAMERA_STREAM_CB_TYPE_SYNC,
    361 } mm_camera_stream_cb_type;
    362 
    363 
    364 /** mm_camera_channel_attr_t: structure for defining channel
    365 *                             attributes
    366 *    @notify_mode : notify mode: burst or continuous
    367 *    @water_mark : queue depth. Only valid for burst mode
    368 *    @look_back : look back how many frames from last buf.
    369 *                 Only valid for burst mode
    370 *    @post_frame_skip : after send first frame to HAL, how many
    371 *                     frames needing to be skipped for next
    372 *                     delivery. Only valid for burst mode
    373 *    @max_unmatched_frames : max number of unmatched frames in
    374 *                     queue
    375 *    @enable_frame_sync: Enables frame sync for dual camera
    376 *    @priority : save matched priority frames only
    377 *    @user_expected_frame_id : Number of frames, camera interface
    378 *                     will wait for getting the instant capture frame.
    379 **/
    380 typedef struct {
    381     mm_camera_super_buf_notify_mode_t notify_mode;
    382     uint8_t water_mark;
    383     uint8_t look_back;
    384     uint8_t post_frame_skip;
    385     uint8_t max_unmatched_frames;
    386     uint8_t enable_frame_sync;
    387     mm_camera_super_buf_priority_t priority;
    388     uint8_t user_expected_frame_id;
    389 } mm_camera_channel_attr_t;
    390 
    391 typedef struct {
    392     /** query_capability: fucntion definition for querying static
    393      *                    camera capabilities
    394      *    @camera_handle : camer handler
    395      *  Return value: 0 -- success
    396      *                -1 -- failure
    397      *  Note: would assume cam_capability_t is already mapped
    398      **/
    399     int32_t (*query_capability) (uint32_t camera_handle);
    400 
    401     /** register_event_notify: fucntion definition for registering
    402      *                         for event notification
    403      *    @camera_handle : camer handler
    404      *    @evt_cb : callback for event notify
    405      *    @user_data : user data poiner
    406      *  Return value: 0 -- success
    407      *                -1 -- failure
    408      **/
    409     int32_t (*register_event_notify) (uint32_t camera_handle,
    410                                       mm_camera_event_notify_t evt_cb,
    411                                       void *user_data);
    412 
    413     /** close_camera: fucntion definition for closing a camera
    414      *    @camera_handle : camer handler
    415      *  Return value: 0 -- success
    416      *                -1 -- failure
    417      **/
    418     int32_t (*close_camera) (uint32_t camera_handle);
    419 
    420     /** map_buf: fucntion definition for mapping a camera buffer
    421      *           via domain socket
    422      *    @camera_handle : camer handler
    423      *    @buf_type : type of mapping buffers, can be value of
    424      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    425      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    426      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    427      *    @fd : file descriptor of the stream buffer
    428      *    @size :  size of the stream buffer
    429      *  Return value: 0 -- success
    430      *                -1 -- failure
    431      **/
    432     int32_t (*map_buf) (uint32_t camera_handle,
    433                         uint8_t buf_type,
    434                         int fd,
    435                         size_t size,
    436                         void *buffer);
    437 
    438     /** map_bufs: function definition for mapping multiple camera buffers
    439      *           via domain socket
    440      *    @camera_handle : camera handler
    441      *    @buf_map_list : list of buffers to map
    442      *  Return value: 0 -- success
    443      *                -1 -- failure
    444      **/
    445     int32_t (*map_bufs) (uint32_t camera_handle,
    446                          const cam_buf_map_type_list *buf_map_list);
    447 
    448     /** unmap_buf: fucntion definition for unmapping a camera buffer
    449      *           via domain socket
    450      *    @camera_handle : camer handler
    451      *    @buf_type : type of mapping buffers, can be value of
    452      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    453      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    454      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    455      *  Return value: 0 -- success
    456      *                -1 -- failure
    457      **/
    458     int32_t (*unmap_buf) (uint32_t camera_handle,
    459                           uint8_t buf_type);
    460 
    461     /** set_parms: fucntion definition for setting camera
    462      *             based parameters to server
    463      *    @camera_handle : camer handler
    464      *    @parms : batch for parameters to be set, stored in
    465      *               parm_buffer_t
    466      *  Return value: 0 -- success
    467      *                -1 -- failure
    468      *  Note: would assume parm_buffer_t is already mapped, and
    469      *       according parameter entries to be set are filled in the
    470      *       buf before this call
    471      **/
    472     int32_t (*set_parms) (uint32_t camera_handle,
    473                           parm_buffer_t *parms);
    474 
    475     /** get_parms: fucntion definition for querying camera
    476      *             based parameters from server
    477      *    @camera_handle : camer handler
    478      *    @parms : batch for parameters to be queried, stored in
    479      *               parm_buffer_t
    480      *  Return value: 0 -- success
    481      *                -1 -- failure
    482      *  Note: would assume parm_buffer_t is already mapped, and
    483      *       according parameter entries to be queried are filled in
    484      *       the buf before this call
    485      **/
    486     int32_t (*get_parms) (uint32_t camera_handle,
    487                           parm_buffer_t *parms);
    488 
    489     /** do_auto_focus: fucntion definition for performing auto focus
    490      *    @camera_handle : camer handler
    491      *  Return value: 0 -- success
    492      *                -1 -- failure
    493      *  Note: if this call success, we will always assume there will
    494      *        be an auto_focus event following up.
    495      **/
    496     int32_t (*do_auto_focus) (uint32_t camera_handle);
    497 
    498     /** cancel_auto_focus: fucntion definition for cancelling
    499      *                     previous auto focus request
    500      *    @camera_handle : camer handler
    501     *  Return value: 0 -- success
    502     *                -1 -- failure
    503      **/
    504     int32_t (*cancel_auto_focus) (uint32_t camera_handle);
    505 
    506     /** prepare_snapshot: fucntion definition for preparing hardware
    507      *                    for snapshot.
    508      *    @camera_handle : camer handler
    509      *    @do_af_flag    : flag indicating if AF needs to be done
    510      *                     0 -- no AF needed
    511      *                     1 -- AF needed
    512      *  Return value: 0 -- success
    513      *                -1 -- failure
    514      **/
    515     int32_t (*prepare_snapshot) (uint32_t camera_handle,
    516                                  int32_t do_af_flag);
    517 
    518     /** start_zsl_snapshot: function definition for starting
    519      *                    zsl snapshot.
    520      *    @camera_handle : camer handler
    521      *    @ch_id         : channel id
    522      *  Return value: 0 -- success
    523      *                -1 -- failure
    524      **/
    525     int32_t (*start_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    526 
    527     /** stop_zsl_snapshot: function definition for stopping
    528      *                    zsl snapshot.
    529      *    @camera_handle : camer handler
    530      *    @ch_id         : channel id
    531      *  Return value: 0 -- success
    532      *                -1 -- failure
    533      **/
    534     int32_t (*stop_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    535 
    536     /** add_channel: fucntion definition for adding a channel
    537      *    @camera_handle : camer handler
    538      *    @ch_id : channel handler
    539      *    @attr : pointer to channel attribute structure
    540      *    @channel_cb : callbak to handle bundled super buffer
    541      *    @userdata : user data pointer
    542      *  Return value: channel id, zero is invalid ch_id
    543      * Note: attr, channel_cb, and userdata can be NULL if no
    544      *       superbufCB is needed
    545      **/
    546     uint32_t (*add_channel) (uint32_t camera_handle,
    547                              mm_camera_channel_attr_t *attr,
    548                              mm_camera_buf_notify_t channel_cb,
    549                              void *userdata);
    550 
    551     /** delete_channel: fucntion definition for deleting a channel
    552      *    @camera_handle : camer handler
    553      *    @ch_id : channel handler
    554      *  Return value: 0 -- success
    555      *                -1 -- failure
    556      **/
    557     int32_t (*delete_channel) (uint32_t camera_handle,
    558                                uint32_t ch_id);
    559 
    560     /** get_bundle_info: function definition for querying bundle
    561      *  info of the channel
    562      *    @camera_handle : camera handler
    563      *    @ch_id         : channel handler
    564      *    @bundle_info   : bundle info to be filled in
    565      *  Return value: 0 -- success
    566      *                -1 -- failure
    567      **/
    568     int32_t (*get_bundle_info) (uint32_t camera_handle,
    569                                 uint32_t ch_id,
    570                                 cam_bundle_config_t *bundle_info);
    571 
    572     /** add_stream: fucntion definition for adding a stream
    573      *    @camera_handle : camer handler
    574      *    @ch_id : channel handler
    575      *  Return value: stream_id. zero is invalid stream_id
    576      **/
    577     uint32_t (*add_stream) (uint32_t camera_handle,
    578                             uint32_t ch_id);
    579 
    580     /** delete_stream: fucntion definition for deleting a stream
    581      *    @camera_handle : camer handler
    582      *    @ch_id : channel handler
    583      *    @stream_id : stream handler
    584      *  Return value: 0 -- success
    585      *                -1 -- failure
    586      **/
    587     int32_t (*delete_stream) (uint32_t camera_handle,
    588                               uint32_t ch_id,
    589                               uint32_t stream_id);
    590 
    591     /** link_stream: function definition for linking a stream
    592      *    @camera_handle : camera handle
    593      *    @ch_id : channel handle from which the stream originates
    594      *    @stream_id : stream handle
    595      *    @linked_ch_id: channel handle in which the stream will be linked
    596      *  Return value: 0 -- success
    597      *                -1 -- failure
    598      **/
    599     int32_t (*link_stream) (uint32_t camera_handle,
    600           uint32_t ch_id,
    601           uint32_t stream_id,
    602           uint32_t linked_ch_id);
    603 
    604     /** config_stream: fucntion definition for configuring a stream
    605      *    @camera_handle : camer handler
    606      *    @ch_id : channel handler
    607      *    @stream_id : stream handler
    608      *    @confid : pointer to a stream configuration structure
    609      *  Return value: 0 -- success
    610      *                -1 -- failure
    611      **/
    612     int32_t (*config_stream) (uint32_t camera_handle,
    613                               uint32_t ch_id,
    614                               uint32_t stream_id,
    615                               mm_camera_stream_config_t *config);
    616 
    617     /** map_stream_buf: fucntion definition for mapping
    618      *                 stream buffer via domain socket
    619      *    @camera_handle : camer handler
    620      *    @ch_id : channel handler
    621      *    @stream_id : stream handler
    622      *    @buf_type : type of mapping buffers, can be value of
    623      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    624      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    625      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    626      *    @buf_idx : buffer index within the stream buffers
    627      *    @plane_idx : plane index. If all planes share the same fd,
    628      *               plane_idx = -1; otherwise, plean_idx is the
    629      *               index to plane (0..num_of_planes)
    630      *    @fd : file descriptor of the stream buffer
    631      *    @size :  size of the stream buffer
    632      *  Return value: 0 -- success
    633      *                -1 -- failure
    634      **/
    635     int32_t (*map_stream_buf) (uint32_t camera_handle,
    636                                uint32_t ch_id,
    637                                uint32_t stream_id,
    638                                uint8_t buf_type,
    639                                uint32_t buf_idx,
    640                                int32_t plane_idx,
    641                                int fd,
    642                                size_t size,
    643                                void *buffer);
    644 
    645     /** map_stream_bufs: function definition for mapping multiple
    646      *                 stream buffers via domain socket
    647      *    @camera_handle : camera handler
    648      *    @ch_id : channel handler
    649      *    @buf_map_list : list of buffers to map
    650      *  Return value: 0 -- success
    651      *                -1 -- failure
    652      **/
    653     int32_t (*map_stream_bufs) (uint32_t camera_handle,
    654                                 uint32_t ch_id,
    655                                 const cam_buf_map_type_list *buf_map_list);
    656 
    657     /** unmap_stream_buf: fucntion definition for unmapping
    658      *                 stream buffer via domain socket
    659      *    @camera_handle : camer handler
    660      *    @ch_id : channel handler
    661      *    @stream_id : stream handler
    662      *    @buf_type : type of mapping buffers, can be value of
    663      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    664      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    665      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    666      *    @buf_idx : buffer index within the stream buffers
    667      *    @plane_idx : plane index. If all planes share the same fd,
    668      *               plane_idx = -1; otherwise, plean_idx is the
    669      *               index to plane (0..num_of_planes)
    670      *  Return value: 0 -- success
    671      *                -1 -- failure
    672      **/
    673     int32_t (*unmap_stream_buf) (uint32_t camera_handle,
    674                                  uint32_t ch_id,
    675                                  uint32_t stream_id,
    676                                  uint8_t buf_type,
    677                                  uint32_t buf_idx,
    678                                  int32_t plane_idx);
    679 
    680     /** set_stream_parms: fucntion definition for setting stream
    681      *                    specific parameters to server
    682      *    @camera_handle : camer handler
    683      *    @ch_id : channel handler
    684      *    @stream_id : stream handler
    685      *    @parms : batch for parameters to be set
    686      *  Return value: 0 -- success
    687      *                -1 -- failure
    688      *  Note: would assume parm buffer is already mapped, and
    689      *       according parameter entries to be set are filled in the
    690      *       buf before this call
    691      **/
    692     int32_t (*set_stream_parms) (uint32_t camera_handle,
    693                                  uint32_t ch_id,
    694                                  uint32_t s_id,
    695                                  cam_stream_parm_buffer_t *parms);
    696 
    697     /** get_stream_parms: fucntion definition for querying stream
    698      *                    specific parameters from server
    699      *    @camera_handle : camer handler
    700      *    @ch_id : channel handler
    701      *    @stream_id : stream handler
    702      *    @parms : batch for parameters to be queried
    703      *  Return value: 0 -- success
    704      *                -1 -- failure
    705      *  Note: would assume parm buffer is already mapped, and
    706      *       according parameter entries to be queried are filled in
    707      *       the buf before this call
    708      **/
    709     int32_t (*get_stream_parms) (uint32_t camera_handle,
    710                                  uint32_t ch_id,
    711                                  uint32_t s_id,
    712                                  cam_stream_parm_buffer_t *parms);
    713 
    714     /** start_channel: fucntion definition for starting a channel
    715      *    @camera_handle : camer handler
    716      *    @ch_id : channel handler
    717      *  Return value: 0 -- success
    718      *                -1 -- failure
    719      * This call will start all streams belongs to the channel
    720      **/
    721     int32_t (*start_channel) (uint32_t camera_handle,
    722                               uint32_t ch_id);
    723 
    724     /** stop_channel: fucntion definition for stopping a channel
    725      *    @camera_handle : camer handler
    726      *    @ch_id : channel handler
    727      *  Return value: 0 -- success
    728      *                -1 -- failure
    729      * This call will stop all streams belongs to the channel
    730      **/
    731     int32_t (*stop_channel) (uint32_t camera_handle,
    732                              uint32_t ch_id);
    733 
    734     /** qbuf: fucntion definition for queuing a frame buffer back to
    735      *        kernel for reuse
    736      *    @camera_handle : camer handler
    737      *    @ch_id : channel handler
    738      *    @buf : a frame buffer to be queued back to kernel
    739      *  Return value: 0 -- success
    740      *                -1 -- failure
    741      **/
    742     int32_t (*qbuf) (uint32_t camera_handle,
    743                      uint32_t ch_id,
    744                      mm_camera_buf_def_t *buf);
    745 
    746     /** cancel_buffer: fucntion definition for recalling a frame
    747      *        buffer from the kernel this is most likely when h/w
    748      *        failed to use this buffer and dropped the frame we use
    749      *        this API to recall the buffer and return it to the
    750      *        framework
    751      *    @camera_handle : camer handler
    752      *    @ch_id : channel handler
    753      *    @stream_id : stream handle
    754      *    @buf : a frame buffer to be queued back to kernel
    755      *  Return value: 0 -- success
    756      *                -1 -- failure
    757      **/
    758     int32_t (*cancel_buffer) (uint32_t camera_handle,
    759                      uint32_t ch_id,
    760                      uint32_t stream_id,
    761                      uint32_t buf_idx);
    762 
    763 
    764     /** get_queued_buf_count: fucntion definition for querying queued buf count
    765      *    @camera_handle : camer handler
    766      *    @ch_id : channel handler
    767      *    @stream_id : stream handler
    768      *  Return value: queued buf count
    769      **/
    770     int32_t (*get_queued_buf_count) (uint32_t camera_handle,
    771             uint32_t ch_id,
    772             uint32_t stream_id);
    773 
    774     /** request_super_buf: fucntion definition for requesting frames
    775      *                     from superbuf queue in burst mode
    776      *    @camera_handle : camer handler
    777      *    @ch_id : channel handler
    778      *    @buf : provides info related to the super buf request
    779      *  Return value: 0 -- success
    780      *                -1 -- failure
    781      **/
    782     int32_t (*request_super_buf) (uint32_t camera_handle,
    783                                   uint32_t ch_id,
    784                                   mm_camera_req_buf_t *buf);
    785 
    786     /** cancel_super_buf_request: fucntion definition for canceling
    787      *                     frames dispatched from superbuf queue in
    788      *                     burst mode
    789      *    @camera_handle : camer handler
    790      *    @ch_id : channel handler
    791      *  Return value: 0 -- success
    792      *                -1 -- failure
    793      **/
    794     int32_t (*cancel_super_buf_request) (uint32_t camera_handle,
    795                                          uint32_t ch_id);
    796 
    797     /** flush_super_buf_queue: function definition for flushing out
    798      *                     all frames in the superbuf queue up to frame_idx,
    799      *                     even if frames with frame_idx come in later than
    800      *                     this call.
    801      *    @camera_handle : camer handler
    802      *    @ch_id : channel handler
    803      *    @frame_idx : frame index up until which all superbufs are flushed
    804      *  Return value: 0 -- success
    805      *                -1 -- failure
    806      **/
    807     int32_t (*flush_super_buf_queue) (uint32_t camera_handle,
    808                                       uint32_t ch_id, uint32_t frame_idx);
    809 
    810     /** configure_notify_mode: function definition for configuring the
    811      *                         notification mode of channel
    812      *    @camera_handle : camera handler
    813      *    @ch_id : channel handler
    814      *    @notify_mode : notification mode
    815      *  Return value: 0 -- success
    816      *                -1 -- failure
    817      **/
    818     int32_t (*configure_notify_mode) (uint32_t camera_handle,
    819                                       uint32_t ch_id,
    820                                       mm_camera_super_buf_notify_mode_t notify_mode);
    821 
    822    /** process_advanced_capture: function definition for start/stop advanced capture
    823      *                    for snapshot.
    824      *    @camera_handle : camera handle
    825      *    @ch_id : channel handler
    826      *    @type :  advanced capture type.
    827      *    @trigger    : flag indicating if advanced capture needs to be done
    828      *                     0 -- stop advanced capture
    829      *                     1 -- start advanced capture
    830      *    @in_value: Input value. Configaration
    831      *  Return value: 0 -- success
    832      *                -1 -- failure
    833      **/
    834     int32_t (*process_advanced_capture) (uint32_t camera_handle,
    835              uint32_t ch_id, mm_camera_advanced_capture_t type,
    836              int8_t start_flag, void *in_value);
    837 
    838    /** get_session_id: gets the backend session id from the kernel
    839      *    @camera_handle : camera handle
    840      *    @sessionid : session id to be retrieved
    841      *     Return value: 0 -- success
    842      *                -1 -- failure
    843      *  Note: if this call succeeds, we will get a valid session id
    844      **/
    845     int32_t (*get_session_id) (uint32_t camera_handle,
    846             uint32_t* sessionid);
    847 
    848     /** sync_related_sensors: sends sync cmd
    849       *    @camera_handle : camera handle
    850       *    @related_cam_info : related cam info to be sent to server
    851       *     Return value: 0 -- success
    852       *                -1 -- failure
    853       *  Note: if this call succeeds, we will get linking established in back end
    854       **/
    855      int32_t (*sync_related_sensors) (uint32_t camera_handle,
    856             cam_sync_related_sensors_event_info_t*
    857             related_cam_info);
    858     /** flush: function definition for flush
    859      *  @camera_handle: camera handler
    860      *  Return value: 0 -- success
    861      *               -1 -- failure
    862      **/
    863     int32_t (*flush) (uint32_t camera_handle);
    864 
    865    /** register_stream_buf_cb: fucntion definition for registering special stream callbacks
    866      *    @camera_handle : camer handler
    867      *    @ch_id : channel handler
    868      *    @stream_id : stream handler
    869      *    @buf_cb : callback function pointer
    870      *    @cb_type : Callback type SYNC/ASYNC
    871      *    @userdata : user data pointer
    872      *    Return value: 0 -- success
    873      *                -       1 -- failure
    874      **/
    875     int32_t (*register_stream_buf_cb) (uint32_t camera_handle,
    876             uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
    877             mm_camera_stream_cb_type cb_type, void *userdata);
    878 } mm_camera_ops_t;
    879 
    880 /** mm_camera_vtbl_t: virtual table for camera operations
    881 *    @camera_handle : camera handler which uniquely identifies a
    882 *                   camera object
    883 *    @ops : API call table
    884 **/
    885 typedef struct {
    886     uint32_t camera_handle;
    887     mm_camera_ops_t *ops;
    888 } mm_camera_vtbl_t;
    889 
    890 /* return number of cameras */
    891 uint8_t get_num_of_cameras();
    892 
    893 /* return reference pointer of camera vtbl */
    894 int32_t camera_open(uint8_t camera_idx, mm_camera_vtbl_t **camera_obj);
    895 
    896 /* helper functions */
    897 int32_t mm_stream_calc_offset_preview(cam_stream_info_t *stream_info,
    898         cam_dimension_t *dim,
    899         cam_padding_info_t *padding,
    900         cam_stream_buf_plane_info_t *buf_planes);
    901 
    902 int32_t mm_stream_calc_offset_post_view(cam_format_t fmt,
    903         cam_dimension_t *dim,
    904         cam_stream_buf_plane_info_t *buf_planes);
    905 
    906 int32_t mm_stream_calc_offset_snapshot(cam_format_t fmt,
    907         cam_dimension_t *dim,
    908         cam_padding_info_t *padding,
    909         cam_stream_buf_plane_info_t *buf_planes);
    910 
    911 int32_t mm_stream_calc_offset_raw(cam_format_t fmt,
    912         cam_dimension_t *dim,
    913         cam_padding_info_t *padding,
    914         cam_stream_buf_plane_info_t *buf_planes);
    915 
    916 int32_t mm_stream_calc_offset_video(cam_format_t fmt,
    917         cam_dimension_t *dim,
    918         cam_stream_buf_plane_info_t *buf_planes);
    919 
    920 int32_t mm_stream_calc_offset_metadata(cam_dimension_t *dim,
    921         cam_padding_info_t *padding,
    922         cam_stream_buf_plane_info_t *buf_planes);
    923 
    924 int32_t mm_stream_calc_offset_postproc(cam_stream_info_t *stream_info,
    925         cam_padding_info_t *padding,
    926         cam_stream_buf_plane_info_t *buf_planes);
    927 
    928 int32_t mm_stream_calc_offset_analysis(cam_format_t fmt,
    929         cam_dimension_t *dim,
    930         cam_padding_info_t *padding,
    931         cam_stream_buf_plane_info_t *buf_planes);
    932 
    933 uint32_t mm_stream_calc_lcm (int32_t num1, int32_t num2);
    934 
    935 struct camera_info *get_cam_info(uint32_t camera_id, cam_sync_type_t *pCamType);
    936 
    937 uint8_t is_yuv_sensor(uint32_t camera_id);
    938 
    939 #endif /*__MM_CAMERA_INTERFACE_H__*/
    940