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