Home | History | Annotate | Download | only in inc
      1 /* Copyright (c) 2012-2015, 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_H__
     31 #define __MM_CAMERA_H__
     32 
     33 #include <cam_semaphore.h>
     34 
     35 #include "mm_camera_interface.h"
     36 #include <hardware/camera.h>
     37 #include <utils/Timers.h>
     38 
     39 /**********************************************************************************
     40 * Data structure declare
     41 ***********************************************************************************/
     42 /* num of callbacks allowed for an event type */
     43 #define MM_CAMERA_EVT_ENTRY_MAX 4
     44 /* num of data callbacks allowed in a stream obj */
     45 #define MM_CAMERA_STREAM_BUF_CB_MAX 4
     46 /* num of data poll threads allowed in a channel obj */
     47 #define MM_CAMERA_CHANNEL_POLL_THREAD_MAX 1
     48 
     49 #define MM_CAMERA_DEV_NAME_LEN 32
     50 #define MM_CAMERA_DEV_OPEN_TRIES 2
     51 #define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20
     52 #define THREAD_NAME_SIZE 15
     53 
     54 #ifndef TRUE
     55 #define TRUE 1
     56 #endif
     57 
     58 #ifndef FALSE
     59 #define FALSE 0
     60 #endif
     61 
     62 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
     63 
     64 struct mm_channel;
     65 struct mm_stream;
     66 struct mm_camera_obj;
     67 
     68 typedef enum
     69 {
     70     MM_CAMERA_CMD_TYPE_DATA_CB,    /* dataB CMD */
     71     MM_CAMERA_CMD_TYPE_EVT_CB,     /* evtCB CMD */
     72     MM_CAMERA_CMD_TYPE_EXIT,       /* EXIT */
     73     MM_CAMERA_CMD_TYPE_REQ_DATA_CB,/* request data */
     74     MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB,    /* superbuf dataB CMD */
     75     MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY, /* configure notify mode */
     76     MM_CAMERA_CMD_TYPE_START_ZSL, /* start zsl snapshot for channel */
     77     MM_CAMERA_CMD_TYPE_STOP_ZSL, /* stop zsl snapshot for channel */
     78     MM_CAMERA_CMD_TYPE_FLUSH_QUEUE, /* flush queue */
     79     MM_CAMERA_CMD_TYPE_GENERAL,  /* general cmd */
     80     MM_CAMERA_CMD_TYPE_MAX
     81 } mm_camera_cmdcb_type_t;
     82 
     83 typedef struct {
     84     uint32_t stream_id;
     85     uint32_t frame_idx;
     86     uint32_t flags;
     87     mm_camera_buf_def_t *buf; /* ref to buf */
     88 } mm_camera_buf_info_t;
     89 
     90 typedef struct {
     91     uint32_t num_buf_requested;
     92     uint32_t num_retro_buf_requested;
     93 } mm_camera_req_buf_t;
     94 
     95 typedef enum {
     96     MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING,
     97     MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING,
     98     MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING,
     99     MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X,
    100     MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING,
    101 } mm_camera_generic_cmd_type_t;
    102 
    103 typedef struct {
    104     mm_camera_generic_cmd_type_t type;
    105     uint32_t payload[32];
    106     union {
    107         cam_capture_frame_config_t frame_config;
    108     };
    109 } mm_camera_generic_cmd_t;
    110 
    111 typedef struct {
    112     mm_camera_cmdcb_type_t cmd_type;
    113     union {
    114         mm_camera_buf_info_t buf;    /* frame buf if dataCB */
    115         mm_camera_event_t evt;       /* evt if evtCB */
    116         mm_camera_super_buf_t superbuf; /* superbuf if superbuf dataCB*/
    117         mm_camera_req_buf_t req_buf; /* num of buf requested */
    118         uint32_t frame_idx; /* frame idx boundary for flush superbuf queue*/
    119         mm_camera_super_buf_notify_mode_t notify_mode; /* notification mode */
    120         mm_camera_generic_cmd_t gen_cmd;
    121     } u;
    122 } mm_camera_cmdcb_t;
    123 
    124 typedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data);
    125 
    126 typedef struct {
    127     cam_queue_t cmd_queue; /* cmd queue (queuing dataCB, asyncCB, or exitCMD) */
    128     pthread_t cmd_pid;           /* cmd thread ID */
    129     cam_semaphore_t cmd_sem;     /* semaphore for cmd thread */
    130     mm_camera_cmd_cb_t cb;       /* cb for cmd */
    131     void* user_data;             /* user_data for cb */
    132     char threadName[THREAD_NAME_SIZE];
    133 } mm_camera_cmd_thread_t;
    134 
    135 typedef enum {
    136     MM_CAMERA_POLL_TYPE_EVT,
    137     MM_CAMERA_POLL_TYPE_DATA,
    138     MM_CAMERA_POLL_TYPE_MAX
    139 } mm_camera_poll_thread_type_t;
    140 
    141 /* function ptr defined for poll notify CB,
    142  * registered at poll thread with poll fd */
    143 typedef void (*mm_camera_poll_notify_t)(void *user_data);
    144 
    145 typedef struct {
    146     int32_t fd;
    147     mm_camera_poll_notify_t notify_cb;
    148     uint32_t handler;
    149     void* user_data;
    150 } mm_camera_poll_entry_t;
    151 
    152 typedef struct {
    153     mm_camera_poll_thread_type_t poll_type;
    154     /* array to store poll fd and cb info
    155      * for MM_CAMERA_POLL_TYPE_EVT, only index 0 is valid;
    156      * for MM_CAMERA_POLL_TYPE_DATA, depends on valid stream fd */
    157     mm_camera_poll_entry_t poll_entries[MAX_STREAM_NUM_IN_BUNDLE];
    158     int32_t pfds[2];
    159     pthread_t pid;
    160     int32_t state;
    161     int timeoutms;
    162     uint32_t cmd;
    163     struct pollfd poll_fds[MAX_STREAM_NUM_IN_BUNDLE + 1];
    164     uint8_t num_fds;
    165     pthread_mutex_t mutex;
    166     pthread_cond_t cond_v;
    167     int32_t status;
    168     char threadName[THREAD_NAME_SIZE];
    169     //void *my_obj;
    170 } mm_camera_poll_thread_t;
    171 
    172 /* mm_stream */
    173 typedef enum {
    174     MM_STREAM_STATE_NOTUSED = 0,      /* not used */
    175     MM_STREAM_STATE_INITED,           /* inited  */
    176     MM_STREAM_STATE_ACQUIRED,         /* acquired, fd opened  */
    177     MM_STREAM_STATE_CFG,              /* fmt & dim configured */
    178     MM_STREAM_STATE_BUFFED,           /* buf allocated */
    179     MM_STREAM_STATE_REG,              /* buf regged, stream off */
    180     MM_STREAM_STATE_ACTIVE,           /* active */
    181     MM_STREAM_STATE_MAX
    182 } mm_stream_state_type_t;
    183 
    184 typedef enum {
    185     MM_STREAM_EVT_ACQUIRE,
    186     MM_STREAM_EVT_RELEASE,
    187     MM_STREAM_EVT_SET_FMT,
    188     MM_STREAM_EVT_GET_BUF,
    189     MM_STREAM_EVT_PUT_BUF,
    190     MM_STREAM_EVT_REG_BUF,
    191     MM_STREAM_EVT_UNREG_BUF,
    192     MM_STREAM_EVT_START,
    193     MM_STREAM_EVT_STOP,
    194     MM_STREAM_EVT_QBUF,
    195     MM_STREAM_EVT_SET_PARM,
    196     MM_STREAM_EVT_GET_PARM,
    197     MM_STREAM_EVT_DO_ACTION,
    198     MM_STREAM_EVT_GET_QUEUED_BUF_COUNT,
    199     MM_STREAM_EVT_MAX
    200 } mm_stream_evt_type_t;
    201 
    202 typedef struct {
    203     mm_camera_buf_notify_t cb;
    204     void *user_data;
    205     /* cb_count = -1: infinite
    206      * cb_count > 0: register only for required times */
    207     int8_t cb_count;
    208 } mm_stream_data_cb_t;
    209 
    210 typedef struct {
    211     /* buf reference count */
    212     uint8_t buf_refcnt;
    213 
    214     /* This flag is to indicate if after allocation,
    215      * the corresponding buf needs to qbuf into kernel
    216      * (e.g. for preview usecase, display needs to hold two bufs,
    217      * so no need to qbuf these two bufs initially) */
    218     uint8_t initial_reg_flag;
    219 
    220     /* indicate if buf is in kernel(1) or client(0) */
    221     uint8_t in_kernel;
    222 } mm_stream_buf_status_t;
    223 
    224 typedef struct mm_stream {
    225     uint32_t my_hdl; /* local stream id */
    226     uint32_t server_stream_id; /* stream id from server */
    227     int32_t fd;
    228     mm_stream_state_type_t state;
    229 
    230     /* stream info*/
    231     cam_stream_info_t *stream_info;
    232 
    233     /* padding info */
    234     cam_padding_info_t padding_info;
    235 
    236     /* offset */
    237     cam_frame_len_offset_t frame_offset;
    238 
    239     mm_camera_cmd_thread_t cmd_thread;
    240 
    241     /* dataCB registered on this stream obj */
    242     pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */
    243     mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX];
    244 
    245     /* stream buffer management */
    246     pthread_mutex_t buf_lock;
    247     uint8_t buf_num; /* num of buffers allocated */
    248     mm_camera_buf_def_t* buf; /* ptr to buf array */
    249     mm_stream_buf_status_t* buf_status; /* ptr to buf status array */
    250 
    251     uint8_t plane_buf_num; /* num of plane buffers allocated  Used only in Batch mode*/
    252     mm_camera_buf_def_t *plane_buf; /*Pointer to plane buffer array Used only in Batch mode */
    253     int32_t cur_buf_idx; /* Current container buffer active filling. Used only in Batch mode*/
    254     uint8_t cur_bufs_staged; /*Number of plane buf freed by HAL for this usr buf*/
    255 
    256 
    257     /* reference to parent channel_obj */
    258     struct mm_channel* ch_obj;
    259 
    260     uint8_t is_bundled; /* flag if stream is bundled */
    261 
    262     /* reference to linked channel_obj */
    263     struct mm_channel* linked_obj;
    264     struct mm_stream * linked_stream; /* original stream */
    265     uint8_t is_linked; /* flag if stream is linked */
    266 
    267     mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */
    268 
    269     mm_camera_map_unmap_ops_tbl_t map_ops;
    270 
    271     int8_t queued_buffer_count;
    272 
    273     /*latest timestamp of this stream frame received & last frameID*/
    274     uint32_t prev_frameID;
    275     nsecs_t prev_timestamp;
    276 } mm_stream_t;
    277 
    278 /* mm_channel */
    279 typedef enum {
    280     MM_CHANNEL_STATE_NOTUSED = 0,   /* not used */
    281     MM_CHANNEL_STATE_STOPPED,       /* stopped */
    282     MM_CHANNEL_STATE_ACTIVE,        /* active, at least one stream active */
    283     MM_CHANNEL_STATE_PAUSED,        /* paused */
    284     MM_CHANNEL_STATE_MAX
    285 } mm_channel_state_type_t;
    286 
    287 typedef enum {
    288     MM_CHANNEL_EVT_ADD_STREAM,
    289     MM_CHANNEL_EVT_DEL_STREAM,
    290     MM_CHANNEL_EVT_LINK_STREAM,
    291     MM_CHANNEL_EVT_CONFIG_STREAM,
    292     MM_CHANNEL_EVT_GET_BUNDLE_INFO,
    293     MM_CHANNEL_EVT_START,
    294     MM_CHANNEL_EVT_STOP,
    295     MM_CHANNEL_EVT_PAUSE,
    296     MM_CHANNEL_EVT_RESUME,
    297     MM_CHANNEL_EVT_REQUEST_SUPER_BUF,
    298     MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF,
    299     MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE,
    300     MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE,
    301     MM_CHANNEL_EVT_START_ZSL_SNAPSHOT,
    302     MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT,
    303     MM_CHANNEL_EVT_MAP_STREAM_BUF,
    304     MM_CHANNEL_EVT_UNMAP_STREAM_BUF,
    305     MM_CHANNEL_EVT_SET_STREAM_PARM,
    306     MM_CHANNEL_EVT_GET_STREAM_PARM,
    307     MM_CHANNEL_EVT_DO_STREAM_ACTION,
    308     MM_CHANNEL_EVT_DELETE,
    309     MM_CHANNEL_EVT_AF_BRACKETING,
    310     MM_CHANNEL_EVT_AE_BRACKETING,
    311     MM_CHANNEL_EVT_FLASH_BRACKETING,
    312     MM_CHANNEL_EVT_ZOOM_1X,
    313     MM_CAMERA_EVT_CAPTURE_SETTING,
    314     MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT,
    315 } mm_channel_evt_type_t;
    316 
    317 typedef struct {
    318     uint32_t stream_id;
    319     mm_camera_stream_config_t *config;
    320 } mm_evt_paylod_config_stream_t;
    321 
    322 typedef struct {
    323     uint32_t stream_id;
    324     cam_stream_parm_buffer_t *parms;
    325 } mm_evt_paylod_set_get_stream_parms_t;
    326 
    327 typedef struct {
    328     uint32_t stream_id;
    329     void *actions;
    330 } mm_evt_paylod_do_stream_action_t;
    331 
    332 typedef struct {
    333     uint32_t stream_id;
    334     uint8_t buf_type;
    335     uint32_t buf_idx;
    336     int32_t plane_idx;
    337     int fd;
    338     size_t size;
    339 } mm_evt_paylod_map_stream_buf_t;
    340 
    341 typedef struct {
    342     uint32_t stream_id;
    343     uint8_t buf_type;
    344     uint32_t buf_idx;
    345     int32_t plane_idx;
    346 } mm_evt_paylod_unmap_stream_buf_t;
    347 
    348 typedef struct {
    349     uint8_t num_of_bufs;
    350     mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE];
    351     uint8_t matched;
    352     uint8_t expected;
    353     uint32_t frame_idx;
    354 } mm_channel_queue_node_t;
    355 
    356 typedef struct {
    357     cam_queue_t que;
    358     uint8_t num_streams;
    359     /* container for bundled stream handlers */
    360     uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE];
    361     mm_camera_channel_attr_t attr;
    362     uint32_t expected_frame_id;
    363     uint32_t match_cnt;
    364     uint32_t expected_frame_id_without_led;
    365     uint32_t led_on_start_frame_id;
    366     uint32_t led_off_start_frame_id;
    367     uint32_t led_on_num_frames;
    368     uint32_t once;
    369     uint32_t frame_skip_count;
    370     uint32_t nomatch_frame_id;
    371 } mm_channel_queue_t;
    372 
    373 typedef struct {
    374     uint8_t is_active; /* flag to indicate if bundle is valid */
    375     /* queue to store bundled super buffers */
    376     mm_channel_queue_t superbuf_queue;
    377     mm_camera_buf_notify_t super_buf_notify_cb;
    378     void *user_data;
    379 } mm_channel_bundle_t;
    380 
    381 typedef enum {
    382     MM_CHANNEL_BRACKETING_STATE_OFF,
    383     MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX,
    384     MM_CHANNEL_BRACKETING_STATE_ACTIVE,
    385 } mm_channel_bracketing_state_t;
    386 
    387 typedef struct mm_channel {
    388     uint32_t my_hdl;
    389     mm_channel_state_type_t state;
    390     pthread_mutex_t ch_lock; /* channel lock */
    391 
    392     /* stream bundle info in the channel */
    393     mm_channel_bundle_t bundle;
    394 
    395     /* num of pending suferbuffers */
    396     uint32_t pending_cnt;
    397     uint32_t pending_retro_cnt;
    398     uint32_t bWaitForPrepSnapshotDone;
    399     uint32_t unLockAEC;
    400     /* num of pending suferbuffers */
    401     uint8_t stopZslSnapshot;
    402 
    403     /* cmd thread for superbuffer dataCB and async stop*/
    404     mm_camera_cmd_thread_t cmd_thread;
    405 
    406     /* cb thread for sending data cb */
    407     mm_camera_cmd_thread_t cb_thread;
    408 
    409     /* data poll thread
    410     * currently one data poll thread per channel
    411     * could extended to support one data poll thread per stream in the channel */
    412     mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX];
    413 
    414     /* container for all streams in channel */
    415     mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE];
    416 
    417     /* reference to parent cam_obj */
    418     struct mm_camera_obj* cam_obj;
    419 
    420     /* manual zsl snapshot control */
    421     uint8_t manualZSLSnapshot;
    422 
    423     /* control for zsl led */
    424     uint8_t startZSlSnapshotCalled;
    425     uint8_t needLEDFlash;
    426     mm_channel_bracketing_state_t bracketingState;
    427     uint8_t isFlashBracketingEnabled;
    428     uint8_t isZoom1xFrameRequested;
    429     uint32_t burstSnapNum;
    430     char threadName[THREAD_NAME_SIZE];
    431 
    432     /*Buffer diverted*/
    433     uint8_t diverted_frame_id;
    434 
    435     /*Frame capture configaration*/
    436     uint8_t cur_capture_idx;
    437     cam_capture_frame_config_t *frame_config;
    438 } mm_channel_t;
    439 
    440 typedef struct {
    441     mm_channel_t *ch;
    442     uint32_t stream_id;
    443 } mm_camera_stream_link_t;
    444 
    445 /* struct to store information about pp cookie*/
    446 typedef struct {
    447     uint32_t cam_hdl;
    448     uint32_t ch_hdl;
    449     uint32_t stream_hdl;
    450     mm_channel_queue_node_t* super_buf;
    451 } mm_channel_pp_info_t;
    452 
    453 /* mm_camera */
    454 typedef struct {
    455     mm_camera_event_notify_t evt_cb;
    456     void *user_data;
    457 } mm_camera_evt_entry_t;
    458 
    459 typedef struct {
    460     mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
    461     /* reg_count <=0: infinite
    462      * reg_count > 0: register only for required times */
    463     int reg_count;
    464 } mm_camera_evt_obj_t;
    465 
    466 typedef struct mm_camera_obj {
    467     uint32_t my_hdl;
    468     int ref_count;
    469     int32_t ctrl_fd;
    470     int32_t ds_fd; /* domain socket fd */
    471     pthread_mutex_t cam_lock;
    472     pthread_mutex_t cb_lock; /* lock for evt cb */
    473     mm_channel_t ch[MM_CAMERA_CHANNEL_MAX];
    474     mm_camera_evt_obj_t evt;
    475     mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */
    476     mm_camera_cmd_thread_t evt_thread;       /* thread for evt CB */
    477     mm_camera_vtbl_t vtbl;
    478 
    479     pthread_mutex_t evt_lock;
    480     pthread_cond_t evt_cond;
    481     mm_camera_event_t evt_rcvd;
    482 
    483     pthread_mutex_t msg_lock; /* lock for sending msg through socket */
    484 } mm_camera_obj_t;
    485 
    486 typedef struct {
    487     int8_t num_cam;
    488     char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
    489     mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS];
    490     struct camera_info info[MM_CAMERA_MAX_NUM_SENSORS];
    491 } mm_camera_ctrl_t;
    492 
    493 typedef enum {
    494     mm_camera_async_call,
    495     mm_camera_sync_call
    496 } mm_camera_call_type_t;
    497 
    498 /**********************************************************************************
    499 * external function declare
    500 ***********************************************************************************/
    501 /* utility functions */
    502 /* set int32_t value */
    503 extern int32_t mm_camera_util_s_ctrl(int32_t fd,
    504                                      uint32_t id,
    505                                      int32_t *value);
    506 
    507 /* get int32_t value */
    508 extern int32_t mm_camera_util_g_ctrl(int32_t fd,
    509                                      uint32_t id,
    510                                      int32_t *value);
    511 
    512 /* send msg throught domain socket for fd mapping */
    513 extern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj,
    514                                       void *msg,
    515                                       size_t buf_size,
    516                                       int sendfd);
    517 /* Check if hardware target is A family */
    518 uint8_t mm_camera_util_chip_is_a_family(void);
    519 
    520 /* mm-camera */
    521 extern int32_t mm_camera_open(mm_camera_obj_t *my_obj);
    522 extern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
    523 extern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj,
    524                                                mm_camera_event_notify_t evt_cb,
    525                                                void * user_data);
    526 extern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj,
    527                               uint32_t ch_id,
    528                               mm_camera_buf_def_t *buf);
    529 extern int32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj,
    530         uint32_t ch_id, uint32_t stream_id);
    531 extern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj);
    532 extern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj,
    533                                    parm_buffer_t *parms);
    534 extern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj,
    535                                    parm_buffer_t *parms);
    536 extern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj,
    537                                  uint8_t buf_type,
    538                                  int fd,
    539                                  size_t size);
    540 extern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj,
    541                                    uint8_t buf_type);
    542 extern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj);
    543 extern int32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj);
    544 extern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj,
    545                                           int32_t do_af_flag);
    546 extern int32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj);
    547 extern int32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj);
    548 extern int32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
    549         uint32_t ch_id);
    550 extern int32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
    551         uint32_t ch_id);
    552 extern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,
    553                                       mm_camera_channel_attr_t *attr,
    554                                       mm_camera_buf_notify_t channel_cb,
    555                                       void *userdata);
    556 extern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj,
    557                                      uint32_t ch_id);
    558 extern int32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj,
    559                                          uint32_t ch_id,
    560                                          cam_bundle_config_t *bundle_info);
    561 extern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj,
    562                                      uint32_t ch_id);
    563 extern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj,
    564                                     uint32_t ch_id,
    565                                     uint32_t stream_id);
    566 extern uint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj,
    567         uint32_t ch_id,
    568         uint32_t stream_id,
    569         uint32_t linked_ch_id);
    570 extern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj,
    571                                        uint32_t ch_id,
    572                                        uint32_t stream_id,
    573                                        mm_camera_stream_config_t *config);
    574 extern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj,
    575                                        uint32_t ch_id);
    576 extern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj,
    577                                       uint32_t ch_id);
    578 extern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj,
    579                                            uint32_t ch_id,
    580                                            uint32_t num_buf_requested,
    581                                            uint32_t num_retro_buf_requested);
    582 extern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj,
    583                                                   uint32_t ch_id);
    584 extern int32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj,
    585                                                uint32_t ch_id,
    586                                                uint32_t frame_idx);
    587 extern int32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj,
    588                                                uint32_t ch_id,
    589                                                mm_camera_super_buf_notify_mode_t notify_mode);
    590 extern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj,
    591                                           uint32_t ch_id,
    592                                           uint32_t s_id,
    593                                           cam_stream_parm_buffer_t *parms);
    594 extern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj,
    595                                           uint32_t ch_id,
    596                                           uint32_t s_id,
    597                                           cam_stream_parm_buffer_t *parms);
    598 extern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,
    599                                                         mm_camera_event_notify_t evt_cb,
    600                                                         void * user_data);
    601 extern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj,
    602                                         uint32_t ch_id,
    603                                         uint32_t stream_id,
    604                                         uint8_t buf_type,
    605                                         uint32_t buf_idx,
    606                                         int32_t plane_idx,
    607                                         int fd,
    608                                         size_t size);
    609 extern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj,
    610                                           uint32_t ch_id,
    611                                           uint32_t stream_id,
    612                                           uint8_t buf_type,
    613                                           uint32_t buf_idx,
    614                                           int32_t plane_idx);
    615 extern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj,
    616                                           uint32_t ch_id,
    617                                           uint32_t stream_id,
    618                                           void *actions);
    619 
    620 /* mm_channel */
    621 extern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj,
    622                                  mm_channel_evt_type_t evt,
    623                                  void * in_val,
    624                                  void * out_val);
    625 extern int32_t mm_channel_init(mm_channel_t *my_obj,
    626                                mm_camera_channel_attr_t *attr,
    627                                mm_camera_buf_notify_t channel_cb,
    628                                void *userdata);
    629 /* qbuf is a special case that not going through state machine.
    630  * This is to avoid deadlock when trying to aquire ch_lock,
    631  * from the context of dataCB, but async stop is holding ch_lock */
    632 extern int32_t mm_channel_qbuf(mm_channel_t *my_obj,
    633                                mm_camera_buf_def_t *buf);
    634 /* mm_stream */
    635 extern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
    636                                 mm_stream_evt_type_t evt,
    637                                 void * in_val,
    638                                 void * out_val);
    639 /* Allow other stream to register dataCB at certain stream.
    640  * This is for use case of video sized live snapshot,
    641  * because snapshot stream need register one time CB at video stream.
    642  * ext_image_mode and sensor_idx are used to identify the destinate stream
    643  * to be register with dataCB. */
    644 extern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
    645                                     mm_stream_data_cb_t *val);
    646 extern int32_t mm_stream_map_buf(mm_stream_t *my_obj,
    647                                  uint8_t buf_type,
    648                                  uint32_t frame_idx,
    649                                  int32_t plane_idx,
    650                                  int fd,
    651                                  size_t size);
    652 extern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj,
    653                                    uint8_t buf_type,
    654                                    uint32_t frame_idx,
    655                                    int32_t plane_idx);
    656 
    657 
    658 /* utiltity fucntion declared in mm-camera-inteface2.c
    659  * and need be used by mm-camera and below*/
    660 uint32_t mm_camera_util_generate_handler(uint8_t index);
    661 const char * mm_camera_util_get_dev_name(uint32_t cam_handler);
    662 uint8_t mm_camera_util_get_index_by_handler(uint32_t handler);
    663 
    664 /* poll/cmd thread functions */
    665 extern int32_t mm_camera_poll_thread_launch(
    666                                 mm_camera_poll_thread_t * poll_cb,
    667                                 mm_camera_poll_thread_type_t poll_type);
    668 extern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb);
    669 extern int32_t mm_camera_poll_thread_add_poll_fd(
    670                                 mm_camera_poll_thread_t * poll_cb,
    671                                 uint32_t handler,
    672                                 int32_t fd,
    673                                 mm_camera_poll_notify_t nofity_cb,
    674                                 void *userdata,
    675                                 mm_camera_call_type_t);
    676 extern int32_t mm_camera_poll_thread_del_poll_fd(
    677                                 mm_camera_poll_thread_t * poll_cb,
    678                                 uint32_t handler,
    679                                 mm_camera_call_type_t);
    680 extern int32_t mm_camera_poll_thread_commit_updates(
    681         mm_camera_poll_thread_t * poll_cb);
    682 extern int32_t mm_camera_cmd_thread_launch(
    683                                 mm_camera_cmd_thread_t * cmd_thread,
    684                                 mm_camera_cmd_cb_t cb,
    685                                 void* user_data);
    686 extern int32_t mm_camera_cmd_thread_name(const char* name);
    687 extern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread);
    688 
    689 extern int32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj,
    690         uint32_t ch_id, mm_camera_advanced_capture_t type,
    691         uint32_t trigger, void *in_value);
    692 #endif /* __MM_CAMERA_H__ */
    693