13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef __MM_CAMERA_H__
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define __MM_CAMERA_H__
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <poll.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "hardware/camera_common.h"
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_semaphore.h"
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_interface.h"
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_shim.h"
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**********************************************************************************
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* Data structure declarations
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel***********************************************************************************/
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* num of callbacks allowed for an event type */
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_EVT_ENTRY_MAX 4
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* num of data callbacks allowed in a stream obj */
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_STREAM_BUF_CB_MAX 4
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* num of data poll threads allowed in a channel obj */
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_CHANNEL_POLL_THREAD_MAX 1
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_DEV_NAME_LEN 32
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_DEV_OPEN_TRIES 20
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define THREAD_NAME_SIZE 15
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Future frame idx, large enough to make sure capture
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* settings can be applied and small enough to still capture an image */
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_CAMERA_MAX_FUTURE_FRAME_WAIT 100
600b3fcb04b75783f8e4060fb4c1e7b3efef4a690eEino-Ville Talvala#define WAIT_TIMEOUT 10
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
62cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*For frame sync */
63cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel#define MAX_OBJS_FOR_FRAME_SYNC   4
64cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
65cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/* num of supporting camera*/
66cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel#define MM_CAMERA_MAX_AUX_CAMERA 1
67cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef TRUE
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define TRUE 1
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef FALSE
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define FALSE 0
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstruct mm_channel;
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstruct mm_stream;
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstruct mm_camera_obj;
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef int64_t nsecs_t;
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_DATA_CB,    /* dataB CMD */
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_EVT_CB,     /* evtCB CMD */
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_EXIT,       /* EXIT */
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_REQ_DATA_CB,/* request data */
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB,    /* superbuf dataB CMD */
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY, /* configure notify mode */
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_START_ZSL, /* start zsl snapshot for channel */
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_STOP_ZSL, /* stop zsl snapshot for channel */
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_FLUSH_QUEUE, /* flush queue */
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_GENERAL,  /* general cmd */
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_CMD_TYPE_MAX
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_cmdcb_type_t;
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx;
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t flags;
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_def_t *buf; /* ref to buf */
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_buf_info_t;
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING,
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING,
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING,
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X,
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING,
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_generic_cmd_type_t;
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_generic_cmd_type_t type;
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t payload[32];
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    union {
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_capture_frame_config_t frame_config;
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    };
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_generic_cmd_t;
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx;
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_type_t stream_type;
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_flush_cmd_t;
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmdcb_type_t cmd_type;
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    union {
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_buf_info_t buf;    /* frame buf if dataCB */
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_event_t evt;       /* evt if evtCB */
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_super_buf_t superbuf; /* superbuf if superbuf dataCB*/
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_req_buf_t req_buf; /* num of buf requested */
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_flush_cmd_t flush_cmd; /* frame idx boundary for flush superbuf queue*/
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_super_buf_notify_mode_t notify_mode; /* notification mode */
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_generic_cmd_t gen_cmd;
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } u;
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_cmdcb_t;
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data);
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_active;     /*indicates whether thread is active or not */
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_queue_t cmd_queue; /* cmd queue (queuing dataCB, asyncCB, or exitCMD) */
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_t cmd_pid;           /* cmd thread ID */
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_semaphore_t cmd_sem;     /* semaphore for cmd thread */
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_semaphore_t sync_sem;     /* semaphore for synchronization with cmd thread */
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmd_cb_t cb;       /* cb for cmd */
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void* user_data;             /* user_data for cb */
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char threadName[THREAD_NAME_SIZE];
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_cmd_thread_t;
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_POLL_TYPE_EVT,
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_POLL_TYPE_DATA,
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_POLL_TYPE_MAX
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_poll_thread_type_t;
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* function ptr defined for poll notify CB,
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * registered at poll thread with poll fd */
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef void (*mm_camera_poll_notify_t)(void *user_data);
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t fd;
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_poll_notify_t notify_cb;
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t handler;
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void* user_data;
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_poll_entry_t;
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_poll_thread_type_t poll_type;
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* array to store poll fd and cb info
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * for MM_CAMERA_POLL_TYPE_EVT, only index 0 is valid;
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * for MM_CAMERA_POLL_TYPE_DATA, depends on valid stream fd */
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_poll_entry_t poll_entries[MAX_STREAM_NUM_IN_BUNDLE];
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t pfds[2];
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_t pid;
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t state;
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int timeoutms;
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t cmd;
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct pollfd poll_fds[MAX_STREAM_NUM_IN_BUNDLE + 1];
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t num_fds;
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t mutex;
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_cond_t cond_v;
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t status;
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char threadName[THREAD_NAME_SIZE];
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //void *my_obj;
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_poll_thread_t;
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm_stream */
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_NOTUSED = 0,      /* not used */
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_INITED,           /* inited  */
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_ACQUIRED,         /* acquired, fd opened  */
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_CFG,              /* fmt & dim configured */
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_BUFFED,           /* buf allocated */
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_REG,              /* buf regged, stream off */
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_ACTIVE,           /* active */
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_STATE_MAX
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_stream_state_type_t;
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_ACQUIRE,
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_RELEASE,
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_SET_FMT,
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_GET_BUF,
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_PUT_BUF,
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_REG_BUF,
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_UNREG_BUF,
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_START,
211ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen    MM_STREAM_EVT_START_SENSOR_STREAMING,
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_STOP,
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_QBUF,
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_SET_PARM,
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_GET_PARM,
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_DO_ACTION,
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_GET_QUEUED_BUF_COUNT,
218cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_STREAM_EVT_REG_FRAME_SYNC,
219cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_STREAM_EVT_TRIGGER_FRAME_SYNC,
220c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    MM_STREAM_EVT_CANCEL_BUF,
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_STREAM_EVT_MAX
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_stream_evt_type_t;
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_notify_t cb;
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *user_data;
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* cb_count = -1: infinite
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * cb_count > 0: register only for required times */
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int8_t cb_count;
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_stream_cb_type cb_type;
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_stream_data_cb_t;
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* buf reference count */
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t buf_refcnt;
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* This flag is to indicate if after allocation,
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * the corresponding buf needs to qbuf into kernel
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * (e.g. for preview usecase, display needs to hold two bufs,
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * so no need to qbuf these two bufs initially) */
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t initial_reg_flag;
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* indicate if buf is in kernel(1) or client(0) */
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t in_kernel;
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /*indicate if this buffer is mapped to daemon*/
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int8_t map_status;
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_stream_buf_status_t;
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
249cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*Structure definition to carry frame sync queue details*/
250cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeltypedef struct {
251cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Number of objects to be synced*/
252cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t num_objs;
253cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Object handle to be synced*/
254cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t bundled_objs[MAX_OBJS_FOR_FRAME_SYNC];
255cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Queue*/
256cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    cam_queue_t que;
257cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
258cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*queue attributed*/
259e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mm_camera_channel_attr_t attr;
260cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
261cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Expected frame for this queue*/
262cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t expected_frame_id;
263cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
264e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    /*Total match count*/
265e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    uint32_t match_cnt;
266cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} mm_frame_sync_queue_t;
267cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
268cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*Structure definition to carry frame sync details*/
269cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeltypedef struct {
270cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /* flag to indicate if frame sync is active*/
271cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t is_active;
272cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
273cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Frame sync lock. Shared between child and parent stream*/
274cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    pthread_mutex_t sync_lock;
275cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
276cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Limited number of synced frame request*/
277e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mm_camera_req_buf_t req_buf;
278cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
279cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Queue to hold super buffers*/
280cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_frame_sync_queue_t superbuf_queue;
281cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
282cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Callback registered for synced frame*/
283cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_camera_buf_notify_t super_buf_notify_cb;
284cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
285cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Client data*/
286cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    void *user_data;
287cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} mm_frame_sync_t;
288cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
289cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelstruct mm_stream;
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct mm_stream {
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t my_hdl; /* local stream id */
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t server_stream_id; /* stream id from server */
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t fd;
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_stream_state_type_t state;
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* stream info*/
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_info_t *stream_info;
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* padding info */
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_padding_info_t padding_info;
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* offset */
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_frame_len_offset_t frame_offset;
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t cmd_lock; /* lock to protect cmd_thread */
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmd_thread_t cmd_thread;
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* dataCB registered on this stream obj */
309cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t is_cb_active;
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX];
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* stream buffer management */
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t buf_lock;
315cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t total_buf_cnt; /*Total number of buffer including slave*/
316cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t buf_num; /* num of buffers for this stream */
317cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t buf_idx; /* starting buffer index */
318cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_def_t* buf; /* ptr to buf array */
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_stream_buf_status_t buf_status[CAM_MAX_NUM_BUFS_PER_STREAM]; /* ptr to buf status array */
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t plane_buf_num; /* num of plane buffers allocated  Used only in Batch mode*/
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_def_t *plane_buf; /*Pointer to plane buffer array Used only in Batch mode */
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t cur_buf_idx; /* Current container buffer active filling. Used only in Batch mode*/
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t cur_bufs_staged; /*Number of plane buf freed by HAL for this usr buf*/
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* reference to parent channel_obj */
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_channel* ch_obj;
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_bundled; /* flag if stream is bundled */
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* reference to linked channel_obj */
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_channel* linked_obj;
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_stream * linked_stream; /* original stream */
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_linked; /* flag if stream is linked */
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_map_unmap_ops_tbl_t map_ops;
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int8_t queued_buffer_count;
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /*latest timestamp of this stream frame received & last frameID*/
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t prev_frameID;
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    nsecs_t prev_timestamp;
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Need to wait for buffer mapping before stream-on*/
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_cond_t buf_cond;
348cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
349cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_stream *master_str_obj; /*Master stream of this stream*/
350cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t num_s_cnt;
351cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_stream *aux_str_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*aux stream of this stream*/
352cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_frame_sync_t frame_sync;
353cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t is_res_shared;
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_stream_t;
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm_channel */
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_STATE_NOTUSED = 0,   /* not used */
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_STATE_STOPPED,       /* stopped */
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_STATE_ACTIVE,        /* active, at least one stream active */
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_STATE_PAUSED,        /* paused */
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_STATE_MAX
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_state_type_t;
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_ADD_STREAM,
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_DEL_STREAM,
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_LINK_STREAM,
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_CONFIG_STREAM,
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_GET_BUNDLE_INFO,
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_START,
372ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen    MM_CHANNEL_EVT_START_SENSOR_STREAMING,
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_STOP,
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_PAUSE,
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_RESUME,
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_REQUEST_SUPER_BUF,
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF,
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE,
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE,
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_START_ZSL_SNAPSHOT,
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT,
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_MAP_STREAM_BUF,
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_UNMAP_STREAM_BUF,
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_SET_STREAM_PARM,
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_GET_STREAM_PARM,
386cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_CHANNEL_EVT_DO_ACTION,
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_DELETE,
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_AF_BRACKETING,
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_AE_BRACKETING,
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_FLASH_BRACKETING,
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_ZOOM_1X,
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CAMERA_EVT_CAPTURE_SETTING,
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT,
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_EVT_MAP_STREAM_BUFS,
395cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_CHANNEL_EVT_REG_STREAM_BUF_CB,
396cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_CHANNEL_EVT_REG_FRAME_SYNC,
397cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    MM_CHANNEL_EVT_TRIGGER_FRAME_SYNC,
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_evt_type_t;
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_stream_config_t *config;
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_evt_paylod_config_stream_t;
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_parm_buffer_t *parms;
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_evt_paylod_set_get_stream_parms_t;
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *actions;
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_evt_paylod_do_stream_action_t;
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_stream_data_cb_t buf_cb;
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_evt_paylod_reg_stream_buf_cb;
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t num_of_bufs;
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE];
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t matched;
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t expected_frame;
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx;
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* unmatched meta idx needed in case of low priority queue */
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t unmatched_meta_idx;
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_queue_node_t;
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_queue_t que;
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t num_streams;
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* container for bundled stream handlers */
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE];
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_channel_attr_t attr;
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t expected_frame_id;
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t match_cnt;
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t expected_frame_id_without_led;
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t led_on_start_frame_id;
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t led_off_start_frame_id;
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t led_on_num_frames;
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t once;
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_skip_count;
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t good_frame_id;
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_queue_t;
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_active; /* flag to indicate if bundle is valid */
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* queue to store bundled super buffers */
450cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t is_cb_active;
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_queue_t superbuf_queue;
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_notify_t super_buf_notify_cb;
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *user_data;
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_bundle_t;
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Nodes used for frame sync */
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Frame idx */
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx;
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Frame present for corresponding channel*/
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_valid[MAX_NUM_CAMERA_PER_BUNDLE];
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Frame present in all channels*/
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t matched;
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_sync_node_t;
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Frame sync information */
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Number of camera channels that need to be synced*/
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t num_cam;
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* position of the next node to be updated */
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t pos;
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* circular node array used to store frame information */
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_sync_node_t node[MM_CAMERA_FRAME_SYNC_NODES];
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Channel corresponding to each camera */
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE];
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Cb corresponding to each camera */
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_notify_t cb[MAX_NUM_CAMERA_PER_BUNDLE];
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_frame_sync_info_t;
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Node information for multiple superbuf callbacks
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*  This can be used to batch nodes before sending to upper layer */
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Number of nodes to be sent*/
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t num_nodes;
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* queue node information*/
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_queue_node_t *node[MAX_NUM_CAMERA_PER_BUNDLE];
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* channel information*/
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE];
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_node_info_t;
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_BRACKETING_STATE_OFF,
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX,
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    MM_CHANNEL_BRACKETING_STATE_ACTIVE,
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_bracketing_state_t;
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
497cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelstruct mm_channel;
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct mm_channel {
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t my_hdl;
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_state_type_t state;
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t ch_lock; /* channel lock */
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* stream bundle info in the channel */
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_bundle_t bundle;
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* num of pending suferbuffers */
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t pending_cnt;
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t pending_retro_cnt;
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_req_buf_type_t req_type;
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t bWaitForPrepSnapshotDone;
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t unLockAEC;
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* num of pending suferbuffers */
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t stopZslSnapshot;
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* cmd thread for superbuffer dataCB and async stop*/
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmd_thread_t cmd_thread;
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* cb thread for sending data cb */
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmd_thread_t cb_thread;
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* data poll thread
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    * currently one data poll thread per channel
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    * could extended to support one data poll thread per stream in the channel */
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX];
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* container for all streams in channel */
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE];
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* reference to parent cam_obj */
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct mm_camera_obj* cam_obj;
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* manual zsl snapshot control */
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t manualZSLSnapshot;
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* control for zsl led */
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t startZSlSnapshotCalled;
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t needLEDFlash;
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_bracketing_state_t bracketingState;
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t isFlashBracketingEnabled;
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t isZoom1xFrameRequested;
5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t burstSnapNum;
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char threadName[THREAD_NAME_SIZE];
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /*Buffer diverted*/
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t diverted_frame_id;
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t sessionid;
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /*Frame capture configaration*/
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t isConfigCapture;
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t cur_capture_idx;
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t capture_frame_id[MAX_CAPTURE_BATCH_NUM];
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_capture_frame_config_t frameConfig;
5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t needLowLightZSL;
554cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
555cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Capture based on index*/
556cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t cur_req_idx;
557cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t frame_req_cnt;
558cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t requested_frame_id[MAX_CAPTURE_BATCH_NUM];
559cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
560cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*For channel frame sync*/
561cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_frame_sync_t frame_sync;
562cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
563cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Multiple camera's*/
564cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_channel *master_ch_obj; /*Master channel of this channel*/
565cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t num_s_cnt;
566cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_channel *aux_ch_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*Slave channel of this channel*/
5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_t;
5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_t *ch;
5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_id;
5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_stream_link_t;
5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* struct to store information about pp cookie*/
5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t cam_hdl;
5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t ch_hdl;
5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t stream_hdl;
579e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mm_channel_queue_node_t *super_buf;
5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_channel_pp_info_t;
5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm_camera */
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_event_notify_t evt_cb;
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *user_data;
5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_evt_entry_t;
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* reg_count <=0: infinite
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * reg_count > 0: register only for required times */
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int reg_count;
5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_evt_obj_t;
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
595cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelstruct mm_camera_obj;
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct mm_camera_obj {
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t my_hdl;
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int ref_count;
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t ctrl_fd;
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t ds_fd; /* domain socket fd */
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t cam_lock;
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t cb_lock; /* lock for evt cb */
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_channel_t ch[MM_CAMERA_CHANNEL_MAX];
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_evt_obj_t evt;
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_cmd_thread_t evt_thread;       /* thread for evt CB */
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_vtbl_t vtbl;
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t evt_lock;
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_cond_t evt_cond;
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_event_t evt_rcvd;
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_t msg_lock; /* lock for sending msg through socket */
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t sessionid; /* Camera server session id */
615cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
616cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t my_num;          /*this camera position in multi mode*/
617cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    pthread_mutex_t muxer_lock;
618cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_camera_obj *master_cam_obj; /*Master Camera of this camera*/
619cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t num_s_cnt;
620cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    struct mm_camera_obj *aux_cam_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*Slave Camera of this camera*/
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_obj_t;
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int8_t num_cam;
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_shim_ops_t cam_shim_ops;
6269ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    int8_t num_cam_to_expose;
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS];
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    struct camera_info info[MM_CAMERA_MAX_NUM_SENSORS];
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_sync_type_t cam_type[MM_CAMERA_MAX_NUM_SENSORS];
6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_sync_mode_t cam_mode[MM_CAMERA_MAX_NUM_SENSORS];
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_yuv[MM_CAMERA_MAX_NUM_SENSORS]; // 1=CAM_SENSOR_YUV, 0=CAM_SENSOR_RAW
633cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t cam_index[MM_CAMERA_MAX_NUM_SENSORS]; //Actual cam index are stored in bits
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_ctrl_t;
6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_async_call,
6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_sync_call
6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_camera_call_type_t;
6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
641cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*internal structure for registring frame sync*/
642cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeltypedef struct {
643cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_camera_obj_t *a_cam_obj;
644cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t a_ch_id;
645cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t a_stream_id;
646e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    uint8_t is_active;
647e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mm_camera_channel_attr_t attr;
648cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_camera_buf_notify_t buf_cb;
649cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint8_t is_res_shared;
650cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    void *userdata;
651cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} mm_camera_frame_sync_t;
652cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
653cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*Payload for reg frame sync event in MCI*/
654cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeltypedef struct {
655cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t stream_id;
656cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_channel_t *a_ch_obj;
657cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_stream_t *a_str_obj;
658cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mm_camera_frame_sync_t *sync_attr;
659cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} mm_evt_paylod_reg_frame_sync;
660cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
661e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/*Payload to handle frame sync */
662cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeltypedef struct {
663cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t stream_id;
664e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mm_camera_cb_req_type type;
665cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} mm_evt_paylod_trigger_frame_sync;
666cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
667e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**********************************************************************************
6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* external function declare
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel***********************************************************************************/
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* utility functions */
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* set int32_t value */
6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_util_s_ctrl(mm_camera_obj_t *my_obj,
6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int stream_id, int32_t fd, uint32_t id, int32_t *value);
6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* get int32_t value */
6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_util_g_ctrl(mm_camera_obj_t *my_obj,
6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int stream_id, int32_t fd, uint32_t id, int32_t *value);
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* send msg throught domain socket for fd mapping */
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj,
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      void *msg,
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      size_t buf_size,
6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      int sendfd);
6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* send msg through domain socket for bundled fd mapping */
6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_util_bundled_sendmsg(mm_camera_obj_t *my_obj,
6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              void *msg,
6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              size_t buf_size,
6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              int sendfds[CAM_MAX_NUM_BUFS_PER_STREAM],
6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              int numfds);
6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Check if hardware target is A family */
6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint8_t mm_camera_util_chip_is_a_family(void);
6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm-camera */
6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_open(mm_camera_obj_t *my_obj);
6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj,
7003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               mm_camera_event_notify_t evt_cb,
7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               void * user_data);
7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj,
7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                              uint32_t ch_id,
7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                              mm_camera_buf_def_t *buf);
705c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelextern int32_t mm_camera_cancel_buf(mm_camera_obj_t *my_obj,
706c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                       uint32_t ch_id,
707c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                       uint32_t stream_id,
708c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                       uint32_t buf_idx);
7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj,
7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id, uint32_t stream_id);
7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj);
7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj,
7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   parm_buffer_t *parms);
7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj,
7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   parm_buffer_t *parms);
7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj,
7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 uint8_t buf_type,
7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 int fd,
7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 size_t size,
7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 void *buffer);
7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_map_bufs(mm_camera_obj_t *my_obj,
7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  const cam_buf_map_type_list *buf_map_list);
7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj,
7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   uint8_t buf_type);
7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj);
7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj);
7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj,
7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          int32_t do_af_flag);
7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj);
7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj);
7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_flush(mm_camera_obj_t *my_obj);
7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id);
7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id);
7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,
7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      mm_camera_channel_attr_t *attr,
7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      mm_camera_buf_notify_t channel_cb,
7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      void *userdata);
7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj,
7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     uint32_t ch_id);
7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj,
7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         uint32_t ch_id,
7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         cam_bundle_config_t *bundle_info);
7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj,
7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     uint32_t ch_id);
7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj,
7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    uint32_t ch_id,
7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    uint32_t stream_id);
7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern uint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj,
7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id,
7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t stream_id,
7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t linked_ch_id);
7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_reg_stream_buf_cb(mm_camera_obj_t *my_obj,
7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_stream_cb_type cb_type, void *userdata);
7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj,
7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       uint32_t ch_id,
7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       uint32_t stream_id,
7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       mm_camera_stream_config_t *config);
7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj,
7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       uint32_t ch_id);
764ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chenextern int32_t mm_camera_start_sensor_stream_on(mm_camera_obj_t *my_obj,
765ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen                                       uint32_t ch_id);
7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj,
76709cb28ee5fe4b3664777977d75fde8a6372d2f32Chien-Yu Chen                                      uint32_t ch_id, bool stop_immediately);
7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj,
7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id, mm_camera_req_buf_t *buf);
7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj,
7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                  uint32_t ch_id);
7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj,
7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               uint32_t ch_id,
7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               uint32_t frame_idx);
7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj,
7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               uint32_t ch_id,
7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               mm_camera_super_buf_notify_mode_t notify_mode);
7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj,
7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t ch_id,
7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t s_id,
7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          cam_stream_parm_buffer_t *parms);
7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj,
7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t ch_id,
7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t s_id,
7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          cam_stream_parm_buffer_t *parms);
7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,
7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        mm_camera_event_notify_t evt_cb,
7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        void * user_data);
7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj,
7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        uint32_t ch_id,
7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        uint32_t stream_id,
7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        uint8_t buf_type,
7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        uint32_t buf_idx,
7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        int32_t plane_idx,
7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        int fd,
7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        size_t size,
7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        void *buffer);
7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_map_stream_bufs(mm_camera_obj_t *my_obj,
7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         uint32_t ch_id,
8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         const cam_buf_map_type_list *buf_map_list);
8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj,
8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t ch_id,
8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t stream_id,
8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint8_t buf_type,
8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t buf_idx,
8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          int32_t plane_idx);
8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj,
8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t ch_id,
8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          uint32_t stream_id,
8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                          void *actions);
8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_get_session_id(mm_camera_obj_t *my_obj,
8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        uint32_t* sessionid);
813295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudelextern int32_t mm_camera_set_dual_cam_cmd(mm_camera_obj_t *my_obj);
814cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelextern int32_t mm_camera_reg_frame_sync(mm_camera_obj_t *my_obj,
815cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        uint32_t ch_id, uint32_t stream_id,
816cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        mm_camera_frame_sync_t *sync_attr);
817e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelextern int32_t mm_camera_handle_frame_sync_cb(mm_camera_obj_t *my_obj,
818e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        uint32_t ch_id, uint32_t stream_id, mm_camera_cb_req_type req_type);
8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm_channel */
8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj,
8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 mm_channel_evt_type_t evt,
8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 void * in_val,
8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 void * out_val);
8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_channel_init(mm_channel_t *my_obj,
8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               mm_camera_channel_attr_t *attr,
8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               mm_camera_buf_notify_t channel_cb,
8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               void *userdata);
8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* qbuf is a special case that not going through state machine.
8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * This is to avoid deadlock when trying to aquire ch_lock,
8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from the context of dataCB, but async stop is holding ch_lock */
8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_channel_qbuf(mm_channel_t *my_obj,
8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               mm_camera_buf_def_t *buf);
834c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelextern int32_t mm_channel_cancel_buf(mm_channel_t *my_obj,
835c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                        uint32_t stream_id, uint32_t buf_idx);
8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* mm_stream */
8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                mm_stream_evt_type_t evt,
8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                void * in_val,
8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                void * out_val);
8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Function to register special callback for stream buffer*/
8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_stream_data_cb_t val);
8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_stream_map_buf(mm_stream_t *my_obj,
8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 uint8_t buf_type,
8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 uint32_t frame_idx,
8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 int32_t plane_idx,
8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 int fd,
8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 size_t size,
8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 void *buffer);
8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_stream_map_bufs(mm_stream_t *my_obj,
8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  const cam_buf_map_type_list *buf_map_list);
8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj,
8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   uint8_t buf_type,
8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   uint32_t frame_idx,
8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                   int32_t plane_idx);
8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* utiltity fucntion declared in mm-camera-inteface2.c
8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * and need be used by mm-camera and below*/
8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t mm_camera_util_generate_handler(uint8_t index);
861cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelconst char *mm_camera_util_get_dev_name(uint32_t cam_handler);
8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint8_t mm_camera_util_get_index_by_handler(uint32_t handler);
8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* poll/cmd thread functions */
8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_poll_thread_launch(
8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                mm_camera_poll_thread_t * poll_cb,
8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                mm_camera_poll_thread_type_t poll_type);
8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb);
8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_poll_thread_add_poll_fd(
870cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler,
871cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        int32_t fd, mm_camera_poll_notify_t nofity_cb,
872cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        void *userdata, mm_camera_call_type_t);
8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_poll_thread_del_poll_fd(
874cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler,
875cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        mm_camera_call_type_t);
8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_poll_thread_commit_updates(
8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_poll_thread_t * poll_cb);
8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_cmd_thread_launch(
8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                mm_camera_cmd_thread_t * cmd_thread,
8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                mm_camera_cmd_cb_t cb,
8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                void* user_data);
8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_cmd_thread_name(const char* name);
8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread);
8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj,
8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t ch_id, mm_camera_advanced_capture_t type,
8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t trigger, void *in_value);
8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj,
8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                              mm_camera_event_t *event);
8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_load_shim_lib();
8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelcam_shim_packet_t *mm_camera_create_shim_cmd_packet(cam_shim_cmd_type type,
8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t sessionID, void *data);
8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_destroy_shim_cmd_packet(cam_shim_packet_t *cmd);
8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_module_event_handler(
8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t session_id, cam_event_t *event);
8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelcam_status_t mm_camera_module_open_session(int sessionid,
8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int (*event_cb)(uint32_t sessionid, cam_event_t *event));
8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_module_close_session(int session);
8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_camera_module_send_cmd(cam_shim_packet_t *event);
9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif /* __MM_CAMERA_H__ */
902