17f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 27f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 37f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Redistribution and use in source and binary forms, with or without 47f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * modification, are permitted provided that the following conditions are 57f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * met: 67f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Redistributions of source code must retain the above copyright 77f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * notice, this list of conditions and the following disclaimer. 87f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Redistributions in binary form must reproduce the above 97f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * copyright notice, this list of conditions and the following 107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * disclaimer in the documentation and/or other materials provided 117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * with the distribution. 127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Neither the name of The Linux Foundation nor the names of its 137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * contributors may be used to endorse or promote products derived 147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * from this software without specific prior written permission. 157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He */ 297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He// To remove 317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <cutils/properties.h> 327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He// System dependencies 347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <pthread.h> 357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <errno.h> 367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <fcntl.h> 377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <stdlib.h> 387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <dlfcn.h> 397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define IOCTL_H <SYSTEM_HEADER_PREFIX/ioctl.h> 407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include IOCTL_H 417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He// Camera dependencies 437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "cam_semaphore.h" 447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_dbg.h" 457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_sock.h" 467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_interface.h" 477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera.h" 487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "cam_cond.h" 497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define SET_PARM_BIT32(parm, parm_arr) \ 517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (parm_arr[parm/32] |= (1<<(parm%32))) 527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define GET_PARM_BIT32(parm, parm_arr) \ 547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ((parm_arr[parm/32]>>(parm%32))& 0x1) 557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* internal function declare */ 577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_evt_sub(mm_camera_obj_t * my_obj, 587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t reg_flag); 597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj, 607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_t *event); 617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heextern mm_camera_obj_t* mm_camera_util_get_camera_by_session_id 627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (uint32_t session_id); 637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_get_channel_by_handler 667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to get a channel object from its handle 687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @cam_obj: ptr to a camera object 717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @handler: channel handle 727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : ptr to a channel object. 747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NULL if failed. 757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hemm_channel_t * mm_camera_util_get_channel_by_handler( 777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_obj_t * cam_obj, 787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t handler) 797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int i; 817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t *ch_obj = NULL; 827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for(i = 0; i < MM_CAMERA_CHANNEL_MAX; i++) { 837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (handler == cam_obj->ch[i].my_hdl) { 847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj = &cam_obj->ch[i]; 857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return ch_obj; 897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_chip_is_a_family 937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to check if the host is A family chip 957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : TRUE if A family. 997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FALSE otherwise. 1007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 1017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint8_t mm_camera_util_chip_is_a_family(void) 1027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 1037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef USE_A_FAMILY 1047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return TRUE; 1057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else 1067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return FALSE; 1077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 1087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 1097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 1117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_dispatch_app_event 1127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: dispatch event to apps who regitster for event notify 1147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 1167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @cmd_cb: ptr to a struct storing event info 1177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @user_data: user data ptr (camera object) 1187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : none 1207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 1217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic void mm_camera_dispatch_app_event(mm_camera_cmdcb_t *cmd_cb, 1227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void* user_data) 1237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 1247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int i; 1257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_t *event = &cmd_cb->u.evt; 1267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_obj_t * my_obj = (mm_camera_obj_t *)user_data; 1277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != my_obj) { 1287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_cmd_thread_name(my_obj->evt_thread.threadName); 1297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->cb_lock); 1307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 1317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(my_obj->evt.evt[i].evt_cb) { 1327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->evt.evt[i].evt_cb( 1337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->my_hdl, 1347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He event, 1357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->evt.evt[i].user_data); 1367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 1377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 1387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cb_lock); 1397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 1407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 1417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 1437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_event_notify 1447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: callback to handle event notify from kernel. This call will 1467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * dequeue event from kernel. 1477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 1497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @user_data: user data ptr (camera object) 1507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : none 1527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 1537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic void mm_camera_event_notify(void* user_data) 1547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 1557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_event ev; 1567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct msm_v4l2_event_data *msm_evt = NULL; 1577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc; 1587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_t evt; 1597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&evt, 0, sizeof(mm_camera_event_t)); 1607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_obj_t *my_obj = (mm_camera_obj_t*)user_data; 1627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != my_obj) { 1637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* read evt */ 1647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&ev, 0, sizeof(ev)); 1657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(my_obj->ctrl_fd, VIDIOC_DQEVENT, &ev); 1667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc >= 0 && ev.id == MSM_CAMERA_MSM_NOTIFY) { 1687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He msm_evt = (struct msm_v4l2_event_data *)ev.u.data; 1697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He switch (msm_evt->command) { 1707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_EVENT_TYPE_DAEMON_PULL_REQ: 1717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt.server_event_type = CAM_EVENT_TYPE_DAEMON_PULL_REQ; 1727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_enqueue_evt(my_obj, &evt); 1737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 1747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_EVENT_TYPE_MAP_UNMAP_DONE: 1757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->evt_lock); 1767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->evt_rcvd.server_event_type = msm_evt->command; 1777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->evt_rcvd.status = msm_evt->status; 1787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_cond_signal(&my_obj->evt_cond); 1797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->evt_lock); 1807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 1817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_EVENT_TYPE_INT_TAKE_JPEG: 1827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_EVENT_TYPE_INT_TAKE_RAW: 1837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He { 1847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt.server_event_type = msm_evt->command; 1857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_enqueue_evt(my_obj, &evt); 1867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 1877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 1887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MSM_CAMERA_PRIV_SHUTDOWN: 1897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He { 1907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Camera Event DAEMON DIED received"); 1917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt.server_event_type = CAM_EVENT_TYPE_DAEMON_DIED; 1927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_enqueue_evt(my_obj, &evt); 1937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 1947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 1957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_EVENT_TYPE_CAC_DONE: 1967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He { 1977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt.server_event_type = CAM_EVENT_TYPE_CAC_DONE; 1987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_enqueue_evt(my_obj, &evt); 1997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 2017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He default: 2027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 2037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 2077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 2097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_enqueue_evt 2107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: enqueue received event into event queue to be processed by 2127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * event thread. 2137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 2157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : ptr to a camera object 2167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @event : event to be queued 2177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 2197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 2207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 2217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 2227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj, 2237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_t *event) 2247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 2257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 2267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_cmdcb_t *node = NULL; 2277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 2297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != node) { 2307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(node, 0, sizeof(mm_camera_cmdcb_t)); 2317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He node->cmd_type = MM_CAMERA_CMD_TYPE_EVT_CB; 2327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He node->u.evt = *event; 2337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* enqueue to evt cmd thread */ 2357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_queue_enq(&(my_obj->evt_thread.cmd_queue), node); 2367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* wake up evt cmd thread */ 2377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_sem_post(&(my_obj->evt_thread.cmd_sem)); 2387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 2397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("No memory for mm_camera_node_t"); 2407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 2417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 2447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 2457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 2477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_open 2487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: open a camera 2507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 2527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : ptr to a camera object 2537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 2547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 2557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 2567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 2577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 2587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_open(mm_camera_obj_t *my_obj) 2597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 2607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He char dev_name[MM_CAMERA_DEV_NAME_LEN]; 2617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 2627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int8_t n_try=MM_CAMERA_DEV_OPEN_TRIES; 2637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t sleep_msec=MM_CAMERA_DEV_OPEN_RETRY_SLEEP; 2647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int cam_idx = 0; 2657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const char *dev_name_value = NULL; 2667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int l_errno = 0; 2677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("begin\n"); 2697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL == my_obj) { 2717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He goto on_error; 2727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He dev_name_value = mm_camera_util_get_dev_name(my_obj->my_hdl); 2747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL == dev_name_value) { 2757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He goto on_error; 2767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He snprintf(dev_name, sizeof(dev_name), "/dev/%s", 2787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He dev_name_value); 2797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sscanf(dev_name, "/dev/video%d", &cam_idx); 2807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("dev name = %s, cam_idx = %d", dev_name, cam_idx); 2817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He do{ 2837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He n_try--; 2847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He errno = 0; 2857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ctrl_fd = open(dev_name, O_RDWR | O_NONBLOCK); 2867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He l_errno = errno; 2877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("ctrl_fd = %d, errno == %d", my_obj->ctrl_fd, l_errno); 2887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if((my_obj->ctrl_fd >= 0) || (errno != EIO && errno != ETIMEDOUT) || (n_try <= 0 )) { 2897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 2907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 2917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Failed with %s error, retrying after %d milli-seconds", 2927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He strerror(errno), sleep_msec); 2937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He usleep(sleep_msec * 1000U); 2947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He }while (n_try > 0); 2957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 2967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (my_obj->ctrl_fd < 0) { 2977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("cannot open control fd of '%s' (%s)\n", 2987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He dev_name, strerror(l_errno)); 2997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (l_errno == EBUSY) 3007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -EUSERS; 3017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He else 3027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 3037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He goto on_error; 3047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 3057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_get_session_id(my_obj, &my_obj->sessionid); 3067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGH("Camera Opened id = %d sessionid = %d", cam_idx, my_obj->sessionid); 3077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 3107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* open domain socket*/ 3117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He n_try = MM_CAMERA_DEV_OPEN_TRIES; 3127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He do { 3137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He n_try--; 3147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ds_fd = mm_camera_socket_create(cam_idx, MM_CAMERA_SOCK_TYPE_UDP); 3157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He l_errno = errno; 3167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("ds_fd = %d, errno = %d", my_obj->ds_fd, l_errno); 3177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if((my_obj->ds_fd >= 0) || (n_try <= 0 )) { 3187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("opened, break out while loop"); 3197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 3207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("failed with I/O error retrying after %d milli-seconds", 3227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sleep_msec); 3237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He usleep(sleep_msec * 1000U); 3247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } while (n_try > 0); 3257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (my_obj->ds_fd < 0) { 3277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("cannot open domain socket fd of '%s'(%s)\n", 3287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He dev_name, strerror(l_errno)); 3297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 3307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He goto on_error; 3317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else /* DAEMON_PRESENT */ 3337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_status_t cam_status; 3347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_status = mm_camera_module_open_session(my_obj->sessionid, 3357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_module_event_handler); 3367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (cam_status < 0) { 3377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Failed to open session"); 3387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (cam_status == CAM_STATUS_BUSY) { 3397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -EUSERS; 3407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 3417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 3427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He goto on_error; 3447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */ 3467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_init(&my_obj->msg_lock, NULL); 3487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_init(&my_obj->cb_lock, NULL); 3497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_init(&my_obj->evt_lock, NULL); 3507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He PTHREAD_COND_INIT(&my_obj->evt_cond); 3517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("Launch evt Thread in Cam Open"); 3537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He snprintf(my_obj->evt_thread.threadName, THREAD_NAME_SIZE, "CAM_Dispatch"); 3547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_cmd_thread_launch(&my_obj->evt_thread, 3557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_dispatch_app_event, 3567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)my_obj); 3577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* launch event poll thread 3597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * we will add evt fd into event poll thread upon user first register for evt */ 3607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("Launch evt Poll Thread in Cam Open"); 3617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He snprintf(my_obj->evt_poll_thread.threadName, THREAD_NAME_SIZE, "CAM_evntPoll"); 3627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_poll_thread_launch(&my_obj->evt_poll_thread, 3637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CAMERA_POLL_TYPE_EVT); 3647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_evt_sub(my_obj, TRUE); 3657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* unlock cam_lock, we need release global intf_lock in camera_open(), 3677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * in order not block operation of other Camera in dual camera use case.*/ 3687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 3697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("end (rc = %d)\n", rc); 3707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 3717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heon_error: 3737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL == dev_name_value) { 3757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Invalid device name\n"); 3767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 3777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL == my_obj) { 3807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Invalid camera object\n"); 3817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = -1; 3827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 3837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (my_obj->ctrl_fd >= 0) { 3847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He close(my_obj->ctrl_fd); 3857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ctrl_fd = -1; 3867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 3887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (my_obj->ds_fd >= 0) { 3897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_socket_close(my_obj->ds_fd); 3907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ds_fd = -1; 3917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 3937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 3947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 3957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* unlock cam_lock, we need release global intf_lock in camera_open(), 3967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * in order not block operation of other Camera in dual camera use case.*/ 3977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 3987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 3997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 4007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 4027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_close 4037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: enqueue received event into event queue to be processed by 4057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * event thread. 4067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 4087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : ptr to a camera object 4097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @event : event to be queued 4107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 4127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 4137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 4147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 4157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_close(mm_camera_obj_t *my_obj) 4167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 4177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("unsubscribe evt"); 4187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifndef DAEMON_PRESENT 4207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_module_close_session(my_obj->sessionid); 4217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */ 4227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_evt_sub(my_obj, FALSE); 4247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("Close evt Poll Thread in Cam Close"); 4267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_poll_thread_release(&my_obj->evt_poll_thread); 4277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("Close evt cmd Thread in Cam Close"); 4297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_cmd_thread_release(&my_obj->evt_thread); 4307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(my_obj->ctrl_fd >= 0) { 4327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He close(my_obj->ctrl_fd); 4337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ctrl_fd = -1; 4347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 4377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(my_obj->ds_fd >= 0) { 4387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_socket_close(my_obj->ds_fd); 4397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ds_fd = -1; 4407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 4427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_destroy(&my_obj->msg_lock); 4447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_destroy(&my_obj->cb_lock); 4457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_destroy(&my_obj->evt_lock); 4467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_cond_destroy(&my_obj->evt_cond); 4477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 4487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return 0; 4497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 4507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 4527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_register_event_notify_internal 4537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: internal implementation for registering callback for event notify. 4557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 4577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : ptr to a camera object 4587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @evt_cb : callback to be registered to handle event notify 4597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @user_data: user data ptr 4607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 4617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 4627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 4637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 4647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 4657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj, 4667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_notify_t evt_cb, 4677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void * user_data) 4687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 4697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int i; 4707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = -1; 4717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_evt_obj_t *evt_array = NULL; 4727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->cb_lock); 4747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array = &my_obj->evt; 4757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(evt_cb) { 4767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* this is reg case */ 4777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 4787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(evt_array->evt[i].user_data == NULL) { 4797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->evt[i].evt_cb = evt_cb; 4807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->evt[i].user_data = user_data; 4817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->reg_count++; 4827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = 0; 4837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 4847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 4877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* this is unreg case */ 4887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++) { 4897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(evt_array->evt[i].user_data == user_data) { 4907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->evt[i].evt_cb = NULL; 4917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->evt[i].user_data = NULL; 4927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_array->reg_count--; 4937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = 0; 4947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 4957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 4987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 4997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cb_lock); 5007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 5017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 5027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 5047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_register_event_notify 5057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: registering a callback for event notify. 5077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 5097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : ptr to a camera object 5107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @evt_cb : callback to be registered to handle event notify 5117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @user_data: user data ptr 5127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 5147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 5157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 5167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 5177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj, 5187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_notify_t evt_cb, 5197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void * user_data) 5207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 5217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = -1; 5227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_register_event_notify_internal(my_obj, 5237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_cb, 5247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He user_data); 5257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 5267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 5277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 5287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 5307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_qbuf 5317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: enqueue buffer back to kernel 5337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 5357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 5367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 5377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf : buf ptr to be enqueued 5387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 5407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 5417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 5427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 5437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_qbuf(mm_camera_obj_t *my_obj, 5447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 5457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_buf_def_t *buf) 5467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 5477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = -1; 5487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = NULL; 5497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj = mm_camera_util_get_channel_by_handler(my_obj, ch_id); 5507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 5527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* we always assume qbuf will be done before channel/stream is fully stopped 5547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * because qbuf is done within dataCB context 5557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * in order to avoid deadlock, we are not locking ch_lock for qbuf */ 5567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 5577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_qbuf(ch_obj, buf); 5587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 5597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 5617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 5627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 5647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_cancel_buf 5657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Cancel an already queued buffer 5677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 5697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 5707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 5717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf : buf ptr to be enqueued 5737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 5757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 5767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 5777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 5787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_cancel_buf(mm_camera_obj_t *my_obj, 5797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 5807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 5817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t buf_idx) 5827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 5837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = -1; 5847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = NULL; 5857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj = mm_camera_util_get_channel_by_handler(my_obj, ch_id); 5867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 5887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 5897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_cancel_buf(ch_obj,stream_id,buf_idx); 5907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 5917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 5937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 5947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 5957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 5967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_get_queued_buf_count 5977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 5987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: return queued buffer count 5997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 6017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 6027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 6037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id : stream id 6047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : queued buffer count 6067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 6077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj, 6087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, uint32_t stream_id) 6097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 6107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = -1; 6117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = NULL; 6127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t payload; 6137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj = mm_camera_util_get_channel_by_handler(my_obj, ch_id); 6147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload = stream_id; 6157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 6167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 6177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 6187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 6197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 6207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT, 6217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&payload, 6227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 6237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 6247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 6257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 6267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 6277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 6287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 6297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 6307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 6317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_query_capability 6327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: query camera capability 6347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 6367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj: camera object 6377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 6397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 6407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 6417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 6427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_query_capability(mm_camera_obj_t *my_obj) 6437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 6447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 6457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 6467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 6477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_capability cap; 6487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* get camera capabilities */ 6497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&cap, 0, sizeof(cap)); 6507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(my_obj->ctrl_fd, VIDIOC_QUERYCAP, &cap); 6517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else /* DAEMON_PRESENT */ 6527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 6537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_cmd_data shim_cmd_data; 6547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&shim_cmd_data, 0, sizeof(shim_cmd_data)); 6557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.command = MSM_CAMERA_PRIV_QUERY_CAP; 6567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.stream_id = 0; 6577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.value = NULL; 6587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_GET_PARM, 6597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid,&shim_cmd_data); 6607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 6617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 6627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */ 6637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc != 0) { 6647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("cannot get camera capabilities, rc = %d, errno %d", 6657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc, errno); 6667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 6677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 6687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 6697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 6707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 6717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 6727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_set_parms 6737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: set parameters per camera 6757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 6777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 6787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @parms : ptr to a param struct to be set to server 6797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 6807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 6817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 6827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 6837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the parms struct buf is already mapped to server via 6847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Corresponding fields of parameters to be set 6857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * are already filled in by upper layer caller. 6867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 6877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_set_parms(mm_camera_obj_t *my_obj, 6887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He parm_buffer_t *parms) 6897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 6907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 6917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 6927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (parms != NULL) { 6937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, 6947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He CAM_PRIV_PARM, &value); 6957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 6967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 6977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 6987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 6997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 7007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 7017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_get_parms 7027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get parameters per camera 7047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 7067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 7077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @parms : ptr to a param struct to be get from server 7087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 7107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 7117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 7127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the parms struct buf is already mapped to server via 7137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Parameters to be get from server are already 7147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * filled in by upper layer caller. After this call, corresponding 7157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * fields of requested parameters will be filled in by server with 7167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * detailed information. 7177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 7187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_get_parms(mm_camera_obj_t *my_obj, 7197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He parm_buffer_t *parms) 7207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 7217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 7227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 7237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (parms != NULL) { 7247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_g_ctrl(my_obj, 0, my_obj->ctrl_fd, CAM_PRIV_PARM, &value); 7257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 7267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 7277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 7287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 7297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 7307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 7317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_do_auto_focus 7327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: performing auto focus 7347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 7367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @camera_handle: camera handle 7377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 7397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 7407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 7417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : if this call success, we will always assume there will 7427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * be an auto_focus event following up. 7437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 7447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj) 7457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 7467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 7477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 7487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, CAM_PRIV_DO_AUTO_FOCUS, &value); 7497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 7507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 7517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 7527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 7537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 7547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_cancel_auto_focus 7557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: cancel auto focus 7577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 7597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @camera_handle: camera handle 7607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 7627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 7637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 7647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 7657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj) 7667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 7677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 7687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 7697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, CAM_PRIV_CANCEL_AUTO_FOCUS, &value); 7707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 7717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 7727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 7737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 7747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 7757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_prepare_snapshot 7767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: prepare hardware for snapshot 7787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 7807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 7817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @do_af_flag : flag indicating if AF is needed 7827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 7837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 7847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 7857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 7867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 7877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj, 7887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t do_af_flag) 7897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 7907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 7917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = do_af_flag; 7927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, CAM_PRIV_PREPARE_SNAPSHOT, &value); 7937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 7947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 7957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 7967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 7977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 7987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_start_zsl_snapshot 7997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: start zsl snapshot 8017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 8037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 8047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 8067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 8077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 8087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 8097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj) 8107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 8117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 8127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 8137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, 8157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He CAM_PRIV_START_ZSL_SNAPSHOT, &value); 8167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 8177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 8187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 8207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_stop_zsl_snapshot 8217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: stop zsl capture 8237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 8257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 8267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 8287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 8297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 8307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 8317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj) 8327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 8337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 8347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value; 8357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, 8367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He CAM_PRIV_STOP_ZSL_SNAPSHOT, &value); 8377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 8387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 8397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 8417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_flush 8427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: flush the current camera state and buffers 8447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 8467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 8477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 8497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 8507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 8517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 8527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_flush(mm_camera_obj_t *my_obj) 8537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 8547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 8557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value; 8567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, 8577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He CAM_PRIV_FLUSH, &value); 8587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 8597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 8607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 8617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 8637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_add_channel 8647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: add a channel 8667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 8687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 8697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @attr : bundle attribute of the channel if needed 8707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @channel_cb : callback function for bundle data notify 8717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @userdata : user data ptr 8727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 8737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : uint32_t type of channel handle 8747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- invalid channel handle, meaning the op failed 8757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * >0 -- successfully added a channel with a valid handle 8767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : if no bundle data notify is needed, meaning each stream in the 8777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * channel will have its own stream data notify callback, then 8787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * attr, channel_cb, and userdata can be NULL. In this case, 8797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * no matching logic will be performed in channel for the bundling. 8807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 8817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj, 8827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_channel_attr_t *attr, 8837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_buf_notify_t channel_cb, 8847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *userdata) 8857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 8867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t *ch_obj = NULL; 8877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t ch_idx = 0; 8887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_hdl = 0; 8897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for(ch_idx = 0; ch_idx < MM_CAMERA_CHANNEL_MAX; ch_idx++) { 8917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (MM_CHANNEL_STATE_NOTUSED == my_obj->ch[ch_idx].state) { 8927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj = &my_obj->ch[ch_idx]; 8937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 8947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 8957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 8967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 8977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 8987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* initialize channel obj */ 8997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(ch_obj, 0, sizeof(mm_channel_t)); 9007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_hdl = mm_camera_util_generate_handler(ch_idx); 9017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj->my_hdl = ch_hdl; 9027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj->state = MM_CHANNEL_STATE_STOPPED; 9037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj->cam_obj = my_obj; 9047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_init(&ch_obj->ch_lock, NULL); 9057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ch_obj->sessionid = my_obj->sessionid; 9067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_init(ch_obj, attr, channel_cb, userdata); 9077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 9087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 9107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return ch_hdl; 9127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 9137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 9157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_del_channel 9167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: delete a channel by its handle 9187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 9207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 9217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 9227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 9247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 9257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 9267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : all streams in the channel should be stopped already before 9277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * this channel can be deleted. 9287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 9297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_del_channel(mm_camera_obj_t *my_obj, 9307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id) 9317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 9327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 9337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 9347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 9357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 9377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 9387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 9397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 9417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_DELETE, 9427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 9437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 9447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_destroy(&ch_obj->ch_lock); 9467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(ch_obj, 0, sizeof(mm_channel_t)); 9477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 9487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 9497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 9507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 9517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 9527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 9547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_get_bundle_info 9557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: query bundle info of the channel 9577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 9597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 9607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 9617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @bundle_info : bundle info to be filled in 9627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 9647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 9657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 9667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : all streams in the channel should be stopped already before 9677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * this channel can be deleted. 9687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 9697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj, 9707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 9717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_bundle_config_t *bundle_info) 9727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 9737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 9747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 9757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 9767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 9787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 9797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 9807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 9827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_GET_BUNDLE_INFO, 9837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)bundle_info, 9847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 9857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 9867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 9877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 9887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 9897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 9907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 9917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 9927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_link_stream 9937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: link a stream into a channel 9957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 9967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 9977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 9987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 9997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id : stream that will be linked 10007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @linked_ch_id : channel in which the stream will be linked 10017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : uint32_t type of stream handle 10037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- invalid stream handle, meaning the op failed 10047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * >0 -- successfully linked a stream with a valid handle 10057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 10067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj, 10077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 10087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 10097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t linked_ch_id) 10107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 10117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t s_hdl = 0; 10127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 10137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, linked_ch_id); 10147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * owner_obj = 10157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 10167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if ((NULL != ch_obj) && (NULL != owner_obj)) { 10187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 10197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 10207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_stream_link_t stream_link; 10227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&stream_link, 0, sizeof(mm_camera_stream_link_t)); 10237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He stream_link.ch = owner_obj; 10247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He stream_link.stream_id = stream_id; 10257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_fsm_fn(ch_obj, 10267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_LINK_STREAM, 10277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&stream_link, 10287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&s_hdl); 10297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 10307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 10317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 10327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return s_hdl; 10347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 10357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 10377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_add_stream 10387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: add a stream into a channel 10407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 10427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 10437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 10447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : uint32_t type of stream handle 10467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- invalid stream handle, meaning the op failed 10477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * >0 -- successfully added a stream with a valid handle 10487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 10497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heuint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj, 10507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id) 10517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 10527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t s_hdl = 0; 10537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 10547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 10557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 10577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 10587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 10597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_fsm_fn(ch_obj, 10617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_ADD_STREAM, 10627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 10637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&s_hdl); 10647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 10657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 10667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 10677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return s_hdl; 10697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 10707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 10727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_del_stream 10737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: delete a stream by its handle 10757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 10777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 10787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 10797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id : stream handle 10807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 10817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 10827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 10837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 10847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : stream should be stopped already before it can be deleted. 10857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 10867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_del_stream(mm_camera_obj_t *my_obj, 10877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 10887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id) 10897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 10907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 10917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 10927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 10937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 10957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 10967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 10977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 10987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 10997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_DEL_STREAM, 11007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&stream_id, 11017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 11027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 11037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 11047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 11057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 11077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 11087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 11107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_start_zsl_snapshot_ch 11117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: starts zsl snapshot for specific channel 11137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 11157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 11167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 11177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 11197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 11207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 11217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 11227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 11237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id) 11247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 11257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 11267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 11277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 11287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 11307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 11317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 11327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 11347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_START_ZSL_SNAPSHOT, 11357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 11367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 11377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 11387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 11397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 11407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 11427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 11437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 11457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_stop_zsl_snapshot_ch 11467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: stops zsl snapshot for specific channel 11487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 11507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 11517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 11527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 11547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 11557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 11567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 11577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 11587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id) 11597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 11607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 11617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 11627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 11637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 11657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 11667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 11677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 11697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT, 11707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 11717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 11727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 11737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 11747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 11757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 11777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 11787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 11797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 11807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_config_stream 11817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: configure a stream 11837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 11857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 11867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 11877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id : stream handle 11887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @config : stream configuration 11897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 11907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 11917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 11927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 11937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 11947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_config_stream(mm_camera_obj_t *my_obj, 11957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 11967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 11977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_stream_config_t *config) 11987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 11997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 12007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 12017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 12027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_evt_paylod_config_stream_t payload; 12037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 12057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 12067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(mm_evt_paylod_config_stream_t)); 12097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = stream_id; 12107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.config = config; 12117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 12127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_CONFIG_STREAM, 12137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&payload, 12147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 12157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 12167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 12187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 12207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 12217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 12237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_start_channel 12247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: start a channel, which will start all streams in the channel 12267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 12287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 12297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 12307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 12327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 12337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 12347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 12357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_start_channel(mm_camera_obj_t *my_obj, uint32_t ch_id) 12367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 12377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 12387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 12397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 12407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 12427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 12437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 12467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_START, 12477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 12487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 12497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 12507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 12527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 12547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 12557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 12577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_stop_channel 12587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: stop a channel, which will stop all streams in the channel 12607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 12627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 12637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 12647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 12667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 12677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 12687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 12697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj, 12707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id) 12717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 12727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 12737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 12747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 12757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 12777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 12787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 12817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_STOP, 12827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 12837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 12847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 12857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 12867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 12877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 12887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 12897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 12907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 12917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_request_super_buf 12927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched 12947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * frames from superbuf queue 12957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 12967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 12977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 12987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 12997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @num_buf_requested : number of matched frames needed 13007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 13027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 13037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 13047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 13057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj, 13067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, mm_camera_req_buf_t *buf) 13077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 13087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 13097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 13107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 13117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if ((NULL != ch_obj) && (buf != NULL)) { 13137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 13147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, MM_CHANNEL_EVT_REQUEST_SUPER_BUF, 13177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)buf, NULL); 13187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 13197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 13217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 13237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 13247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 13267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_cancel_super_buf_request 13277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: for burst mode in bundle, cancel the reuqest for certain amount 13297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * of matched frames from superbuf queue 13307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 13327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 13337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 13347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 13367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 13377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 13387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 13397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj, uint32_t ch_id) 13407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 13417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 13427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 13437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 13447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 13467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 13477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 13507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF, 13517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL, 13527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 13537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 13547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 13567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 13587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 13597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 13617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_flush_super_buf_queue 13627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: flush out all frames in the superbuf queue 13647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 13667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 13677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 13687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 13707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 13717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 13727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 13737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj, uint32_t ch_id, 13747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t frame_idx) 13757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 13767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 13777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 13787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 13797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 13817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 13827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 13857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE, 13867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&frame_idx, 13877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 13887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 13897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 13907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 13917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 13937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 13947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 13957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 13967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_config_channel_notify 13977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 13987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: configures the channel notification mode 13997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 14017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 14027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 14037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @notify_mode : notification mode 14047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 14067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 14077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 14087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 14097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj, 14107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 14117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_notify_mode_t notify_mode) 14127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 14137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 14147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 14157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 14167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 14187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 14197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 14207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 14227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE, 14237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)¬ify_mode, 14247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 14257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 14267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 14277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 14287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 14307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 14317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 14337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_set_stream_parms 14347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: set parameters per stream 14367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 14387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 14397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 14407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @s_id : stream handle 14417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @parms : ptr to a param struct to be set to server 14427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 14447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 14457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 14467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the parms struct buf is already mapped to server via 14477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Corresponding fields of parameters to be set 14487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * are already filled in by upper layer caller. 14497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 14507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj, 14517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 14527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t s_id, 14537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_stream_parm_buffer_t *parms) 14547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 14557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 14567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_evt_paylod_set_get_stream_parms_t payload; 14577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 14587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 14597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 14617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 14627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 14637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(payload)); 14657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = s_id; 14667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.parms = parms; 14677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 14697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_SET_STREAM_PARM, 14707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&payload, 14717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 14727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 14737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 14747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 14757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 14777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 14787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 14797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 14807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_get_stream_parms 14817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get parameters per stream 14837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 14857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 14867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 14877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @s_id : stream handle 14887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @parms : ptr to a param struct to be get from server 14897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 14907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 14917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 14927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 14937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the parms struct buf is already mapped to server via 14947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Parameters to be get from server are already 14957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * filled in by upper layer caller. After this call, corresponding 14967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * fields of requested parameters will be filled in by server with 14977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * detailed information. 14987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 14997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj, 15007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 15017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t s_id, 15027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_stream_parm_buffer_t *parms) 15037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 15047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 15057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_evt_paylod_set_get_stream_parms_t payload; 15067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 15077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 15087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 15107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 15117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 15127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(payload)); 15147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = s_id; 15157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.parms = parms; 15167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 15187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_GET_STREAM_PARM, 15197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&payload, 15207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 15217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 15227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 15237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 15247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 15267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 15277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 15297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_do_stream_action 15307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: request server to perform stream based action. Maybe removed later 15327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * if the functionality is included in mm_camera_set_parms 15337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 15357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 15367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 15377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @s_id : stream handle 15387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @actions : ptr to an action struct buf to be performed by server 15397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 15417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 15427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 15437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the action struct buf is already mapped to server via 15447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Actions to be performed by server are already 15457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * filled in by upper layer caller. 15467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 15477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj, 15487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 15497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 15507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *actions) 15517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 15527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 15537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_evt_paylod_do_stream_action_t payload; 15547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 15557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 15567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 15587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 15597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 15607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(payload)); 15627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = stream_id; 15637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.actions = actions; 15647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 15667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_DO_STREAM_ACTION, 15677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&payload, 15687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 15697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 15707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 15717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 15727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 15747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 15757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 15767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 15777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_map_stream_buf 15787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping stream buffer via domain socket to server 15807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 15827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 15837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 15847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @s_id : stream handle 15857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_type : type of buffer to be mapped. could be following values: 15867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_STREAM_BUF 15877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_STREAM_INFO 15887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 15897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_idx : index of buffer within the stream buffers, only valid if 15907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or 15917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 15927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @plane_idx : plane index. If all planes share the same fd, 15937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * plane_idx = -1; otherwise, plean_idx is the 15947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * index to plane (0..num_of_planes) 15957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @fd : file descriptor of the buffer 15967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @size : size of the buffer 15977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 15987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 15997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 16007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 16017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 16027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj, 16037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 16047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 16057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t buf_type, 16067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t buf_idx, 16077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t plane_idx, 16087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int fd, 16097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He size_t size, 16107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *buffer) 16117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 16127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 16137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_buf_map_type payload; 16147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 16157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 16167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 16187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 16197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 16207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(payload)); 16227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = stream_id; 16237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.type = buf_type; 16247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.frame_idx = buf_idx; 16257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.plane_idx = plane_idx; 16267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.fd = fd; 16277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.size = size; 16287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.buffer = buffer; 16297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 16307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_MAP_STREAM_BUF, 16317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&payload, 16327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 16337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 16347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 16357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 16367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 16387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 16397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 16417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_map_stream_bufs 16427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping stream buffers via domain socket to server 16447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 16467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 16477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 16487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_map_list : list of buffers to be mapped 16497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 16517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 16527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 16537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 16547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_map_stream_bufs(mm_camera_obj_t *my_obj, 16557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 16567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const cam_buf_map_type_list *buf_map_list) 16577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 16587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 16597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_buf_map_type_list payload; 16607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 16617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 16627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 16647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 16657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 16667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memcpy(&payload, buf_map_list, sizeof(payload)); 16687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 16697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_MAP_STREAM_BUFS, 16707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&payload, 16717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 16727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 16737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 16747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 16757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 16777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 16787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 16797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 16807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_unmap_stream_buf 16817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: unmapping stream buffer via domain socket to server 16837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 16857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 16867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 16877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @s_id : stream handle 16887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_type : type of buffer to be mapped. could be following values: 16897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_STREAM_BUF 16907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_STREAM_INFO 16917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 16927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_idx : index of buffer within the stream buffers, only valid if 16937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or 16947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF 16957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @plane_idx : plane index. If all planes share the same fd, 16967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * plane_idx = -1; otherwise, plean_idx is the 16977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * index to plane (0..num_of_planes) 16987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 16997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 17007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 17017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 17027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 17037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj, 17047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, 17057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t stream_id, 17067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t buf_type, 17077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t buf_idx, 17087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t plane_idx) 17097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 17107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 17117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_buf_unmap_type payload; 17127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 17137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 17147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 17167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 17177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 17187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(payload)); 17207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = stream_id; 17217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.type = buf_type; 17227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.frame_idx = buf_idx; 17237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.plane_idx = plane_idx; 17247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 17257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_UNMAP_STREAM_BUF, 17267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&payload, 17277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 17287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 17297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 17307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 17317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 17337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 17347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 17367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_evt_sub 17377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: subscribe/unsubscribe event notify from kernel 17397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 17417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 17427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @reg_flag : 1 -- subscribe ; 0 -- unsubscribe 17437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 17457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 17467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 17477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 17487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_evt_sub(mm_camera_obj_t * my_obj, 17497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t reg_flag) 17507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 17517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 17527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_event_subscription sub; 17537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&sub, 0, sizeof(sub)); 17557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sub.type = MSM_CAMERA_V4L2_EVENT_TYPE; 17567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sub.id = MSM_CAMERA_MSM_NOTIFY; 17577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(FALSE == reg_flag) { 17587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* unsubscribe */ 17597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(my_obj->ctrl_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 17607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc < 0) { 17617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("unsubscribe event rc = %d, errno %d", 17627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc, errno); 17637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 17647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 17657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* remove evt fd from the polling thraed when unreg the last event */ 17667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_poll_thread_del_poll_fd(&my_obj->evt_poll_thread, 17677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->my_hdl, 17687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_sync_call); 17697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 17707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(my_obj->ctrl_fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 17717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc < 0) { 17727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("subscribe event rc = %d, errno %d", 17737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc, errno); 17747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 17757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 17767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* add evt fd to polling thread when subscribe the first event */ 17777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_poll_thread_add_poll_fd(&my_obj->evt_poll_thread, 17787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->my_hdl, 17797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ctrl_fd, 17807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_event_notify, 17817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)my_obj, 17827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_sync_call); 17837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 17847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 17857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 17867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 17877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 17887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_wait_for_event 17897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to wait for certain events 17917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 17937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 17947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @evt_mask : mask for events to be waited. Any of event in the mask would 17957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * trigger the wait to end 17967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @status : status of the event 17977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 17987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : none 17997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 18007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hevoid mm_camera_util_wait_for_event(mm_camera_obj_t *my_obj, 18017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t evt_mask, 18027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t *status) 18037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 18047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 18057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct timespec ts; 18067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 18077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->evt_lock); 18087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He while (!(my_obj->evt_rcvd.server_event_type & evt_mask)) { 18097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He clock_gettime(CLOCK_MONOTONIC, &ts); 18107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ts.tv_sec += WAIT_TIMEOUT; 18117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = pthread_cond_timedwait(&my_obj->evt_cond, &my_obj->evt_lock, &ts); 18127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc) { 18137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("pthread_cond_timedwait of evt_mask 0x%x failed %d", 18147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He evt_mask, rc); 18157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 18167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (!rc) { 18197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *status = my_obj->evt_rcvd.status; 18207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 18217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *status = MSM_CAMERA_STATUS_FAIL; 18227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* reset local storage for recieved event for next event */ 18247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&my_obj->evt_rcvd, 0, sizeof(mm_camera_event_t)); 18257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->evt_lock); 18267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 18277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 18287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 18297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_bundled_sendmsg 18307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to send bundled msg via domain socket 18327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 18347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 18357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @msg : message to be sent 18367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_size : size of the message to be sent 18377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @sendfds : array of file descriptors to be sent 18387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @numfds : number of file descriptors to be sent 18397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 18417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 18427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 18437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 18447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_util_bundled_sendmsg(mm_camera_obj_t *my_obj, 18457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *msg, 18467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He size_t buf_size, 18477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int sendfds[CAM_MAX_NUM_BUFS_PER_STREAM], 18487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int numfds) 18497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 18507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 18517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t status; 18527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 18537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* need to lock msg_lock, since sendmsg until response back is deemed as one operation*/ 18547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->msg_lock); 18557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(mm_camera_socket_bundle_sendmsg(my_obj->ds_fd, msg, buf_size, sendfds, numfds) > 0) { 18567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* wait for event that mapping/unmapping is done */ 18577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_wait_for_event(my_obj, CAM_EVENT_TYPE_MAP_UNMAP_DONE, &status); 18587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (MSM_CAMERA_STATUS_SUCCESS == status) { 18597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = 0; 18607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->msg_lock); 18637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 18647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 18657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 18667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 18677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_sendmsg 18687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to send msg via domain socket 18707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 18727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 18737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @msg : message to be sent 18747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_size : size of the message to be sent 18757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @sendfd : >0 if any file descriptor need to be passed across process 18767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 18777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 18787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 18797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 18807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 18817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj, 18827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *msg, 18837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He size_t buf_size, 18847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int sendfd) 18857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 18867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 18877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t status; 18887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 18897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* need to lock msg_lock, since sendmsg until reposonse back is deemed as one operation*/ 18907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&my_obj->msg_lock); 18917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(mm_camera_socket_sendmsg(my_obj->ds_fd, msg, buf_size, sendfd) > 0) { 18927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* wait for event that mapping/unmapping is done */ 18937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_wait_for_event(my_obj, CAM_EVENT_TYPE_MAP_UNMAP_DONE, &status); 18947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (MSM_CAMERA_STATUS_SUCCESS == status) { 18957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = 0; 18967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 18987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->msg_lock); 18997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 19007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 19017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 19037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTIOa : mm_camera_map_buf 19047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping camera buffer via domain socket to server 19067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 19087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 19097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_type : type of buffer to be mapped. could be following values: 19107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_CAPABILITY 19117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_SETPARM_BUF 19127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_GETPARM_BUF 19137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @fd : file descriptor of the buffer 19147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @size : size of the buffer 19157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 19177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 19187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 19197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 19207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_map_buf(mm_camera_obj_t *my_obj, 19217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t buf_type, int fd, size_t size, void *buffer) 19227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 19237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 19247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_sock_packet_t packet; 19267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&packet, 0, sizeof(cam_sock_packet_t)); 19277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.msg_type = CAM_MAPPING_TYPE_FD_MAPPING; 19287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map.type = buf_type; 19297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map.fd = fd; 19307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map.size = size; 19317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map.buffer = buffer; 19327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 19337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_sendmsg(my_obj, 19347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He &packet, 19357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sizeof(cam_sock_packet_t), 19367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He fd); 19377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else 19387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 19397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_REG_BUF, 19407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid, &packet); 19417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 19427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 19437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 19447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 19457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 19467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 19477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 19497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_map_bufs 19507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mapping camera buffers via domain socket to server 19527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 19547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 19557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_map_list : list of buffers to be mapped 19567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 19577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 19587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 19597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 19607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 19617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_map_bufs(mm_camera_obj_t *my_obj, 19627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const cam_buf_map_type_list* buf_map_list) 19637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 19647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 19657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_sock_packet_t packet; 19667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&packet, 0, sizeof(cam_sock_packet_t)); 19677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.msg_type = CAM_MAPPING_TYPE_FD_BUNDLED_MAPPING; 19687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memcpy(&packet.payload.buf_map_list, buf_map_list, 19707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sizeof(packet.payload.buf_map_list)); 19717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int sendfds[CAM_MAX_NUM_BUFS_PER_STREAM]; 19737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t numbufs = packet.payload.buf_map_list.length; 19747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t i; 19757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (i = 0; i < numbufs; i++) { 19767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sendfds[i] = packet.payload.buf_map_list.buf_maps[i].fd; 19777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map_list.buf_maps[i].buffer = 19787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buf_map_list->buf_maps[i].buffer; 19797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 19807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (i = numbufs; i < CAM_MAX_NUM_BUFS_PER_STREAM; i++) { 19817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_map_list.buf_maps[i].fd = -1; 19827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sendfds[i] = -1; 19837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 19847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 19867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_bundled_sendmsg(my_obj, 19877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He &packet, sizeof(cam_sock_packet_t), 19887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sendfds, numbufs); 19897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else 19907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 19917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_REG_BUF, 19927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid, &packet); 19937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 19947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 19957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 19967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 19977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 19987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 19997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 20007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 20017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 20027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_unmap_buf 20037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: unmapping camera buffer via domain socket to server 20057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 20077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 20087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_type : type of buffer to be mapped. could be following values: 20097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_CAPABILITY 20107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_SETPARM_BUF 20117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CAM_MAPPING_BUF_TYPE_GETPARM_BUF 20127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 20147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 20157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 20167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 20177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj, 20187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t buf_type) 20197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 20207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 20217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_sock_packet_t packet; 20227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&packet, 0, sizeof(cam_sock_packet_t)); 20237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.msg_type = CAM_MAPPING_TYPE_FD_UNMAPPING; 20247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He packet.payload.buf_unmap.type = buf_type; 20257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 20267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_sendmsg(my_obj, 20277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He &packet, 20287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He sizeof(cam_sock_packet_t), 20297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He -1); 20307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else 20317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 20327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_REG_BUF, 20337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid, &packet); 20347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 20357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 20367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 20377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 20387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 20397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 20407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 20417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 20427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_s_ctrl 20437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to send v4l2 ioctl for s_ctrl 20457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 20477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj :Camera object 20487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id :streamID 20497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @fd : file descritpor for sending ioctl 20507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @id : control id 20517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @value : value of the ioctl to be sent 20527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 20547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 20557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 20567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 20577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_util_s_ctrl(__unused mm_camera_obj_t *my_obj, 20587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He __unused int stream_id, int32_t fd, 20597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t id, int32_t *value) 20607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 20617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = 0; 20627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 20637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 20647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_control control; 20657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&control, 0, sizeof(control)); 20667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.id = id; 20677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (value != NULL) { 20687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.value = *value; 20697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 20707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(fd, VIDIOC_S_CTRL, &control); 20717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("fd=%d, S_CTRL, id=0x%x, value = %p, rc = %d\n", 20727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He fd, id, value, rc); 20737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (rc < 0) { 20747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("ioctl failed %d, errno %d", rc, errno); 20757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (value != NULL) { 20767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *value = control.value; 20777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 20787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else /* DAEMON_PRESENT */ 20797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 20807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_cmd_data shim_cmd_data; 20817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void)fd; 20827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void)value; 20837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&shim_cmd_data, 0, sizeof(shim_cmd_data)); 20847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 20857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.command = id; 20867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.stream_id = stream_id; 20877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.value = NULL; 20887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_SET_PARM, 20897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid,&shim_cmd_data); 20907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 20917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 20927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */ 20937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return (rc >= 0)? 0 : -1; 20947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 20957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 20967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 20977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_util_g_ctrl 20987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 20997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: utility function to send v4l2 ioctl for g_ctrl 21007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 21017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 21027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj :Camera object 21037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id :streamID 21047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @fd : file descritpor for sending ioctl 21057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @id : control id 21067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @value : value of the ioctl to be sent 21077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 21087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 21097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 21107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 21117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 21127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_util_g_ctrl(__unused mm_camera_obj_t *my_obj, 21137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He __unused int stream_id, int32_t fd, uint32_t id, int32_t *value) 21147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 21157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = 0; 21167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_control control; 21177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&control, 0, sizeof(control)); 21197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.id = id; 21207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (value != NULL) { 21217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.value = *value; 21227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef DAEMON_PRESENT 21257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(fd, VIDIOC_G_CTRL, &control); 21267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("fd=%d, G_CTRL, id=0x%x, rc = %d\n", fd, id, rc); 21277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (value != NULL) { 21287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *value = control.value; 21297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#else /* DAEMON_PRESENT */ 21317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_cmd; 21327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_cmd_data shim_cmd_data; 21337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void)fd; 21347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&shim_cmd_data, 0, sizeof(shim_cmd_data)); 21357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.command = id; 21377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.stream_id = stream_id; 21387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd_data.value = value; 21397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_cmd = mm_camera_create_shim_cmd_packet(CAM_SHIM_GET_PARM, 21407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->sessionid, &shim_cmd_data); 21417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_module_send_cmd(shim_cmd); 21437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(shim_cmd); 21447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* DAEMON_PRESENT */ 21457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return (rc >= 0)? 0 : -1; 21467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 21477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 21497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_create_shim_cmd 21507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 21517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Prepare comand packet to pass to back-end through shim layer 21527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 21537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 21547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @type : type of command 21557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @sessionID : camera sessionID 21567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @data : command data 21577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 21587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : NULL in case of failures 21597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He allocated pointer to shim packet 21607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 21617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hecam_shim_packet_t *mm_camera_create_shim_cmd_packet(cam_shim_cmd_type type, 21627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t sessionID, void *data) 21637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 21647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_packet_t *shim_pack = NULL; 21657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t i = 0; 21667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 21677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack = (cam_shim_packet_t *)malloc(sizeof(cam_shim_packet_t)); 21687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (shim_pack == NULL) { 21697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGE("Cannot allocate a memory for shim packet"); 21707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return NULL; 21717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(shim_pack, 0, sizeof(cam_shim_packet_t)); 21737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->cmd_type = type; 21747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->session_id = sessionID; 21757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He switch (type) { 21767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_SET_PARM: 21777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_GET_PARM: { 21787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_cmd_data *cmd_data = (cam_shim_cmd_data *)data; 21797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->cmd_data = *cmd_data; 21807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 21817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_REG_BUF: { 21837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_reg_buf_t *cmd_data = (cam_reg_buf_t *)data; 21847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->reg_buf = *cmd_data; 21857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 21867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_BUNDLE_CMD: { 21887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_stream_cmd_packet_t *cmd_data = (cam_shim_stream_cmd_packet_t *)data; 21897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (i = 0; i < cmd_data->stream_count; i++) { 21907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->bundle_cmd.stream_event[i] = cmd_data->stream_event[i]; 21917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He shim_pack->bundle_cmd.stream_count = cmd_data->stream_count; 21937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 21947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He default: 21967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGW("No Data for this command"); 21977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 21987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return shim_pack; 21997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 22007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 22027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_destroy_shim_cmd 22037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 22047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: destroy shim packet 22057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 22067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 22077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @cmd : ptr to shim packet 22087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 22107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 22117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 22127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 22137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_destroy_shim_cmd_packet(cam_shim_packet_t *cmd) 22147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 22157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = 0; 22167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t i = 0, j = 0; 22177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (cmd == NULL) { 22197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGW("Command is NULL"); 22207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 22217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He switch (cmd->cmd_type) { 22247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_SET_PARM: 22257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_GET_PARM: 22267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_REG_BUF: 22277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 22287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_SHIM_BUNDLE_CMD: { 22297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_stream_cmd_packet_t *cmd_data = (cam_shim_stream_cmd_packet_t *)cmd; 22307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (i = 0; i < cmd_data->stream_count; i++) { 22317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_shim_cmd_packet_t *stream_evt = &cmd_data->stream_event[i]; 22327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (j = 0; j < stream_evt->cmd_count; j++) { 22337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (stream_evt->cmd != NULL) { 22347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(stream_evt->cmd->cmd_type == CAM_SHIM_BUNDLE_CMD) { 22357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_destroy_shim_cmd_packet(stream_evt->cmd); 22367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He free(stream_evt->cmd); 22387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He stream_evt->cmd = NULL; 22397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 22437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He default: 22457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGW("No Data for this command"); 22467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 22477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He free(cmd); 22487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cmd = NULL; 22497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 22507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 22517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 22537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_channel_advanced_capture 22547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 22557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: sets the channel advanced capture 22567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 22577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 22587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 22597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 22607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @type : advanced capture type. 22617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @start_flag : flag to indicate start/stop 22627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @in_value : input configaration 22637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 22647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 22657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 22667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 22677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 22687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj, 22697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, mm_camera_advanced_capture_t type, 22707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t trigger, void *in_value) 22717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 22727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("E type = %d", type); 22737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 22747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 22757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 22767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 22777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 22787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 22797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 22807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He switch (type) { 22817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MM_CAMERA_AF_BRACKETING: 22827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 22837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_AF_BRACKETING, 22847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&trigger, 22857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 22867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 22877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MM_CAMERA_AE_BRACKETING: 22887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 22897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_AE_BRACKETING, 22907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&trigger, 22917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 22927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 22937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MM_CAMERA_FLASH_BRACKETING: 22947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 22957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_FLASH_BRACKETING, 22967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&trigger, 22977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 22987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 22997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MM_CAMERA_ZOOM_1X: 23007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 23017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_ZOOM_1X, 23027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)&trigger, 23037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 23047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 23057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case MM_CAMERA_FRAME_CAPTURE: 23067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_channel_fsm_fn(ch_obj, 23077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CAMERA_EVT_CAPTURE_SETTING, 23087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void *)in_value, 23097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He NULL); 23107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 23117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He default: 23127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 23137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 23147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 23167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 23177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 23187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("X"); 23207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 23217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 23227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 23247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_get_session_id 23257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: get the session identity 23277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 23297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 23307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @sessionid: pointer to the output session id 23317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 23337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 23347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 23357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : if this call succeeds, we will get a valid session id 23367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 23377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_get_session_id(mm_camera_obj_t *my_obj, 23387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t* sessionid) 23397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 23407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 23417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 23427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if(sessionid != NULL) { 23437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He struct v4l2_control control; 23447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&control, 0, sizeof(control)); 23457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.id = MSM_CAMERA_PRIV_G_SESSION_ID; 23467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He control.value = value; 23477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = ioctl(my_obj->ctrl_fd, VIDIOC_G_CTRL, &control); 23497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He value = control.value; 23507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He LOGD("fd=%d, get_session_id, id=0x%x, value = %d, rc = %d\n", 23517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He my_obj->ctrl_fd, MSM_CAMERA_PRIV_G_SESSION_ID, 23527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He value, rc); 23537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *sessionid = value; 23547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 23557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 23567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 23577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 23597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_sync_related_sensors 23607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: send sync cmd 23627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 23647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 23657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @parms : ptr to the related cam info to be sent to server 23667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 23687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 23697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * -1 -- failure 23707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * NOTE : Assume the sync struct buf is already mapped to server via 23717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * domain socket. Corresponding fields of parameters to be set 23727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * are already filled in by upper layer caller. 23737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 23747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_sync_related_sensors(mm_camera_obj_t *my_obj, 23757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_sync_related_sensors_event_info_t* parms) 23767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 23777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t rc = -1; 23787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t value = 0; 23797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (parms != NULL) { 23807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = mm_camera_util_s_ctrl(my_obj, 0, my_obj->ctrl_fd, 23817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He CAM_PRIV_SYNC_RELATED_SENSORS, &value); 23827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 23837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 23847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 23857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 23867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 23877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 23887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * FUNCTION : mm_camera_reg_stream_buf_cb 23897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: Register callback for stream buffer 23917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 23927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * PARAMETERS : 23937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @my_obj : camera object 23947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @ch_id : channel handle 23957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @stream_id : stream that will be linked 23967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @buf_cb : special callback needs to be registered for stream buffer 23977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @cb_type : Callback type SYNC/ASYNC 23987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @userdata : user data pointer 23997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 24007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * RETURN : int32_t type of status 24017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 0 -- success 24027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 1 -- failure 24037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 24047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint32_t mm_camera_reg_stream_buf_cb(mm_camera_obj_t *my_obj, 24057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t stream_cb, 24067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_stream_cb_type cb_type, void *userdata) 24077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 24087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int rc = 0; 24097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_stream_data_cb_t buf_cb; 24107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_t * ch_obj = 24117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_util_get_channel_by_handler(my_obj, ch_id); 24127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (NULL != ch_obj) { 24147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&ch_obj->ch_lock); 24157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 24167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&buf_cb, 0, sizeof(mm_stream_data_cb_t)); 24187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buf_cb.cb = stream_cb; 24197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buf_cb.cb_count = -1; 24207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buf_cb.cb_type = cb_type; 24217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buf_cb.user_data = userdata; 24227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_evt_paylod_reg_stream_buf_cb payload; 24247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He memset(&payload, 0, sizeof(mm_evt_paylod_reg_stream_buf_cb)); 24257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.buf_cb = buf_cb; 24267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He payload.stream_id = stream_id; 24277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_channel_fsm_fn(ch_obj, 24287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He MM_CHANNEL_EVT_REG_STREAM_BUF_CB, 24297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (void*)&payload, NULL); 24307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 24317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&my_obj->cam_lock); 24327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 24337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 24347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 24357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifdef QCAMERA_REDEFINE_LOG 24377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/*=========================================================================== 24397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * DESCRIPTION: mm camera debug interface 24407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 24417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *==========================================================================*/ 24427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepthread_mutex_t dbg_log_mutex; 24437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#undef LOG_TAG 24457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define LOG_TAG "QCamera" 24467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define CDBG_MAX_STR_LEN 1024 24477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define CDBG_MAX_LINE_LENGTH 256 24487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* current trace loggin permissions 24507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * {NONE, ERR, WARN, HIGH, DEBUG, LOW, INFO} */ 24517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heint g_cam_log[CAM_LAST_MODULE][CAM_GLBL_DBG_INFO + 1] = { 24527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {0, 1, 0, 0, 0, 0, 1}, /* CAM_NO_MODULE */ 24537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {0, 1, 0, 0, 0, 0, 1}, /* CAM_HAL_MODULE */ 24547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {0, 1, 0, 0, 0, 0, 1}, /* CAM_MCI_MODULE */ 24557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {0, 1, 0, 0, 0, 0, 1}, /* CAM_JPEG_MODULE */ 24567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; 24577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* string representation for logging level */ 24597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic const char *cam_dbg_level_to_str[] = { 24607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "", /* CAM_GLBL_DBG_NONE */ 24617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<ERROR>", /* CAM_GLBL_DBG_ERR */ 24627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<WARN>", /* CAM_GLBL_DBG_WARN */ 24637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<HIGH>", /* CAM_GLBL_DBG_HIGH */ 24647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<DBG>", /* CAM_GLBL_DBG_DEBUG */ 24657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<LOW>", /* CAM_GLBL_DBG_LOW */ 24667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<INFO>" /* CAM_GLBL_DBG_INFO */ 24677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; 24687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* current trace logging configuration */ 24707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hetypedef struct { 24717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_global_debug_level_t level; 24727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int initialized; 24737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const char *name; 24747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const char *prop; 24757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} module_debug_t; 24767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic module_debug_t cam_loginfo[(int)CAM_LAST_MODULE] = { 24787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {CAM_GLBL_DBG_ERR, 1, 24797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "", "persist.camera.global.debug" }, /* CAM_NO_MODULE */ 24807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {CAM_GLBL_DBG_ERR, 1, 24817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<HAL>", "persist.camera.hal.debug" }, /* CAM_HAL_MODULE */ 24827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {CAM_GLBL_DBG_ERR, 1, 24837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<MCI>", "persist.camera.mci.debug" }, /* CAM_MCI_MODULE */ 24847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He {CAM_GLBL_DBG_ERR, 1, 24857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He "<JPEG>", "persist.camera.mmstill.logs" }, /* CAM_JPEG_MODULE */ 24867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; 24877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 24887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/** cam_get_dbg_level 24897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 24907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @module: module name 24917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @level: module debug logging level 24927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 24937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Maps debug log string to value. 24947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 24957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Return: logging level 24967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He **/ 24977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He__unused 24987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic cam_global_debug_level_t cam_get_dbg_level(const char *module, 24997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He char *pValue) { 25007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_global_debug_level_t rc = CAM_GLBL_DBG_NONE; 25027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (!strcmp(pValue, "none")) { 25047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_NONE; 25057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "warn")) { 25067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_WARN; 25077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "debug")) { 25087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_DEBUG; 25097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "error")) { 25107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_ERR; 25117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "low")) { 25127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_LOW; 25137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "high")) { 25147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_HIGH; 25157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else if (!strcmp(pValue, "info")) { 25167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He rc = CAM_GLBL_DBG_INFO; 25177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } else { 25187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGE("Invalid %s debug log level %s\n", module, pValue); 25197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 25207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGD("%s debug log level: %s\n", module, cam_dbg_level_to_str[rc]); 25227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He return rc; 25247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 25257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/** cam_vsnprintf 25277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @pdst: destination buffer pointer 25287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @size: size of destination b uffer 25297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @pfmt: string format 25307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @argptr: variabkle length argument list 25317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Processes variable length argument list to a formatted string. 25337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Return: n/a 25357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He **/ 25367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hestatic void cam_vsnprintf(char* pdst, unsigned int size, 25377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const char* pfmt, va_list argptr) { 25387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int num_chars_written = 0; 25397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pdst[0] = '\0'; 25417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He num_chars_written = vsnprintf(pdst, size, pfmt, argptr); 25427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if ((num_chars_written >= (int)size) && (size > 0)) { 25447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* Message length exceeds the buffer limit size */ 25457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He num_chars_written = size - 1; 25467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pdst[size - 1] = '\0'; 25477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 25487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 25497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/** mm_camera_debug_log 25517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @module: origin or log message 25527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @level: logging level 25537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @func: caller function name 25547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @line: caller line number 25557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @fmt: log message formatting string 25567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * @...: variable argument list 25577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Generig logger method. 25597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Return: N/A 25617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He **/ 25627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hevoid mm_camera_debug_log(const cam_modules_t module, 25637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const cam_global_debug_level_t level, 25647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He const char *func, const int line, const char *fmt, ...) { 25657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He char str_buffer[CDBG_MAX_STR_LEN]; 25667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He va_list args; 25677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He va_start(args, fmt); 25697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_vsnprintf(str_buffer, CDBG_MAX_STR_LEN, fmt, args); 25707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He va_end(args); 25717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He switch (level) { 25737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_WARN: 25747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGW("%s%s %s: %d: %s", cam_loginfo[module].name, 25757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_dbg_level_to_str[level], func, line, str_buffer); 25767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 25777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_ERR: 25787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGE("%s%s %s: %d: %s", cam_loginfo[module].name, 25797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_dbg_level_to_str[level], func, line, str_buffer); 25807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 25817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_INFO: 25827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGI("%s%s %s: %d: %s", cam_loginfo[module].name, 25837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_dbg_level_to_str[level], func, line, str_buffer); 25847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He break; 25857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_HIGH: 25867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_DEBUG: 25877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He case CAM_GLBL_DBG_LOW: 25887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He default: 25897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ALOGD("%s%s %s: %d: %s", cam_loginfo[module].name, 25907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_dbg_level_to_str[level], func, line, str_buffer); 25917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 25927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 25937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 25947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /** mm_camera_set_dbg_log_properties 25957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Set global and module log level properties. 25977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 25987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Return: N/A 25997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He **/ 26007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hevoid mm_camera_set_dbg_log_properties(void) { 26017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int i; 26027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He unsigned int j; 26037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static int boot_init = 1; 26047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He char property_value[PROPERTY_VALUE_MAX] = {0}; 26057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He char default_value[PROPERTY_VALUE_MAX] = {0}; 26067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (boot_init) { 26087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He boot_init = 0; 26097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_init(&dbg_log_mutex, 0); 26107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 26117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* set global and individual module logging levels */ 26137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_lock(&dbg_log_mutex); 26147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (i = CAM_NO_MODULE; i < CAM_LAST_MODULE; i++) { 26157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_global_debug_level_t log_level; 26167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He snprintf(default_value, PROPERTY_VALUE_MAX, "%d", (int)cam_loginfo[i].level); 26177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He property_get(cam_loginfo[i].prop, property_value, default_value); 26187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He log_level = (cam_global_debug_level_t)atoi(property_value); 26197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* fix KW warnings */ 26217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He if (log_level > CAM_GLBL_DBG_INFO) { 26227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He log_level = CAM_GLBL_DBG_INFO; 26237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 26247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_loginfo[i].level = log_level; 26267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He /* The logging macros will produce a log message when logging level for 26287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * a module is less or equal to the level specified in the property for 26297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * the module, or less or equal the level specified by the global logging 26307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * property. Currently we don't allow INFO logging to be turned off */ 26317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He for (j = CAM_GLBL_DBG_ERR; j <= CAM_GLBL_DBG_LOW; j++) { 26327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He g_cam_log[i][j] = (cam_loginfo[CAM_NO_MODULE].level != CAM_GLBL_DBG_NONE) && 26337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (cam_loginfo[i].level != CAM_GLBL_DBG_NONE) && 26347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He ((j <= cam_loginfo[i].level) || 26357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He (j <= cam_loginfo[CAM_NO_MODULE].level)); 26367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 26377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He } 26387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_unlock(&dbg_log_mutex); 26397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 26407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 26417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif 2642