mm_camera.h revision caa40ca90569900a549e51d669fc82b1982233ce
140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/*
29376681fc1c945a9789cab5bbd0b3badbb7165deMuhua LiCopyright (c) 2012, The Linux Foundation. All rights reserved.
340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabRedistribution and use in source and binary forms, with or without
540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabmodification, are permitted provided that the following conditions are
640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabmet:
740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    * Redistributions of source code must retain the above copyright
840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      notice, this list of conditions and the following disclaimer.
940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    * Redistributions in binary form must reproduce the above
1040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      copyright notice, this list of conditions and the following
1140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      disclaimer in the documentation and/or other materials provided
1240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      with the distribution.
1340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    * Neither the name of Code Aurora Forum, Inc. nor the names of its
1440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      contributors may be used to endorse or promote products derived
1540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab      from this software without specific prior written permission.
1640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
1740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor AftabIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab*/
2940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
3040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#ifndef __MM_CAMERA_H__
3140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define __MM_CAMERA_H__
3240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
33caa40ca90569900a549e51d669fc82b1982233ceShuzhen Wang#include <cam_semaphore.h>
34caa40ca90569900a549e51d669fc82b1982233ceShuzhen Wang
3540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#include "mm_camera_interface.h"
3640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
3740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/**********************************************************************************
3840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab* Data structure declare
3940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab***********************************************************************************/
4040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* num of callbacks allowed for an event type */
4140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_EVT_ENTRY_MAX 4
4240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* num of data callbacks allowed in a stream obj */
4340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_STREAM_BUF_CB_MAX 4
4440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* num of data poll threads allowed in a channel obj */
4540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_CHANNEL_POLL_THREAD_MAX 1
4640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
4740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_DEV_NAME_LEN 32
4840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_DEV_OPEN_TRIES 2
4940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20
5040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
5140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#ifndef TRUE
5240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define TRUE 1
5340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#endif
5440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
5540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#ifndef FALSE
5640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#define FALSE 0
5740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#endif
5840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
5940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabstruct mm_channel;
6040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabstruct mm_stream;
6140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabstruct mm_camera_obj;
6240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
6340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum
6440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
6540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_DATA_CB,    /* dataB CMD */
6640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_EVT_CB,     /* evtCB CMD */
6740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_EXIT,       /* EXIT */
6840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_REQ_DATA_CB,/* request data */
6940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB,    /* superbuf dataB CMD */
7040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_CMD_TYPE_MAX
7140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_cmdcb_type_t;
7240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
7340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
7440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
7540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t frame_idx;
7640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_buf_def_t *buf; /* ref to buf */
7740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_buf_info_t;
7840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
7940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
8040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t num_buf_requested;
8140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_req_buf_t;
8240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
8340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
8440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmdcb_type_t cmd_type;
8540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    union {
8640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        mm_camera_buf_info_t buf;    /* frame buf if dataCB */
8740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        mm_camera_event_t evt;       /* evt if evtCB */
8840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        mm_camera_super_buf_t superbuf; /* superbuf if superbuf dataCB*/
8940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        mm_camera_req_buf_t req_buf; /* num of buf requested */
9040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    } u;
9140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_cmdcb_t;
9240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
9340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data);
9440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
9540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
9640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    cam_queue_t cmd_queue; /* cmd queue (queuing dataCB, asyncCB, or exitCMD) */
9740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_t cmd_pid;           /* cmd thread ID */
98caa40ca90569900a549e51d669fc82b1982233ceShuzhen Wang    cam_semaphore_t cmd_sem;     /* semaphore for cmd thread */
9940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmd_cb_t cb;       /* cb for cmd */
10040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void* user_data;             /* user_data for cb */
10140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_cmd_thread_t;
10240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
10340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum {
10440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_POLL_TYPE_EVT,
10540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CAMERA_POLL_TYPE_DATA,
1069376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    MM_CAMERA_POLL_TYPE_MAX
10740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_poll_thread_type_t;
1089376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li
10940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* function ptr defined for poll notify CB,
11040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * registered at poll thread with poll fd */
11140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef void (*mm_camera_poll_notify_t)(void *user_data);
11240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
11340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
11440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t fd;
11540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_poll_notify_t notify_cb;
11640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t handler;
11740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void* user_data;
11840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_poll_entry_t;
11940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
12040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
12140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_poll_thread_type_t poll_type;
12240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* array to store poll fd and cb info
12340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * for MM_CAMERA_POLL_TYPE_EVT, only index 0 is valid;
12440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * for MM_CAMERA_POLL_TYPE_DATA, depends on valid stream fd */
12570b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    mm_camera_poll_entry_t poll_entries[MAX_STREAM_NUM_IN_BUNDLE];
12640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t pfds[2];
12740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_t pid;
12840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t state;
12940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int timeoutms;
13040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t cmd;
13170b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    struct pollfd poll_fds[MAX_STREAM_NUM_IN_BUNDLE + 1];
13240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t num_fds;
13340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t mutex;
13440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_cond_t cond_v;
13540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t status;
13640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    //void *my_obj;
13740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_poll_thread_t;
13840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
13940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm_stream */
14040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum {
14140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_NOTUSED = 0,      /* not used */
14240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_INITED,           /* inited  */
14340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_ACQUIRED,         /* acquired, fd opened  */
14440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_CFG,              /* fmt & dim configured */
14540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_BUFFED,           /* buf allocated */
14640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_REG,              /* buf regged, stream off */
14740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_ACTIVE,           /* active */
14840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_STATE_MAX
14940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_stream_state_type_t;
15040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
15140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum {
15240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_ACQUIRE,
15340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_RELEASE,
15440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_SET_FMT,
15540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_GET_BUF,
15640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_PUT_BUF,
15740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_REG_BUF,
15840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_UNREG_BUF,
15940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_START,
16040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_STOP,
16140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_QBUF,
16240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_SET_PARM,
16340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_GET_PARM,
16440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_DO_ACTION,
16540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_STREAM_EVT_MAX
16640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_stream_evt_type_t;
16740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
16840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
16940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_buf_notify_t cb;
17040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void *user_data;
17140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* cb_count = -1: infinite
17240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * cb_count > 0: register only for required times */
17340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int8_t cb_count;
17440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_stream_data_cb_t;
17540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
17640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
17740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* buf reference count */
17840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t buf_refcnt;
17940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
18040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* This flag is to indicate if after allocation,
18140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * the corresponding buf needs to qbuf into kernel
18240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * (e.g. for preview usecase, display needs to hold two bufs,
18340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * so no need to qbuf these two bufs initially) */
18440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t initial_reg_flag;
18540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
18640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* indicate if buf is in kernel(1) or client(0) */
18740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t in_kernel;
18840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_stream_buf_status_t;
18940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
19040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct mm_stream {
19140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t my_hdl; /* local stream id */
19240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t server_stream_id; /* stream id from server */
19340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t fd;
19440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_stream_state_type_t state;
19540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
19640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* stream info*/
19740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    cam_stream_info_t *stream_info;
19840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
1999376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    /* padding info */
2009376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    cam_padding_info_t padding_info;
2019376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li
20270b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    /* offset */
20370b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    cam_frame_len_offset_t frame_offset;
20470b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li
20540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmd_thread_t cmd_thread;
20640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
20740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* dataCB registered on this stream obj */
20840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */
20940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX];
21040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
21140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* stream buffer management */
21240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t buf_lock;
21340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t buf_num; /* num of buffers allocated */
21440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_buf_def_t* buf; /* ptr to buf array */
21540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_stream_buf_status_t* buf_status; /* ptr to buf status array */
21640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
21740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* reference to parent channel_obj */
21840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    struct mm_channel* ch_obj;
21940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
22040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t is_bundled; /* flag if stream is bundled */
22140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
22240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */
22340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_stream_t;
22440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
22540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm_channel */
22640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum {
22740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_STATE_NOTUSED = 0,   /* not used */
22840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_STATE_STOPPED,       /* stopped */
22940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_STATE_ACTIVE,        /* active, at least one stream active */
23040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_STATE_PAUSED,        /* paused */
23140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_STATE_MAX
23240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_state_type_t;
23340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
23440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef enum {
23540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_ADD_STREAM,
23640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_DEL_STREAM,
23740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_CONFIG_STREAM,
23840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_START,
23940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_STOP,
24040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_PAUSE,
24140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_RESUME,
24240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_REQUEST_SUPER_BUF,
24340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF,
24440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_MAP_STREAM_BUF,
24540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_UNMAP_STREAM_BUF,
24640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_SET_STREAM_PARM,
24740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_GET_STREAM_PARM,
24840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_DO_STREAM_ACTION,
24940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    MM_CHANNEL_EVT_DELETE,
25040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_evt_type_t;
25140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
25240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
25340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
25440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_stream_config_t *config;
25540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_evt_paylod_config_stream_t;
25640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
25740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
25840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
2599376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    cam_stream_parm_buffer_t *parms;
26040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_evt_paylod_set_get_stream_parms_t;
26140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
26240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
26340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
26440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void *actions;
26540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_evt_paylod_do_stream_action_t;
26640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
26740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
26840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
26940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t buf_type;
2709376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    uint32_t buf_idx;
2719376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    int32_t plane_idx;
27240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int fd;
27340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t size;
27440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_evt_paylod_map_stream_buf_t;
27540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
27640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
27740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_id;
27840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t buf_type;
2799376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    uint32_t buf_idx;
2809376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li    int32_t plane_idx;
28140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_evt_paylod_unmap_stream_buf_t;
28240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
28340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
28440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t num_of_bufs;
28570b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE];
28640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t matched;
28740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_queue_node_t;
28840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
28940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
29040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    cam_queue_t que;
29140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t num_streams;
29240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* container for bundled stream handlers */
29370b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE];
29440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_channel_attr_t attr;
29540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t expected_frame_id;
29640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t match_cnt;
29740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_queue_t;
29840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
29940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
30040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint8_t is_active; /* flag to indicate if bundle is valid */
30140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* queue to store bundled super buffers */
30240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_channel_queue_t superbuf_queue;
30340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_buf_notify_t super_buf_notify_cb;
30440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void *user_data;
30540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_bundle_t;
30640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
30740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct mm_channel {
30840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t my_hdl;
30940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_channel_state_type_t state;
31040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t ch_lock; /* channel lock */
31140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
31240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* stream bundle info in the channel */
31340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_channel_bundle_t bundle;
31440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
31540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* num of pending suferbuffers */
31640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t pending_cnt;
31740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
31840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* cmd thread for superbuffer dataCB and async stop*/
31940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmd_thread_t cmd_thread;
32040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
32140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* cb thread for sending data cb */
32240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmd_thread_t cb_thread;
32340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
32440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* data poll thread
32540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    * currently one data poll thread per channel
32640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    * could extended to support one data poll thread per stream in the channel */
32740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX];
32840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
32940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* container for all streams in channel */
33070b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE];
33140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
33240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* reference to parent cam_obj */
33340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    struct mm_camera_obj* cam_obj;
33440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_t;
33540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
33640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* struct to store information about pp cookie*/
33740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
33840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t cam_hdl;
33940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t ch_hdl;
34040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t stream_hdl;
34140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_channel_queue_node_t* super_buf;
34240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_channel_pp_info_t;
34340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
34440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm_camera */
34540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
34640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_event_notify_t evt_cb;
34740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    void *user_data;
34840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_evt_entry_t;
34940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
35040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
35140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
35240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    /* reg_count <=0: infinite
35340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab     * reg_count > 0: register only for required times */
35440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int reg_count;
35540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_evt_obj_t;
35640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
35740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct mm_camera_obj {
35840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    uint32_t my_hdl;
35940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int ref_count;
36040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t ctrl_fd;
36140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int32_t ds_fd; /* domain socket fd */
36240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t cam_lock;
36340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t cb_lock; /* lock for evt cb */
36440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_channel_t ch[MM_CAMERA_CHANNEL_MAX];
36540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_evt_obj_t evt;
36640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */
36740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_cmd_thread_t evt_thread;       /* thread for evt CB */
36840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_vtbl_t vtbl;
36940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
37040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_mutex_t evt_lock;
37140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    pthread_cond_t evt_cond;
37240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    mm_camera_event_t evt_rcvd;
37340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_obj_t;
37440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
37540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabtypedef struct {
37640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int8_t num_cam;
37770b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
37870b9a18a83c667fe749b6e1dd4b7f7188ee81f70Muhua Li    mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS];
37940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab} mm_camera_ctrl_t;
38040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
38140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/**********************************************************************************
38240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab* external function declare
38340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab***********************************************************************************/
38440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* utility functions */
38540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* set int32_t value */
38640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_util_s_ctrl(int32_t fd,
38740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                     uint32_t id,
388c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Li                                     int32_t *value);
38940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
39040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* get int32_t value */
39140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_util_g_ctrl(int32_t fd,
39240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                     uint32_t id,
393c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Li                                     int32_t *value);
39440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
39540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* send msg throught domain socket for fd mapping */
39640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj,
39740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      void *msg,
39840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      uint32_t buf_size,
39940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      int sendfd);
4009376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li/* Check if hardware target is A family */
4019376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Liuint8_t mm_camera_util_chip_is_a_family(void);
40240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
40340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm-camera */
40440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_open(mm_camera_obj_t *my_obj);
40540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
40640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj,
40740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                               mm_camera_event_notify_t evt_cb,
40840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                               void * user_data);
40940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj,
41040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                              uint32_t ch_id,
41140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                              mm_camera_buf_def_t *buf);
41240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj);
41340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj,
4149376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                   parm_buffer_t *parms);
41540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj,
4169376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                   parm_buffer_t *parms);
41740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj,
41840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 uint8_t buf_type,
41940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 int fd,
42040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 uint32_t size);
42140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj,
42240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                   uint8_t buf_type);
423c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Liextern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj,
424c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Li                                        cam_autofocus_cycle_t sweep_mode);
425c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Liextern cam_autofocus_state_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj);
426c5bafeb72b56487c5a9ac91efda0c1b4c2d43607Muhua Liextern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj);
42740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,
42840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      mm_camera_channel_attr_t *attr,
42940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      mm_camera_buf_notify_t channel_cb,
43040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      void *userdata);
43140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj,
43240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                     uint32_t ch_id);
43340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj,
43440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                     uint32_t ch_id);
43540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj,
43640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                    uint32_t ch_id,
43740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                    uint32_t stream_id);
43840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj,
43940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                       uint32_t ch_id,
44040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                       uint32_t stream_id,
44140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                       mm_camera_stream_config_t *config);
44240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj,
44340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                       uint32_t ch_id);
44440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj,
44540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                      uint32_t ch_id);
44640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj,
44740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                           uint32_t ch_id,
44840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                           uint32_t num_buf_requested);
44940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj,
45040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                                  uint32_t ch_id);
45140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj,
45240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t ch_id,
45340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t s_id,
4549376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                          cam_stream_parm_buffer_t *parms);
45540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj,
45640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t ch_id,
45740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t s_id,
4589376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                          cam_stream_parm_buffer_t *parms);
45940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,
46040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                                        mm_camera_event_notify_t evt_cb,
46140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                                        void * user_data);
46240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj,
46340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                        uint32_t ch_id,
46440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                        uint32_t stream_id,
46540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                        uint8_t buf_type,
4669376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                        uint32_t buf_idx,
4679376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                        int32_t plane_idx,
46840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                        int fd,
46940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                        uint32_t size);
47040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj,
47140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t ch_id,
47240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t stream_id,
47340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint8_t buf_type,
4749376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                          uint32_t buf_idx,
4759376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                          int32_t plane_idx);
47640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj,
47740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t ch_id,
47840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          uint32_t stream_id,
47940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                          void *actions);
48040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
48140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm_channel */
48240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj,
48340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 mm_channel_evt_type_t evt,
48440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 void * in_val,
48540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 void * out_val);
48640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_channel_init(mm_channel_t *my_obj,
48740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                               mm_camera_channel_attr_t *attr,
48840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                               mm_camera_buf_notify_t channel_cb,
48940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                               void *userdata);
49040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* qbuf is a special case that not going through state machine.
49140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * This is to avoid deadlock when trying to aquire ch_lock,
49240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * from the context of dataCB, but async stop is holding ch_lock */
49340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_channel_qbuf(mm_channel_t *my_obj,
49440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                               mm_camera_buf_def_t *buf);
49540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
49640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* mm_stream */
49740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
49840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_stream_evt_type_t evt,
49940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                void * in_val,
50040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                void * out_val);
50140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* Allow other stream to register dataCB at certain stream.
50240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * This is for use case of video sized live snapshot,
50340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * because snapshot stream need register one time CB at video stream.
50440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * ext_image_mode and sensor_idx are used to identify the destinate stream
50540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * to be register with dataCB. */
50640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
50740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                    mm_stream_data_cb_t *val);
50840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_stream_map_buf(mm_stream_t *my_obj,
50940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 uint8_t buf_type,
51040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 uint32_t frame_idx,
5119376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                 int32_t plane_idx,
51240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 int fd,
51340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                 uint32_t size);
51440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj,
51540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                   uint8_t buf_type,
5169376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                   uint32_t frame_idx,
5179376681fc1c945a9789cab5bbd0b3badbb7165deMuhua Li                                   int32_t plane_idx);
51840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
51940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
52040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* utiltity fucntion declared in mm-camera-inteface2.c
52140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab * and need be used by mm-camera and below*/
52240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabuint32_t mm_camera_util_generate_handler(uint8_t index);
52340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabconst char * mm_camera_util_get_dev_name(uint32_t cam_handler);
52440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabuint8_t mm_camera_util_get_index_by_handler(uint32_t handler);
52540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
52640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab/* poll/cmd thread functions */
52740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_poll_thread_launch(
52840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_poll_thread_t * poll_cb,
52940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_poll_thread_type_t poll_type);
53040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb);
53140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_poll_thread_add_poll_fd(
53240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_poll_thread_t * poll_cb,
53340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                uint32_t handler,
53440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                int32_t fd,
53540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_poll_notify_t nofity_cb,
53640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                void *userdata);
53740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_poll_thread_del_poll_fd(
53840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_poll_thread_t * poll_cb,
53940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                uint32_t handler);
54040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_cmd_thread_launch(
54140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_cmd_thread_t * cmd_thread,
54240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                mm_camera_cmd_cb_t cb,
54340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab                                void* user_data);
54440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftabextern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread);
54540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
54640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#endif /* __MM_CAMERA_H__ */
547