11d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
21d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *
31d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * Redistribution and use in source and binary forms, with or without
41d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * modification, are permitted provided that the following conditions are
51d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * met:
61d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *     * Redistributions of source code must retain the above copyright
71d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       notice, this list of conditions and the following disclaimer.
81d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *     * Redistributions in binary form must reproduce the above
91d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       copyright notice, this list of conditions and the following
101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       disclaimer in the documentation and/or other materials provided
111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       with the distribution.
121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *     * Neither the name of The Linux Foundation nor the names of its
131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       contributors may be used to endorse or promote products derived
141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *       from this software without specific prior written permission.
151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *
161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam *
281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam */
291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#ifndef __MM_CAMERA_H__
311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define __MM_CAMERA_H__
321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#include <cam_semaphore.h>
341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#include "mm_camera_interface.h"
361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#include <hardware/camera.h>
371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#include <utils/Timers.h>
381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/**********************************************************************************
401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam* Data structure declare
411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam***********************************************************************************/
421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* num of callbacks allowed for an event type */
431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define MM_CAMERA_EVT_ENTRY_MAX 4
441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* num of data callbacks allowed in a stream obj */
451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define MM_CAMERA_STREAM_BUF_CB_MAX 4
461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* num of data poll threads allowed in a channel obj */
471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define MM_CAMERA_CHANNEL_POLL_THREAD_MAX 1
481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define MM_CAMERA_DEV_NAME_LEN 32
50bee7b2b0d7f3ddc1d7a9f86e4754a8c681398e6dChien-Yu Chen#define MM_CAMERA_DEV_OPEN_TRIES 30
511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20
521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define THREAD_NAME_SIZE 15
531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#ifndef TRUE
551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define TRUE 1
561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#endif
571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#ifndef FALSE
591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define FALSE 0
601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#endif
611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamstruct mm_channel;
651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamstruct mm_stream;
661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamstruct mm_camera_obj;
671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum
691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam{
701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_DATA_CB,    /* dataB CMD */
711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_EVT_CB,     /* evtCB CMD */
721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_EXIT,       /* EXIT */
731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_REQ_DATA_CB,/* request data */
741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB,    /* superbuf dataB CMD */
751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY, /* configure notify mode */
761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_START_ZSL, /* start zsl snapshot for channel */
771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_STOP_ZSL, /* stop zsl snapshot for channel */
781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_FLUSH_QUEUE, /* flush queue */
791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_GENERAL,  /* general cmd */
801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_CMD_TYPE_MAX
811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_cmdcb_type_t;
821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t frame_idx;
861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t flags;
871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_def_t *buf; /* ref to buf */
881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_buf_info_t;
891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t num_buf_requested;
921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t num_retro_buf_requested;
931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_req_buf_t;
941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING,
971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING,
981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING,
991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X,
1001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING,
1011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_generic_cmd_type_t;
1021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
1041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_generic_cmd_type_t type;
1051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t payload[32];
1061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    union {
1071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        cam_capture_frame_config_t frame_config;
1081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    };
1091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_generic_cmd_t;
1101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
1121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmdcb_type_t cmd_type;
1131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    union {
1141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_buf_info_t buf;    /* frame buf if dataCB */
1151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_event_t evt;       /* evt if evtCB */
1161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_super_buf_t superbuf; /* superbuf if superbuf dataCB*/
1171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_req_buf_t req_buf; /* num of buf requested */
1181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t frame_idx; /* frame idx boundary for flush superbuf queue*/
1191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_super_buf_notify_mode_t notify_mode; /* notification mode */
1201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_generic_cmd_t gen_cmd;
1211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    } u;
1221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_cmdcb_t;
1231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data);
1251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
1271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_queue_t cmd_queue; /* cmd queue (queuing dataCB, asyncCB, or exitCMD) */
1281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_t cmd_pid;           /* cmd thread ID */
1291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_semaphore_t cmd_sem;     /* semaphore for cmd thread */
1301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmd_cb_t cb;       /* cb for cmd */
1311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void* user_data;             /* user_data for cb */
1321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    char threadName[THREAD_NAME_SIZE];
1331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_cmd_thread_t;
1341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
1361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_POLL_TYPE_EVT,
1371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_POLL_TYPE_DATA,
1381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_POLL_TYPE_MAX
1391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_poll_thread_type_t;
1401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* function ptr defined for poll notify CB,
1421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * registered at poll thread with poll fd */
1431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef void (*mm_camera_poll_notify_t)(void *user_data);
1441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
1461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t fd;
1471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_poll_notify_t notify_cb;
1481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t handler;
1491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void* user_data;
1501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_poll_entry_t;
1511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
1531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_poll_thread_type_t poll_type;
1541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* array to store poll fd and cb info
1551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * for MM_CAMERA_POLL_TYPE_EVT, only index 0 is valid;
1561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * for MM_CAMERA_POLL_TYPE_DATA, depends on valid stream fd */
1571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_poll_entry_t poll_entries[MAX_STREAM_NUM_IN_BUNDLE];
1581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t pfds[2];
1591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_t pid;
1601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t state;
1611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int timeoutms;
1621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t cmd;
1631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct pollfd poll_fds[MAX_STREAM_NUM_IN_BUNDLE + 1];
1641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t num_fds;
1651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t mutex;
1661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_cond_t cond_v;
1671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t status;
1681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    char threadName[THREAD_NAME_SIZE];
1691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    //void *my_obj;
1701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_poll_thread_t;
1711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm_stream */
1731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
1741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_NOTUSED = 0,      /* not used */
1751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_INITED,           /* inited  */
1761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_ACQUIRED,         /* acquired, fd opened  */
1771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_CFG,              /* fmt & dim configured */
1781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_BUFFED,           /* buf allocated */
1791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_REG,              /* buf regged, stream off */
1801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_ACTIVE,           /* active */
1811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_STATE_MAX
1821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_stream_state_type_t;
1831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
1841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
1851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_ACQUIRE,
1861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_RELEASE,
1871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_SET_FMT,
1881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_GET_BUF,
1891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_PUT_BUF,
1901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_REG_BUF,
1911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_UNREG_BUF,
1921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_START,
1931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_STOP,
1941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_QBUF,
1951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_SET_PARM,
1961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_GET_PARM,
1971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_DO_ACTION,
1981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_GET_QUEUED_BUF_COUNT,
1991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_STREAM_EVT_MAX
2001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_stream_evt_type_t;
2011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
2031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_notify_t cb;
2041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void *user_data;
2051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* cb_count = -1: infinite
2061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * cb_count > 0: register only for required times */
2071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int8_t cb_count;
2081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_stream_data_cb_t;
2091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
2111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* buf reference count */
2121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t buf_refcnt;
2131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* This flag is to indicate if after allocation,
2151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * the corresponding buf needs to qbuf into kernel
2161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * (e.g. for preview usecase, display needs to hold two bufs,
2171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * so no need to qbuf these two bufs initially) */
2181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t initial_reg_flag;
2191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* indicate if buf is in kernel(1) or client(0) */
2211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t in_kernel;
2221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_stream_buf_status_t;
2231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct mm_stream {
2251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t my_hdl; /* local stream id */
2261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t server_stream_id; /* stream id from server */
2271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t fd;
2281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_stream_state_type_t state;
2291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* stream info*/
2311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_stream_info_t *stream_info;
2321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* padding info */
2341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_padding_info_t padding_info;
2351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* offset */
2371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_frame_len_offset_t frame_offset;
2381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmd_thread_t cmd_thread;
2401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* dataCB registered on this stream obj */
2421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */
2431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX];
2441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* stream buffer management */
2461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t buf_lock;
2471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t buf_num; /* num of buffers allocated */
2481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_def_t* buf; /* ptr to buf array */
2491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_stream_buf_status_t* buf_status; /* ptr to buf status array */
2501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t plane_buf_num; /* num of plane buffers allocated  Used only in Batch mode*/
2521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_def_t *plane_buf; /*Pointer to plane buffer array Used only in Batch mode */
2531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t cur_buf_idx; /* Current container buffer active filling. Used only in Batch mode*/
2541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t cur_bufs_staged; /*Number of plane buf freed by HAL for this usr buf*/
2551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* reference to parent channel_obj */
2581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct mm_channel* ch_obj;
2591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t is_bundled; /* flag if stream is bundled */
2611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* reference to linked channel_obj */
2631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct mm_channel* linked_obj;
2641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct mm_stream * linked_stream; /* original stream */
2651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t is_linked; /* flag if stream is linked */
2661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */
2681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_map_unmap_ops_tbl_t map_ops;
2701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int8_t queued_buffer_count;
2721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /*latest timestamp of this stream frame received & last frameID*/
2741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t prev_frameID;
2751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    nsecs_t prev_timestamp;
2761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_stream_t;
2771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm_channel */
2791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
2801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_STATE_NOTUSED = 0,   /* not used */
2811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_STATE_STOPPED,       /* stopped */
2821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_STATE_ACTIVE,        /* active, at least one stream active */
2831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_STATE_PAUSED,        /* paused */
2841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_STATE_MAX
2851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_state_type_t;
2861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
2871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
2881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_ADD_STREAM,
2891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_DEL_STREAM,
2901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_LINK_STREAM,
2911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_CONFIG_STREAM,
2921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_GET_BUNDLE_INFO,
2931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_START,
2941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_STOP,
2951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_PAUSE,
2961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_RESUME,
2971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_REQUEST_SUPER_BUF,
2981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF,
2991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE,
3001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE,
3011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_START_ZSL_SNAPSHOT,
3021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT,
3031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_MAP_STREAM_BUF,
3041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_UNMAP_STREAM_BUF,
3051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_SET_STREAM_PARM,
3061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_GET_STREAM_PARM,
3071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_DO_STREAM_ACTION,
3081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_DELETE,
3091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_AF_BRACKETING,
3101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_AE_BRACKETING,
3111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_FLASH_BRACKETING,
3121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_ZOOM_1X,
3131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CAMERA_EVT_CAPTURE_SETTING,
3141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT,
3151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_evt_type_t;
3161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
3191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_stream_config_t *config;
3201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_evt_paylod_config_stream_t;
3211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
3241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_stream_parm_buffer_t *parms;
3251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_evt_paylod_set_get_stream_parms_t;
3261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
3291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void *actions;
3301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_evt_paylod_do_stream_action_t;
3311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
3341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t buf_type;
3351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t buf_idx;
3361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t plane_idx;
3371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int fd;
3381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    size_t size;
3391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_evt_paylod_map_stream_buf_t;
3401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
3431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t buf_type;
3441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t buf_idx;
3451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t plane_idx;
3461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_evt_paylod_unmap_stream_buf_t;
3471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t num_of_bufs;
3501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE];
3511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t matched;
3521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t expected;
3531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t frame_idx;
3541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_queue_node_t;
3551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_queue_t que;
3581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t num_streams;
3591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* container for bundled stream handlers */
3601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE];
3611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_channel_attr_t attr;
3621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t expected_frame_id;
3631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t match_cnt;
3641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t expected_frame_id_without_led;
3651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t led_on_start_frame_id;
3661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t led_off_start_frame_id;
3671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t led_on_num_frames;
3681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t once;
3691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t frame_skip_count;
3701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t nomatch_frame_id;
3711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_queue_t;
3721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
3741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t is_active; /* flag to indicate if bundle is valid */
3751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* queue to store bundled super buffers */
3761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_queue_t superbuf_queue;
3771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_buf_notify_t super_buf_notify_cb;
3781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void *user_data;
3791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_bundle_t;
3801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
3821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_BRACKETING_STATE_OFF,
3831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX,
3841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    MM_CHANNEL_BRACKETING_STATE_ACTIVE,
3851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_bracketing_state_t;
3861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct mm_channel {
3881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t my_hdl;
3891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_state_type_t state;
3901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t ch_lock; /* channel lock */
3911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* stream bundle info in the channel */
3931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_bundle_t bundle;
3941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
3951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* num of pending suferbuffers */
3961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t pending_cnt;
3971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t pending_retro_cnt;
3981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t bWaitForPrepSnapshotDone;
3991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t unLockAEC;
4001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* num of pending suferbuffers */
4011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t stopZslSnapshot;
4021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* cmd thread for superbuffer dataCB and async stop*/
4041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmd_thread_t cmd_thread;
4051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* cb thread for sending data cb */
4071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmd_thread_t cb_thread;
4081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* data poll thread
4101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    * currently one data poll thread per channel
4111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    * could extended to support one data poll thread per stream in the channel */
4121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX];
4131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* container for all streams in channel */
4151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE];
4161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* reference to parent cam_obj */
4181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct mm_camera_obj* cam_obj;
4191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* manual zsl snapshot control */
4211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t manualZSLSnapshot;
4221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* control for zsl led */
4241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t startZSlSnapshotCalled;
4251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t needLEDFlash;
4261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_bracketing_state_t bracketingState;
4271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t isFlashBracketingEnabled;
4281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t isZoom1xFrameRequested;
4291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t burstSnapNum;
4301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    char threadName[THREAD_NAME_SIZE];
4311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /*Buffer diverted*/
4331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t diverted_frame_id;
4341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /*Frame capture configaration*/
4361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint8_t cur_capture_idx;
4371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    cam_capture_frame_config_t *frame_config;
4381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_t;
4391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
4411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_t *ch;
4421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_id;
4431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_stream_link_t;
4441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* struct to store information about pp cookie*/
4461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
4471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t cam_hdl;
4481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t ch_hdl;
4491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t stream_hdl;
4501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_queue_node_t* super_buf;
4511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_channel_pp_info_t;
4521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm_camera */
4541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
4551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_event_notify_t evt_cb;
4561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    void *user_data;
4571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_evt_entry_t;
4581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
4601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
4611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    /* reg_count <=0: infinite
4621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam     * reg_count > 0: register only for required times */
4631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int reg_count;
4641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_evt_obj_t;
4651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct mm_camera_obj {
4671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    uint32_t my_hdl;
4681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int ref_count;
4691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t ctrl_fd;
4701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int32_t ds_fd; /* domain socket fd */
4711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t cam_lock;
4721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t cb_lock; /* lock for evt cb */
4731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_channel_t ch[MM_CAMERA_CHANNEL_MAX];
4741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_evt_obj_t evt;
4751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */
4761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_cmd_thread_t evt_thread;       /* thread for evt CB */
4771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_vtbl_t vtbl;
4781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t evt_lock;
4801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_cond_t evt_cond;
4811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_event_t evt_rcvd;
4821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    pthread_mutex_t msg_lock; /* lock for sending msg through socket */
4841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_obj_t;
4851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef struct {
4871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    int8_t num_cam;
4881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
4891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS];
4901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    struct camera_info info[MM_CAMERA_MAX_NUM_SENSORS];
4911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_ctrl_t;
4921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamtypedef enum {
4941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_async_call,
4951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam    mm_camera_sync_call
4961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam} mm_camera_call_type_t;
4971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
4981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/**********************************************************************************
4991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam* external function declare
5001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam***********************************************************************************/
5011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* utility functions */
5021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* set int32_t value */
5031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_util_s_ctrl(int32_t fd,
5041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     uint32_t id,
5051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     int32_t *value);
5061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
5071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* get int32_t value */
5081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_util_g_ctrl(int32_t fd,
5091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     uint32_t id,
5101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     int32_t *value);
5111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
5121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* send msg throught domain socket for fd mapping */
5131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj,
5141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      void *msg,
5151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      size_t buf_size,
5161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      int sendfd);
5171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* Check if hardware target is A family */
5181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamuint8_t mm_camera_util_chip_is_a_family(void);
5191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
5201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm-camera */
5211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_open(mm_camera_obj_t *my_obj);
5221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
5231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_close_fd(mm_camera_obj_t *my_obj);
5241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj,
5251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               mm_camera_event_notify_t evt_cb,
5261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               void * user_data);
5271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj,
5281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                              uint32_t ch_id,
5291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                              mm_camera_buf_def_t *buf);
5301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj,
5311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t ch_id, uint32_t stream_id);
5321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj);
5331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj,
5341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   parm_buffer_t *parms);
5351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj,
5361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   parm_buffer_t *parms);
5371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj,
5381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 uint8_t buf_type,
5391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 int fd,
5401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 size_t size);
5411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj,
5421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   uint8_t buf_type);
5431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj);
5441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj);
5451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj,
5461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          int32_t do_af_flag);
5471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj);
5481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj);
5491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
5501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t ch_id);
5511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
5521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t ch_id);
5531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,
5541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      mm_camera_channel_attr_t *attr,
5551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      mm_camera_buf_notify_t channel_cb,
5561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      void *userdata);
5571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj,
5581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     uint32_t ch_id);
5591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj,
5601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                         uint32_t ch_id,
5611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                         cam_bundle_config_t *bundle_info);
5621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj,
5631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                     uint32_t ch_id);
5641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj,
5651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                    uint32_t ch_id,
5661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                    uint32_t stream_id);
5671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern uint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj,
5681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t ch_id,
5691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t stream_id,
5701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t linked_ch_id);
5711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj,
5721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                       uint32_t ch_id,
5731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                       uint32_t stream_id,
5741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                       mm_camera_stream_config_t *config);
5751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj,
5761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                       uint32_t ch_id);
5771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj,
5781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                      uint32_t ch_id);
5791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj,
5801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                           uint32_t ch_id,
5811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                           uint32_t num_buf_requested,
5821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                           uint32_t num_retro_buf_requested);
5831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj,
5841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                                  uint32_t ch_id);
5851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj,
5861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               uint32_t ch_id,
5871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               uint32_t frame_idx);
5881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj,
5891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               uint32_t ch_id,
5901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                               mm_camera_super_buf_notify_mode_t notify_mode);
5911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj,
5921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t ch_id,
5931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t s_id,
5941d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          cam_stream_parm_buffer_t *parms);
5951d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj,
5961d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t ch_id,
5971d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t s_id,
5981d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          cam_stream_parm_buffer_t *parms);
5991d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,
6001d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                                        mm_camera_event_notify_t evt_cb,
6011d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                                        void * user_data);
6021d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj,
6031d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        uint32_t ch_id,
6041d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        uint32_t stream_id,
6051d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        uint8_t buf_type,
6061d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        uint32_t buf_idx,
6071d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        int32_t plane_idx,
6081d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        int fd,
6091d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                        size_t size);
6101d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj,
6111d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t ch_id,
6121d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t stream_id,
6131d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint8_t buf_type,
6141d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t buf_idx,
6151d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          int32_t plane_idx);
6161d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj,
6171d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t ch_id,
6181d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          uint32_t stream_id,
6191d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                          void *actions);
6201d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
6211d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm_channel */
6221d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj,
6231d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 mm_channel_evt_type_t evt,
6241d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 void * in_val,
6251d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 void * out_val);
6261d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_channel_init(mm_channel_t *my_obj,
6271d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                               mm_camera_channel_attr_t *attr,
6281d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                               mm_camera_buf_notify_t channel_cb,
6291d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                               void *userdata);
6301d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* qbuf is a special case that not going through state machine.
6311d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * This is to avoid deadlock when trying to aquire ch_lock,
6321d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * from the context of dataCB, but async stop is holding ch_lock */
6331d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_channel_qbuf(mm_channel_t *my_obj,
6341d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                               mm_camera_buf_def_t *buf);
6351d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* mm_stream */
6361d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
6371d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_stream_evt_type_t evt,
6381d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                void * in_val,
6391d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                void * out_val);
6401d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* Allow other stream to register dataCB at certain stream.
6411d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * This is for use case of video sized live snapshot,
6421d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * because snapshot stream need register one time CB at video stream.
6431d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * ext_image_mode and sensor_idx are used to identify the destinate stream
6441d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * to be register with dataCB. */
6451d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
6461d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                    mm_stream_data_cb_t *val);
6471d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_stream_map_buf(mm_stream_t *my_obj,
6481d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 uint8_t buf_type,
6491d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 uint32_t frame_idx,
6501d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 int32_t plane_idx,
6511d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 int fd,
6521d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                 size_t size);
6531d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj,
6541d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   uint8_t buf_type,
6551d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   uint32_t frame_idx,
6561d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                   int32_t plane_idx);
6571d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
6581d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
6591d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* utiltity fucntion declared in mm-camera-inteface2.c
6601d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam * and need be used by mm-camera and below*/
6611d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamuint32_t mm_camera_util_generate_handler(uint8_t index);
6621d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamconst char * mm_camera_util_get_dev_name(uint32_t cam_handler);
6631d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamuint8_t mm_camera_util_get_index_by_handler(uint32_t handler);
6641d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
6651d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam/* poll/cmd thread functions */
6661d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_poll_thread_launch(
6671d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_poll_thread_t * poll_cb,
6681d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_poll_thread_type_t poll_type);
6691d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb);
6701d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_poll_thread_add_poll_fd(
6711d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_poll_thread_t * poll_cb,
6721d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                uint32_t handler,
6731d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                int32_t fd,
6741d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_poll_notify_t nofity_cb,
6751d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                void *userdata,
6761d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_call_type_t);
6771d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_poll_thread_del_poll_fd(
6781d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_poll_thread_t * poll_cb,
6791d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                uint32_t handler,
6801d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_call_type_t);
6811d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_poll_thread_commit_updates(
6821d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        mm_camera_poll_thread_t * poll_cb);
6831d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_cmd_thread_launch(
6841d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_cmd_thread_t * cmd_thread,
6851d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                mm_camera_cmd_cb_t cb,
6861d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam                                void* user_data);
6871d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_cmd_thread_name(const char* name);
6881d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread);
6891d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam
6901d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tamextern int32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj,
6911d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t ch_id, mm_camera_advanced_capture_t type,
6921d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam        uint32_t trigger, void *in_value);
6931d467d58305ab97eecfcbb94622b9ad3a7a9a853Ed Tam#endif /* __MM_CAMERA_H__ */
694